操作系统:
用作服务器的主机 (使用PhpStudy 搭建):Window 7 专业版 (32 位)
靶机:Window XP Pro SP3
软件:IE 6.0
工具:Ollydbg,windbg,IDA Pro,Sublime Text,Chrome,PHPStudy,WireShark
1. 通过协议分析客户端获得恶意html(POC)
查看会话
然后流跟踪,可以发现
2. 分析服务端发送的html文件
下面是提取出的网页代码
首先,创建了一个字符串
接着把对该字符串进行解密,请求链接?后面的数据被用来解密
解密完代码后使用window["eval".replace(/[A-Z]/g,"")]定义解密后的js代码中的变量,声明其函数
再gif图片被加载完后执行函数WisgEgTNEfaONekEqaMyAUALLMYW
通过Chrome的开发者工具(F12),获得解密后的JS脚本:
小结:
当使用HTML访问服务器时,服务器会返回一个重定向信息迫使客户端重新发起请求,然后通过请求链接中的索引解密返回的html文件中的JS代码,接着在本地执行js脚本触发漏洞并且执行ShellCode。
搭建漏洞环境,执行漏洞poc
执行 poc 以及样本(在执行时,如果使用OD 附加,需要把原本忽略的异常都恢复)
执行 恶意html :
在Win7电脑上开启phpStudy设置服务器,将提取出来的html放在网站根目录中,在WindXP上访问地址http://win7的IP/hack.html?rFfWELUjLJHpP
访问结果触发异常,如下:
从图中可以看出,由于此时的eax为0x00000000,导致了下面的call出现了异常,而eax的值是从ecx中地址取内容获得的,所以重点就是ecx的值是由谁赋值的。
随着js脚本分析漏洞成因
1.找到执行函数
从图中可以看出,加载完gif后会调用WisgEgTNEfaONekEqaMyAUALLMYW函数,参数是一个event对象(在此处是iframe的event对象)
2 .先简要分析WisgEgTNEfaONekEqaMyAUALLMYW函数
先查看该函数调用的第一个函数
很明显的,这是一个堆喷射函数,目标是把0x0c0d0c0d的只是内容覆盖为0x0c0d0c0d,大红框内就是ShellCode
堆喷结束后,会创建一个event对象副本,本例中传入的是IFream的event对象,然后将将span对象的innerHtml清空,释放iframe对象,最后创建一个定时器,接下来查看定时器函数的内容
可以推断,应该是定时器最后的代码
var t = lTneQKOeMgwvXaqCPyQAaDDYAkd.srcElement;
触发的漏洞
3 . 验证是否是srcElement触发漏洞
从异常触发点的调用堆栈可以看出,是调用了get_srcElement后,引发了异常,而之前的
正是调用get_srcElement函数
4 . 分析js脚本是如何引发漏洞的
参考了看雪大佬的文章:
https://bbs.pediy.com/thread-105899-1.htm
首先,在函数中引发漏洞的关键函数是下面三个
而触发漏洞的是定时器函数
那么要分析如何触发漏洞,就得分析浏览器是如何获得srcElement属性的,那么就要理解函数
get_srcElement是如何实现的,以下是看雪大佬的原话
而从这段话中分析出来的一个结构是这样的,get_srcElement函数要获取srcElement属性需要从CEventObj中获取EVENTPARAM结构中的CTreeNode指针,接着再通过CTreeNode指针获取指向CElement的指针,下面是具体的结构图
Event对象就是CEventObj
那么接下来根据上面看雪大佬的话以及结构图,进入IDA中分析
下面是get_srcElement函数
进入函数GenericGetElement中分析,函数内部执行GetParam函数,push了 ebp-8 作为参数,该函数获得了EVNETPARAM的地址
GetParam函数内部,下图中的ebp-8指的是函数外Push的ebp - 8,而不是GetParam的局部变量
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-10-22 11:37
被Ashen1编辑
,原因: 把图片弄高清点。。