How to exploit the Android Services using Drozer– Sieve

บทนำ (Overview)

บทความนี้นำเสนอ การตรวจสอบ “Android Components” ที่ชื่อว่า “Service” ซึ่งลักษณะเหมือน “Activity” แต่ไม่มี “User Interface” สามารถรับค่าจาก “Application” อื่น ๆ และ “Return” กลับค่าไปเช่นกัน ซึ่งบางครั้ง Service อาจจะไม่มีการป้องกันเพียงพอ ส่งผลให้เกิดช่องโหว่ที่สามารถนำไปสู่การโจมตีจากโปรแกรมประสงค์ร้ายได้เช่นกัน

ขั้นตอน (Steps)

  1. ติดตั้งโปรแกรม “Sieve” บทเครื่องAndroid หรือ Emulator (How to install sieve.apk on Genymotion Emulator)
  2. ตั้งรหัสผ่าน แล้วกดปุ่ม “Submit”
  3. จากนั้นตั้งค่า “PIN” แล้ว “Submit”
  4. เมื่อเสร็จสิ้นให้ “Sign-in” โดย “password” ที่ตั้งครั้งแรก sieve-06
  5. ให้กดปุ่ม + เพื่อเพิ่มรหัสผ่านใหม่
  6. กรอกข้อมูลแล้วกดปุ่ม “Save” sieve-08
  7. ข้อมูลจะถูกเพิ่มขึ้นเรื่อย ๆ sieve-09
  8. ติดตั้งและตั้งค่าสำหรับโปรแกรม “Drozer” (How to set Drozer)
  9. เรียกใช้ 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
    


  10. ตรวจสอบชื่อ “package” โดยใช้คำสั่งค้นหา
    //ทดลองเดาชื่อโปรแกรม หรือคำอื่น ๆ เพื่อช่วยในการค้นหา
    dz> run app.package.list -f sieve
    com.mwr.example.sieve (Sieve)
    


  11. จากนั้นไปหายอดสรุปก่อนว่า “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
    


  12. จากนั้นลองเข้าไปดูตรวจสอบในไฟล์ “Android Manifest” ตามรูป insecureservice01
  13. จากนั้นลองตรวจสอบสอบ “Service” ที่เปิด “Export” ต้างการ “permission” พิเศษอื่นๆ ใดบ้างเมื่อต้องงานใช้งาน Service พบว่าไม่ต้อง permission พิเศษ อื่น ๆ insecureservice02
  14. ให้ “Convert Byte-code” เพื่อตรวจสอบ “Source-code” ที่เกี่ยวข้องกับ “Services” สามารถติดตามได้ที่บทความ
  15. ให้ใช้คำค้นหาเกี่ยวกับ “Service” ที่เป็น “Exported” (AuthService และ CryptService) เพื่อตรวจสอบฟังก์ชันการทำงานที่เกี่ยวข้อง  insecureservice03
  16. ให้ค้นหา Class, method, variables ที่เกี่ยวข้องกับคำค้นหาใน source-code จากรูปเราพบว่า insecureservice04
  17. ในการเรียกใช้งาน “services” ผ่าน “Drozer” เราจะต้องส่ง “messages” ที่ประกอบไปด้วย “argument” 3 ตัว (what, arg1, arg2) จากตัวอย่างเราพบว่ามีinsecureservice06
    1. arg1 = 9234
    2. “Type” คือรับ “parameter” ประเภท “String”
    3. “Value” โดยค่ามี “Key” สำหรับการอ้างอิงคือ “com.mwr.example.sieve.PIN”
  18. ถ้า “Services” ได้รับค่าตามข้างต้น มันจะไปเรียกใช้งานฟังก์ชัน “get key”  ซึ่งทำหน้าที่ในการดึง password จากฐานข้อมูลและส่งกลับไป insecureservice07
  19. จากตอนนี้ในส่วนของ “What Argument” เรายังไม่ทราบจึงจำเป็นต้องลองหาและทดสอบคำสั่งการเรียกใช้งาน “Service” ไปเรื่อยจนพบว่า “MSG_CHECK value  = 2354” น่าจะเป็นส่วนของ “What Argument” insecureservice08
  20. อย่างไรก็ตามเมื่อเราลองตรวจสอบ “Source-code” ไปเรื่อยๆ จะพบฟังก์ชัน “Check pin” มีการเรียกใช้งาน “Android Services” ดังรูป insecureservice09
  21. ที่นี้เราลองใช้คำสั่งของ “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
    
  22. เราจะพบว่าถ้าใส่ “PIN” ถูกต้อง “Service” จะตอบกลับ “password” กลับมา insecureservice10
  23. แต่ถ้าไม่ถูกต้องจะเป็นดังนี้ จากช่องโหว่ดังกล่าวนำไปสู่การ “Bruteforce PIN” เพื่อการค้นหา “Password” ได้เช่นกันinsecureservice11

ใส่ความเห็น