基于时间反馈的RCE

在最近的渗透测试项目中,我们遇到了一个情况,为了证明可利用性和损害性,我们进行了在隔离的服务器中使用基于操作系统时间命令注入的一个API测试。

在测试过程中,我们确定了一个GET请求,它接收了两个参数:第一个字符串和另一个ID号。

基于它处理单引号的方式,通过模糊字符串参数它看起来有潜在的SQL注入。测试了一下这个攻击向量但没有成功,当我们发送了 ` sleep 10` 命令,HTTP响应在10秒后返回时,我们知道我们有事要做了,这是游戏结束的应用程序。第一个想法是我们要设法在API服务器上获得远程代码执行。

但事情并没有那么顺利。我们从响应头部假设API在Windows平台上托管,但是在某些情况下,尝试的有效内容应该仅适用于Bash或PowerShell。这两个都有可能,现在我们测试并寻找注入是在PowerShell还是Bash。

我们想通过运行一个简单的“if”语句来测试这一点,如果条件评估为true,则包含一个sleep命令。

if

在我们的方式里,我们试图建立一种与我们服务器交互的方式,但没有成功。我们尝试使用了许多工具建立TCP连接:ncat,wget,curl,但没有一个可以工作。然后,我们尝试了其他类似的exfiltration技术:FTP连接,DNS查询,甚至ICMP数据包,还是没有一个工作。我们后来发现,我们正在访问的服务器是一个私人网络隔离的防火墙,我们可以执行命令,但是我们看不到命令的输出。

一个同事建议我们可以使用sleep命令通过char输出的值来猜测char,而且我们可以自动完成这个任务。这像从基于时间的SQL注入获取输出一样容易。

我们的第一种方法:考虑到网络延迟同时为了测试这是否可以工作,我们创建了一个脚本,并使用命令来确定位置X的字母是否等于Y.

if

运行一个简单的脚本后,我们得到了whoami命令输出。

你可以发现,以这种基于时间方式获得命令的输出是一个Sisyphean任务。但是我们很快发现,我们的GET参数仅限于48个字符,并且有效负载超过了限制。 我们绕过这个限制的方法是在服务器上临时文件中分割并输出执行的命令,执行它并把执行输出写入我们用来读取数据的另一个文件。

fromfile1

使用上面的有效载荷,我们的长度正好是48个字符。但限制又出现了,我们不能提取超过9个字符,因为我们超过了限制。

但我们可以一个接一个地向远程主机写文件,然后执行该脚本执行某个任务,我们开始编写一个中间脚本,这样我们可以执行更短的命令。

结合所有这些想法,我们想做一个工具来完成这些事情。这次我们不使用Bash了,我们切换到Python。我们也替换了猜测每个字符的过程,猜测字符的ASCII值,所以这样我们可以节省很多无意义的请求。

为什么使用这个工具?

我们知道你会建议在这样的情况下使用commix。commix有很多的渗滤技术,其中一个甚至是基于时间的。它还可以识别可能的操作系统命令注入漏洞。虽它是一个很好用工具,但我们不能使用commix的主要原因有两个:

  • commix使用的有效载荷非常长,在这样的情况下没有办法工作。
  • 因为按照我们的想法,它会花费大量的时间来提取一个whoami命令输出。

该工具如何工作?

脚本有3个部分:

  1. length.py或length.bat脚本,允许猜测从文件输出的命令的长度。
  2. ascii.py或ascii.bat脚本,允许从X位置猜测字符的ASCII值。
  3. 发送命令并分析响应时间的主脚本,以确定假条件的真实性。

提取过程如下所示:

  1. 将命令输出写入文件。
  2. 使用length.py脚本猜测命令输出长度。

要猜测命令输出长度,请遵循以下几个步骤:

python ascii.py {NUMBER} {IS_GREATER} {WHERE_THE_OUTPUT_IS_AT} {TIME_DELAY}

  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字符代码。

此任务用ascii.py:python ascii.py {CHAR_POS} {ASCII_VALUE} {IS_GREATER} {WHERE_THE_OUTPUT_IS_AT} {TIME_DELAY}.

猜测过程与猜测命令输出的长度相同。不是猜测长度值,而是猜测特定字符的ASCII值。

这里有一些工具的打印屏幕:

tool

提取uname -a:

uname-a3

uname-a4

我们进一步尝试提取/etc/password的长度约2863,它正常工作:

etc_passwd

你可以使用以下简单的PHP脚本来尝试:

setup

安装此工具必须安装

pip install pycurl
或
apt-get install pycurl
或
apt-get install python-pycurl

此工具的用法

  -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

该工具可这里下载 https://github.com/dancezarp/TBDEx

*来源:securitycafe.ro,MottoIN整理发布

原创文章,作者:Stbird,如若转载,请注明出处:http://www.mottoin.com/97678.html

发表评论

登录后才能评论

联系我们

021-62666911

在线咨询:点击这里给我发消息

邮件:root@mottoin.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code