รวมคำสั่งตั้งค่าเปิดปิด Proxy ผ่าน USB รวดเดียว บนเครื่องจริง

บทความนี้กล่าวถึงการใช้งานเครื่องมือที่ชื่อว่า 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 ผ่านสาย USB
แค่เปิด Burp ไม่ต้อง Set ค่า ใด ๆ ก็สามารถใช้งานได้ทันที
ทดสอบดักจับข้อมูล

อธิบายการทำงานที่สำคัญ

ฟังก์ชันนี้ใช้สำหรับการตั้งค่า 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")

ฟังก์ชันนี้จะดำเนินการดังนี้:

  1. check_adb():
    • ฟังก์ชันนี้จะตรวจสอบว่า ADB (Android Debug Bridge) กำลังทำงานหรือไม่
    • ถ้า ADB กำลังทำงาน ฟังก์ชันนี้ควรจะคืนค่าที่ไม่ใช่ None (นั่นคือเป็นบางค่าที่เกี่ยวข้องกับ ADB อาจเป็น PID, สถานะ, หรืออื่นๆ)
  2. adb_shell_settings_put_global_http_proxy(':0', "Clear USB Proxy"):
    • คำสั่งนี้จะใช้ ADB เพื่อเข้าถึงการตั้งค่าของ Android แล้วยกเลิกการตั้งค่า Proxy ของ USB โดยการเรียก settings put global http_proxy และกำหนดค่า proxy เป็น :0
  3. adb_shell_settings_put_global_http_proxy('127.0.0.1:8080', "Set USB proxy"):
    • คำสั่งนี้เหมือนกับคำสั่งที่สอง แต่คราวนี้เป็นการตั้งค่า proxy ของ USB ให้เป็น 127.0.0.1:8080 ซึ่งเป็นที่อยู่ของ proxy server ที่ทำงานภายในเครื่อง
  4. 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)

ฟังก์ชันนี้จะดำเนินการดังนี้:

  1. def adb_shell_settings_put_global_http_proxy(proxy, cmd)::
    • การประกาศฟังก์ชันชื่อ adb_shell_settings_put_global_http_proxy ซึ่งรับพารามิเตอร์ 2 ตัวคือ proxy และ cmd
  2. command = ['adb', 'shell', 'settings', 'put', 'global', 'http_proxy', proxy]:
    • สร้างลิสต์ command ที่ประกอบไปด้วยสตริงซึ่งแสดงถึงคำสั่งเต็มๆที่จะถูกสั่งให้ ADB ทำงาน
    • คำสั่งนี้จะใช้เพื่อเปลี่ยนหรือตั้งค่า proxy ใน Android ผ่าน adb shell
    • proxy คือพารามิเตอร์ที่ได้รับมาจากการเรียกฟังก์ชัน และจะเป็นค่าที่เราต้องการตั้งในการตั้งค่า proxy (เช่น ‘127.0.0.1:8080’ หรือ ‘:0’)
  3. 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)

ฟังก์ชันนี้จะดำเนินการดังนี้:

  1. def adb_reverse(port, cmd)::
    • ประกาศฟังก์ชันชื่อ adb_reverse ซึ่งรับพารามิเตอร์ 2 ตัวคือ port และ cmd
  2. command = ['adb', 'reverse', f'tcp:{port}', f'tcp:{port}']:
    • สร้างลิสต์ command ที่ประกอบไปด้วยสตริงเพื่อใช้ในการสั่งงาน ADB
    • adb reverse เป็นคำสั่งที่ใช้สร้างการเชื่อมต่อ reverse port forwarding ระหว่างเครื่องคอมพิวเตอร์และอุปกรณ์ Android
    • f'tcp:{port}' ในส่วนนี้เป็นการใช้ formatted string literals (หรือ f-strings) ใน Python เพื่อแทรกค่าของ port ลงไปในสตริง, ดังนั้นถ้า port เป็น 8080 สตริงนี้จะกลายเป็น ‘tcp:8080’
    • การใช้ f'tcp:{port}' สองครั้งแสดงว่ามันกำลังสั่งให้ ADB สร้างการเชื่อมต่อระหว่าง port นั้นในเครื่องคอมพิวเตอร์และ port เดียวกันในอุปกรณ์ Android
  3. run_command(command, False, "ADB reverse: " + cmd):
    • เรียกใช้ฟังก์ชัน run_command กับลิสต์ command ที่สร้างขึ้นจากขั้นตอนก่อนหน้า
    • False เป็นพารามิเตอร์ที่กำหนดว่าการทำงานของคำสั่งนั้นๆควรเป็นแบบ synchronous หรือไม่
    • "ADB reverse: " + cmd คือข้อความที่ระบุคำอธิบายหรือสถานะของคำสั่งที่กำลังทำงาน

อ้างอิง