Để hiểu bài này các bạn cần học qua lớp MOBISEC 1
Giới thiệu : Đây là tool được BQT trình bày tại lớp Pentest Mobile cho BIDV tại QNET vào lúc hết đợt covid 1. Tool quá đỉnh nhưng cũng khó dùng, phải test lab đầy đủ mới hiểu được ý nghĩa của nó.
Video hướng dẫn bài này có trong lớp MOBISEC 2
Objection Framework là bộ công cụ khám phá thời gian chạy trên thiết bị di động được xây dựng dựa trên frida, được sử dụng trong Android và iOS pentesting. Chúng ta có thể sử dụng Objection Framework để thực hiện nhiều chức năng như bỏ qua SSLPinning , bỏ qua phát hiện gốc, thực hiện tác vụ bộ nhớ, tác vụ đống và hơn thế nữa mà không cần root / bẻ khóa. Tuy nhiên, cần lưu ý rằng để tận dụng hết tất cả các chức năng nên root thiết bị. Trong bài viết này, một số chức năng được trình bày sẽ yêu cầu root và một số có thể không. Bạn nên kiểm tra ứng dụng trên thiết bị gốc. Hãy bắt đầu nào.
Mục lục
- Thiết lập Objection Framework
- Đính kèm Trình đơn tác nhân và Trợ giúp
- Bỏ qua SSLPinning
- Android Hooking
- Thực hiện Shell
- FLAG_SECURE bypass
- Khởi chạy hoạt động bằng cách sử dụng Objection Framework
- Bỏ qua phát hiện gốc
- Các nhiệm vụ liên quan đến bộ nhớ
- Phần kết luận
Thiết lập Objection Framework
Frida là một bộ công cụ động được sử dụng để triển khai các tập lệnh vào quá trình thử nghiệm của apk. Frida cung cấp các API cho các nhà phát triển để tạo các công cụ trên đó. Một trong những công cụ như vậy là Objection Framework. Trước khi thiết lập Objection Frameworki, chúng tôi sẽ phải triển khai máy chủ Frida trong hệ thống Android.
Vì vậy, để làm điều đó, chúng tôi sẽ đi đến vị trí này và tải xuống bản phát hành mới nhất cho Android có sẵn:

Bây giờ chúng ta cần triển khai điều này trong hệ thống Android. Đầu tiên, giải nén tệp ở vị trí đã tải xuống và sau đó chúng tôi nhập lệnh sau:
1 2 | adb connect 192.168.27.101:5555 chmod 777 frida-server-14.1.3-android-x86_64 && adb push frida-server-14.1.3-android-x86_64 /tmp/frida-server |

Để có thể chạy Objection Framework, chúng tôi sẽ phải khởi chạy máy chủ frida trước bằng cách:
1 | adb shell “./tmp/frida-server &” |

Và cuối cùng, chúng ta cần cài đặt Objection Framework bằng cách sử dụng pip3:
1 | pip3 install objection |

Bây giờ, các gói (ứng dụng) được cài đặt trong thiết bị Android được gọi là tiện ích trong Objection Framework và để tương tác với một ứng dụng để kiểm tra, chúng tôi sẽ phải đưa tác nhân phản đối của mình vào ứng dụng. Làm như vậy:
1 2 | objection –gadget jakhar.aseem.diva exploreping |
Ping sẽ kiểm tra lại xem tác nhân có được gắn thành công vào ứng dụng hay không.

Danh sách trợ giúp
Để mở menu trợ giúp:
1 | objection –help |

Để khởi chạy menu trợ giúp trong một tiện ích trong Objection Framework, chúng ta có hai lệnh:
1 | <tab> |

Sau đó, tìm hiểu rõ hơn về một mô-đun cụ thể:
1 | help android |

Bỏ qua ghim SSL
Để hiểu về bỏ qua SSL Pinning (ghim), trước tiên chúng ta sẽ xem tính năng ghim SSL là gì.
- Chứng chỉ truyền thống và chứng chỉ tự ký : Trong kiến trúc máy chủ-máy khách truyền thống, máy khách xác thực kết nối bằng chứng chỉ do máy chủ trình bày trong quá trình bắt tay. Chứng chỉ là bằng chứng về danh tính của một máy chủ . Chứng chỉ này chỉ được chứng minh là hợp lệ nếu nó được ký bởi Tổ chức phát hành chứng chỉ đáng tin cậy (ví dụ: RapidSSL, Symantec, digicert). Sau khi chứng chỉ được xác thực, quá trình truyền dữ liệu bắt đầu được mã hóa dựa trên bộ mật mã mà chứng chỉ đã được cấu hình để cung cấp.

Điều này có thể bị lạm dụng bằng cách cài đặt chứng chỉ CA gốc tự tạo trên hệ thống máy khách. Một ví dụ phổ biến là Portswigger CA của Burp Suite. Burp giống như một Người đàn ông ở giữa trong tình huống này và lưu lượng truy cập đến từ máy chủ đi qua burp, nó chặn nó và cố gắng chuyển tiếp nó đến trình duyệt nhưng trình duyệt không tin tưởng vào chứng chỉ của burp, vì vậy nó gây ra lỗi (ERR_CERT_AUTHORITY_INVALID ). Một số thông báo cũng được hiển thị như thế này:

Vì vậy, để làm cho trình duyệt tin tưởng chứng chỉ máy chủ của burp, người thử nghiệm cài đặt cacert.der trong hệ thống của riêng mình và thêm chứng chỉ của Burp là đáng tin cậy để trình duyệt bắt đầu tin tưởng chứng chỉ máy chủ của Burp và trang web được truy cập thông qua proxy của burp. Bằng cách này, kẻ tấn công có thể đọc, sửa đổi và gửi các yêu cầu bắt nguồn từ hệ thống của mình.
- SSL Pinning : Được sử dụng phổ biến nhất trong Android APK và iOS IPA, đây là một kỹ thuật được các nhà phát triển triển khai trong mã của họ ở phía máy khách để ngăn chặn các cuộc tấn công MiTM. Nó xác thực lại chứng chỉ máy chủ ngay cả sau khi bắt tay SSL. Các nhà phát triển thêm hoặc ghim danh sách các chứng chỉ đáng tin cậy vào chính mã của ứng dụng khách và sử dụng nó để so sánh với các chứng chỉ của máy chủ trong thời gian chạy.
Do đó, có một vấn đề đối với kẻ tấn công là ngay cả khi có chứng chỉ tự tạo được cài đặt trên thiết bị khách, giao tiếp vẫn không bị chặn do mã ghim chứng chỉ được nhúng của nhà phát triển trong ứng dụng. Đây thường là chứng chỉ x509 hoặc khóa công khai.
Vì vậy, bây giờ nếu có sự không khớp, kết nối sẽ bị gián đoạn và không thể liên lạc được nữa.
Điều này có thể được hiểu theo sơ đồ như sau:

Bạn có thể đọc thêm về nó trên trang web của OWASP tại đây .
- Bỏ qua ghim SSL : Để bỏ qua ghim SSL, có hai phương pháp khác
Phương pháp 1:
Trong các ứng dụng Android, mã có một số chuỗi như “ checkClientTrusted ” hoặc “ checkServerTrusted ” thường là mã có ghim. Nó cũng có thể là một số khác. Vì vậy, một cách để bỏ qua ghim SSL là dịch ngược mã nguồn, tìm kiếm mã này, xóa các dòng mã này, biên dịch lại và ký bằng apktool. Thông tin chi tiết về điều này sẽ được đề cập trong một bài viết tiếp theo về các ứng dụng Android thiết kế ngược.
Phương pháp 2:
Để bỏ qua tính năng ghim SSL, chúng tôi sẽ đưa một mã tùy chỉnh vào ứng dụng, trong khi ứng dụng đang chạy , để nó thêm chứng chỉ tự tạo của chúng tôi làm chứng chỉ đáng tin cậy cho ứng dụng. Quá trình chèn mã trong khi một ứng dụng đang chạy được gọi là nối . Frida cho phép người dùng tạo các hook và thay đổi hành vi của ứng dụng trong thời gian chạy. Hooking cũng cho phép một người chặn phần mềm đối với các cuộc gọi phần cứng và sửa đổi nó.
Frida hooking : Giờ đây, một mình Frida có rất nhiều khả năng kết nối vào các ứng dụng Android bằng javascript. Nhưng kiến thức về javascript là điều cần thiết để viết mã này theo cách thủ công. Có nhiều tập lệnh khác nhau có sẵn để thực hiện việc này trên github như ở đây nhưng để tránh hoàn toàn sự phức tạp này chỉ với một vài cú nhấp chuột, chính là nơi mà sự phản đối xuất hiện trong bức tranh.
- Bỏ qua SSLPinning sử dụng Phản đối : Như đã nêu ở trên, Phản đối dựa trên API của Frida. Nó cũng có các công cụ tuyệt vời để bỏ qua ghim SSL bằng cách tạo mã javascript và nối nó vào ứng dụng.
Hãy xem nó được thực hiện như thế nào nhưng trước đó, chúng tôi sẽ thiết lập burpsuite trên Android của mình để chặn giao tiếp từ một ứng dụng có SSL.
Bước 1: Mở ợ và thêm giao diện.

Bước 2: Thêm một số cổng khác ngoài cổng đã được sử dụng, chẳng hạn như cổng 8082. Thay đổi tùy chọn liên kết thành địa chỉ thành Tất cả giao diện và nhấp vào ok.

Bước 3: Truy cập Wi-Fi Android của bạn và nhấp vào chỉnh sửa kết nối (biểu tượng bút chì)

Bước 4: Thay đổi proxy thành thủ công và thêm tên máy chủ làm IP của bạn trên đó ợ đang được chạy. Ngoài ra, thay đổi cổng của bạn thành 8082 và nhấp vào lưu.

Bước 5: Chuyển sang thiết bị Android của bạn và gõ “http: // burp: 8082” và tải xuống cacert của ợ.

Bước 6: Sau khi chứng chỉ được tải xuống, hãy chuyển đến tùy chọn Wi-Fi và xuống dưới cùng, bạn sẽ tìm thấy tùy chọn “ cài đặt chứng chỉ ”. Nhấp vào nó và chọn chứng chỉ bạn vừa tải xuống. Nhưng bạn sẽ lưu ý rằng chứng chỉ đã tải xuống ở định dạng * .der và android không nhận dạng đó là chứng chỉ hợp lệ. Vì vậy, chúng tôi sẽ kéo chứng chỉ và đổi tên nó thành “ cert-der.crt ”

Để đổi tên này, chúng ta gõ lệnh sau:
1 2 | adb pull /sdcard/Download/cacert.der adb push cacert.der /tmp/cert-der.crt |

Bước 7: Khi bạn đã tải xuống, bạn sẽ tìm thấy một tùy chọn để đổi tên chứng chỉ. Chỉ cần nhập “cacert” và đảm bảo rằng các ứng dụng sử dụng thông tin đăng nhập đã được chọn.

Bước 8: Cacert bây giờ đã được cài đặt thành công và bạn cần lưu ý rằng burp hiện đã bắt đầu thu thập tất cả lưu lượng truy cập từ trình duyệt và một số ứng dụng. Lưu ý rằng đây chỉ là những ứng dụng không được bật tính năng ghim SSL.

Truy cập trang web HTTPS và bạn sẽ thấy các yêu cầu hiện đang được ghi lại. Bạn có thể xác minh chứng chỉ đã cài đặt bằng cách đi tới Cài đặt-> thông tin đăng nhập đáng tin cậy-> người dùng .
Sau khi cài đặt nó, các kết nối SSL cũng đang được bắt. Ví dụ: portwigger.net

Bước 9: Bây giờ mọi thứ đã được thiết lập, chúng tôi sẽ cần một ứng dụng để kiểm tra SSL Pinning. Có một ứng dụng trong playstore có tên là “Bản trình diễn ghim chứng chỉ ”. Ứng dụng này sẽ giúp chúng tôi chứng minh việc bỏ qua ghim SSL bằng cách sử dụng phản đối. Vì vậy, hãy cài đặt cái này trên thiết bị.

Bước 10: Đi tới ứng dụng và ghim HttpURLConnection.

Bây giờ, khi bạn gửi yêu cầu cho URL mẫu đã được cung cấp theo mặc định, tức là ssllabs.com, chúng tôi lưu ý rằng yêu cầu đã không thành công do lỗi chứng chỉ ngay cả sau khi chúng tôi đã cài đặt cacert của mình trong thiết bị.

Tiếp tục , các bạn sẽ thấy rằng không có yêu cầu nào được ghi lại. Bây giờ, đây là phần thú vị. Bỏ qua SSLPinning bằng cách sử dụng Objection Framework.

Bước 11: Đính kèm gói vào Objection Framework và chạy lệnh khám phá:
1 | objection –gadget com.osfg.certificatepinning explore |

Bước 12: Chúng tôi sẽ sử dụng module android sslpinning để tắt SSLPinning trong khi gói đang chạy. Objection Framework chèn một mã JavaScript hoặc “nối” nó bằng cách sử dụng đại lý của Frida để làm như vậy.
1 | android sslpinning disable |

Sau khi hoàn tất, hãy nhấp vào gửi một lần nữa trong ứng dụng và kiểm tra ợ xem có thể có bất kỳ thông tin liên lạc nào mà nó đã chặn hay không.

Bây giờ, chúng ta thấy mã trạng thái là 200, tức là kết nối được thiết lập thành công mà không có lỗi chứng chỉ. Do đó ta đã bỏ qua SSLPinning!

Android Hooking
Như đã giải thích ngắn gọn trong phương pháp Bỏ qua SSLPinning ở trên, nối là quá trình chèn mã của chúng tôi (hoặc móc) trong khi ứng dụng đang chạy để sửa đổi hành vi của nó. Hooking cho phép khách hàng xem phần mềm với giao tiếp phần cứng, sửa đổi đầu ra / chức năng của các phương pháp đang được sử dụng. Frida sử dụng javascript để kết nối vào các phương thức của ứng dụng đang chạy, vì vậy chúng tôi sẽ chứng minh tính năng nối như một khái niệm cho một ứng dụng Android nhỏ mà chúng tôi đã viết và sử dụng javascript để kết nối vào các phương thức.
Ở đây, ta có một đoạn mã nhỏ bằng Java để tính tổng của 10 và 50.
1234567891011121314151617181920212223242526272829303132 | package com.example.harshitrajpal;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;public class MainActivity extends AppCompatActivity { Button add_button; TextView a,b,sum; double add=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); a=(TextView)findViewById(R.id.num1); b=(TextView)findViewById(R.id.num2); add_button=(Button) findViewById(R.id.add_button); sum=(TextView)findViewById(R.id.sum); add_button.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ sum.setText(Double.toString(returnValue())); } }); } double returnValue(){ double a1 = 10; double b1 = 50; add= a1 + b1; return add; }} |
Như bạn có thể thấy, nó đang lấy hai số làm đầu vào và hiển thị kết quả của nó.
Lưu ý: Bạn có thể tải xuống mã nguồn của ứng dụng từ đây .

Bây giờ chúng ta sẽ tạo một hook trong javascript và cố gắng giả mạo đầu ra của hai số! Như bạn có thể thấy, ứng dụng đang sử dụng một hàm có tên là returnValue để tính toán. Có lẽ chúng ta có thể giả mạo nó.
Sau đây là hook mà tôi đã tạo trong javascript cho chương trình trên, trong đó ta đã thay đổi giá trị trả về thành 100:

Bạn có thể tải xuống mã cho tệp javascript này từ đây .
Bây giờ, khi chạy mã này theo cách thủ công bằng frida, các bạn thấy như sau:

Và chắc chắn, khi chúng ta nhấp vào add, chúng ta thấy rằng hook đã hoạt động!

Để làm cho việc tạo mã hook javascript dễ dàng bị Objection Framework có thể tự động hóa quá trình này. Hãy cùng khám phá xem tất cả các lựa chọn phản đối có tác dụng gì. Hãy đính kèm tiện ích trong Objection Framework và khám phá tất cả các tùy chọn nối có liên quan:
1 2 | objection –gadget com.example.harshitrajpal explore android hooking generate simple com.example.harshitrajpal.MainActivity |
Bây giờ, mã này chỉ cần được sửa đổi ở các vị trí nhận xét và chúng tôi có thể thực hiện bất kỳ chức năng nào mà chúng tôi muốn mã làm như vậy, trong thời gian chạy! Thật thú vị phải không?

Nó là giá trị khám phá một số chức năng liên quan khác trong phản đối có thể làm cho cuộc sống của chúng ta dễ dàng. Ví dụ: khám phá tất cả các phương thức trong ứng dụng thường sẽ không hiển thị trừ khi chúng tôi dịch ngược ứng dụng. Điều này giống như:
1 | android hooking list class_methods com.example.harshitrajpal.MainActivity |

Tương tự, chúng ta cũng có thể tìm kiếm tất cả các lớp bắt đầu có từ “chính” thông qua lệnh sau:
1 | android hooking search classes main |
Bây giờ, nếu chúng ta muốn theo dõi một hoạt động cụ thể để xem tất cả các chức năng mà hoạt động gọi là gì và theo trình tự logic nào để hiểu rõ hơn về cách tạo hook, chúng ta sẽ nhập lệnh sau:
1 | android hooking watch class com.example.harshitrajpal.MainActivity –dump-args –dump-backtrace –dump-return |

Thực hiện Shell
Phản đối cũng có thể thực thi một trình bao cục bộ trong giao diện của chính nó. Đó là một thủ thuật nhỏ tiện dụng giúp tiết kiệm những rắc rối khi mở các tab mới.
1 2 | android shell_exec ls android shell_exec whoami |

FLAG_SECURE ByPass
Thông thường, các nhà phát triển Android đặt kiểm tra mã của họ được gọi là “FLAG_SECURE” để ngăn người dùng xem nội dung của một ứng dụng trong khi nó được thu nhỏ. Đây là một chức năng quan trọng vì nhiều ứng dụng không cho phép người dùng xem tài liệu trong khi ứng dụng được thu nhỏ. Chuyển đổi cờ này sẽ chuyển đổi bảo mật đó. Objection Framework có khả năng chuyển đổi cờ này trong thời gian chạy. Đầu tiên, hãy đặt cờ thành true và xem điều gì sẽ xảy ra:
1 2 | android ui FLAG_SECURE android ui FLAG_SECURE true |

Bây giờ, hãy thu nhỏ ứng dụng vào ngăn kéo và xem điều này đã làm được gì. Rõ ràng là chúng tôi không thể xem bất kỳ nội dung nào khi nội dung đó được thu nhỏ

Bây giờ chúng ta hãy tắt cờ
1 | android ui FLAG_SECURE false |

Hãy xem điều gì sẽ xảy ra với ứng dụng bây giờ khi nó được thu nhỏ. Chắc chắn rồi, bây giờ chúng ta có thể xem nội dung!

Khởi chạy hoạt động bằng cách sử dụng Objection Framework
Objection Framework cũng có thể được sử dụng để khởi chạy một hoạt động từ bên trong giao diện của nó. Điều này cũng giống như công cụ am của gdb với tùy chọn -n như chúng ta đã thấy trong bài viết trước . Để bắt đầu một hoạt động, chúng tôi nhập:
1 2 | android intent launch_activity android intent launch_activity jakhar.aseem.diva.APICredsActivity |
Lưu ý, để khởi chạy hoạt động của DIVA, trước tiên hãy đính kèm tiện ích của nó

Và chắc chắn, hoạt động hiện đã bắt đầu

Bỏ qua phát hiện gốc (root checker)
Phát hiện root là một tính năng mà các nhà phát triển viết mã trong ứng dụng của họ để hạn chế ứng dụng của họ chạy trên các thiết bị đã root vì mục đích bảo mật. Một lần nữa có hai phương pháp để bỏ qua việc phát hiện gốc, một là thông qua thiết kế ngược ứng dụng và phương pháp kia là sử dụng một công cụ như Objection Framework.
Để làm điều này theo Objection Framework sử dụng các lệnh sau:
1 | android root disable |
Để mô phỏng lại việc phát hiện root:
1 | android root simulate |

Các nhiệm vụ liên quan đến bộ nhớ
Để chơi với bộ nhớ cấp thấp, phản đối có một công cụ tiện dụng được gọi là mô-đun bộ nhớ cho phép một người xem quá trình nào đang xuất vào bộ nhớ, nơi nó đang ghi và hơn thế nữa!
Ở đây, chúng ta hãy xem tất cả các mô-đun được tải vào bộ nhớ trong khi tiện ích được đính kèm
1 | memory list modules |

Ở phía dưới, chúng ta cũng sẽ thấy một mô-đun Frida.

Bây giờ, để xem Frida đang xuất gì và địa chỉ tương ứng của nó:
1 | memory list exports Frida-agent-32.so |

Tương tự, chúng ta cũng có thể tìm kiếm một chuỗi cụ thể trong bộ nhớ và thậm chí ghi đè lên nó. Để tìm kiếm một chuỗi, chúng ta gõ:
1 | memory search 4141 –string |
Và chúng ta sẽ thấy Objection Framework trả về địa chỉ bộ nhớ của khối bộ nhớ chứa chuỗi được xác định.

Để ghi vào bộ nhớ, chúng ta có lệnh sau:
1 | memory write <address> <string> –string |
Ta sẽ không ghi vào bộ nhớ ngay bây giờ và phạm vi chuyên sâu về các tác vụ liên quan đến bộ nhớ sẽ được đề cập chi tiết trong một bài viết sắp tới.
Phần kết luận
Trong bài viết này, chúng ta đã thấy Objection Framework là một công cụ hữu ích tự động hóa các tác vụ khác nhau trong khi thực hiện phân tích APK tĩnh và động. Chúng tôi cũng đã làm quen với SSLPinning bypass và android hooking.