远程命令执行

0x01 原理

RCE的原理相当简单,其实就是传入执行系统命令函数的参数未经过严格过滤。

0x02 常见命令执行模式

1
2
3
4
5
<?php
$cmd=$_GET['cmd']
if (isset($cmd)){
system($cmd);
}

假设靶机ip地址为192.168.1.1。则

1
http://192.168.1.1/index.php?cmd=ls

将回显

1
1.txt 2.php 3.jpg images documents

诸如此类的函数还有exec,shell_exec,passthru,以及运算符。
exec和system的区别在于system在单独进程中执行程序,执行结束返回原来的进程,而exec会覆盖掉正在执行的进程。

0x03 webshell命令执行防御

动态监测
webshell传到服务器,就会执行,webshell执行的时刻表现出来的特征就叫动态特征,先前我们说到的webshell通信是HTTP协议。只要我们把webshell特有的HTTP请求、响应做成特征库,加到IDS里面去检测所有的HTTP请求就好了,webshell如果执行系统命令就会有进程,linux下就是nobody用户起的bash,win下就是iis user起的cmd,这些都是动态特征。再者如果黑客反向链接的话,那就更容易检测了,Agent和IDS都可以抓现行,webshell总要有一个HTTP请求,如果我们在网络层监控HTTP,并且检测到有人访问了一个从来没访问过的文件,而却返回了200,则很容易定位到webshell,这便是http异常模型检测,就和检测文件变化一样,如果非管理员新增文件,则说明被人入侵,缺点也很明显,黑客只要利用原文件就很容易绕过,并且部署代价高,网站时常更新的话规则也要不断添加,还有一个思路是利用函数劫持。

静态监测
静态监测用过匹配特征码、特征值、危险函数来查找webshell的方法,只能查找一直的webshell,并且误报率会比较高,但是如果规则完善,可以减低误报率。不过优点就是快速方便,不会对应用造成影响,对已知的webshell查找准确率高。部署方便,一个脚本就能搞定。缺点就是误报高、误报率高、无法查找0day型的webshell,而却很容易被绕过。对于单站点的网站,用静态检测还是有很大好好处,配合人工,能快速定位webshell,但是如果是一个成千上万站点的大型企业,这个时候在人工工作量就比较大。所以用这样一种思路:强弱特征。即把特征码分为强弱两种,强特征命中的则必是webshell,弱特征就交给人去判断。要解决误报和漏报,就不能拘泥于代码级别了,可以换个角度考虑问题:文件系统。我们可以结合文件的属性来判断,比如apache是nobody启动的,webshell属主也是nobody,如果我们的web目录无缘无故多了一个nobody属主的文件,就值得怀疑,理想的办法就是需要一种制度和流程来建设一个web目录唯一的发布入口,控制住这个入口,非法进来的web文件就可以实时发现。

日志检测:
使用过webshell都知道。不会在系统日志中留下记录,只是在web日志中留下webshell页面的访问数据和数据提交记录。日志分析检测技术通过大量的日志文件建立请求模型从而检测出异常文件,称之为:HTTP异常请求模型检测。

配置加固:
通过加固本地配置达到防御webshell的作用。比如php.ini里有disable_function,这里可以禁止类似system,exec,eval这类函数。

0x04 绕过

绕过方法有很多,这里只列举最简单的绕过:

基于黑名单的绕过:
如果黑名单本身不够健壮,那么可以尝试稍微冷门的系统执行函数。根据黑名单没有的进行尝试,如

assert,system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open,`