WATCH.png

在最近的渗透测试项目中,为了进一步验证漏洞的可用性和危害性,我们遇到了这样一种情形:构造基于时间差反馈的系统注入命令(OS command injection time based ),从某逻辑隔离的服务器中实现数据获取。以下是测试过程中的相关思路整理,仅供借鉴参考(渗透测试最终利用工具请移步GitHub-TBDEx)。

漏洞说明

由于该逻辑隔离服务器仅能通过API服务提供的程序接口实现特定服务访问,而在对该API接口的测试过程中,我们发现了一个有趣的GET request请求,其中包含了两个参数,一个为字符串,另一个为请求包的ID号。

之后在对参数的fuzzing中,其对单引号的处理方式和特征貌似像是SQL注入漏洞,但在漏洞利用过程中却不能成功实现注入攻击,然而,当我们执行了‘sleep 10′命令后,HTTP response在10秒钟之后有了回应,这下可能有戏了!我们首先想到的是,该API程序完蛋了,因为这样就可以对API服务端执行远程代码了。

Payload不能有效执行

但一切都高兴得太早,本来我们通过HTTP响应头判断API服务应该是架设在Windows平台上,但漏洞利用payload只在Bash或PowerShell下可用,所以,只能重新在Bash或PowerShell模式下进行可行性测试。为了模拟实际测试效果,我们通过在linux环境下运行形如以下、包含sleep命令的“time if”判断语句来查看系统反馈信息:

linux下time命令可以获取到一个程序的执行时间,包括程序的实际运行时间(real time),以及程序运行在用户态的时间(user time)和内核态的时间(sys time)。

if.png

利用这种方式,我们在模拟服务器上进行了各种ncat、wget、curl测试和其它数据窃取动作,如FTP 连接、 DNS请求,甚至是ICMP请求,但依然不能成功,没有效果。后来,我们才意识到,由于目标服务器主机处于有防火墙的逻辑隔离网络内,我们执行的命令估计被防火墙阻挡了。

构造基于时间延迟的判断执行命令

之后,一个同事建议可以尝试用形如以下sleep语句来运行包含的任务命令,这样一方面可以通过时间延迟来逐字符判断输出值,又能实现命令自动化,就像从基于时间(time-based)的SQL注入中获取输出信息一样。

考虑到网络延迟,我们首先想到的是,构造一个包含以下命令,按字符位置进行猜解判断的脚本,可以看到,以下黄色框内命令中:

time if [ $(whoami | cut -c 1 == r)]; then sleep 5; fi

whoamiiiiii.png

如果系统用户为root,通过whoami | cut -c 1 == r 方式取root的第一个字符“r”成功,则相应的时间延迟为5秒,与判断命令中的sleep 5结果一致,以此方式猜解出系统用户为root

Linux系统cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。

-b :以字节为单位进行分割

-c :以字符为单位进行分割,cut -c 1 取第1个字符

-d :自定义分隔符,默认为制表符

-f  :与-d一起使用,指定显示哪个区域

-n :取消分割多字节字符

突破限制构造有效Payload命令

你可以想像用这种方式是多么的繁杂,更烦人的是,前述发现的GET请求参数中竟然有48个字符的最大限制, 而我们构造的payload远远超过48个字符。为了绕过这种限制,我们只有把任务命令的输出结果重定向到系统某个临时文件中,然后用cut方式分割这些输出结果,取出需要的位置字符,结合time命令的时间延迟方式判断猜解,大概方法如下:

fromfile1.png

使用以上方法构造的payload可以控制在48个字符以内,但是在payload获取数据时候又遇到字符限制的问题:只能获取9个字符以内的数据。之后,我们想到可以向远程主机中分段写入命令,形成脚本,之后,利用这个过渡脚本就可以执行某种命令。

我们最终把以上这些所有想法和思路集成为了一个python工具TBDEx(Time Based Data Exfiltration Tool),另外,为了提高运行效率,用猜解判断字符的ASCII码值方式替代了单纯的字符判断。

为什么不用Commix?

Commix是一款系统命令注入漏洞自动化测试工具,它具有包含Time-based在内的很多数据获取技术。可能有人会问,怎么不用Commix呢?这主要有两方面原因:

Commix形成的payload非常长而且在我们的渗透场景中执行不成功

Commix对我们特定命令的执行非常耗时,读取一个whoami命令都很慢

TBDEx如何使用?

该工具包含三个部分:

length.py或length.bat:猜测判断重定向输出文件中包含的执行命令结果长度

ascii.py或ascii.bat:猜测判断特定位置字符的ASCII码值

timebased.py:程序执行主文件,发送命令请求并分析响应时间是否满足漏洞利用条件

数据获取过程:

把执行命令结果重定向输出到某个文件

用length.py或length.bat猜测判断执行命令结果输出长度

猜解判断获取数据的实际ASCII码值

对执行命令结果输出长度的判断,请遵循以下几个综合判断步骤:

1.输出长度是否大于 0? : python l.py 0 0 0 4     =>没有检测到延迟,这意味着它是真的;

2.输出长度是否大于10?: python l.py 10 0 0 4    =>检测到4秒延迟,这意味着这是假的

3.输出是否等于10?: python l.py 10 1 0 4           =>没有检测到延迟,这意味着是假的

4.输出是否等于9?: python l.py 9 1 0 4          => 检测到4秒延迟,这意味着我们找到了实际的输出长度

得到执行命令输出结果长度之后,我们就可以用程序进行实际的ASCII码值猜解:

python ascii.py {CHAR_POS} {ASCII_VALUE} {IS_GREATER} {WHERE_THE_OUTPUT_IS_AT} {TIME_DELAY}

当然,用主程序来执行的例子如下:

python timbesed.py -url http://192.168.207.128/ml.php?c=%here% -payload_limit 48 -tmp

tool.png

执行uname -a:

uname-a4.png

uname-a3.png

完美获取长度达2863字符的/etc/password结果:

etc_passwd.png

测试链接http://192.168.207.128/ml.php中的ml.php可以是以下内容,感兴趣的话,可以自行尝试:

setup.png

运行TBDEx工具的必备安装组件pycurl:

pip install pycurl

apt-get install pycurl

apt-get install python-pycurl

TBDEx的使用命令和运行参数:

  -h, –help           show this help message and exit

  -url URL              URL

  -post POST            POST

  -threads THREADS         Threads

  -cookie COOKIE FILE      Cookie File

  -file HEADER FILE        Burp request file

  -retry RETRY             Retry request N times in case of network errors

  -timeout TIMEOUT         General timeout request

  -time AVGTIME            Added timeout to request

  -os OS                   OS type (U unix/linux , W windows)

  -payload limit LIMIT     If there is any command length limitation

  -force write             Force writing auxiliary files

  -tmp                     Writing auxiliary files in tmp folder

TBDEx工具下载:Github

*参考来源:securitycafe,FB小编clouds编译