渗透测试中利用基于时间差反馈的远程代码执行漏洞(Timed Based RCE)进行数据获取
作者:admin | 时间:2017-3-23 00:53:21 | 分类:黑客技术 隐藏侧边栏展开侧边栏
在最近的渗透测试项目中,为了进一步验证漏洞的可用性和危害性,我们遇到了这样一种情形:构造基于时间差反馈的系统注入命令(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
*参考来源:securitycafe,FB小编clouds编译