สำนักวิทยบริการและเทคโนโลยีสารสนเทศ (สวส.)

Office of Academic Resources and Information Technology

วิธีตรวจสอบเว็บไซต์ที่มีความเสี่ยงการโดน Hack

  • การตรจสอบเว็บไซต์ที่โดน Hack จะมี Code หรือ Script มีคำว่า eval และ base 64_decode เพิ่มเข้ามา Code หรือ Script จะมีการเข้ารหัสแบบ Base64 ไว้  ไฟล์ที่มี Code นี้ เพิ่มเข้ามาจะเป็นไฟล์ที่เข้าข่ายดังกล่าว แนะนำให้ตรวจสอบอย่างละเอียด และย้ายออกจากพื้นที่เว็บไซต์ เพื่อตรวจสอบให้แน่ใจอีกครั้ง
    • วิธีการค้นหาไฟล์  find /var/www -name "*.php" -exec egrep -l "@eval.*base64_decode" {} \;   
sample1
sample2
  • การเช็คการใช้งาน Cron ว่าผิดปกติหรือเปล่า โดยการเปิดดูไฟล์ /var/log/syslog ดูว่า มี User www-data เรียกใช้ Cron หรือเปล่า โดยใช้คำสั่งนี้ในการตรวจสอบ  
    zgrep "www-data" /var/log/syslog*  
    ผลที่ได้ คือ
    
    
    

     จึงใช้คำสั่ง

     wget -q http://221.132.37.26/scen

     เพื่อเอาไฟล์ชื่อ ‘scen’ จาก Website ดังกล่าวมาดู มีเนื้อหาดังนี้

    ซึ่ง การสร้าง cron นั้น จะไปฝังที่ /var/spool/cron/crontab โดยดูได้จากคำสั่ง

    ls -l /var/spool/cron/crontabs/

    ผลที่ได้คือ
    www-data.cron

    -rw------- 1 nobody crontab 271 2013-11-21 21:45 nobody
    -rw------- 1 root   crontab 256 2011-12-30 09:46 root

     

    ซึ่ง แม้จะ Reboot เครื่อง หรือ Clear backdoor ต่างๆออกไปแล้ว ก็จะยังมี cron นี้ไปดึง Botnet กลับมาทุกสัปดาห์อยู่ดี
    ให้ทำการ ลบ Cron โดยใช้คำสั่ง rm -rf .....ตามด้วยชื่อไฟล์....

  • วิธีการปิดช่องโหว่ของ Apache สำหรับผู้ใช้ติดตั้ง joomla และ มี JCE รุ่นที่มีช่องโหว่ จะได้ไม่สร้างปัญหา และ แนะนำวิธีสำหรับผู้พัฒนาเวปไซต์เองด้วย ที่เปิดให้มีการ Upload ไฟล์โดยผู้ใช้ผ่านทาง Web 
    สำหรับ JCE Exploited จะพบว่า การวางไฟล์ Backdoor จะเริ่มวางไว้ที่ไดเรคทอรี่ images/stories ที่ แกล้งเป็นไฟล์ .gif แล้วเอาโค๊ด PHP เข้ามาใส่ แล้วเปลี่ยนนามสกุลเป็น .php ภายหลัง ดังนั้น หาก Apache Web Server สามารถ ปิดกั้นตั้งแต่จุดนี้ได้ กล่าวคือ ต่อให้เอาไฟล์มาวางได้ แต่สั่งให้ทำงานไม่ได้ ก็น่าจะปลอดภัย และ หากพัฒนาเวปไซต์เอง หรือ ผู้ใช้ของระบบต้องการให้ Upload ไฟล์ไว้ในไดเรคทอรี่ใดได้ ก็ต้องแจ้งให้ Web Server Administrator รับทราบ และเพิ่มเติมให้ น่าจะทำให้ปลอดภัยมากขึ้นได้

    สมมุติฐานคือ

  1. ติดตั้ง OS และ Apache Web Server ใหม่
  2. ติดตั้ง Joomla ใหม่ หรือ เอา Web Application ที่ปลอดช่องโหว่อื่นๆ/Backdoor มาลงโดย Joomla ที่มีที่วางไฟล์ภาพไว้ที่ images/stories ส่วน Web Application อื่นๆ ขอสมมุติว่าตั้งชื่อไดเรคทอรี่ว่า uploads
  • สำหรับ Apache2 บน Ubuntu Apache 2.2 นั้น มีโครงสร้างไดเรคทอรี่ดังนี้
/etc/apache2/
|-- apache2.conf
|       `--  ports.conf
|-- mods-enabled
|       |-- *.load
|       `-- *.conf
|-- conf.d
|       `-- *
|-- sites-enabled
        `-- *

     เมื่อ Apache เริ่ม (Start) ก็จะไปอ่าน /etc/apache2/apache2.conf ในนั้น จะกำหนดภาพรวมของระบบ ได้แก่ ใครเป็นคน Start (APACHE_RUN_USER/APACHE_RUN_GROUP), การกำหนดชื่อไฟล์ .htaccess ที่เปิดให้ผู้ใช้ปรับแต่ง Apache ที่แต่ละไดเรคทอรี่ของตนได้, กำหนดว่า จะเรียกใช้ Module อะไรบ้าง โดยการ Include *.load, *.conf  จาก mods-enabled, กำหนดว่า จะเปิดให้มี Virtual Host อะไรบ้างโดยการ Include ไฟล์จาก sites-enabled และ ที่สำคัญ ผู้ดูแลระบบสามารถแยกไฟล์ config ออกเป็นส่วนย่อยๆเป็นไฟล์ โดยการ Include จาก conf.d

ต่อไป สร้างไฟล์ /etc/apache2/conf.d/jce มีเนื้อหาดังนี้

<DirectoryMatch ".*/images/stories/.*">
<FilesMatch "\.php$">
       Order Deny,Allow
       Deny from All
 </FilesMatch>
</DirectoryMatch>

 และในทำนองเดียวกัน สร้างไฟล์ /etc/apache2/conf.d/uploads มีเนื้อหาดังนี้

<DirectoryMatch ".*/uploads/.*">
<FilesMatch "\.php$">
       Order Deny,Allow
       Deny from All
 </FilesMatch>
</DirectoryMatch>

ก่อนจะ Restart/Reload Apache ทดสอบสร้างไฟล์ใน

/var/www/joomla15/images/stories/0day.php
/var/www/mywebapp/uploads/hack.php

เมื่อเรียก URL
http://localhost/joomla15/images/stories/0day.php

http://localhost/mywebapp/uploads/hack.php

 ผลที่ได้คือ Backdoor หน้าตาประมาณนี้

แต่พอใช้ Reload Apache ด้วยคำสั่ง

 sudo /etc/init.d/apache2 reload

 แล้วเรียก URL

 http://localhost/joomla15/images/stories/0day.php

 จะได้ผลดังนี้

เป็นอันว่า แม้ Hacker จะสามารถเอาไฟล์ 0day.php ไปวางใน images/stories ได้ แต่ก็จะไม่สามารถทำงานได้ (อย่างน้อย ก็เรียกใช้ไม่ได้ แต่ผู้ดูแลต้องค้นหาและทำลายเป็นประจำ)

 อธิบายเพิ่มเติมเกี่ยวกับ Apache Configuration เล็กน้อย, การเขียนนั้น ประกอบด้วยสิ่งที่เรียกว่า Directive โดยแบ่งออกเป็น Container และ Directive ทั่วไป

1. Container Directive: เป็นตัวบอกขอบเขต แบ่งออกเป็น

1.1 FileSystem: ได้แก่

1.1.1 <Directory directory-path> … </Directory>
ตั้งค่ากับเฉพาะ ขอบเขตของ Directory ซึ่ง directory-path จะต้องเขียนตามให้เต็ม Path เช่น
<Direcotory /var/www>
….
</Directory>

1.1.2 <DirectoryMatch regexp> … </DirectoryMatch>
ตั้งค่ากับเฉพาะ ขอบเขตของ Directory ซึ่งสอดคล้องกับ regexp ที่กำหนด เช่น
<DirecotoryMatch “.*/images/stories/.*”>
….
</DirectoryMatch>

1.1.3 <Files filename> … </Files>
ตั้งค่ากับเฉพาะ ชื่อไฟล์ที่ตรงกับ filename ที่กำหนด เช่่น
<Files “somefile.html”>

</Files>

1.1.4 <FilesMatch regexp> … </FilesMatch>
ตั้งค่ากับเฉพาะ ชื่อไฟล์ที่สอดคล้องกับ regexp ที่กำหนด เช่่น
<FilesMatch “.*\.php$”>

</FilesMatch>

1.2 WebSpace: ได้แก่

1.2.1 <Location URL-Path> … </Location>
ตั้งค่ากับเฉพาะ URL ที่ตรงกับ URL-Path เช่น
<Location /private>

</Location>
1.2.2 <LocationMatch regexp> … </LocalMatch>
ตั้งค่ากับเฉพาะ URL ที่สอดคล้องกับ regexp เช่น
<LocationMatch “/(extra|special)/data”>

</LocationMatch>

2. Other Directive
ซึ่งมีอยู่มากมาย กรุณาอ่านเพิ่มเติมจาก http://httpd.apache.org/docs/2.2/mod/core.html แต่ในที่นี้ จะขอยกตัวอย่างที่สำคัญ และจำเป็นต้องใช้ ตามตัวอย่างข้างต้น คือ

Order ordering : อยู่ใน Module mod_access_compat, ค่า ordering ที่สามารถกำหนดได้คือ

Allow, Deny ซึ่งจะพิจารณาการอนุญาตก่อนปฏิเสธ และ Deny, Allow จะปฏิเสะก่อนแล้วพิจารณาอนุญาต ให้เข้าถึงไฟล์ หรือ ไดเรคทอรี่ต่างๆ

Deny all|host : อยู่ใน Module mod_access_compat, ค่า all หมายถึง ปฏิเสธทุกการเชื่อมต่อจากทุกๆที่, host สามารถเป็น IP Address หรือ URL ก็ได้

Allow all|host : อยู่ใน Module mod_access_compat, ค่า all หมายถึง ยอมรับทุกการเชื่อมต่อจากทุกๆที่, host สามารถเป็น IP Address หรือ URL ก็ได้

ดังนั้น ไฟล์ /etc/apache2/conf.d/jce ซึ่งมีเนื้อหาว่า

<DirectoryMatch ".*/images/stories/.*>
 <FilesMatch "\.php$">
       Order Deny,Allow
       Deny from All
 </FilesMatch>
</DirectoryMatch>

หมายถึง ถ้ามีการเรียก ไฟล์ที่อยู่ใน directory อะไรก็ตามที่มีส่วนหนึ่งของ Path เป็น images/stories ก็จะ ไปดูว่า ชื่อไฟล์ที่เรียกนั้น มีนามสกุลเป็น .php หรือไม่ (.* แปลว่า ตัวอักษรอะไรก็ได้, \. หมายถึงจุด “.” ที่ใช้เชื่อม filename และ extenstion และ $ หมายถึง สิ้นสุดข้อความ) ถ้าเป็นการเรียกไฟล์ .php ใน images/stories ก็จะ ปฏิเสธเสมอ (Deny from ALL)

ที่มา : http://sysadmin.psu.ac.th/2014/01/10/web-hacking-and-security-workshop/