IT SELECT LAB

รวมคำสั่งตั้งค่าเปิดปิด 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")

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

  • 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_shell_settings_put_global_http_proxy('127.0.0.1:8080', "Set USB proxy"): คำสั่งนี้เหมือนกับคำสั่งที่สอง แต่คราวนี้เป็นการตั้งค่า proxy ของ USB ให้เป็น 127.0.0.1:8080 ซึ่งเป็นที่อยู่ของ proxy server ที่ทำงานภายในเครื่อง

  • 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 ระหว่างเครื่องคอมพิวเตอร์และอุปกรณ์ Android

  • f'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 คือข้อความที่ระบุคำอธิบายหรือสถานะของคำสั่งที่กำลังทำงาน

อ้างอิง

วางขอบเขตงานก่อนขอราคา

ระบุระบบ บทบาทผู้ใช้ สภาพแวดล้อม และข้อกำหนดที่เกี่ยวข้อง เพื่อหารือขอบเขต ระยะเวลา และงบประมาณตามงานจริง

จองเวลาคุย 💬 Line @itselectlab หรือเตรียม scope ก่อน