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: ระบุว่าเราจะทำงานกับ tablenatของiptables-A OUTPUT: กำหนดให้เพิ่ม (Append) กฎใน chainOUTPUTกฎที่ถูกเพิ่มจะถูกประยุกต์ใช้กับแพ็กเก็ตที่มีเป้าหมายเป็นโฮสต์เครื่องนี้เอง-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


เราสามารถลบ 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
