
취약한 Log4j(CVE-2021-44228) 시스템을 일반적인 HTTP 헤더에 페이로드를 주입하여 확인하는 스크립트.
2021년 12월 10일 금요일, Java 라이브러리 'log4j'의 원격 코드 실행(RCE) 취약점을 다루는 새로운 개념 증명1이 공개되었습니다. 이 취약점은 사전에 소프트웨어 개발자에게 공개되지 않았습니다. 해당 취약점은 CVE-2021-442283로 추적되고 있습니다. 자세한 내용은 Northwave Threat Response4에서 확인할 수 있습니다.
Northwave는 일반적인 HTTP 헤더와 HTTP GET 요청의 일부로 페이로드를 주입하여 취약한 시스템을 확인하는 테스트 스크립트를 만들었습니다. 취약한 시스템은 대상에 대해 특별히 생성된 UUID를 포함하는 들어오는 DNS 요청을 수신하여 감지됩니다. 들어오는 DNS를 수신하고 (예: LDAP 서버를 배포하는 대신) 아웃바운드 트래픽 필터링이 적용된 환경에서도 취약한 시스템을 감지할 가능성을 높입니다. 실제로 아웃바운드 DNS는 종종 허용됩니다. 높은 위음성(false negative) 비율이 예상되므로 면책 조항을 읽어주세요.
다음 HTTP 헤더가 다루어집니다:
X-Api-VersionUser-AgentRefererX-Druid-CommentOriginLocationX-Forwarded-ForCookieX-Requested-WithX-Forwarded-HostAccept각 주입에 대해 다음 JNDI 접두사가 확인됩니다:
jndi:rmijndi:ldapjndi:dnsjndi:${lower:l}${lower:d}ap이 스크립트는 두 가지 특정 검사(HTTP 헤더 및 HTTP GET 요청)만 수행합니다. 이로 인해 취약점을 트리거하기 위해 다른 헤더, 특정 입력 필드 등을 대상으로 해야 하는 경우 위음성이 발생할 수 있습니다. 이러한 상황은 매우 자주 발생할 수 있습니다.
중요: 체커가 '취약점이 감지되지 않음'을 반환하는 경우, Northwave Threat Response4에 설명된 대로 파일 시스템 검사를 진행하십시오. 이 체커만 실행하는 것만으로는 시스템이 취약한지 여부를 판단하기에 충분하지 않습니다.
먼저, 들어오는 DNS 요청을 수신할 수 있는 하위 도메인이 필요합니다. 이 경우 log4jdnsreq.northwave.nl 영역을 사용하고 log4jchecker.northwave.nl에 스크립트를 배포합니다. 다음과 같이 DNS 항목을 구성하십시오:
log4jdnsreq 3600 IN NS log4jchecker.northwave.nl.
이제 Debian 시스템에 apt install bind9을 사용하여 BIND DNS 서버를 설정하고 다음을 /etc/bind/named.conf.options 파일에 추가합니다:
recursion no;
allow-transfer { none; };
이 설정은 오픈 DNS 서버를 실행하지 않기 위해 재귀를 비활성화합니다. 다음 구성을 추가하여 /etc/bind/named.conf.local에서 로깅을 구성합니다:
logging {
channel querylog {
file "/var/log/named/query.log";
severity debug 3;
print-time yes;
};
category queries { querylog;};
};
systemctl restart bind9를 사용하여 BIND를 다시 시작하는 것을 잊지 마십시오. xyz.log4jdnsreq.northwave.nl에 대한 DNS 쿼리를 수행하여 로깅이 작동하는지 확인하십시오. 하나 이상의 쿼리가 /var/log/named/query.log에 표시되어야 합니다.
네임서버 조회가 실제로 로깅되는지 확인하는 것이 중요합니다. 네임서버 설정이 요청을 로깅하지 않으면 이 스크립트는 취약한 사이트를 감지할 수 없습니다
테스트 조회를 수행하여 서버를 테스트하십시오 (이상적으로는 다른 시스템에서):
dig test.log4jchecker.northwave.nl
응답은 기대하지 않지만 로그 파일(cat /var/log/named/query.log)에 항목이 있어야 합니다. 이 항목은 다음과 유사할 수 있습니다:
14-Dec-2021 13:36:01.402 client @0x7f8b180a9b30 requester-ip#58755 (test.log4jchecker.northwave.nl): query: test.log4jchecker.northwave.nl IN A -E(0)DC (your-ip)
로그에 응답이 표시되지 않으면 계속 진행하지 마십시오. 그렇지 않으면 스크립트가 취약점을 감지하지 못합니다.
pip install -r requirements.txt를 사용하여 Python 종속성을 설치하십시오. 스크립트를 편집하여 다음 줄을 구성한 DNS 영역으로 변경하십시오:
HOSTNAME = "log4jdnsreq.northwave.nl"
이제 -u 매개변수를 사용하여 단일 URL을 제공하거나 -l 매개변수를 사용하여 URL 목록을 제공하여 스크립트를 실행할 수 있습니다:
usage: nw_log4jcheck.py [-h] [-l LIST] [-u URL] [-w WAIT] [-t TIMEOUT]
optional arguments:
-h, --help show this help message and exit
-l LIST, --list LIST A text file with a list of URLs to check (one url per line)
-u URL, --url URL URL to check (for example: http://yoururl.com)
-w WAIT, --wait WAIT Number of seconds to wait before checking DNS logs (default: 15)
-t TIMEOUT, --timeout TIMEOUT
HTTP timeout in seconds to use (default: 5)
출력의 마지막 줄은 시스템이 취약한 것으로 발견되었는지 여부를 보여줍니다:
NO VULNERABILITY DETECTED. Proceed with on-server checking. No incoming DNS request to 3414db71-309a-4288-83d4-aa3f103db97c.log4jdns.northwave.nl was seen
취약점이 감지되지 않은 경우, Northwave Threat Response4에 설명된 대로 파일 시스템 검사를 진행하십시오. 다시 말하지만, 이 체커만 실행하는 것만으로는 시스템이 취약한지 여부를 판단하기에 충분하지 않습니다.
Log4jcheck는 MIT 라이선스에 따라 오픈 소스 소프트웨어입니다.