# Pentest Android-InsecureBankV2
## Giới thiệu top 10 owasp mobile

OWASP Mobile Top 10 là danh sách 10 nhóm rủi ro bảo mật phổ biến nhất trên ứng dụng di động, được cộng đồng OWASP cập nhật định kỳ. Nó giúp pentester, developer, và security researcher có chung một khung tham chiếu khi đánh giá và vá lỗi ứng dụng.
- Phiên bản 2016: tập trung nhiều vào khía cạnh kỹ thuật (platform misuse, insecure data storage, reverse engineering…).
- Phiên bản 2024: được cập nhật để phản ánh bối cảnh mới (supply chain, privacy, input validation, security misconfig…).
So sánh nhanh 2016 vs 2024:
- Xuất hiện thêm các mục mới:
- Improper Credential Usage
- Inadequate Supply Chain Security
- Inadequate Privacy Controls
- Insufficient Input/Output Validation
- Một số mục bị gộp / dịch chuyển:
- Insecure Authentication + Insecure Authorization → thành M3: Insecure Authentication/Authorization
- Code Tampering + Reverse Engineering → thành M7: Insufficient Binary Protections
- Insecure Communication → từ M3 (2016) → M5 (2024)
- Insecure Data Storage → từ M2 (2016) → M9 (2024)
- Insufficient Cryptography → từ M5 (2016) → M10 (2024)
- Một số mục được định nghĩa lại: Extraneous Functionality → Security Misconfiguration.
📌 Ý nghĩa cho pentest InsecureBankV2:
Ứng dụng này chứa nhiều lỗ hổng mô phỏng theo các nhóm OWASP Mobile Top 10. Trong bài lab này, chúng ta sẽ phân tích và khai thác từng lỗ hổng tiêu biểu.
## Lab Android-InsecureBankv2

### 1. **Giới thiệu**
- InsecureBankV2 là ứng dụng Android có chủ đích chứa nhiều lỗ hổng bảo mật.
- Mục tiêu: giúp pentester, researcher và developer thực hành khai thác mobile app vulnerabilities.
- Các nhóm lỗi được mô phỏng: insecure login, insecure data storage, root detection bypass, insecure webview…
### 2. **Setup lab**
- Mình đã viết 1 blog riêng để set-up lab này cho python 2 rồi các có thể đọc [ở đây](https://hackmd.io/@PinkArmor/setuplabandroidinsecurebank).
- Còn đây là [server lab cho python 3](https://github.com/PinkArmor/Android-InsecureBankv2-Server-for-python3).
> Các bạn chọn bản python phù hợp với môi trường của máy tính mình hiện tại nhé.
## Khai thác lỗ hổng
Mình có tham khảo cách làm vài câu của anh [tsug0d](https://github.com/tsug0d/AndroidMobilePentest101) và [walkthroughs](https://github.com/dineshshetty/Android-InsecureBankv2/tree/master/Walkthroughs) của Android-InsecureBankv2
### 1. **Hardcoded backdoor account**

- Mở file bằng jadx.
- Trong `com/android.insecurebankv2/Dologin` có đoạn code trên khi đăng nhập với tài khoản là “devadmin” thì tự động login vào đc ko cần quan tâm đến mật khẩu :v.


⇒ Nếu user nhập `devadmin` thì login không cần password.
⇒ Ý nghĩa: hardcode tài khoản đặc biệt → bypass auth.
### 2. **Patch Android App (Privilege Escalation)**
Một huyền thoại đã từng nói: “Nếu bạn muốn làm 1 pentester giỏi, hay nhà bảo mật ưu tú, thì phải lưu nhớ rằng: thấy cái gì yes thì chuyển thành no, no thì chuyển thành yes”.

- Chúng ta vào `InsecureBankv2/res/values/strings.xml`
- Chuyển đoạn is_admin này thành `yes` xong save lại rồi patch thui.

- Build lại app.
- File apk vừa recompile lại nằm ở thư mục dist.

- Tiếp theo bạn phải xóa cái app ban đầu trên điện thoại rồi mới tải app mới này lên được.
- Trước khi tải lại bạn phải sign cho app mới này cài được.
<pre>```keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000```</pre>
- Mấy cái kia cứ điền bừa là đc nhé =))
<pre>```jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore InsecureBankv2.apk alias_name```</pre>
- Xong bước này thì cài lại app thui.
- Đổi tên


- Nhớ nhập lại đúng IP server nhá.

- Nút Create User thì chỉ có admin mới thấy.
### 3. **Root Detection Bypass**
Các chương trình hầu hết đều có các đoạn code kiểm tra để ngăn chặn attacker phân tích mã nguồn của app như root detection và emulator detection. Hai cái phổ biến trên android.

> Một số dấu hiệu dấu hiệu thường dùng để check root trong Android.

- Trong `InsecureBankv2/com/android.insecurebankv2/PostLogin` và vào shell của app kiểm tra các dấu hiệu điện thoại cài app đã bị root.

- App kiểm tra sẽ phát hiện root khi tồn tại `system/app/Superuser.apk` nhưng thực ra cái nó cần kiểm tra là `system/app/Superuser/Superuser.apk`
- App mình tải lại ko có cái detect emulator =))
👉 Bypass root detect

- Vào `PostLogin.smali`.


- Chỗ kiểm tra root tương ứng với chỗ điều kiện trên jadx ấy đây.
- Nó gọi 2 hàm:
- `doesSuperuserApkExist()` → kiểm tra file `/system/app/Superuser.apk`
- `doesSUexist()` → kiểm tra binary `su` trong hệ thống.
- Sau đó kết quả gán vào biến `isrooted (v0)`.
- Nếu `isrooted = 1` → app in `Rooted Device!!`.
- Nếu `isrooted = 0` → app in `Device not Rooted!!`.

Sửa xong build lại app rồi tải lại lên điện thoại thôi.


- Có keystore rồi thì chỉ cần kí jarsigner là đc nhá.


- Bypass rùi nè.
- Cách trên về cơ bản nó chỉ bypass root trên UI thôi chứ về logic thì cái hàm nó vẫn kiểm tra thiết bị có bị root hay ko.
- Nếu muốn sửa theo kiểu logic thì phải cách này.

- Tại sao cách này là bypass logic thật sự?
- `isrooted` là biến quyết định toàn bộ luồng xử lý.
- Bằng việc set `v0 = 0` ngay từ đầu, ta không chỉ thay đổi UI mà còn thay đổi giá trị logic mà các phần khác trong app dùng để quyết định có chặn tính năng hay không.
- Như vậy, mọi đoạn code phụ thuộc vào `isrooted` sẽ tin rằng máy không root, kể cả khi thật sự root.
### 4. **Insecure Login Mechanism**
Phân tích cơ chế login yếu kém.

- `android:exported="true"` nghĩa là Activity này có thể được gọi từ bên ngoài app (bất kỳ app nào khác hoặc ADB).
- Bình thường `PostLogin` chỉ được mở sau khi login thành công, nhưng do `export = true` nên attacker có thể bypass login.

- Kết quả: app mở thẳng màn hình `PostLogin` mà không cần đi qua `DoLogin`.
- Đây là bypass cơ chế xác thực.

### 5. **Insecure Credential Storage**
App lưu trữ / xử lý credential thiếu bảo mật (hardcoded key, crypto yếu, lưu local không mã hóa).
Kiểm tra `DoLogin`, `LoginActivity`, `CryptoClass`.

- `com/android.insecurebankv2/DoLogin`
- Username chỉ encode Base64, không hề mã hóa (base64 ≠ encryption).
- Password có mã hóa, nhưng dùng key hardcoded và IV cố định → attacker giải mã được dễ dàng.

- `com/android.insecurebankv2/LoginActivity`

- `com/android.insecurebankv2/CryptoClass`
- Key hardcoded: Khóa AES được hardcode trong source code → attacker decompile apk là lấy được ngay.
- IV (Initialization Vector) cố định: ivBytes toàn số 0 → mất tính ngẫu nhiên, dễ tấn công replay/chosen-plaintext.
- AES/CBC/PKCS5Padding: Dùng chế độ CBC, nhưng IV yếu → dễ brute force/known plaintext attacks.
Tiến hành giải mã


- `shared_prefs` trong Android là nơi app lưu trữ dữ liệu dạng key–value.





### 6. **Debug Mode Enabled**

- Mặc định khi build release APK, thuộc tính này phải là false.
- Nhưng nhiều dev quên tắt → app release vẫn bật debug.



- `adb shell` truy cập dễ hơn nếu device/emulator root hoặc có quyền debug, attacker có thể `adb shell` vào và truy cập trực tiếp thư mục private của app `/data/data/<package>`.
### 7. **Backup mode endable**

- Android cho phép `ADB backup & restore` toàn bộ dữ liệu của ứng dụng.
- Đây là tính năng hỗ trợ user di chuyển dữ liệu khi đổi máy.
- Mặc định, nếu không khai báo, `allowBackup = true`.

- Toàn bộ dữ liệu app (bao gồm `shared_prefs`, `database`, `files`) sẽ được export.

- Cần thiết bị cho phép `adb backup`.

`Android Backup Extractor (ABE)`
- [Android Backup Extractor (ABE)](https://github.com/nelenkov/android-backup-extractor/releases) – một tool thường dùng để xử lý file backup `.ab` mà Android tạo ra khi app có `android:allowBackup="true"`.


### 8. **Insecure Logging**
- Trong quá trình phát triển, dev thường dùng `Log.d()`, `Log.i()`, `Log.e()`… để debug.
- Nhưng nếu log ra thông tin nhạy cảm (username, password, token, dữ liệu giao dịch…) thì khi app chạy trên thiết bị:
- Các thông tin này sẽ bị ghi vào logcat.
- Trên máy root, bất kỳ app nào hoặc attacker có quyền debug đều có thể đọc logcat.

- Dùng `Log.d()` để in thẳng username + password ra logcat.
- Logcat có thể đọc được bởi bất kỳ ứng dụng nào khác đang chạy trên device/emulator nếu chúng có quyền đọc log (READ_LOGS hoặc trên thiết bị cũ < Android 4.1, logcat global).
- Điều này dẫn đến rò rỉ thông tin nhạy cảm (credentials leak).

- Lần này làm trên kali nhé.



- Dùng `pidcat`:
- `pidcat` là một tool Python (do Jake Wharton viết) dùng để lọc `logcat` theo package name.
- Bình thường `adb logcat` in ra cực kỳ nhiều log của cả hệ thống Android → rất khó tìm log của app mình đang test.
- `pidcat` sẽ tự động tìm PID (process ID) của app rồi chỉ hiển thị log của app đó.


### 9. **Insecure webview**
WebView không cấu hình an toàn → có thể bị XSS/JS injection.

- `loadUrl("file://...")` → app load file HTML từ External Storage (SD card).
- External storage có thể bị ghi bởi app khác → attacker chỉ cần tạo/ghi file `Statements_username.html` với nội dung độc hại (JavaScript, XSS, phishing).





### 10. **Local Data Storage Vulnerability**
- Dữ liệu nhạy cảm lưu local (SharedPreferences, DB) không mã hóa.
- Attacker có thể extract và đọc trực tiếp.


- `ctrl + d` to exit.


## 📌 Tổng kết
Trong lab **InsecureBankV2**, tôi đã thử khai thác nhiều lỗ hổng phổ biến thuộc **OWASP Mobile Top 10**:
- 🔑 **Hardcoded account**
→ Bypass đăng nhập chỉ với user `devadmin`.
- 🛠 **Patch APK**
→ Chỉnh sửa `is_admin` để leo quyền.
- 📲 **Root detection bypass**
→ Patch smali để app tin rằng thiết bị không root.
- 🚪 **Exported Activity**
→ Gọi thẳng `PostLogin` qua `adb`, bypass luôn login.
- 🔐 **Insecure credential storage**
→ Username/Password lưu ở `shared_prefs`.
- 🐞 **Debug mode enabled**
→ Cho phép attacker attach debugger, xem & sửa logic runtime.
- 💾 **Backup mode enabled**
→ Attacker dump dữ liệu app qua `adb backup` + `abe.jar`.
- 📜 **Insecure logging**
→ Credential/Token lộ thẳng trên logcat.
---
<p align="center"><strong>🔥 Happy Hacking! 🔥</strong></p>