关于Java getSoundBank函数堆栈溢出漏洞
Inking的自留地 :: 漏洞原理 确切的说,错误函数为Java的Native方法Java.com.sun.media.sound.HeadspaceSoundbank.nOpenResource。该函数在拷贝文件路径时没有检查字符串大小而直接进行了拷贝,最终导致了栈溢出: // $$kk: 04.11.99: we are never calling XFileClose!! const char *str = (*e)->GetStringUTFChars(e, path, 0); TRACE0("Java_com_sun_media_sound_HeadspaceSoundbank_nOpenResource. "); XConvertNativeFileToXFILENAME((void *)str, &xfilename); (*e)->ReleaseStringUTFChars(e, path, str); TRACE1("Java_com_sun_media_sound_HeadspaceSoundbank_nOpenResource completed, returning %lu. ", file); return (jlong) (INT_PTR) file; // given a native file spec (FSSpec for MacOS, and C string for WinOS, fill in a XFILENAME dest = &xfile->theFile; struct XFILENAME // private variables. Zero out before calling functions XPTR pResourceData; // if file is memory based // standard strcpy sav = dest; 以上FILE_NAME_LENGTH在windows下为_MAX_PATH,也就是256,所以只要url->filename大于256就溢出了。还有一个关键点: HeadspaceSoundbank(URL url) throws IOException { if(Printer.trace) Printer.trace("HeadspaceSoundbank: constructor: url: " + url); String protocol = url.getProtocol(); InputStream stream = url.openStream(); if(Printer.trace) Printer.trace("HeadspaceSoundbank: constructor: url: " + url + " completed"); :: 漏洞利用 漏洞的原理虽然简单,但是利用却不是那么容易。首先,虽然漏洞是通过IE触发的,但是最终执行漏洞函数的进程为java.exe,所以无法通过简单的JavaScript堆喷射来进行利用。如果要做到比较通用,直接在java.exe内进行java堆喷射会比较好,但是事实上问题也挺多的,最麻烦的就是java堆的大小默认只有64M,而且如果进行gc的频率过高,jvm会直接抛出异常。所以经过几次尝试后,暂时放弃了这条路。还有一条路是常规的栈溢出利用。但是这个方法也有几个问题。比较庆幸的是我们有足够大的空间来写Shellcode,可以直接用JMP ESP来进行Shellcode的定位。最棘手的是字符编码的问题,在利用的过程中,跳转地址和Shellcode的字节大小都必须在0x80以内(java现学的,可能存在盲点),否则会因为字符集的问题而转的乱七八糟的。Shellcode在0x80内比较好解决,因为esp刚好指向Shellcode,用alpha2编码可以使得Shellcode最终全部为可见字符。JMP ESP(CALL ESP)就比较麻烦了,因为比较稳定的opcode地址很多都在kernel32和ntdll上,而这两者的加载基址又比较郁闷(比如kernel32.dll为0x7c800000),又不能去找类似于shell32.dll这种不是很稳定的动态链接库,所以最后还是锁定了java自身的几个动态链接库,希望能通过java代码得到版本号,然后按照不同版本号来计算不同的opcode地址。 :: PoC PoC中的opcode随便找的,测试环境为xp sp2,jre 6.0.160.1 //////////////////////////////////////////////////////////////////////////////////////////////// import java.applet.Applet; public class test extends Applet 补充:软件开发 , Java ,
访问www.zzzyk.com 试试 CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络, |