Một số hướng giải các challenges mức dễ tại https://app.hackthebox.com/challenges?category=8 📱 🔨
Don’t Overreact
Tải app về và mở lên bằng Jadx-GUI, thì có thể thấy rằng app được code bằng React Native
Với React Native, các đoạn mã logic của ứng dụng được viết phần lớn bằng Javascript và được “đóng gói” trong file index.android.bundle (đối với android). File này có thể tìm thấy trong thư mục /assets/ sau khi decompile file apk bằng apktool
Do app không dùng helmet (code không bị chuyển thành bytecode), nên có thể đọc code đã obfuscate tại index.android.bundle, cuối file này có một chuỗi được mã hoá bằng base64
Decode chuỗi trên có kết quả là flag 👀
Không nên lưu các chuỗi bí mật ở client, app build bằng React Native cần sử dụng helmet để tăng tính bảo mật 😀
FastJson and Furious
Lại tải app về và mở file apk bằng Jadx-GUI, có thể thấy khi click button, hàm calcHash sẽ được gọi để lấy flag
Code hàm calcHash
để chạy được code trong khối try catch thì giá trị của biến succeed phải là true (hiện tại đang là false). Để thay đổi giá trị của biến này, có thể dùng code frida script như sau:
1 2 3 4 5 6 7 8 9 10 11 |
// Thay doi gia tri cua bien success let MainActivity = Java.use("hhhkb.ctf.fastjson_and_furious.MainActivity"); MainActivity.succeed.value = true; // bonus doan nay de lay flag :D MainActivity["calcHash"].implementation = function (str) { console.log(`MainActivity.calcHash is called: str=${str}`); let result = this["calcHash"](str); console.log(`MainActivity.calcHash result=${result}`); return result; }; |
Sau khi chạy app với script trên, ta có flag
Nhưng rất tiếc flag này không chính xác :v
Mình cứ nghĩ là trong app sẽ có một chuỗi nào đó dạng JSON để điền vào input rồi ra flag, nhưng tìm mãi không thấy nên mình đã đi xem writeup 🙂↕️
Pinned
Bài này thì kiếm cái script bypass SSL trên mạng, đem về chạy để bắt request qua burpsuite là xong 😀
1 |
frida -Uf com.example.pinned -l ssl.js |
Manager
Bài này bật burp suite lên, thực hiện các chức năng để bắt request từ app. Sẽ phát hiện một lỗi tại API POST /manage.php, cho phép update mật khẩu của user tuỳ ý mà không cần xác thực. Vậy chỉ cần đổi mật khẩu admin rồi đăng nhập là có flag 😀
Anchored
App thực hiện check máy đã root và chặn không cho sử dụng như trong mô tả “The application is intended to run in a non-rooted device”. Khi mở app lên, app có hiện một thông báo là “Rooted device detected!”, thấy vậy thì mình đã dùng jadx-gui để tìm chuỗi này xem nơi trả về kết quả check root :v
Có 4 đoạn code check. Các phần kiểm tra file, app thì đã bị magisk bypass. Nhưng có một đoạn code làm mình thấy phần check này rất là false positive
Chỗ này z3 luôn có giá trị là false mà 🤔
Và mình quyết định cho app chạy hàm finish nhưng không cho thoát app bằng script sau:
1 2 3 4 |
let Activity = Java.use("android.app.Activity"); Activity.finish.overload().implementation = function () { console.log("Calling finish..."); }; |
Và một màn hình của app xuất hiện
Việc còn lại chỉ là bypass ssl pinning bằng script trên mạng và lụm flag 😋
APKrypt
Code của app như thế này
Thì chỉ cần dùng frida script như sau để lấy flag 😀
1 2 3 4 5 6 7 |
let MainActivity = Java.use("com.example.apkrypt.MainActivity"); console.log( MainActivity.decrypt( "k+RLD5J86JRYnluaZLF3Zs/yJrVdVfGo1CQy5k0+tCZDJZTozBWPn2lExQYDHH1l" ) ); |
APKey
Code
Thêm một bài có thể dễ dàng lấy flag bằng frida script
1 2 3 |
let g = Java.use("c.b.a.g"); let b = Java.use("c.b.a.b"); console.log(b.a(g.a())); |
Cat
Bài này tải file về giải nén ra được 1 file .ab, file .ab là file android backup. Do không được bảo vệ bằng mật khẩu, file này có thể giải nén bằng lệnh sau
1 |
java -jar abe.jar unpack cat.ab cat.tar |
Sau khi giải nén file cat.tar, ta có một thư mục Cat, lục lọi một lúc thì tìm được flag