การแนะนำ
สวัสดีทุกคน! ยังคงมาร่วมแบ่งปันประสบการณ์ ความคิด หรือความคิดเห็นเกี่ยวกับเทคโนโลยีที่เกี่ยวข้องกับสาขาวิศวกรรมซอฟต์แวร์ ในบทความนี้ ฉันต้องการแบ่งปันเกี่ยวกับประสบการณ์ของฉันในการตรวจสอบคำขอเครือข่ายจากแอปพลิเคชันมือถือ โดยเฉพาะอย่างยิ่งสำหรับแพลตฟอร์ม Android!
หากเรากำลังพูดถึงเว็บแอป การตรวจสอบคำขอเครือข่ายไปยังเซิร์ฟเวอร์นั้นค่อนข้างง่าย สำหรับ Chrome หรือ Firefox เพียงไปที่เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์และดูแท็บเครือข่าย เราสามารถตรวจสอบประเภทคำขอเช่น Method, URL, Headers, Body และการตอบกลับได้เช่นกัน
แต่ถ้าเราอยากทำแบบเดียวกันบนอุปกรณ์มือถือล่ะ? เนื่องจากสำหรับเบราว์เซอร์มือถือ เราไม่มีตัวเลือกใดๆ ที่คล้ายกับเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ นอกจากนี้ยังเป็นไปไม่ได้เมื่อเราต้องการเห็นเครือข่ายสำหรับแอปพลิเคชันบนมือถือ
หนังสือมอบฉันทะ
คำตอบคือเราสามารถใช้เครื่องมือเช่น Proxy เพื่อช่วยเราจับเครือข่ายระหว่างอุปกรณ์และเซิร์ฟเวอร์ วิธีการนี้เรียกว่า Man-In-The-Middle เนื่องจากเราใส่พร็อกซีไว้ในการเชื่อมต่อระดับกลาง หากต้องการรูปภาพเพิ่มเติม โปรดดูแผนภาพด้านล่าง
มีบริการพร็อกซีมากมายสำหรับตัวอย่าง:
- พร็อกซีแมน (https://proxyman.io)
- mitmproxy (https://mitmproxy.org)
- ชาร์ลส์ (https://www.charlesproxy.com)
- ฯลฯ
ฉันจะเลือกใช้ Proxyman เป็นการส่วนตัวเพราะฉันเป็นผู้ใช้ Mac และเป็นแบบ GUI หากคุณชื่นชอบ CLI มากขึ้น คุณสามารถลองใช้ mitmproxy ได้ ทั้งสองคนไม่ใช่คนโปรดของคุณใช่ไหม? บางทีคุณอาจใช้พรอกซีอื่นที่เหมาะกับคุณได้ แค่ google เกี่ยวกับเรื่องนี้ นี่คือรูปลักษณ์ของพรอกซีที่ฉันพูดถึง
หลังจากติดตั้งและรัน Proxyman เสร็จแล้ว เราก็จะได้รับพอร์ตการฟัง ไม่ต้องกังวลหากพอร์ตเริ่มต้นขัดแย้งกับพอร์ตที่มีอยู่ในระบบของคุณ เราสามารถเปลี่ยนเป็นอันอื่นได้อย่างง่ายดาย นี่คือภาพที่ Proxyman ทำงานและรับพอร์ตการฟังอย่างไร
การกำหนดค่า Android
หลังจากนั้น ขั้นตอนต่อไปคือการกำหนดค่าบนโทรศัพท์ Android หากเราไม่มีโทรศัพท์ Android เราสามารถใช้ Emulator เช่น Genymotion (https://www.genymotion.com)
ตรวจสอบให้แน่ใจว่าเครือข่ายระหว่างโทรศัพท์และพร็อกซีเซิร์ฟเวอร์อยู่ในเครือข่ายเดียวกัน ไปที่การกำหนดค่า SSID เลือกพร็อกซีด้วยตนเอง และเพิ่มชื่อโฮสต์พร็อกซี + พอร์ตเป็นข้อมูลพร็อกซี
เมื่อกำหนดค่าพรอกซีเสร็จแล้ว เราจำเป็นต้องตั้งค่า SSL สำหรับโทรศัพท์ Android เนื่องจากฉันใช้ Proxyman เราจึงต้องเปิด URL http://proxy.man/ssl และดาวน์โหลดใบรับรอง ในโทรศัพท์ Android จริง เพียงแค่เปิดใบรับรองแล้วปฏิบัติตามการติดตั้ง แต่สำหรับกรณีโปรแกรมจำลอง ขั้นตอนจะแตกต่างออกไปเล็กน้อย เราจำเป็นต้องติดตั้งจากการตั้งค่า -> ความปลอดภัย -> ติดตั้งจากการ์ด SD
การทดสอบ
พยายามจับเครือข่ายด้วยการเปิดเว็บไซต์โดยใช้เบราว์เซอร์มือถือ ในกรณีนี้ ฉันกำลังพยายามบันทึกคำขอเครือข่ายสำหรับเว็บไซต์ yahoo ดังที่เราเห็นรูปภาพด้านล่าง เครือข่ายจะถูกจับภาพ และหากเราต้องการดูการตอบสนอง เราต้องคลิก “เปิดใช้งานเฉพาะโดเมนนี้” และลองใช้คำขอเดียวกัน ดูรูปภาพ 4 และ 5 สำหรับรายละเอียด
หากการจับภาพเครือข่ายในเบราว์เซอร์ดูเหมือนไม่มีปัญหาใดๆ แล้วแอพพลิเคชั่นบนมือถือล่ะ? ฉันกำลังลองใช้แอปง่ายๆ สำหรับข้อมูลสกุลเงิน และเช่นเดียวกับ “ภาพที่ 6” มันยังคงใช้งานได้!
ปัญหาอุปกรณ์จริง
ขั้นตอนก่อนหน้านี้ดำเนินการบน Genymotion ถ้าใช้เครื่องจริงล่ะ? เพราะทำได้สะดวกกว่าในอุปกรณ์จริงเมื่อเทียบกับโปรแกรมจำลอง แต่ดูเหมือนว่าอุปกรณ์จริงจะมีปัญหาเกี่ยวกับ SSL Handshake Failed รูปที่ 7 แสดงว่าเครือข่ายกลายเป็นสีแดงเนื่องจากข้อผิดพลาดบางประการ
apk-mitm.apk
สิ่งที่เราสามารถทำได้เพื่อแก้ไขปัญหาเกี่ยวกับ SSL Handshake ล้มเหลวบนอุปกรณ์จริง หนึ่งในวิธีแก้ปัญหาอาจใช้เครื่องมือนี้ที่เรียกว่า apk-mitm (https://github.com/shroudedcode/apk-mitm)
apk-mitm คืออะไร? จากเว็บไซต์ GitHub อย่างเป็นทางการ:
แอปพลิเคชัน CLI ที่เตรียมไฟล์ Android APK สำหรับการตรวจสอบ HTTPS โดยอัตโนมัติ
apk-mitm
ทำให้กระบวนการทั้งหมดเป็นอัตโนมัติ สิ่งที่คุณต้องทำคือให้ไฟล์ APK แก่มัน จากนั้น apk-mitm
จะ:
- ถอดรหัสไฟล์ APK โดยใช้ "Apktool"
- แก้ไข
AndroidManifest.xml
ของแอปให้เป็นdebuggable
- แทนที่ "การกำหนดค่าความปลอดภัยเครือข่าย" ของแอปเพื่ออนุญาตใบรับรองที่ผู้ใช้เพิ่ม
- insert
return-void
opcodes เพื่อปิดการใช้งานตรรกะ การปักหมุดใบรับรอง - เข้ารหัสไฟล์ APK ที่แพตช์แล้วโดยใช้ "Apktool"
- ลงนามไฟล์ APK ที่แพตช์แล้วโดยใช้ "uber-apk-signer"
ตามที่เราเห็นคำอธิบายข้างต้น เราจำเป็นต้องมี APK แบบดิบ เราสามารถรับได้จาก "APKPure" หรือไซต์ที่คล้ายกันหรือส่งออกโดยใช้ "SAI" จากนั้นเราเพียงแค่ต้องรันคำสั่งการติดตั้ง + ดำเนินการ และกระบวนการทั้งหมดจะเหมือนกับในภาพที่ 8
$ npm install -g apk-mitm $ npx apk-mitm <path-to-apk>
หลังจากการติดตั้ง APK ที่แพตช์เสร็จแล้ว ให้ลองเปิดแอปพลิเคชันและดูคำขอที่บันทึกไว้ เอาล่ะ! คำขอจาก APK ที่ได้รับการแก้ไขแล้วไม่มีปัญหาเกี่ยวกับ SSL Handshake ล้มเหลว!
ปัญหาการปักหมุดใบรับรอง
น่าเสียดาย ในกรณีของฉัน ฉันมีปัญหาเกี่ยวกับแอปพลิเคชันที่ใช้การปักหมุดใบรับรอง หากคุณได้ยินเรื่องนี้เป็นครั้งแรก คุณสามารถดูรายละเอียดได้ ที่นี่ แม้ว่า apk-mitm บอกว่าพวกเขามีตรรกะในการปิดการใช้งานการปักหมุดใบรับรอง แต่มันก็ไม่ได้ผลสำหรับฉัน ข้อผิดพลาดเกี่ยวกับ “SSL Handshake Failed” ยังคงเกิดขึ้นบนคอนโซล Proxyman
บทสรุป
สรุปสำหรับการทดสอบนี้สามารถแสดงได้ในประเด็นด้านล่าง:
- Proxyman ทำงานได้ดีในการจับภาพทั้งเบราว์เซอร์และคำขอเครือข่ายแอปพลิเคชันสำหรับ Android (Genymotion)
- การจับภาพแอปพลิเคชันเครือข่ายบนอุปกรณ์ Android จริงจำเป็นต้องได้รับการดูแลเป็นพิเศษโดยใช้
apk-mitm
- Proxyman ทำงานได้ดีในการจับภาพทั้งเบราว์เซอร์และคำขอเครือข่ายแอปพลิเคชันสำหรับ iOS (อุปกรณ์จริง) ฉันไม่ได้แชร์รายละเอียดสำหรับ iOS เนื่องจากหัวข้อต่างๆ แต่ฉันได้ลองแล้ว
- แอปพลิเคชัน Android ที่ใช้การปักหมุดใบรับรองอาจล้มเหลวเนื่องจาก SSL Handshake ล้มเหลว แม้ว่าเราจะใช้ APK ที่ได้รับการติดตั้งแล้วก็ตาม
ฉันหวังว่าบทความนี้จะมีประโยชน์และพบกันใหม่ในหัวข้ออื่น! ขอบคุณ!