bloodhound-python DNS 에러 해결법

이 글에서는 Active Directory 를 운영 중인 타겟의 정보를 수집할 때 사용되는 BloodHound 의 파이썬 버전인 BloodHound.py를 실행 중 발생하는 dns.resolver.NXDOMAIN: None of DNS query names exist
에러를 처리하는 방법에 대해 설명하겠다. BloodHound.py 예시로 들었지만 동일한 이유로 에러가 발생하는 다른 프로그램에서도 문제를 해결할 수 있다.
BloodHound 의 수집기인 SharpHound 는 기본적으로 C#으로 작성되었고, Release 프로그램도 Windows OS 에서만 실행 가능하다는 제약이 있다. 반면, BloodHound.py 은 python 으로 작성된 Impacket 기반의 스크립트로, 기본이 python 이기 때문에 많은 Host 들이 애용하는 Kali Linux 에서도 사용 가능하다는 장점이 있다.
문제 상황
해당 문제는 HackTheBox 머신 중 하나인 Forest 를 공략하는 도중 발생했다. 해당 머신은 10.10.10.161
IP 주소와 htb.local
도메인 이름, DC 로 FOREST.htb.local
를 사용하고 있어 /etc/hosts
에 아래와 같은 내용을 추가해 도메인 이름을 Resolution 할 수 있도록 설정했다.
10.10.10.161 FOREST.htb.local htb.local
해당 도메인으로 ping 을 사용하면 정상적으로 Name Resolution 에 성공하여 통신되는 것을 확인했다.
$ ping FOREST.htb.local
PING FOREST.htb.local (10.10.10.161) 56(84) bytes of data.
64 bytes from FOREST.htb.local (10.10.10.161): icmp_seq=1 ttl=127 time=214 ms
64 bytes from FOREST.htb.local (10.10.10.161): icmp_seq=2 ttl=127 time=214 ms
64 bytes from FOREST.htb.local (10.10.10.161): icmp_seq=3 ttl=127 time=213 ms
/etc/hosts
설정 후, bloodhound-python
명령어에 적절한 도메인 이름(htb.local
) 과 DC 이름(FOREST.htb.local
)을 전달해 정보 수집을 시도했으나 dns.resolver.NXDOMAIN: None of DNS query names exist
에러가 발생했다.
$ bloodhound-python -d htb.local -dc FOREST.htb.local -v --zip -c All -u REDACTED -p REDACTED --dns-timeout 10
INFO: BloodHound.py for BloodHound LEGACY (BloodHound 4.2 and 4.3)
DEBUG: Authentication: username/password
DEBUG: Resolved collection methods: objectprops, dcom, rdp, container, session, group, acl, localadmin, psremote, trusts
DEBUG: Using DNS to retrieve domain information
DEBUG: Querying domain controller information from DNS
DEBUG: Using domain hint: htb.local
WARNING: Could not find a global catalog server, assuming the primary DC has this role
If this gives errors, either specify a hostname with -gc or disable gc resolution with --disable-autogc
DEBUG: Using supplied domain controller as KDC
INFO: Getting TGT for user
DEBUG: Trying to connect to KDC at FOREST.htb.local:88
... 중략 ...
dns.resolver.NXDOMAIN: None of DNS query names exist: FOREST.htb.local., FOREST.htb.local.localdomain.
해결법
이러한 문제가 발생하는 이유는 bloodhound-python
의 Name Resolution 방식이 일반적인 프로그램과 다르기 때문이다. ping, curl, 웹 브라우저와 같은 대부분의 일반적인 프로그램은 시스템의 Name Resolution 방식을 그대로 따르기 때문에 /etc/hosts
파일에서 최우선으로 도메인 정보를 찾고, 실패하면 DNS 서버에 쿼리를 보낸다.
하지만 bloodhound-python
과 같이 dnspython 라이브러리를 사용하는 스크립트는 시스템 Name Resolution 을 따르지 않고 직접 DNS 서버에 쿼리를 보낼 목적으로 작성되었기 때문에 /etc/hosts
파일을 건너뛰고 바로 /etc/resolv.conf
에 지정된 DNS 서버에 지정한 도메인에 대한 정보를 쿼리한다. 이러한 프로그램 특징에 따라 도메인 이름, DC 를 설정할 때는 /etc/hosts
에서 도메인 IP 주소를 직접 설정하는 것이 아닌, /etc/resolv.conf
을 수정하여 쿼리할 도메인에 대한 정보를 알고 있는 DNS 서버, DC 정보를 설정해야 한다.
# Forest의 도메인 컨트롤러를 최우선 DNS 서버로 설정
nameserver 10.10.10.161
# (선택사항) search 키워드에 도메인 이름을 추가하면 'dc'만 입력해도 'dc.htb.local'로 자동완성하여 쿼리.
search htb.local
# 기존에 사용하던 DNS 서버
nameserver 8.8.8.8
nameserver 1.1.1.1
/etc/resolv.conf
에 DC 주소를 설정 후, 다시 bloodhound-python
명령어를 실행하면 에러가 발생하지 않고 정상적으로 작동해 정보를 수집하는 것을 확인할 수 있다.

bloodhound-python
명령어 실행 성공 결과