วิธีการตอบโต้ bot ด้วย ZIP bomb
วันนี้เจอ blog ที่น่าสนใจของ Christian Haschek มาเลยเอามาปรับกับเว็บไซด์หน่อย 😀 เรื่องของเรื่องคือ ตัว Christian เค้าเบื่อพวกที่ชอบมานั่งใช้เครื่องมือมา scan เว็บไซด์ของเค้า หรือพวกที่พยายามจะเจาะไปที่ wp-admin ของเค้า ก็เลยทำเรื่อง Zip Bomb ขึ้นมาตอบโต้คนเหล่านั้น
Zip bomb คือการที่เราใช้งาน zip เพื่อทำการบีบอัดไฟล์ขนาดใหญ่ๆที่ไม่มีอะไรเลยนอกจาก 0 (zero) ไว้ ซึ่งโดยปกติแล้ว web browser และเครื่องมือการ scan ส่วนใหญ่รองรับการส่งข้อมูล http แบบบีบอัด (gzip) อยู่แล้ว ดังนั้นหากมีใคร scan เข้ามาก็จะส่ง zip file กลับไปให้แทนนั่นเอง
zip สามารถทำงานบีบอัดได้ขนาดไหน จะมีปัญหาการส่งทำให้ฝั่งเราต้องเสีย bandwidth ขา upload ไปแทนหรือเปล่า ยกตัวอย่างให้ดังนี้ละกัน เราสามารถ zip ไฟล์ขนาด 4.5 Peta Byte ( 4,500,000 GB) ให้เหลือแค่ 42 kilobyte เท่านั้น เมื่อพยายามเปิดไฟล์ดังกล่าวจะทำให้เกิดอาการ disk เต็มและ RAM หมดได้ แต่เนื่องด้วย http ไม่รองรับ zip ทำให้เราต้องไปใช้ gzip แทน ซึ่งผลลัพธ์ก็แตกต่างกันอยู่แต่ก็ยังถือว่าได้ผลดีระดับหนึ่งครับ
โดยเราใช้คำสั่งนี้ในการสร้าง gzip file ของ file ที่มีขนาด 10 GB
1 |
dd if=/dev/zero bs=1M count=10240 | gzip > 10G.gzip |
ซึ่งไฟล์ 10G.zip นั้นจะมีขนาดแค่ 10 MB เท่านั้น
ทีนี้หากมี bot เข้ามา(ดูจาก User-Agent)เราก็ส่ง gzip ดังกล่าวกลับไปให้โดยเขียนเป็น
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php $agent = filter_input(INPUT_SERVER, 'HTTP_USER_AGENT'); //check for nikto, sql map or "bad" subfolders which only exist on wordpress if (strpos($agent, 'nikto') !== false || strpos($agent, 'sqlmap') !== false || startswith($url,'wp-') || startswith($url,'wordpress') || startswith($url,'wp/')) { sendBomb(); exit(); } function sendBomb(){ //prepare the client to recieve GZIP data. This will not be suspicious //since most web servers use GZIP by default header("Content-Encoding: gzip"); header("Content-Length: ".filesize('10G.gzip')); //Turn off output buffering if (ob_get_level()) ob_end_clean(); //send the gzipped file to the client readfile('10G.gzip'); } function startsWith($a, $b) { return strpos($a, $b) === 0; } |
ผลจากการทดสอบเปลี่ยน User-agent ใน Browser ต่างๆ และการใช้งาน Web Vulnerability Scanner ต่างๆ จะเห็นว่ามีทั้ง Hang ไปเลย, ไม่แสดงผลลัพธ์อะไร, ใช้ RAM จนหมด นั่นหมายความว่ามันก็ work สำหรับการตอบโต้เหล่า Script Kiddy นะครับ 😀
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
ตัวอย่างการ set ใน Nginx set $perform1 false; set $perform2 false; if ($request_uri ~ '10G.php') { set $perform1 true; } if ($http_user_agent ~* '(nikto|Nikto|sqlmap)') { set $perform2 true; } if ($perform1 != $perform2) { return 301 https://www.example.com/10G.php; } |
Source:: Christian Haschek Blog