Kết nối ứng dụng mobile qua VPS

Kết nối ứng dụng mobile qua VPS

Nội dung chính

  • Background

  • [Tải Burpsuite CA vào CA hệ hống](#Tải Burpsuite CA vào CA hệ hống)

  • [Cài đặt Burp Suite đi qua Socks VPS](#Cài đặt Burp Suite đi qua Socks VPS)

  • [Bypass SSL Pinning use RMS](#Bypass SSL Pinning use RMS)

Đầu tuần vừa rồi mình mới gặp một dự án đánh giá bảo mật cho ứng dụng Android, và thế là mình và @l4nc3r đã khá vất vả trong việc cài đặt và làm cho Burp Suite nó hoạt động khi kết nối qua VPS của công ty. Vấn đề mình gặp phải ở đây là

- Công ty A mở kết nối hệ thống để VPS của công ty mình có thể truy cập tới ứng dụng nội bộ ungdung.apk của họ.
- Tuy nhiên, VPS này là một con nhân Linux thuê của Vultr, chỉ dùng qua ssh nên không cài đặt file apk ở đó để làm được.
- Làm thế nào mà hai đứa đang WFH ở nhà có thể cài đặt file apk ở máy mình và chạy ngon lành ???

Background

Bình thường mình kết nối Burp Suite với các máy giả lập trên Genymotion rất đơn giản. Chỉ cần vào cài đặt cấu hình proxy theo hướng dẫn của Portswigger’s là xong thôi! Nhưng nay ứng dụng yêu cầu API tối thiểu là 21, và nó không hoạt động trên mấy cái máy cũ của tôi. Tôi đã làm theo cấu hình cài đặt các thứ các thứ của Portswigger’s mà tôi vẫn thường làm nhưng không thấy gì ngoài lỗi kết nối trong Burp:

image.png

Tôi đã mất công cài đặt các giả lập khác nhưng vẫn không được, thật khó chịu, tôi đã hỏi anh Sẻ về cái lỗi này. Cuối cùng thì tôi cũng hiểu ra vấn đề nằm ở phiên bản Android mới nhất, để cài đặt được certificate cần chuyển định dạng cacert.cert sang một dạng mã hóa <hash_id>.0 thì thiết bị giả lập mới hiểu được.

Android mới đã thay đổi hành vi mặc định của việc tin cậy (trusted) các chứng chỉ (certificates) do người dùng cài đặt. Không còn đơn giản bằng việc chỉ cài đặt Burpsuite CA từ sdcard để bắt đầu chặn request gửi lên máy chủ từng ứng dụng. Các ứng dụng giờ đây sẽ chỉ tin cậy (trust) các CA hệ thống, có nghĩa là nằm ở System CA. Lỗi này sẽ hiển thị ở Burpsuite kiểu giống cái ảnh tôi chụp ở trên.

Có hai cách để vượt qua việc cài đặt certificates từ bên ngoài:

  • Tải Burpsuite CA vào CA hệ hống (system-level CA): Đây là cách dễ dàng thực hiện nhất, và bạn không phải cài lockscreen PIN.

  • Chỉnh sửa tệp manifest.xml sau đó đóng gói lại ứng dụng: Nghe cái tên đã lười làm rồi. Bạn tự tham khảo ở tài liệu sau Changes to Trusted Certificate Authorities in Android Nougat

Note: Ở đây tôi sử dụng Burpsuite Pro trên Windows 10 và đang sử dụng MEmu 7.1.2 (API 25).

Tải Burpsuite CA vào CA hệ hống

Để xem các chứng chỉ hệ thống có sẵn, truy cập tới vị trí Settings -> Security -> Trusted Credentials và xem tại tab SYSTEM CAs.

image.png

Theo mặc định, các trusted CAs của Android được lưu trữ định dạng đặc biệt tại /system/etc/security/cacerts. Nếu có quyền root thì có thể ghi Burpsuite CA vào vị trí này được (sau khi thực hiện sửa đổi cert được export từ Burpsuite.

Export and convert the Burpsuite CA.

Đầu tiên thực hiện export Burpsuite CA thành định dạng cacert.der. Sử dụng Burpsuite Pro, thực hiện các bước:
Proxy > Options > Import / export CA certificate > Certificate in DER format

image.png

Android sẽ không hiểu được định dạng .der hoặc .cert, nó chỉ hiểu chứng chỉ ở định dạng PEM và có tên là subject_hash.0. Sử dụng openssl để convert định dạng DER sang PEM, và output sẽ là subject_hash_old, sau đó thực hiện rename tên tệp tin thành định dạng subject_hash.0.

openssl x509 -inform DER -in cacert.der -out cacert.pem
openssl x509 -inform PEM -subject_hash_old -in cacert.pem |head -1
mv cacert.pem 9a5ba575.0

Tôi thực hiện các bước sau:

image.png

Sao chép tệp tin chứng chỉ vừa tạo lên thiết bị

Tôi sử dụng adb để copy chứng chỉ lên thiết bị, nhưng vì nó phải được sao chép vào thư mục hệ thống /system, nên phải sử dụng remount thì mới ghi được. Với quyền root thật đơn giản để thực hiện:

adb root
adb remount
adb push 9a5ba575.0 /sdcard/
adb shell

mv /sdcard/9a5ba575.0 /system/etc/security/cacerts/
chmod 644 /system/etc/security/cacerts/9a5ba575.0
reboot

image.png

Sau khi khởi động lại giả lập, truy cập tới Settings -> Security -> Trusted Credentials để kiểm tra "Portswigger CA" được tạo trong system trusted CA chưa.

image.png

Giờ thì chuyển sang bước thiết lập Proxy và bắt đầu tương tác với bất kỳ ứng dụng nào qua Burpsuite thôi :) Để check nhanh, truy cập website bất kì (nên chọn https) để xem Burpsuite đã bắt được request đi qua chưa.

Cài đặt Burp Suite đi qua Socks VPS

Tuy nhiên ứng dụng A chỉ chạy thông qua con VPS thôi! Nên bây giờ cần phải thiết lập đi qua VPS và Burpsuite theo một số bước thiết lập cơ bản sau:

  • 1 - Sử dụng SSH Tunnel kết nối đến VPS thông qua port 12345 trên máy local.
ssh -D 12345 root@xxx.xxx.xxx.xxx

image.png

  • 2 - Cấu hình proxy trên wifi của giả lập MEmu, với địa chỉ ipaddress là địa chỉ ip của máy tính Windows 10, chọn port 8082.

    image.png

  • 3 - Cấu hình proxy trên Burpsuite để chặn request đi qua port 8082. Truy cập chức năng Proxy > Options > Proxy Listeners, chọn All interfaces, blind port là 8082.

    image.png

  • 4 - Cấu hình Socks trên Burpsuite để kết nối với VPS. Truy cập chức năng User options > Connections > SOCKS Proxy, chọn Use SOCKS proxy và sử dụng host: 127.0.0.1 - port: 12345

    image.png

Bùmmmmmmmmmmmmmmmm !

Vẫn không được trong khi trình duyệt web vẫn bắt được, nhưng ứng dụng A thì không !? Tại sao ? Do ứng dụng có sử dụng SSL Pinning, mình hướng dẫn luôn cách sử dụng RMS để bypass ssl pinning.

Bypass SSL Pinning use RMS

Tham khảo tại https://cobalt.io/blog/getting-started-with-android-application-security

Như vậy là mình đã hoàn tất việc kết nối ứng dụng thông qua VPS và một số hướng dẫn khác rồi. Việc thực hiện các bước này có thể sẽ lặp lại rất nhiều lần sau đó trong việc pentest ứng dụng mobile.

~!

Ngoài cách tạo tunnel để kết nối có thể sử dụng Wireguard hoặc tạo OpenVPN để kết nối tới VPS Server.