การแก้ไขเครื่องบริการเมื่อพบ DoS ผ่าน xmlrpc.php

netstat check connection
netstat check connection

วันนี้ (5 เม.ย.59) เครื่องบริการหนึ่งที่บริการผ่าน host name 3 ตัว
ปฏิเสธการให้บริการเป็นระยะ บางทีก็ตอบ บางทีก็ไม่ตอบ
พอใช้ remote desktop เข้าไปก็ได้ response time ที่ปกติ
จะ ping ก็ปกติ ปัญหามีเฉพาะ web server ผ่าน port 80
ก็ต้องแก้ไขกันไปตามอาการครับ
1. เข้าดู Access.log เข้าดูด้วย notepad ก็ไม่ได้
จะเข้าดูด้วย editplus ก็แฟ้มใหญ่เกินไป เพราะไม่เคย clear
ขนาดเกือบ 2GB จึงต้องลบทิ้งไปก่อน
แต่พบปัญหาว่า
จะลบก็ไม่ได้ เพราะ service start อยู่
จะ stop service ก็ไม่ได้ เครื่องค้าง
สรุปว่าต้อง restart
หลัง restart เข้า stop service ทันที แล้วลบ log
2. ใช้ DOS>netstat -na | more
พบว่าเครื่องโดนโจมตี Denied of Service Attack เข้าแล้ว
เพราะเห็นเครื่องบริการอยู่ 2 IP หลายร้อยการเชื่อมต่อ
3. เข้าดู access.log พบว่าแฟ้มที่โดนคือ xmlrpc.php
4. พบคำอธิบายการแก้ปัญหาที่
+ http://www.thaiseoboard.com/index.php?topic=354223.25;imode
+ https://httpd.apache.org/docs/current/howto/htaccess.html
+ http://www.mikevanwinkle.com/block-a-hacker-post-attack-on-wordpress-xmlrpc-php/
+ http://stackoverflow.com/questions/24472349/htaccess-doesnt-work-on-xampp-windows-7
5. เลือกแก้ปัญหาด้วยการใช้ .htaccess
การทำให้ .htaccess ทำงานได้ ทำโดยแก้ไขแฟ้ม httpd.conf

old #AllowOverride All
new AllowOverride All
old #LoadModule rewrite_module modules/mod_rewrite.so
new LoadModule rewrite_module modules/mod_rewrite.so

6. ทดสอบสั่ง block เครื่องบริการด้วย user authentication

AuthType Basic
AuthName “Password Protected Area”
AuthUserFile /.htpasswd
Require valid-user
ถ้าเปิดเว็บแล้ว ร้องถามรหัสผ่าน แสดงว่า .htaccess ทำงานได้ปกติ

7. การ block แฟ้ม xmlrpc.php ผ่านการกำหนดใน .htaccess ทำได้หลายวิธี
วิธีแรก
<Files “xmlrpc.php”>
Order Allow,Deny
Deny from all
</Files>
วิธีที่สอง
Order Deny,Allow
Allow from 122.154.225.
Deny from 89.248.167.
Deny from 185.103.252.
วิธีที่สาม
if ( strpos($_SERVER[‘HTTP_USER_AGENT’], “Googlebot”) === true ) { exit(); }

8. จาก 3 วิธีข้างต้น ผมเลือกวิธีแรก
เพราะไม่ต้องกังวลว่า ผู้ร้ายจะใช้เครื่องเบอร์อื่นโจมตีเข้ามาอีก
ปิดให้หมด ไม่ต้องบริการไปเลย

9. เข้าดู access.log ก็จะพบข้อความใน 3 ลักษณะ
คือ error แบบ 403 นี่แสดงว่ามีการควบคุม หรือเครื่องบริการเอาอยู่
ถ้าบริการปกติเป็น 200 หากไม่มีการ block แล้วปล่อยให้บริการปกติ เราจะพบ 200
ถ้าถูกโจมตีเครื่องจะหยุดบริการตามปกติจะพบ 200 สลับ 500 แบบนี้ไม่ดีแน่
อ่านความหมายของ 200, 403 และ 500 ข้างล่างนี้ได้

403 – Forbidden or Connection refused by host (เครื่องบริการปฏิเสธผู้ร้องขอข้อมูล อาจสงสัยผู้ร้องขอเป็นผู้ร้าย)
185.103.252.14 – – [05/Apr/2016:20:33:22 +0700] “POST /xmlrpc.php HTTP/1.1” 403 1044 “-” “Googlebot/2.1 (+http://www.google.com/bot.html)”
89.248.167.131 – – [05/Apr/2016:20:33:23 +0700] “POST /xmlrpc.php HTTP/1.1” 403 1044 “-” “Googlebot/2.1 (+http://www.google.com/bot.html)”

200 OK (ทุกอย่างปกติ)
89.248.167.131 – – [05/Apr/2016:20:36:33 +0700] “POST /xmlrpc.php HTTP/1.1” 200 370 “-” “Googlebot/2.1 (+http://www.google.com/bot.html)”
185.103.252.14 – – [05/Apr/2016:20:36:33 +0700] “POST /xmlrpc.php HTTP/1.1” 200 370 “-” “Googlebot/2.1 (+http://www.google.com/bot.html)”

500 Server Error (เครื่องบริการมีข้อผิดพลาด)
185.103.252.14 – – [05/Apr/2016:20:36:33 +0700] “POST /xmlrpc.php HTTP/1.1” 500 – “-” “Googlebot/2.1 (+http://www.google.com/bot.html)”
89.248.167.131 – – [05/Apr/2016:20:36:33 +0700] “POST /xmlrpc.php HTTP/1.1” 500 – “-” “Googlebot/2.1 (+http://www.google.com/bot.html)”

trackbacks
trackbacks

10. เมื่อกำหนด .htaccess เพื่อปฏิเสธการให้บริการกับเครื่องที่ไม่ประสงค์ดีแล้ว
ก็จะพบรายงานใน access.log มาเรื่อย ๆ ว่าปฏิเสธ แล้วแสดง 403
ซึ่งไม่เป็นปัญหาแต่อย่างใด ยกเว้น access.log จะใหญ่ไปหน่อย
ดังนั้นว่าง ๆ ก็เข้าไปดูแล และ clear ตามรอบเวลาที่ตั้งไว้

11. xmlrpc.php เป็นความสามารถหนึ่งของ wordpress
แต่ผู้ไม่ประสงค์ดีเลือกใช้บริการตัวนี้ ก่อความเสียหายให้กับเครื่องบริการ
โดย xmlrpc.php ใช้กับงาน pingback หรือ trackback
เลือกชี้ไปยังเครื่องเป้าหมาย แล้วทำให้เครื่องเป้าหมายล้มไปเลย
ครั้งนี้เครื่องของผมเป็นเป้าหมาย ถูกยิงมาจากทั่วสารทิศ

pingback
pingback

12. วิธีแก้ง่าย ๆ คือ ลบ xmlrpc.php ทิ้งไปเลย
แค่นี้ก็หมดปัญหา แต่จะรู้สึกเสียดายกับความสามารถเรื่อง pingback กับ trackback เท่านั้นเอง
[pingback] เกิดเมื่อเขียน post ใน Blog A แล้วอ้างถึง post ใน Blog B
เท่ากับว่ามีการ Comment สำหรับ post ใน Blog B
แล้วมีข้อความแจ้งกับไปยัง Blog B ว่าท่านถูก Comment จาก Blog A นะ
เมื่อผู้ดูแล Blog A รับทราบก็จะกดอนุมัติให้มีการ Pingback
http://www.wpbeginner.com/beginners-guide/what-why-and-how-tos-of-trackbacks-and-pingbacks-in-wordpress/

13. ปัญหานี้ ถ้าติดตั้ง Plugin อาจช่วยได้อีกแรง
เช่น Akismet
http://www.wpbeginner.com/beginners-guide/akismet-101-guide-for-all-wordpress-users/
Akismet is a comment spam filtering service. The name Akismet comes from Automattic and Kismet. Auttomatic is the company behind Akismet, and it was founded by the WordPress co-founder Matt Mullenweg. Akismet catches blog comment and pingback spam using their algorithms

Author: บุรินทร์ รุจจนพันธุ์

I am Lecturer, Developer, Researcher, Columnist, Writer, Photographer, and Webmaster - L@mpang man

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.