首页 > 代码库 > Erraticgopher相关漏洞分析

Erraticgopher相关漏洞分析

Erraticgopher为NSA泄露的攻击框架中用于针对RRAS服务的模块,因此需要目标机开启对应的服务选项,如下图所示,该服务主要用于在局域网以及广域网环境中为企业提供路由服务。

技术分享

通过框架运行,并选择使用Erraticgopher攻击模块,配置是选择SMB协议进行通信,攻击运行后成功。

 技术分享

这个工具实际上已经被python化了,可以在以下的链接中进行下载

https://packetstormsecurity.com/files/142313/Microsoft-Windows-2003-SP2-ERRATICGOPHER-SMB-Remote-Code-Execution.html

运行之后如下所示,崩溃了,主要是rop链的问题,但是并不妨碍对这种漏洞的分析。

 技术分享

挂上调试器之后可以看到eip访问的地址71c0db30非法,此时的ebp被修改为41414141,查看调用栈可以发现整个调用链都被破坏了,因此可以知道这是一处栈溢出。

技术分享

查看对应的exp,71c0db30是rop的开始,因此此时漏洞实际上是获取了对应的eip,只是此处的这个地址在我xp的环境下有问题。

 技术分享

此时重要的是获取对应的漏洞函数位置,由于堆栈被大范围破坏,kb函数调用链没有有效信息,这种情况下第一反应是修改exp中的缓冲区溢出包长度,只保障对当前漏洞函数堆栈的破坏,我一开始也采用了这种方法,但是这个漏洞函数比较特别,造成溢出的字符长度必须是1313,否则不会进入到漏洞函数中。

技术分享

那这个时候如何确定漏洞函数呢,这个地方有两种方法可供使用。

  1. 列举函数,在给出的exp中知道是iprtrmgr.dll这个dll出了问题,漏洞指令为reps movs(exp给出的地址有问题),因此可以直接在ida中列举所有reps movs类的指令,并在windbg种将所有这些地址监控起来。

技术分享

  2.当然第一种方法比较笨,因此这个地方再介绍一种优雅的方法,理论上可以用于所有栈溢出的情况(前提是知道溢出的栈地址,可以通过快照实现),实际上就是通过条件断点监控ebp的值,当ebp被修改为指定溢出值时断下。

ba w4 0x01c1f888 ".if poi(@ebp)=0x41414141{}.else{gc}"

 技术分享

可以看到此时已经断下,kb整个函数链也很清晰,此时需要拷贝的长度为ecx =1cb。  

技术分享

但是此时的堆栈长度只有1c,从而导致溢出。

技术分享

Ida中对应的漏洞函数,可以看到在copy中没有对长度进行判断

 技术分享

前置函数中会获取对应漏洞字符串中的magic位,以此确定调用时使用的是映射表中哪一个函数,漏洞函数的位置为9。

技术分享 

因此可以知道这个地方的Magic数为8的原因了。

 技术分享

整个函数调用图如下

技术分享 

之后的利用就是通用的栈溢出的利用方式。

其中固定长度1313的问题,如下所示可以看到修改长度之后,函数的magic为会被修改,下图中unkown以上为不等于1313时的函数调用,看到此时是编号为3,不会进入漏洞函数,unknow下为1313是对应的magic为8。

 技术分享

这个地方对magci的地址进行了监控,可以看到初始化时,传输的exp字符结构正确,但是之后会将magic和紧随的41414141修改。这个地方ba断点并不能断下来,因此怀疑是在运行的过程中有其他进程对这段内存进行了修改,有兴趣的同学可以调试调试。

 技术分享

 转载请注明出处

Erraticgopher相关漏洞分析