การดักจับแพ็กเก็ตแบบคลิกเดียว

ฟังก์ชันการดักจับแพ็กเก็ตแบบ Man-in-the-middle (MITM) ด้วยคลิกเดียว สามารถเปิดใช้งาน MITM แบบ Global บนอุปกรณ์ได้โดยอัตโนมัติ ความแตกต่างจากเครื่องมือที่คุณใช้เป็นประจำ คือ คุณไม่จำเป็นต้องกังวลเกี่ยวกับปัญหาต่างๆ เช่น การติดตั้งใบรับรอง และ การตั้งค่าพร็อกซี และไม่ต้องกังวลว่าระบบปฏิบัติการเวอร์ชันต่างๆ จะมีวิธีการดักจับแพ็กเก็ตที่แตกต่างกัน ฟังก์ชันนี้สามารถทำงานได้อย่างราบรื่นบน Android 6.0 - 14 เราได้จัดการทุกอย่างให้คุณแล้ว คุณเพียงแค่ต้องสนใจในส่วนของธุรกิจที่คุณต้องการเท่านั้น และยังรองรับการแก้ไขและดักจับแพ็กเก็ตแบบเรียลไทม์ ซึ่งเหมาะสำหรับการใช้งานทางธุรกิจจริงมากกว่าโปรแกรม GUI ทั่วไปที่ใช้เพียงแค่ "ดักจับแพ็กเก็ตเพื่อดู"

นอกจากนี้ เราสามารถรับประกันได้ว่า ไม่มีแพ็กเก็ตใดที่ดักจับไม่ได้ (ยกเว้นกรณี Certificate Pinning) และอัตราความสำเร็จในการดักจับก็สูงกว่าวิธีการของซอฟต์แวร์ทั่วไป คุณสามารถดักจับทราฟฟิก http/s ของแอปพลิเคชันได้ สคริปต์จะทำการตั้งค่าและยกเลิก MITM โดยอัตโนมัติ หลังจากออกจากสคริปต์ อุปกรณ์และเครือข่ายจะกลับสู่สภาพเดิม คุณไม่จำเป็นต้องทำการตั้งค่าใดๆ เพิ่มเติม สคริปต์ยังรองรับการดักจับแพ็กเก็ตแบบ นานาชาติ (ผ่าน Upstream Proxy) ทำให้คุณสามารถดักจับข้อมูลจากซอฟต์แวร์ต่างประเทศได้อย่างง่ายดาย

ข้อควรสนใจ

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

การเตรียมการเบื้องต้น

ขั้นแรก ตรวจสอบให้แน่ใจว่าคอมพิวเตอร์และอุปกรณ์ของคุณอยู่ในเครือข่ายเดียวกัน หรือเชื่อมต่อผ่าน USB ในที่นี้เราจะสมมติว่า 192.168.0.2 คือ IP ของอุปกรณ์มือถือที่รัน FIRERPA ต่อมา ตรวจสอบให้แน่ใจว่าคุณได้ clone โค้ดของโปรเจกต์และติดตั้ง dependencies ที่เกี่ยวข้องเรียบร้อยแล้ว และตรวจสอบใน command line ว่า mitmproxy ได้รับการติดตั้งสำเร็จ (สามารถตรวจสอบได้โดยการพิมพ์ mitmdump ใน command line)

หากคุณไม่มี Python และไม่คุ้นเคยกับการ clone และ dependencies คุณสามารถดาวน์โหลด startmitm.exe ได้จากหน้า release ของเรา ซึ่งเป็นไฟล์ที่แพ็กมาจาก startmitm.py คุณสามารถรันการดักจับแพ็กเก็ตได้โดยไม่ต้องติดตั้ง Python นี่เป็นโปรแกรมคอนโซล และพารามิเตอร์คำสั่งจะเหมือนกับ startmitm.py (ไฟล์นี้อาจถูกแจ้งเตือนว่าเป็นไวรัส โปรดตัดสินใจว่าจะใช้งานหรือไม่ด้วยตนเอง)

การดักจับแพ็กเก็ตพื้นฐาน

คำแนะนำ

แอปพลิเคชันที่คุณต้องการดักจับแพ็กเก็ตอาจมี SSL PINNING (Certificate Pinning) หรือใช้โปรโตคอล QUIC ซึ่งทั้งสองกรณีนี้อาจส่งผลต่อประสิทธิภาพการดักจับแพ็กเก็ต เราจะทำการบังคับให้ QUIC ลดระดับ (downgrade) โดยอัตโนมัติ แต่อาจมีช่วงเวลา FallBack ซึ่งอาจทำให้แอปพลิเคชันแสดงผลเครือข่ายที่ช้ามาก โปรดรอสักครู่ สำหรับแอปพลิเคชันที่มี Certificate Pinning จะไม่สามารถดักจับแพ็กเก็ตได้โดยตรง คุณจะต้องใช้การทำวิศวกรรมย้อนกลับ (reverse engineering) ร่วมกับการเขียนสคริปต์ Frida เพื่อข้ามตรรกะของ SSL PINNING

คุณสามารถเริ่มการดักจับแพ็กเก็ตได้อย่างรวดเร็วด้วยคำสั่งต่อไปนี้ ซึ่งเป็นวิธีที่ง่ายที่สุด

python3 -u startmitm.py 192.168.0.2

สำคัญ

**โปรดจำไว้ว่าหลังจากรันคำสั่ง startmitm แล้ว ต้องปิดแอปที่ต้องการดักจับแพ็กเก็ตให้สนิทแล้วเปิดใหม่อีกครั้ง การปิดแอปจากแถบงาน (taskbar) ไม่ใช่วิธีที่เชื่อถือได้ โปรดใช้ API เพื่อปิด หรือใช้คำสั่ง kill -9 กับ PID ทั้งหมดที่เกี่ยวข้องกับแอปด้วยตนเอง มิฉะนั้นจะไม่สามารถดักจับแพ็กเก็ตได้ตามปกติ**

กด CONTROL + C หนึ่งครั้งเพื่อออกจากการดักจับแพ็กเก็ต โปรดอย่ากดซ้ำๆ ติดต่อกัน

การแชร์การดักจับแพ็กเก็ต

หากคุณต้องการวิเคราะห์ร่วมกับเพื่อนร่วมงานในเครือข่ายเดียวกัน ให้รันคำสั่งต่อไปนี้ จากนั้นให้เพื่อนร่วมงานของคุณเปิดเบราว์เซอร์ไปที่ http://Your_IP_Address:7890 ก็จะสามารถเห็นหน้าจอการดักจับแพ็กเก็ตเดียวกันกับคุณ และสามารถวิเคราะห์ร่วมกันได้อย่างสนุกสนาน

python3 -u startmitm.py 192.168.0.2 --web-port 7890 --web-host 0.0.0.0

แอปพลิเคชันที่เจาะจง

หากคุณต้องการดักจับทราฟฟิกของแอปพลิเคชันที่เจาะจง แทนที่จะเป็นทราฟฟิกทั้งหมดของระบบ คุณสามารถใช้วิธีการด้านล่างโดยการเพิ่ม :package_name ต่อท้าย IP เพื่อดักจับข้อมูลทราฟฟิกของแอปพลิเคชันนั้นๆ ตัวอย่างต่อไปนี้จะดักจับเฉพาะทราฟฟิกของ com.some.package

python3 -u startmitm.py 192.168.0.2:com.some.package

การแก้ไขแบบเรียลไทม์

คุณสามารถแก้ไขข้อมูล request และ response ของแอปพลิเคชันได้แบบเรียลไทม์ ฟังก์ชันนี้ทำงานโดยอาศัย event hooks ของ mitmproxy คุณจะต้องเขียนสคริปต์ hook ตาม API ของ mitmproxy ด้วยตนเอง สำหรับวิธีการเขียนสคริปต์ hook โปรดอ้างอิงจากเอกสารอย่างเป็นทางการของ mitmproxy ที่ docs.mitmproxy.org/stable/addons-examples และตัวอย่างโค้ดที่ mitmproxy/examples/contrib

สมมติว่าสคริปต์ hook ที่คุณเขียนคือ http_flow_hook.py ให้ใช้คำสั่งต่อไปนี้เพื่อใช้งานสคริปต์ hook

python3 -u startmitm.py 192.168.0.2 -s http_flow_hook.py

เครือข่ายที่แตกต่างกัน

หากโทรศัพท์มือถือและคอมพิวเตอร์ของคุณไม่ได้อยู่ในเครือข่ายเดียวกัน แต่สามารถเข้าถึงอุปกรณ์ได้ทางกายภาพ คุณยังสามารถดักจับแพ็กเก็ตผ่าน USB ADB ได้ โดยต้องแน่ใจว่าอุปกรณ์ได้เชื่อมต่อกับคอมพิวเตอร์ผ่าน USB ADB และได้รับการอนุญาตอย่างถูกต้องแล้ว

หากคอมพิวเตอร์เชื่อมต่อกับอุปกรณ์ ADB เพียงเครื่องเดียว ให้ใช้คำสั่งต่อไปนี้ในการดักจับแพ็กเก็ต localhost หมายถึงการใช้อุปกรณ์ ADB

python3 -u startmitm.py localhost

หากคอมพิวเตอร์เชื่อมต่อกับอุปกรณ์ ADB หลายเครื่อง คุณจะต้องระบุหมายเลขซีเรียลของ adb ซึ่งสามารถหาได้จากผลลัพธ์ของคำสั่ง adb devices

python3 -u startmitm.py localhost --serial bfde362

หากสภาพแวดล้อมของคุณมีความซับซ้อนยิ่งขึ้น เช่น โทรศัพท์มือถือและคอมพิวเตอร์ไม่ได้อยู่ในเครือข่ายเดียวกันและไม่สามารถเข้าถึงอุปกรณ์ได้ทางกายภาพ แต่คุณสามารถเข้าถึงพอร์ตของ FIRERPA ได้ คุณก็ยังสามารถทำ MITM ได้ กรณีนี้มักเกิดขึ้นเมื่อคุณใช้บริการ frp ในตัวเพื่อส่งต่อ FIRERPA ไปยังเซิร์ฟเวอร์ระยะไกล หรือคุณได้ส่งต่อพอร์ต 65000 ของ FIRERPA ไปยังที่ใดที่หนึ่งด้วยวิธีของคุณเอง ในสถานการณ์นี้ การสื่อสารระหว่างคุณกับ FIRERPA จะทำได้ผ่านพอร์ตนี้เพียงพอร์ตเดียวเท่านั้น และไม่สามารถเข้าถึงพอร์ตอื่นๆ ได้ ในกรณีนี้ โทรศัพท์มือถือจะไม่สามารถเข้าถึงพอร์ตใดๆ บนเครื่องของคุณ และเครื่องของคุณก็สามารถเข้าถึงได้เพียงพอร์ต FIRERPA ของโทรศัพท์มือถือเท่านั้น (หรือโทรศัพท์มือถือมี Public IP แต่เครื่องของคุณอยู่ในเครือข่ายภายใน) ซึ่งจะต้องดำเนินการด้วยวิธีต่อไปนี้ (การเชื่อมต่อเครือข่ายผ่าน OpenVPN ไม่จัดอยู่ในกรณีนี้)

ในสถานการณ์นี้ จะต้องใช้วิธีการผสมผสานดังต่อไปนี้ ขั้นแรก ใช้ adb_pubkey.py หรือเรียกใช้ API ด้วยตนเองเพื่อติดตั้ง ADB Public Key ของคุณลงบนอุปกรณ์ หลังจากติดตั้งเสร็จสิ้น ให้ดำเนินการตามขั้นตอนต่อไปนี้ โดย x.x.x.x คือ IP ที่สามารถเชื่อมต่อกับพอร์ต 65000 ได้ หรือ 127.0.0.1 ตามสถานการณ์จริง

adb connect x.x.x.x:65000

สุดท้าย ใช้วิธีการเดียวกับที่กล่าวไว้ข้างต้น คือการดักจับแพ็กเก็ตผ่าน USB

python3 -u startmitm.py localhost

หรือแบบนี้ โดยที่ serial คือที่อยู่ของ adb connect ไม่ใช่หมายเลขซีเรียลแบบเลขฐานสิบหก

python3 -u startmitm.py localhost --serial x.x.x.x:65000

Upstream Proxy / การดักจับแพ็กเก็ตนานาชาติ

startmitm จะเริ่มต้น mitmproxy เป็นบริการพร็อกซี โดยปกติแล้วทราฟฟิกจะถูกส่งออกจาก network card ของเครื่อง หากคุณต้องการให้ทราฟฟิกถูกส่งผ่าน upstream proxy แทนที่จะเป็นเครื่องของคุณเอง สามารถใช้วิธีการต่อไปนี้เพื่อระบุ upstream proxy ได้ โดยรองรับเฉพาะพร็อกซีโปรโตคอล HTTP เท่านั้น นอกจากนี้ คุณยังต้องระบุ upstream DNS ที่รองรับการสืบค้นแบบ TCP เพื่อหลีกเลี่ยง DNS pollution

เคล็ดลับ

โหมด Upstream Proxy ต้องการ mitmproxy เวอร์ชัน >= 9.0.0 (และ Python >= 3.9)
python3 -u startmitm.py 192.168.0.2 --upstream http://127.0.0.1:7890 --proxy-dns 8.8.8.8

หาก upstream HTTP proxy ต้องการการยืนยันตัวตน โปรดใช้คำสั่งต่อไปนี้และแทนที่ USER:PASSWORD

python3 -u startmitm.py 192.168.0.2 --upstream http://USER:PASSWORD@x.x.x.x:8080 --proxy-dns 8.8.8.8

คำสั่งทั้งหมดข้างต้นจะส่งทราฟฟิกของอุปกรณ์ผ่าน upstream proxy และส่งการสืบค้น DNS ทั้งหมดของเครื่องผ่านพร็อกซีไปยัง 8.8.8.8