การใช้เครื่องมือ Frida และ Objection สำหรับ Mobile Penetration Testing
- Terat Burami
- 4 วันที่ผ่านมา
- ยาว 2 นาที
Frida คืออะไร? Frida คือเครื่องมือที่ช่วยให้เราสามารถ inject โค้ดเข้าไปใน process ของแอปพลิเคชันที่กำลังทำงานอยู่บนอุปกรณ์เพื่อดูการทำงาน แก้ไขค่า หรือ Hook method เพื่อข้ามข้อจำกัดต่างๆได้
แล้ว Objection คืออะไร? Objection เป็น Runtime Mobile Exploration Toolkit ที่สร้างครอบ Frida อีกที เพื่อให้การใช้งานง่ายมากขึ้น โดยมีคำสั่งสำเร็จรูปให้ใช้โดยไม่ต้องมานั่งเขียน JavaScript เองทั้งหมด
ประโยชน์ของการใช้ Frida และ Objection สำหรับ Mobile Penetration Testing:
ประหยัดเวลา ไม่ต้องเขียน Script เองใหม่ทั้งหมดทุกรอบ
ข้ามกลไกความปลอดภัยเบื้องต้นได้ง่ายมากขึ้น เช่น Root/Jailbreak Detection, SSL Pinning ในบางรูปแบบ
สามารถสำรวจ Class, Method และตัวแปรต่างๆ ใน Memory ได้แบบ Real-time ระหว่างที่แอปกำลังทำงาน
การเตรียมความพร้อมและติดตั้ง
ส่วนของการเตรียมเครื่องมือให้พร้อมสำหรับการทดสอบ ในตัวอย่างนี้จะอิงจากระบบปฏิบัติการ macOS หรือ Linux ซึ่งเหมาะกับงาน Mobile Penetration Testing
สิ่งที่ต้องมี:
Python 3 และ pip3
Android Emulator เช่น Android Studio AVD หรืออุปกรณ์ Android จริงที่ผ่านการ Root แล้ว
ขั้นตอนการติดตั้ง:
ติดตั้ง Frida และ Objection บนเครื่องคอมพิวเตอร์เครื่องหลักของเรา:
pip3 install frida-tools
pip3 install objection
ติดตั้ง Frida Server บน Android:
เช็คสถาปัตยกรรมของ Android ก่อนว่าเป็น x86 หรือ arm
ดาวน์โหลด frida-server จาก GitHub ให้ตรงกับสถาปัตยกรรมของ Android และตรงกับเวอร์ชันของ frida-tools บนเครื่องเรา
แตกไฟล์ออกมาและใช้คำสั่ง adb push เพื่อส่งไฟล์เข้าไปที่ /data/local/tmp/ (หรือโฟลเดอร์ไหนก็ได้ที่สามารถ push ไฟล์เข้าไปได้และไม่ติดเรื่อง Permission)
รัน chmod +x และรัน frida-server เป็น Background process โดยใช้คำสั่ง
adb shell
su
cd /data/local/tmp/
chmod +x frida-server
./frida-server & เพียงเท่านี้ทั้งเครื่องมือ frida และ objection ก็พร้อมใช้งานผ่าน frida-tools บนเครื่องหลักของเราแล้ว
ทำความรู้จักกับ WaTFBank
WaTFBank เป็นโปรเจค Open-source แอปธนาคารจำลองที่จงใจใส่ช่องโหว่ไว้ เพื่อใช้สำหรับฝึกทักษะ Mobile App Pentest โดยเฉพาะ โดยการติดตั้ง WaTFBank สามารถเข้าไปที่ https://github.com/WaTF-Team/WaTF-Bank และทำตาม instruction บน GitHub ได้เลย
ตัวอย่างการเจาะระบบ WaTFBank
หลังจากที่เราทำการติดตั้งและเปิดใช้งาน WaTF Server เรียบร้อยแล้ว ให้ทำการโหลด apk จาก GitHub และใช้คำสั่ง
adb install watf-bank.apkหรือถ้าใช้ emulator อย่าง Android Studio สามารถที่จะลากไฟล์ watf-bank.apk จากเครื่องหลักเข้ามายัง Android emulator ได้เลย
เมื่อเข้ามายังแอปพลิเคชันจะเจอกับหน้า Login โดยสามารถใช้ credential ด้านล่างนี้ในการทดลองเจาะระบบได้เลย และใส่ IP Address จากเครื่องหลักของเราที่ใช้เปิด Server
Password | Account Number | Username |
michael123 | 1111111111 | michael |
william123 | 2222222222 | william |
emma123 | 3333333333 | emma |
jacob123 | 4444444444 | jacob |
หลังจากเข้าสู่ระบบ แอปพลิเคชันจะให้เราตั้งค่า PIN สมมติว่าเราตั้งค่า PIN เป็น 1111 ก็จะสามารถเข้ามายังหน้าแอปพลิเคชันได้

รูปที่ 1 หน้าแรกของแอป WaTF
เมื่อเราออกแอปพลิเคชันแล้วเข้าใหม่อีกครั้ง จะมีให้กรอกรหัส PIN ที่เราตั้งไว้ก่อนหน้านี้ เมื่อเราลองกรอก 2222 ไป แอปพลิเคชันก็จะมีการตรวจสอบ PIN และแน่นอนว่ารหัสผิดเพราะเราตั้งไว้เป็น 1111

รูปที่ 2 หน้ากรอกรหัส PIN
เริ่มการวิเคราะห์
จากนั้นเราลองใช้เครื่องมือเช่น mobsf หรือ JADX เพื่อใช้ในการวิเคราะห์โครงสร้างและ Config ของแอปพลิเคชัน เมื่อเราเข้าไปดู AndroidManifest.xml ของแอปพลิเคชัน เราจะเห็นว่ามีการเรียกใช้ Activity ที่มีชื่อว่า CheckPin

รูปที่ 3 AndroidManifest.xml
วิเคราะห์โค้ดของคลาส CheckPinสเต็ปถัดไปคือการเข้าไปแกะโค้ดของ class CheckPin ว่าทำงานอย่างไร หลังจากที่เราเข้าไปวิเคราะห์ class CheckPin จะเห็น method checkPin ที่เอาไว้เช็คว่า PIN ที่ User กรอกมาตรงกับ PIN ที่เซ็ตไว้ในแอปพลิเคชันหรือไม่ โดยการ Return ค่า Boolean ออกมา

รูปที่ 4 ฟังก์ชัน checkPin ในคลาส CheckPin
เขียน Attack Scriptพอเรารู้แล้วว่าขั้นตอนการเช็ครหัส PIN เกิดขึ้นบน local ทั้งหมด ทำให้เราสามารถใช้ frida ในการดักและเปลี่ยนค่า return จาก pin.equals(pinEnter); เป็น return true; ทำให้ไม่ว่าเราจะใส่อะไรเข้าไปก็จะถูกเสมอ
โดยการเขียนโค้ด Javascript method เดียวกันกับ checkPin เพื่อให้มัน override ฟังก์ชันมารันฟังก์ชันของเราแทนที่จะไปรัน method checkPin จริงๆของแอปพลิเคชัน และเซฟไฟล์เป็น .js เพื่อไปใช้รัน frida

รูปที่ 5 script ที่จะใช้โจมตี
จากนั้นก็ใช้คำสั่ง frida -U -f com.WaTF.WaTFBank -l checkPin.js เพื่อรัน script ที่เราเตรียมไว้ เมื่อทำการรันคำสั่ง frida จะ spawn แอปพลิเคชันขึ้นมาพร้อมกับ override method ตาม script ของเรา
แอปพลิเคชันจะให้เรากรอกรหัส PIN ตามปกติ ให้เราลองกรอกรหัสที่ผิดไป

รูปที่ 6 หน้ากรอก PIN
Bypass สำเร็จจะพบว่าเราสามารถเข้าใช้งานแอปพลิเคชันได้ทันทีแม้ว่ารหัส PIN ที่กรอกไปจะไม่ตรงกับ PIN ที่ตั้งไว้ตอนแรก เพราะว่าแอปพลิเคชันได้เรียกใช้ method ที่เราทำขึ้นมาแทนที่จะไปเรียก method จากตัวแอปพลิเคชันเอง ทำให้มัน return true ตลอดเวลาไม่ว่าเราจะกรอกอะไรลงไป

รูปที่ 7 หน้าแรกของแอป WaTF
การใช้ Objection เพื่อ Bypass รหัส PIN
แทนที่เราจะต้องมานั่งเขียนสคริปต์ JavaScript เองยาวๆ เราสามารถใช้คำสั่งของ Objection เพื่อบังคับเปลี่ยนค่า Return ได้เลยทันที ทำให้รวดเร็วและง่ายมากขึ้น เริ่มแรกให้เราเข้าไปยังตัวแอปพลิเคชันด้วยคำสั่ง:
objection -g com.WaTF.WaTFBank exploreเมื่อเข้ามาอยู่ในหน้าต่างของ Objection แล้ว เราสามารถใช้คำสั่ง android hooking set return_value เพื่อบังคับให้ method checkPin คืนค่าเป็น true เสมอ ไม่ว่าผู้ใช้จะกรอกอะไรมาก็ตาม ตามคำสั่งด้านล่าง
android hooking set return_value com.WaTF.WaTFBank.CheckPin checkPin trueเพียงเท่านี้ ไม่ว่าเราจะกรอก PIN ผิดไปเป็นเลขอะไร ตัวแอปก็จะมองว่าเรากรอกถูกเสมอและยอมให้เราเข้าสู่ระบบได้ทันที ซึ่งแสดงให้เห็นว่า Objection ช่วยให้เราทำ Hooking ได้อย่างรวดเร็วมากขึ้น
สรุป
จากเคสการเจาะ WaTFBank ครั้งนี้ จะเห็นได้ชัดเจนเลยว่าการออกแบบแอปพลิเคชันโดยปล่อยให้ฝั่ง Client เป็นคนตัดสินใจเรื่องสำคัญอย่างการตรวจสอบ PIN หรือ Authentication นั้น อันตรายมาก เพราะฝั่งผู้ใช้งานหรือ Attacker สามารถใช้เครื่องมือทำอย่าง Frida เข้ามาแทรกแซง เปลี่ยนแปลงค่า และควบคุม Execution Flow ได้อย่างสมบูรณ์แบบ Frida นับว่าเป็น tool ที่ทรงพลังมากสำหรับการทำ Mobile Pentest ช่วยให้สามารถวิเคราะห์พฤติกรรมของแอปในระดับ Runtime ได้อย่างละเอียด และเมื่อนำมาใช้ประกอบกับ Objection ก็ยิ่งช่วยลดขั้นตอนจุกจิกในการเขียน Script พื้นฐาน ทำให้ Workflow การประเมินความปลอดภัยรวดเร็วขึ้น และเราสามารถเอาเวลาไปโฟกัสกับการหาช่องโหว่ที่ซ่อนอยู่ได้มากขึ้น



