Một số hướng giải các challenges mức trung bình tại https://app.hackthebox.com/challenges?category=8 📱 🔨

Angler

Một phần code trong file apk như sau

Đọc code xong thì mình thử chạy script để gọi hàm getInfo và giải mã thử String f1755y

Và kết quả:

Do hàm getInfo được định nghĩa bên trong thư viện angler nên mình thử mở thư viện này bằng Ghidra xem có gì bên trong, và đây là kết quả:

Note: Lấy thư viện bằng cách decompile file apk bằng lệnh adb d Angler.apk , sau đó file thư libangler.so sẽ xuất hiện trong thư mục Angler/lib/x86_64 

Hàm getInfo thực hiện vài logic, đáng chú ý là thực hiện 2 lời gọi hàm đến 2 hàm illusionne. Hàm illusion không có gì hot, nhưng hàm ne thì có 1 đoạn code như sau

Code dòng 218: Thực hiện so sánh 2 chuỗi, lưu kết quả vào biến iVar3. Nếu 2 chuỗi bằng nhau thì iVar3 có giá trị bằng 0, và nếu iVar3 bằng 0 thì gán chuỗi “You found the flag” cho biến param_1 (là tham số của hàm ne). Vậy bước đi tiếp theo sẽ là sử dụng frida để lấy 2 tham số của hàm strcmp trong hình trên, để ít nhất cũng cho ra được chuỗi You found the flag cái đã :D. script:

Ý nghĩa của đoạn code trên là liệt kê các import trong thư viện libangler.so, tìm các import là có kiểu là function và tên là strcmp. Sau đó dùng Interceptor.attach để intercept lệnh gọi hàm strcmp và in ra 2 tham số của hàm này. Sau khi chạy thì kết quả cho ra khá nhiều, nhưng phần đầu tìm ra được 1 chuỗi
4854427b796f755f3472335f676f6f645f34745f6830306b316e397d là tham số thứ 2 trong hàm strcmp

Theo như hash identifier thì đây là Hex encoded string

Đem đi decode thử thì ra flag 😀

Waiting

Mô tả của bài lab này nói rằng: The app stores a secret and says it is stored securely even in case the application has been tampered. Are you able to retrieve it?
Ý là có triển khai phát hiện frida, nên không thể dùng chiêu thức hook để lấy secret key được

Qua tham khảo code thì thấy có hàm getdxXEPMNe trong thư viện secret

Thử dùng frida script để lấy flag

và kết quả là có flag trước khi app bị crash 😆😆😆

Mình nhớ là có đọc ở đâu đó rằng code trong script frida sẽ luôn chạy trước app. Nên có vẻ đây là lý do cho việc lấy được flag trước khi app phát hiện đang dùng frida :v

Investigator

Tải file từ bài lab về giải nén ra thì nhận được 1 file backup có mật khẩu và một thư mục system, lượn lờ một lúc thì mình thấy có 3 file khá hay. File đầu tiên là /system/password.key

Tiếp theo là file /system/device_policies.xml, file này cho thấy mật khẩu của thiết bị khả năng cao có độ dài 5 ký tự, chỉ chứa chữ viết thường

Và cuối cùng là file /system/locksettings.db, trong file này có một vài thông tin hữu ích là password_salt

Mô tả của bài lab nói rằng chủ sở hữu của thiết bị sử dụng cùng mật khẩu cho hầu hết mọi thứ. Từ đó có hướng đi tiếp theo là brute force mật khẩu của thiết bị để thử với file backup.
Sau một hồi tìm hiểu trên mạng các thứ thì mình tìm ra bài này, rồi làm theo và …
Tìm được flag trong bảng message của file database whatapps đã được giải mã

Supermarket

Làm bài này lúc đầu đọc mô tả thấy tìm discount code cứ nghĩ là sẽ khai thác lỗi nào đó ở server, kiểu SQLi hay brute force gì đó, cũng thử bypass ssl các thứ nhưng trong burp không thấy request. Nhìn lại app thì…app không có quyền INTERNET, nên không giao tiếp với server 🙂

Tiếp đó thì quay sang đọc code trong MainActivity, mở app ở thiết bị thì mình thấy một điều là cả màn hình chỉ có một chỗ nhập text (là chỗ nhập mã discount). Như vậy thì hàm lắng nghe sự kiện text thay đổi (onTextChange) là dùng để lắng nghe sự kiện nhập mã discount và String obj ở dòng 112 là giá trị của mã discount người dùng nhập vào.

Tiếp theo ở dòng 120, app thực hiện so sánh mã người dùng nhập vào với 1 đoạn text nào đó. Để lấy giá trị của đoạn text bí ẩn này, có thể sử dụng đoạn frida script sau để mở app

Khi mở app bằng đoạn script trên và nhập một ký tự vào input discount, trong console sẽ nhận được kết quả là 1 byte array

Cuối cùng là decode và nhận flag

SAW

Vừa mở app đã bị lỗi @@

Tưởng đâu đó là lỗi viết app, hoá ra đây là một chiêu thức của malware để không cho người dùng mở như cách bình thường.

Đoạn code trên cho thấy, cần phải mở app kèm theo dữ liệu dạng string với key là “open” và value là “sesame” được truyền vào activity. Để làm việc này có 2 cách, một là sử dụng một app khác để start app Saw thông qua intent, 2 là có thể dùng lệnh adb sau:

Khi chạy lệnh trên thì mở được app

Như click vào button đỏ không được 🙂

… (tobe continued)

SeeTheSharpFlag

Lab cung cấp mỗi file apk kiến trúc x86, máy mình không cài được 🥹

Cryptohorrific

Bài lab cung cấp 1 file zip, giải nén ra sẽ nhận được file có tên là hackthebox. Mở file bằng Ghidra, và hỉnh ảnh sau xuất hiện :v

Class viewDidLoad

Trong class trên có đoạn code gọi đến hàm SecretManager:key:iv:data (dòng 42)
Lệnh gọi hàm này truyền tham số thứ 4, 5 là 2 địa chỉ, giá trị thật của 2 tham số này lần lượt là “!A%D*G-KaPdSgVkY” và “QfTjWnZq4t7w!z%C”

Tiếp theo ta thấy trong hàm SecretManager:key:iv:data lại gọi đến hàm _CCCrypt với các tham số như hình. Thông tin về hàm CCCrypt ở đây

Ví dụ với hình trên, ta có tham số op của hàm _CCCrypt bằng biến local_74, local_74 = param_3, tham số thứ 3 trong lời gọi hàm SecretManager:key:iv:data (dòng 42 class viewDidLoad) là 1. Như vậy op = 1 => op là kCCDecrypt, tức là đang gọi hàm _CCCrypt với chế độ giải mã. Thực hiện trace tương tự với các tham số khác và dựa vào document của hàm CCCrypt, ta có:
– Tham số thứ 2 (thuật toán mã hoá) có giá trị là 0, tức là kCCAlgorithmAES128 => thuật toán được sử dụng là AES
– Tham số thứ 3 (Tùy chọn mã hóa) có giá trị là 3, tức là kết hợp của kCCOptionPKCS7Padding và kCCOptionECBMode
– Tham số thứ 4 (Khóa mã hóa) là biến local_38, đọc code có thể thấy biến local_38 = local_80 = param_4 = “!A%D*G-KaPdSgVkY”

Đến đây thì mình thử decrypt chuỗi flag trong file challenge.plist (bên trong file hackthebox)

và…(valid flag) :v

Categorized in:

Tagged in:

,