บทนำ (Overview)
บทความนี้นำเสนอ การตรวจสอบ “Android Components” ที่ชื่อว่า “Service” ซึ่งลักษณะเหมือน “Activity” แต่ไม่มี “User Interface” สามารถรับค่าจาก “Application” อื่น ๆ และ “Return” กลับค่าไปเช่นกัน ซึ่งบางครั้ง Service อาจจะไม่มีการป้องกันเพียงพอ ส่งผลให้เกิดช่องโหว่ที่สามารถนำไปสู่การโจมตีจากโปรแกรมประสงค์ร้ายได้เช่นกัน
ขั้นตอน (Steps)
- ติดตั้งโปรแกรม “Sieve” บทเครื่องAndroid หรือ Emulator (How to install sieve.apk on Genymotion Emulator)
- ตั้งรหัสผ่าน แล้วกดปุ่ม “Submit”
- จากนั้นตั้งค่า “PIN” แล้ว “Submit”
- เมื่อเสร็จสิ้นให้ “Sign-in” โดย “password” ที่ตั้งครั้งแรก
- ให้กดปุ่ม + เพื่อเพิ่มรหัสผ่านใหม่
- กรอกข้อมูลแล้วกดปุ่ม “Save”
- ข้อมูลจะถูกเพิ่มขึ้นเรื่อย ๆ
- ติดตั้งและตั้งค่าสำหรับโปรแกรม “Drozer” (How to set Drozer)
- เรียกใช้ Drozer console
//Forward port เพื่อเชื่อมต่อโปรแกรม Drozer บน Emulator หรือ Device C:\Users\[user]\Desktop λ adb forward tcp:31415 tcp:31415 //เรียกใช้งาน Drozer console C:\Users\[user]\Desktop λ drozer console connect
- ตรวจสอบชื่อ “package” โดยใช้คำสั่งค้นหา
//ทดลองเดาชื่อโปรแกรม หรือคำอื่น ๆ เพื่อช่วยในการค้นหา dz> run app.package.list -f sieve com.mwr.example.sieve (Sieve)
- จากนั้นไปหายอดสรุปก่อนว่า “Component” มีเปิด “Exported” อยู่หรือไม่
//จากตัวอย่างพบว่ามี Content providers เปิดอยู่ 2 component dz> run app.package.attacksurface com.mwr.example.sieve Attack Surface: 3 activities exported 0 broadcast receivers exported 2 content providers exported 2 services exported is debuggable
- จากนั้นลองเข้าไปดูตรวจสอบในไฟล์ “Android Manifest” ตามรูป
- จากนั้นลองตรวจสอบสอบ “Service” ที่เปิด “Export” ต้างการ “permission” พิเศษอื่นๆ ใดบ้างเมื่อต้องงานใช้งาน Service พบว่าไม่ต้อง permission พิเศษ อื่น ๆ
- ให้ “Convert Byte-code” เพื่อตรวจสอบ “Source-code” ที่เกี่ยวข้องกับ “Services” สามารถติดตามได้ที่บทความ
- ให้ใช้คำค้นหาเกี่ยวกับ “Service” ที่เป็น “Exported” (AuthService และ CryptService) เพื่อตรวจสอบฟังก์ชันการทำงานที่เกี่ยวข้อง
- ให้ค้นหา Class, method, variables ที่เกี่ยวข้องกับคำค้นหาใน source-code จากรูปเราพบว่า
- ในการเรียกใช้งาน “services” ผ่าน “Drozer” เราจะต้องส่ง “messages” ที่ประกอบไปด้วย “argument” 3 ตัว (what, arg1, arg2) จากตัวอย่างเราพบว่ามี
- arg1 = 9234
- “Type” คือรับ “parameter” ประเภท “String”
- “Value” โดยค่ามี “Key” สำหรับการอ้างอิงคือ “com.mwr.example.sieve.PIN”
- ถ้า “Services” ได้รับค่าตามข้างต้น มันจะไปเรียกใช้งานฟังก์ชัน “get key” ซึ่งทำหน้าที่ในการดึง password จากฐานข้อมูลและส่งกลับไป
- จากตอนนี้ในส่วนของ “What Argument” เรายังไม่ทราบจึงจำเป็นต้องลองหาและทดสอบคำสั่งการเรียกใช้งาน “Service” ไปเรื่อยจนพบว่า “MSG_CHECK value = 2354” น่าจะเป็นส่วนของ “What Argument”
- อย่างไรก็ตามเมื่อเราลองตรวจสอบ “Source-code” ไปเรื่อยๆ จะพบฟังก์ชัน “Check pin” มีการเรียกใช้งาน “Android Services” ดังรูป
- ที่นี้เราลองใช้คำสั่งของ “Drozer” เพื่อเรียกใช้งาน “Services” ได้ดังนี้
run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --msg 2354 9234 1 --extra string com.mwr.example.sieve.PIN 2468 --bundle-as-obj
- เราจะพบว่าถ้าใส่ “PIN” ถูกต้อง “Service” จะตอบกลับ “password” กลับมา
- แต่ถ้าไม่ถูกต้องจะเป็นดังนี้ จากช่องโหว่ดังกล่าวนำไปสู่การ “Bruteforce PIN” เพื่อการค้นหา “Password” ได้เช่นกัน