# Samsung CTF 2021 - ADBaby ## Indonesia Berikut deskripsi soal ![](https://i.imgur.com/I5TErN8.png) Diberikan koneksi untuk melakukan koneksi dari local ke server melalui adb. Beberapa command adb diblacklist seperti shell. ![](https://i.imgur.com/9BEnvb2.png) Beberapa fungsi seperti pull berhasil dilakukan ![](https://i.imgur.com/yMz3zcd.png) Kami lalu mencoba untuk melakukan recon terhadap apa saja perintah adb yang dapat dilakukan dengan framework ghost https://github.com/EntySec/Ghost Ghost dapat digunakan untuk beberapa hal seperti ditampilkan pada menu. ![](https://i.imgur.com/L62iaGN.png) ![](https://i.imgur.com/i34ZUW7.png) Setelah mencoba beberapa fungsi. Kami menemukan bahwa fungsi list dapat digunakan untuk melakukan directory listing pada server ![](https://i.imgur.com/rOyUWlz.png) Namun ada beberapa kondisi janggal saat mengakses beberapa file atau folder, contohnya saat kami mencoba mengakses /data, aplikasi akan hang dan timeout. Kami lalu mencoba melihat traffic yang dilakukan saat proses adb berlangsung. ![](https://i.imgur.com/qbtxqxv.png) Saat ditelusuri menggunakan wireshark, saat melakukan proses listing, client akan mengirim packet berikut. Terlihat juga bahwa server mengirim packet yang berisi "The Path cannot contain ./ ../data". Kami lalu mengecek isi environtment dari process adb yang digunakan. Salah satunya cmdline yang di eksekusi ![](https://i.imgur.com/dODD6sz.png) Terlihat bahwa adbd yang digunakan menggunakan adb custom dan berada pada /data/local/tmp/adbd_sctf ![](https://i.imgur.com/IQKU6So.png) Karena saat eksekusi adb, kami ada didalam proses adb, maka kita dapat mengunduh binary adb dengan melakukan pull terhadap file /proc/self/exe untuk dianalisa di local. ![](https://i.imgur.com/s1Rvwqb.png) Saat kami menganalisis binary, kami menemukan hal yang menarik. Berikut beberapa string yang sebelumnya kita temui di traffic. ![](https://i.imgur.com/e75rWDt.png) Terdapat juga string berikut yang kemungkinan berhubungan dengan flag. ![](https://i.imgur.com/DTdjc2P.png) Setelah menganalisis lebih jauh ada beberapa hal yang dapat disimpulkan dari binary adbd modif berikut 1. Beberapa command ADB di block dari sisi service. ![](https://i.imgur.com/jgELviv.png) ![](https://i.imgur.com/rDxQgx0.png) 2. Command sync ADB tidak dapat dilakukan untuk mengakses file / folder dengan string berisi ../ , ./ ataupun data, sehingga tidak dimungkinkan untuk mengakses flag (sejauh yang kami coba). 3. Terdapat custom command bernama flag di server yang akan mengeksekusi thread flag_service. 4. Terdapat input validation saat mengakses flag_service. ![](https://i.imgur.com/Zd3Xc8w.png) berikut adalah psudocdeo dari fungsi flag_service ```c= unsigned __int64 __fastcall flag_service(int *a1) { int v1; // eax int v2; // edx int v3; // ecx int v4; // er9 char *pointerloop; // rbx __int64 i; // rbp int v7; // ebx const char *v8; // rsi int v9; // ebx int v10; // eax int *v12; // r14 int v13; // ebp __int64 v14; // rax int *v15; // r14 int v16; // ebp __int64 v17; // rax __int64 v18; // rbx size_t v19; // rax char v20; // [rsp+0h] [rbp-A8h] char v21[8]; // [rsp+8h] [rbp-A0h] BYREF __int128 INPUTKITA[2]; // [rsp+10h] [rbp-98h] BYREF char hash[16]; // [rsp+30h] [rbp-78h] BYREF __int128 v24; // [rsp+40h] [rbp-68h] char v25; // [rsp+50h] [rbp-58h] __int128 md5hasil; // [rsp+60h] [rbp-48h] BYREF unsigned __int64 v27; // [rsp+70h] [rbp-38h] v27 = __readfsqword(0x28u); md5hasil = 0LL; if ( android::base::ShouldLog(2LL, 0LL) ) { v12 = __errno(2LL, 0LL); v13 = *v12; android::base::LogMessage::LogMessage(hash, "system/core/adb/daemon/sctf_service.cpp", 55LL, 2LL, 0LL, 0xFFFFFFFFLL); v14 = android::base::LogMessage::stream(hash); std::__put_character_sequence<char,std::char_traits<char>>(v14, "adb Flag Service", 16LL); android::base::LogMessage::~LogMessage(hash); *v12 = v13; } v24 = 0LL; *hash = 0LL; v25 = 0; INPUTKITA[1] = 0LL; INPUTKITA[0] = 0LL; WriteFdExactly(*a1, "An example of the flag looks like 'SCTF{FAKE_FLAG}'. Please enter the password.\n"); v1 = ReadLineFd(*a1, INPUTKITA, 0x20LL); MD5(INPUTKITA, v1, &md5hasil); pointerloop = hash; for ( i = 0LL; i != 16; ++i ) { snprintf(pointerloop, -1, v2, v3, *(&md5hasil + i), v4, v20); LODWORD(pointerloop) = pointerloop + 2; } if ( android::base::ShouldLog(2LL, 0LL) ) { v15 = __errno(2LL, 0LL); v16 = *v15; android::base::LogMessage::LogMessage(v21, "system/core/adb/daemon/sctf_service.cpp", 65LL, 2LL, 0LL, 0xFFFFFFFFLL); v17 = android::base::LogMessage::stream(v21); v18 = std::__put_character_sequence<char,std::char_traits<char>>(v17, "MD5: ", 5LL); v19 = strlen(hash); std::__put_character_sequence<char,std::char_traits<char>>(v18, hash, v19); android::base::LogMessage::~LogMessage(v21); *v15 = v16; } v7 = *a1; if ( *hash ^ 0x33323130 | *&hash[3] ^ 0x36353433 ) { v8 = "Wrong.."; } else { getFlag(); v8 = &getFlag(void)::FLAG; } WriteFdExactly(v7, v8); v9 = *a1; v10 = fcntl(*a1, 1); if ( (v10 & 0x80000001) == 0 ) fcntl(v9, 2, v10 | 1u); return __readfsqword(0x28u); } ``` Terlihat pada fungsi flag_service, kita harus mengisi string yang apabila dihash, hash depannya memiliki nilai 0123456. Setelah melakukan bruteforce didapati string yang yang memenuhi nilai berikut adalah string `0000AFf006`. Setelah didapati string yang memenuhi value tersebut. Kita diharuskan untuk mengisi custom packet agar adb mengeksekusi service flag dan melakukan validasi terhadap packet parameter. Untuk ini kami menggunakan framework adb_shell di python dan menggunakan `device._open` untuk mengeksekusi custom command dan menggunakan `AdbMessage` dengan parameter `WRTE` untuk crafting payload yang akan di write. ```python= from time import * from adb_shell.adb_device import AdbDeviceTcp import adb_shell.constants as constants from adb_shell.adb_message import * device1 = AdbDeviceTcp('adbaby.sstf.site', 6666, default_transport_timeout_s=9.) device1.connect() adb_info = device1._open(b"flag:", 1, 1, 1) sleep(0.2) msg = AdbMessage(constants.WRTE, adb_info.local_id, adb_info.remote_id, b"0000AFf006\n") device1._io_manager.send(msg, adb_info) sleep(0.2) response1 =device1._io_manager.read([constants.OKAY], adb_info) device1._okay(adb_info) print(response1) ``` Jalankan script tersebut dan lihat pada wireshark aplikasi akan menampilkan flag pada traffic. ![](https://i.imgur.com/OQ5spzy.png)