บทความนี้กล่าวถึงการใช้งานเครื่องมือที่ชื่อว่า LazyFrida เพื่อจัดการกับการตั้งค่า proxy ผ่าน USB บนอุปกรณ์ Android เครื่องจริง ผ่าน script อัตโนมัติ แทนการตั้งค่าด้วยมือที่เสียเวลา หรือในบางครั้งจำเป็นต้องเปิดหรือปิด proxy บ่อยครั้ง ได้อย่างรวดเร็วและง่ายดาย ซึ่งเป็นสิ่งที่มีความสำคัญเมื่อต้องการทดสอบเจาะระบบแอปพลิเคชันบน Android (Android Mobile Application Penetration Test) เพื่อเพิ่มความมั่นใจในความปลอดภัยและประสิทธิภาพของแอปพลิเคชัน
Warunyou Sunpachit และ Boonperm Mark
Cybersecurity consultant
LazyFrida
- เปิด Burp Suite เพื่อการสร้าง, การเข้าถึง, และการส่งออก certificate ที่จะใช้งานร่วมกับ Burp Suite.
- เอาสายเสียบ Android (เครื่องต้อง Root เรียบร้อย) เพื่อสามารถติดต่อกับอุปกรณ์ผ่านสาย USB เพื่อรันคำสั่ง, ติดตั้งแอป, และดำเนินการอื่น ๆ ที่ต้องการสิทธิ์สูง
- เปิด USB debugging เพื่อสามารถเชื่อมต่อกับอุปกรณ์ Android ผ่านสาย USB และส่งคำสั่งต่าง ๆ ไปยังอุปกรณ์ได้
- ตั้งค่า Burp Suite Porxy Burp
- ดาวน์โหลดเพื่อใช้งาน https://github.com/thaisingle/lazyfrida
- เรียกใช้คำสั่งตามข้างล่างเพื่อเปิดหรือเปิดใช้งาน Proxy
แสดงวิธีตั้งค่า Proxy
-u USB_PROXY [USB_PROXY ...], --usb-proxy USB_PROXY [USB_PROXY ...]
start and stop the usb proxy
potential parameters: start, stop
เปิดใช้งาน Proxy
python lazyfrida.py -u start
ปิดใช้งาน Proxy
python lazyfrida.py -u stop



อธิบายการทำงานที่สำคัญ
ฟังก์ชันนี้ใช้สำหรับการตั้งค่า proxy บนอุปกรณ์ Android ผ่าน ADB มันยกเลิกการตั้งค่า proxy เก่า (ถ้ามี) และตั้งค่า proxy ใหม่เป็น 127.0.0.1:8080และตั้งค่า port forwarding ให้กับ port 8080
def start_proxy():
if check_adb() is not None:
adb_shell_settings_put_global_http_proxy(':0', "Clear USB Proxy")
adb_shell_settings_put_global_http_proxy('127.0.0.1:8080', "Set USB proxy")
adb_reverse('8080', "Set Port")
ฟังก์ชันนี้จะดำเนินการดังนี้:
check_adb():- ฟังก์ชันนี้จะตรวจสอบว่า ADB (Android Debug Bridge) กำลังทำงานหรือไม่
- ถ้า ADB กำลังทำงาน ฟังก์ชันนี้ควรจะคืนค่าที่ไม่ใช่
None(นั่นคือเป็นบางค่าที่เกี่ยวข้องกับ ADB อาจเป็น PID, สถานะ, หรืออื่นๆ)
adb_shell_settings_put_global_http_proxy(':0', "Clear USB Proxy"):- คำสั่งนี้จะใช้ ADB เพื่อเข้าถึงการตั้งค่าของ Android แล้วยกเลิกการตั้งค่า Proxy ของ USB โดยการเรียก
settings put global http_proxyและกำหนดค่า proxy เป็น:0
- คำสั่งนี้จะใช้ ADB เพื่อเข้าถึงการตั้งค่าของ Android แล้วยกเลิกการตั้งค่า Proxy ของ USB โดยการเรียก
adb_shell_settings_put_global_http_proxy('127.0.0.1:8080', "Set USB proxy"):- คำสั่งนี้เหมือนกับคำสั่งที่สอง แต่คราวนี้เป็นการตั้งค่า proxy ของ USB ให้เป็น
127.0.0.1:8080ซึ่งเป็นที่อยู่ของ proxy server ที่ทำงานภายในเครื่อง
- คำสั่งนี้เหมือนกับคำสั่งที่สอง แต่คราวนี้เป็นการตั้งค่า proxy ของ USB ให้เป็น
adb_reverse('8080', "Set Port"):- ฟังก์ชันนี้ใช้ ADB เพื่อสร้างการเชื่อมต่อ reverse port forwarding ซึ่งเป็นการเชื่อมต่อ port ในเครื่องคอมพิวเตอร์กลับไปยังอุปกรณ์ Android ที่เชื่อมต่อผ่าน ADB
- โดยที่
8080น่าจะเป็น port ที่ต้องการสร้างการเชื่อมต่อ
คำสั่งตั้งค่า proxy
def adb_shell_settings_put_global_http_proxy(proxy, cmd):
command = ['adb', 'shell', 'settings', 'put', 'global', 'http_proxy', proxy]
run_command(command, False, "ADB shell settings put global http_proxy: " + cmd)
ฟังก์ชันนี้จะดำเนินการดังนี้:
def adb_shell_settings_put_global_http_proxy(proxy, cmd)::- การประกาศฟังก์ชันชื่อ
adb_shell_settings_put_global_http_proxyซึ่งรับพารามิเตอร์ 2 ตัวคือproxyและcmd
- การประกาศฟังก์ชันชื่อ
command = ['adb', 'shell', 'settings', 'put', 'global', 'http_proxy', proxy]:- สร้างลิสต์
commandที่ประกอบไปด้วยสตริงซึ่งแสดงถึงคำสั่งเต็มๆที่จะถูกสั่งให้ ADB ทำงาน - คำสั่งนี้จะใช้เพื่อเปลี่ยนหรือตั้งค่า proxy ใน Android ผ่าน
adb shell proxyคือพารามิเตอร์ที่ได้รับมาจากการเรียกฟังก์ชัน และจะเป็นค่าที่เราต้องการตั้งในการตั้งค่า proxy (เช่น ‘127.0.0.1:8080’ หรือ ‘:0’)
- สร้างลิสต์
run_command(command, False, "ADB shell settings put global http_proxy: " + cmd):- การเรียกฟังก์ชัน
run_commandด้วยลิสต์commandที่ได้จากขั้นตอนก่อนหน้า - ฟังก์ชัน
run_commandเป็นฟังก์ชันที่สั่งให้คำสั่งในลิสต์commandถูกสั่งให้ทำงาน Falseน่าจะเป็นพารามิเตอร์ที่กำหนดว่าการทำงานของคำสั่งนั้นๆควรเป็นแบบ synchronous (ไม่ต้องรอคำสั่งให้เสร็จสิ้นก่อนที่จะดำเนินการต่อ) หรือไม่"ADB shell settings put global http_proxy: " + cmdคือข้อความที่ระบุคำอธิบายหรือสถานะของคำสั่งที่กำลังทำงาน
- การเรียกฟังก์ชัน
การสร้าง reverse port forwarding, ซึ่งหมายถึงการส่งต่อการเชื่อมต่อจาก port บนอุปกรณ์ Android ไปยัง port บนเครื่องคอมพิวเตอร์
def adb_reverse(port, cmd):
command = ['adb', 'reverse', f'tcp:{port}', f'tcp:{port}']
run_command(command, False, "ADB reverse: " + cmd)
ฟังก์ชันนี้จะดำเนินการดังนี้:
def adb_reverse(port, cmd)::- ประกาศฟังก์ชันชื่อ
adb_reverseซึ่งรับพารามิเตอร์ 2 ตัวคือportและcmd
- ประกาศฟังก์ชันชื่อ
command = ['adb', 'reverse', f'tcp:{port}', f'tcp:{port}']:- สร้างลิสต์
commandที่ประกอบไปด้วยสตริงเพื่อใช้ในการสั่งงาน ADB adb reverseเป็นคำสั่งที่ใช้สร้างการเชื่อมต่อ reverse port forwarding ระหว่างเครื่องคอมพิวเตอร์และอุปกรณ์ Androidf'tcp:{port}'ในส่วนนี้เป็นการใช้ formatted string literals (หรือ f-strings) ใน Python เพื่อแทรกค่าของportลงไปในสตริง, ดังนั้นถ้าportเป็น 8080 สตริงนี้จะกลายเป็น ‘tcp:8080’- การใช้
f'tcp:{port}'สองครั้งแสดงว่ามันกำลังสั่งให้ ADB สร้างการเชื่อมต่อระหว่าง port นั้นในเครื่องคอมพิวเตอร์และ port เดียวกันในอุปกรณ์ Android
- สร้างลิสต์
run_command(command, False, "ADB reverse: " + cmd):- เรียกใช้ฟังก์ชัน
run_commandกับลิสต์commandที่สร้างขึ้นจากขั้นตอนก่อนหน้า Falseเป็นพารามิเตอร์ที่กำหนดว่าการทำงานของคำสั่งนั้นๆควรเป็นแบบ synchronous หรือไม่"ADB reverse: " + cmdคือข้อความที่ระบุคำอธิบายหรือสถานะของคำสั่งที่กำลังทำงาน
- เรียกใช้ฟังก์ชัน
