รวมคำสั่งตั้งค่าเปิดปิด Proxy ผ่าน USB รวดเดียวสำหรับ Flutter App

Flutter เป็นเฟรมเวิร์กการพัฒนาแอพพลิเคชันที่ช่วยให้นักพัฒนาสร้างแอพพลิเคชันได้บนหลายแพลตฟอร์มจากฐานโค้ดเดียว การพัฒนาด้วย Flutter สร้างแอพพลิเคชันโดยใช้ภาษา Dart และมีข้อแตกต่างหลายประการเมื่อเทียบกับแอพพลิเคชันแบบดั้งเดิมที่พัฒนาโดยใช้ Java หรือ Kotlin (สำหรับ Android) และ Swift หรือ Objective-C (สำหรับ iOS) โปรแกรมที่ถูกสร้างโดย Flutter อาจไม่ใช้ “system CA store” ของแอนดรอยด์แต่ใช้รายการ CA ที่ถูกคอมไพล์ลงในแอพพลิเคชัน จึงเป็นสาเหตุให้ไม่สามารถดักจับข้อมูลได้โดยการการตั้ง proxy แบบปกติ

Warunyou Sunpachit และ Boonperm Mark
Cybersecurity consultant

หลักการ

Proxy listener

คือเซิร์ฟเวอร์พร็อกซีที่ทำงานบนเครื่องที่ใช้ Burp Suite ซึ่งมันรอรับการเชื่อมต่อจากเบราว์เซอร์หรือโปรแกรมที่ต้องการสื่อสารผ่าน HTTP โดยการทำงานผ่านพร็อกซีนี้ ผู้ใช้สามารถดักจับและตรวจสอบข้อมูลที่ส่งผ่านเครือข่ายได้ “loopback interface” หมายถึง interface ของเครือข่ายที่เชื่อมต่อกลับไปยังเครื่องเดียวกัน โดยมีที่อยู่ IP เป็น 127.0.0.1 หรือที่เรียกว่า localhost และ “port 8080” คือ port ที่ proxy listener ของ Burp คอยรอรับการเชื่อมต่อ และถ้าา listener ถูกผูกไว้กับทุก interfaces หรือถูกผูกไว้กับ interface ที่ไม่ใช่ loopback คอมพิวเตอร์อื่น ๆ ก็อาจสามารถเชื่อมต่อกับ listener นั้นได้

Invisible proxying

สำหรับ Thick client (รวมถึง Application ที่เขียนโดย Flutter) ที่ทำการสื่อสารผ่าน HTTP แต่ไม่รองรับการตั้งค่าพร็อกซี การใช้ invisible proxying เป็นวิธีที่เหมาะสมในการดักจับและแก้ไข traffic นั้น ๆ การทำให้ traffic วิ่งเข้าไปยัง invisible proxying สามารถทำได้ด้วยการปรับเปลี่ยนการตั้งค่า ผ่านทางพร็อกซีด้วย iptables

ตั้งค่าเชื่อมต่อ proxy โดยใช้ สาย USB

สามารถตรวจสอบรายละเอียดเพิ่มเติมได้ที่ บทความตั้งค่า Proxy ของ เครื่องโทรศัพท์ Android โดยใช้คำสั่ง

#เสียบสาย android กับเครื่อง ใช้คำสั่ง
adb shell settings put global http_proxy :0
adb shell settings put global http_proxy 127.0.0.1:8080
adb reverse tcp:8080 tcp:8080

เข้าถึงอุปกรณ์ผ่าน adb shell และให้สิทธิ์ superuser โดยการใช้คำสั่ง su (iptables ต้องการสิทธิ์ superuser). ใช้คำสั่งต่อไปนี้เพื่อสร้างกฎเพื่อเปลี่ยนเส้นทางทั้งหมดของการส่งข้อมูลไปยัง 127.0.0.1:8080 บนอุปกรณ์เป้าหมาย.

adb shell
su
iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8080
iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to-destination 127.0.0.1:8080

การตั้งค่าการส่งผ่านข้อมูลใน Linux ด้วย iptables มาในรูปของ Network Address Translation (NAT) ที่อยู่ใน table nat

  • iptables: เป็นเครื่องมือที่ใช้ในการจัดการกฎการส่งผ่านข้อมูลใน Linux
  • -t nat: ระบุว่าเราจะทำงานกับ table nat ของ iptables
  • -A OUTPUT: กำหนดให้เพิ่ม (Append) กฎใน chain OUTPUT กฎที่ถูกเพิ่มจะถูกประยุกต์ใช้กับแพ็กเก็ตที่มีเป้าหมายเป็นโฮสต์เครื่องนี้เอง
  • -p tcp: กำหนดให้กฎนี้ใช้เฉพาะกับแพ็กเก็ต TCP
  • --dport 80 และ --dport 443: กำหนดให้กฎนี้ใช้กับแพ็กเก็ตที่มี port ปลายทางเป็น 80 หรือ 443 (สำหรับคำสั่งที่สอง)
  • -j DNAT: กำหนดให้ทำ Destination NAT หรือการแปลงที่อยู่ปลายทางของแพ็กเก็ต
  • --to-destination 127.0.0.1:8080: ระบุที่อยู่และ port ใหม่ของแพ็กเก็ตหลังจากการแปลง ในที่นี้คือ 127.0.0.1 (localhost) และ port 8080

ใช้คำสั่งต่อไปนี้เพื่อตรวจสอบว่ากฎที่ต้องการได้ถูกสร้างขึ้นบนอุปกรณ์ทดสอบของเราหรือไม่ ข้อความที่เน้นไว้แสดงว่ากฎการเปลี่ยนเส้นทางได้ถูกสร้างบนอุปกรณ์แล้ว

iptables -t nat -L
ตรวจสอบว่ากฎที่ต้องการได้ถูกสร้างขึ้นบนอุปกรณ์

ตั้ง Proxy เป็น แบบ Invisible proxying

ไปที่ Setting ของ Burp > Proxy > All interface
จากนั้นไปที่ Request handling > Support invisible proxying

เราสามารถลบ Rule ออกได้จาก iptables, ใช้คำสั่ง -D (Delete) พร้อมกับตัวกำหนดที่ใช้เมื่อเพิ่มกฎ ถ้ากฏเพิ่มมาหนึ่งบรรทัดจะต้องลบออกหนึ่งบรรทัด

iptables -t nat -D OUTPUT -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8080
iptables -t nat -D OUTPUT -p tcp --dport 443 -j DNAT --to-destination 127.0.0.1:8080

LazyFrida

การเตรียมความพร้อมก่อนใช้งาน

  • เปิด Burp Suite สำหรับตั้งค่า Invisible Proxy ตามข้างต้น
  • และเพื่อการสร้าง, การเข้าถึง, และการส่งออก 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 including iptables for invisible proxying (Flutter)
                        potential parameters: start, stop, and flutter

เปิดใช้งาน Proxy และตั้งค่า iptables

 python lazyfrida.py -u start flutter

ปิดใช้งาน Proxy และลบ iptables

python lazyfrida.py -u stop flutter

อ้างอิง