Giới thiệu
Gần đây, tôi đã thử nghiệm một số ứng dụng di động để tìm hiểu về công nghệ và kỹ thuật mới trên thị trường. Trong lúc này, một người bạn đã gửi cho tôi một ứng dụng Android và cho biết rằng ứng dụng này không sử dụng SSL Pinning, có thể dễ dàng được thử nghiệm bằng Burp Suite.
Mặc dù vậy, khi kiểm tra chức năng chat trong ứng dụng, không có bất kỳ yêu cầu nào xuất hiện trong Burp Suite. Do đó, tôi đã quyết định tải ứng dụng và nghiên cứu thêm.
Tại Sao Không Bắt Được Yêu Cầu Chat?
Dựa trên kinh nghiệm của mình trong việc kiểm tra an ninh ứng dụng di động, tôi có thể suy đoán hai khả năng có thể xảy ra:
- Chức năng chat không sử dụng giao thức HTTP, do đó Burp không thể bắt được yêu cầu.
- Ứng dụng sử dụng dịch vụ từ bên thứ ba, và dịch vụ đó có SSL Pinning riêng.
Giả thuyết đầu tiên có thể sẽ không khả thi, vì vậy tôi đã tiếp tục tìm hiểu theo giả thuyết thứ hai. Nếu lập trình viên đã triển khai SSL Pinning cho một ứng dụng, họ có thể đã làm điều này trên toàn bộ ứng dụng, không chỉ cho từng phần.
Tìm Kiếm Thư Viện
Để củng cố giả thuyết của mình, tôi đã decompile tệp APK bằng apktool:
java -jar apktool.jar d redacted.apk
Sau khi decompile, tôi đã tìm kiếm trong thư mục lib, nơi chứa các thư viện bên thứ ba. Nhờ vào các kỹ năng tìm kiếm và dò tìm, tôi xác định rằng thư viện chính thực hiện tính năng chat là Twilio.
Twilio Là Gì?
Twilio là một nền tảng cung cấp các dịch vụ giao tiếp, đặc biệt là cho các ứng dụng chat và nhắn tin. Nó mang lại trải nghiệm xử lý tin nhắn trực tiếp và tương tác giữa người dùng.
Bypass SSL Pinning Trên Twilio
Bây giờ tôi sẽ thử nhiều phương pháp khác nhau để bypass SSL Pinning.
Phương Pháp 1: Hook Bằng Frida
Tôi sẽ thử phương pháp phổ biến và đơn giản nhất trước. Đầu tiên, cần phải tìm hàm thực hiện SSL Pinning. Bằng việc sử dụng lệnh nm
để liệt kê các hàm trong thư viện Twilio:
nm --demangle --dynamic libtwilio-convo-native.so
Tôi không tìm thấy bất kỳ hàm nào liên quan đến SSL Pinning, do đó tôi cần phải tìm sâu hơn.
Đào Sâu Hơn: Sử Dụng GDA
Tôi đã sử dụng công cụ GDA để tìm kiếm các giao thức liên quan. Trong số đó, tôi đã phát hiện ra hàm readCertificateStore
, cho thấy rằng Twilio đọc một danh sách các Root Cert có sẵn trong thiết bị. Nếu quá trình đọc không thành công, nó sẽ tìm kiếm trong một tệp chứa các Root Cert nằm trong tệp tin APK.
Tôi đã tìm thấy tệp tin rootcert.pem trong thư mục /res/raw
, chứa danh sách các root cert.
Phương Pháp 2: Patch APK
Với thông tin mà tôi thu thập được, tôi bắt đầu thực hiện các bước bypass SSL Pinning như sau:
Bước 1: Chèn chứng chỉ Burp vào đầu tệp tin rootcert.pem.
Bước 2: Sử dụng apktool để patch lại APK.
java -jar apktool_2.9.3.jar b redacted.apk
Khi tệp APK mới được tạo, yêu cầu chat qua socket đã được bắt thành công.
Kết Luận
Việc bypass SSL Pinning không hề đơn giản và yêu cầu sự kiên nhẫn, kỹ năng phân tích, và hiểu biết sâu sắc về cách thức hoạt động của các thư viện bên thứ ba như Twilio. Hy vọng bài viết này sẽ giúp ích cho những ai đang tìm hiểu về môi trường an ninh trong ứng dụng di động.
source: viblo