渗透测试中利用基于时间差反馈的远程代码执行漏洞(Timed Based RCE)进行数据获取

在最近的渗透测试项目中,为了进一步验证漏洞的可用性和危害性,我们遇到了这样一种情形:构造基于时间差反馈的系统注入命令(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)。

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

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

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

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

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

如果系统用户为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命令的时间延迟方式判断猜解,大概方法如下:

使用以上方法构造的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

执行uname -a:

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

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

运行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

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-03-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菜鸟计划

Ajax详解

一、ajax定义 ajax 的全称是Asynchronous JavaScript and XML,其中,Asynchronous 是异步的意思,它有别于传统w...

40050
来自专栏一枝花算不算浪漫

[Redis]Redis 概述及基本使用规范.

52980
来自专栏前端侠2.0

Angular技巧汇总 原

    声明项目的全局类型,同时不需要在各个Ts文件中import {XXX} from 'xxx'  ,就能直接引用!方法是:

13120
来自专栏有趣的django

35.Django2.0文档

第四章 模板  1.标签 (1)if/else {% if %} 标签检查(evaluate)一个变量,如果这个变量为真(即,变量存在,非空,不是布尔值假),系...

599100
来自专栏码洞

依赖注入不是Java的专利,Golang也有

笔者在使用Golang的时候就发现构建系统依赖树非常繁琐,New了很多对象,又手工代码将它们拼接起来,写了一堆非常冗繁的代码。然后就开始想,要是Golang像J...

12010
来自专栏Java Web

Java I/O不迷茫,一文为你导航!

学习过计算机相关课程的童鞋应该都知道,I/O 即输入Input/ 输出Output的缩写,最容易让人联想到的就是屏幕这样的输出设备以及键盘鼠标这一类的输入设备,...

13220
来自专栏PHP实战技术

PHP经典面试题目汇总(上篇)

1、双引号和单引号的区别 双引号解释变量,单引号不解释变量 双引号里插入单引号,其中单引号里如果有变量的话,变量解释 双引号的变量名后面必须要有一个非数字、字母...

38570
来自专栏owent

boost.context-1.61版本的设计模型变化

之前写了个C++的协程框架libcopp,底层使用的是boost.context实现,然后剥离了对boost的依赖。然而这样意味着我必须时常跟进boost.co...

89910
来自专栏Java Web

Java 面试知识点解析(二)——高并发编程篇

292100
来自专栏前端说吧

vuex - 学习日记

389110

扫码关注云+社区

领取腾讯云代金券