การแนะนำ

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

หากเรากำลังพูดถึงเว็บแอป การตรวจสอบคำขอเครือข่ายไปยังเซิร์ฟเวอร์นั้นค่อนข้างง่าย สำหรับ Chrome หรือ Firefox เพียงไปที่เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์และดูแท็บเครือข่าย เราสามารถตรวจสอบประเภทคำขอเช่น Method, URL, Headers, Body และการตอบกลับได้เช่นกัน

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

หนังสือมอบฉันทะ

คำตอบคือเราสามารถใช้เครื่องมือเช่น Proxy เพื่อช่วยเราจับเครือข่ายระหว่างอุปกรณ์และเซิร์ฟเวอร์ วิธีการนี้เรียกว่า Man-In-The-Middle เนื่องจากเราใส่พร็อกซีไว้ในการเชื่อมต่อระดับกลาง หากต้องการรูปภาพเพิ่มเติม โปรดดูแผนภาพด้านล่าง

มีบริการพร็อกซีมากมายสำหรับตัวอย่าง:

ฉันจะเลือกใช้ 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 ที่ได้รับการติดตั้งแล้วก็ตาม

ฉันหวังว่าบทความนี้จะมีประโยชน์และพบกันใหม่ในหัวข้ออื่น! ขอบคุณ!