วันนี้ทางทีมงาน TechTalkThai ได้รับเกียรติจากนักเขียนรับเชิญ MaYaSeVeN ผู้ที่เปิดสอน Hacking Workshop สำหรับคนไทย มาเล่าประสบการณ์การเล่น Vulnhub เพื่อฝึก Hack ระบบกันแบบฟรีๆ แต่ความยากนั้นก็ยังถือว่าอยู่ในระดับที่ยากและท้าทาย ใครที่สนใจเรื่องราวแนวนี้พลาดไม่ได้ ขอเรียนเชิญทุกท่านอ่านบทความจาก MaYaSeVeN กันได้เลยครับ
สวัสดีครับผม MaYaSeVeN ในบทความนี้ผมจะมานำเสนอ CTF/labs ที่เอาไว้ฝึกแฮคฟรี ที่เป็นรูปแบบ Boot-to-Root โดยในการฝึกแฮคในลักษณะนี้คือโจทย์จะให้ VM Image มาหลังจากเรา Boot VM นั้นแล้ว ก็ให้เราทำการแฮค Guest OS นั้นจนได้สิทธิ์ Root นั้นละครับ Boot-to-Root
รู้จักกับ Vulnhub กันก่อน
Vulnhub (https://www.vulnhub.com/) คือที่รวบรวม Vulnerable By Design หรือ VM Image ที่มีช่องโหว่ และเราเองก็สามารถสร้าง VM Image ที่มีช่องโหว่และอัพโหลดขึ้นไปไว้บน Vulnhub ให้คนอื่นได้ลองเล่นด้วยได้เช่นกัน ซึ่งในปัจจุบันนี้บน Vulnhub มีโจทย์ให้เราเล่นมากกว่า 140 โจทย์เลยทีเดียว

ข้อดีของโจทย์ลักษณะนี้คือเสมือนการแฮค Server จริงๆ เลย เริ่มตั้งแต่การเก็บข้อมูลเป้าหมายด้วย Nmap หาช่องโหว่จนได้ Shell และก็หาช่องโหว่อีกรอบหรือหลายรอบจนได้สิทธิ์ Root
ข้อเสียของ CTF/labs แบบ Boot-to-Root คือเป็นโจทย์แบบจำลองสถานการณ์เดียว เช่น บริษัท Best Security Inc. กำลังพัฒนา Software ตัวหนึ่งและ Server นี้กำลังทดลองให้บริการ Software ตัวนั้นอยู่ เป็นต้น นั้นหมายความว่าถ้าเราอยากจะฝึก OWASP Top 10 ให้ครบทั้ง 10 ข้อหรือหวังจะฝึกพื้นฐานอันนี้คงไม่ใช่คำตอบ เพราะโจทย์ค่อนข้างยากเลยทีเดียว
ตัวอย่างการเล่นโจทย์บน Vulnhub
ผมจะยกตัวอย่างการเล่นโจทย์ตัวหนึ่งที่ผมชอบคือ Flick II ของ Leonjza เพราะมี Mobile App มาเกี่ยวข้องด้วย โดยต้องเริ่มทำการเก็บข้อมูลจากฝั่ง Mobile App ไล่ไปเรื่อยๆ จนกระทั่งได้สิทธิ์ Root ในฝั่ง Server Side

โจทย์บอกว่าบริษัท Flick Inc. เร่งทำงานอย่างหนักเพื่อที่จะได้ปล่อย Checker App ให้ทัน Deadline ท่ามกลางความวุ่นวายในที่สุดก็ได้ App ที่ให้เราสามารถทดสอบความปลอดภัยก่อนที่จะนำไปใช้จริง (แปลให้เข้ากับสถานการณ์จริงนิดนึง 5555+)
สิ่งที่เราได้มาจากโจทย์คือไฟล์ Android .apk ที่จะนำขึ้นไปอยู่บน Play Store และไฟล์ VM ที่จะนำไปไว้บน Cloud Hosting ต่อไป
หลังจากที่ Download โจทย์มาเสร็จแล้ว ผมก็ Boot VM นั้นและนำ Android App ไปติดตั้งใน Emulator แล้วจึงทำการ Scan Port VM ด้วย Nmap จนได้ผลตามรูปด้านล่าง



เตรียม Environment เสร็จหมดแล้ว! ลุยกันต่อเลย!
ขั้นตอนต่อไปผมก็ลองเล่น Android App ในมุมผู้ใช้และพบว่า App นี้เอาไว้ Check สถานะของ Server ตามรูป

จากรูป Output เหมือนการใช้ ps ที่เป็น Linux Command ผมจึงเดาได้ว่าต้องมีการส่งคำสั่ง OS Command ไปที่ฝั่ง Server Side ซึ่งนั่นแปลว่าเราอาจจะทำ Command Injection ได้ จากนั้นผมจึงได้พยายาม Intercept การคุยกันระหว่าง Android App กับ Server Side ด้วย Burp แต่ทำได้ไม่สำเร็จ
หลังจาก Intercept ข้อมูลไม่ได้ผมก็ทำการ Decompile ตัว Android App เพื่อดูการทำงานของ Android App ได้ผลดังภาพด้านล่างนี้
ใน PubKeyManager.class ผมเจอสาเหตุว่าทำไมถึง Intercept การคุยกันระหว่าง Android App และ Server Side ไม่ได้แล้ว นั่นก็เป็นเพราะว่าตัว Android App มีการทำ Certificate Pinning ไว้นั้นเอง
หาทางจัดการกับการทำ Certificate Pinning ให้ได้
มาถึงตรงนี้ผมมีทางเลือก 2 ทางคือ
1. ทำการ Patch Android App ตัวนี้โดยการแก้ไข Dalvik Assembly Code ที่ Decompile มาเพื่อ Bypass การตรวจสอบ Certificate Pinning และทำการ Recompile กลับไปเป็นไฟล์ APK อีกครั้ง แล้วจึงใช้ Burp เพื่อ Intercept การทำงาน ได้ผลตามรูป

2. ทำการอ่าน Java Code ที่ Decompile มาว่ามันทำงานยังไงแล้วก็เขียนโปรแกรมมาส่ง Message คุยกับ API ฝั่ง Server Side โดยตรง
พอมาถึงจุดนี้หลายคนเริ่มมองออกแล้วว่า Android App ตัวนี้มีช่องโหว่อะไรให้สังเกตจากรูปบน /do/cmd/cHM= โดยคำว่า cHM= หลังจาก Decode ด้วย base64 จะได้ ps นั้นหมายความเราสามารถที่จะให้ Server รันคำสั่งอะไรก็ได้ด้วยคำสั่งในรูปแบบดังต่อไปนี้
/do/cmd/base64_encode(‘OS command’)
ผมจึงได้ทำการเขียน Exploit หรือ Code ที่ใช้โจมตีช่องโหว่เพื่อทำ Reverse Shell ตามรูป

ได้ Shell แล้ว! ต่อไปคือการเพิ่มระดับสิทธิ์!
หลังจากได้ Shell ผมก็ทำการเก็บข้อมูลเพิ่มเติมเพื่อจะหาช่องโหว่ในการเพิ่มสิทธิ์เริ่มจากอ่านไฟล์ /etc/passwd เพื่อดูว่าเครื่องนี้มี Users อะไรอยู่บ้างตามรูป

ให้เราย้อนกลับไปดูรูปหน้าตา Android App ด้านบนอีกครั้งจะเห็นว่ามีฟีเจอร์ Use Secure Access อยู่ แต่ไม่สามารถเปิดใช้ได้ผมเลยลองไปดูใน Java Code ที่ Decompile มาพบว่ามันคือ ssh นั้นเองตามรูป

จากรูปด้านบนเราจะเห็นว่าเป็นการ Login ssh ด้วย User robin นั้นเองแต่ฟีเจอร์นี้ใช้ไม่ได้เพราะ Server Side ไม่ได้เปิด Port 22 แต่จากจุดนี้เราจะได้ Password ของ User robin แต่ Password ถูก Encode อยู่ตามรูป

ผมจึงได้ทำการเขียนโปรแกรมขึ้นมาเพื่อทำการ XOR เพื่อให้ได้ Password ของ robin ตามรูป
ผลการ Decode Password ของ robin ได้ Password คือ 40373df4b7a1f413af61cf7fd06d03a565a51898
ด้วยการใช้รหัสผ่านนั้น สุดท้ายเราก็ได้ Shell บน User robin แล้ว
ในตอนนี้เราก็ได้ Shell ของ User robin บนเครื่อง Server Side ของ Android app แล้วครับ แต่โจทย์ยังไม่จบเพียงเท่านี้ สิ่งที่เราต้องทำต่อจากนี้ก็คือการหาทางเพิ่มสิทธิ์ต่อไปเรื่อยๆ จนกระทั่งได้สิทธิ์ Root มานั่นเองถึงจะถือว่าจบการทำ Boot-to-Root ในโจทย์ข้อนี้ แต่เพื่อไม่ให้บทความนี้ยาวจนเกินไป ผมขอตัดจบลงตรงนี้ ให้เพื่อนๆ ได้ลองไปเล่นกันต่อเองนะครับ

สำหรับเพื่อนๆ ที่เล่นแล้วติดขัดอะไรหรือมีคำถามสงสัย ก็สามารถเข้ามาพูดคุยกันได้ที่ Facebook Fan Page https://www.facebook.com/MaYaSeVeN-139105159494751/ เลยนะครับ
ก็จบบทความแนะนำ Vulnhub กันแบบถึงพริกถึงขิงกันไปในครั้งนี้โดยคุณ MaYaSeVeN แล้วนะครับ ทางทีมงานก็ต้องขอขอบคุณทาง MaYaSeVeN ที่ช่วยสละเวลามาให้ความรู้ผ่านทางบทความบนเว็บไซต์แก่ผู้อ่านของเราทุกท่านด้วยเช่นกัน และทางทีมงาน TechTalkThai ก็ขออนุญาตใช้พื้นที่ตรงนี้ช่วยโปรโมทคอร์ส Hacking Workshop ของ MaYaSeVeN ด้วยเลยก็แล้วกันครับ
MaYaSeVeN เปิด Hacking Workshop วันที่ 18-19 มิ.ย. แจกสิทธิ์นักศึกษาฟรี 1 ที่นั่ง โดย TechTalkThai
สำหรับผู้ที่อยากอัพเดตความรู้ทางด้าน Security ของตนเองแบบลงลึก ทาง MaYaSeVeN ได้ออกมาเปิดคอร์ส Hacking Workshop ในรอบวันที่ 18-19 มิถุนายน 2016 นี้อีกครั้ง พร้อมจับมือกับ TechTalkThai แจกสิทธิ์ให้นักศึกษาฟรี 1 ที่นั่ง โดยมีรายละเอียดเนื้อหาในคอร์สและวิธีการสมัครดังนี้ https://www.techtalkthai.com/mayaseven-opens-hacking-workshop-18-19-june-2016-with-1-free-student-quota/