
DNSChef - 침투 테스터 및 악성코드 분석가를 위한 DNS 프록시
| | version 0.4 | | / _|
| | __ ___ | | __| |
/ ` | ' / |/ | ' \ / _ \ |
| (| | | | _ \ (| | | | __/ |
_,|| ||/_|| ||___||
D O C U M E N T A T I O N
DNSChef는 침투 테스터와 악성코드 분석가를 위한 매우 구성 가능한 DNS 프록시입니다. DNS 프록시("Fake DNS"라고도 함)는 애플리케이션 네트워크 트래픽 분석 등에 사용되는 도구입니다. 예를 들어, DNS 프록시는 "badguy.com"에 대한 요청을 인터넷 상의 실제 호스트 대신 로컬 머신으로 가리켜 종단점을 만들거나 가로채는 데 사용할 수 있습니다.
이미 여러 DNS 프록시가 존재합니다. 대부분은 모든 DNS 쿼리를 단일 IP 주소로 전달하거나 기초적인 필터링만 구현합니다. DNSChef는 보다 구성 가능한 시스템이 필요했던 침투 테스트 과정에서 개발되었습니다. 그 결과 DNSChef는 포함 및 제외 도메인 목록을 기반으로 응답을 위조하고, 여러 DNS 레코드 유형을 지원하며, 와일드카드로 도메인을 일치시키고, 일치하지 않는 도메인에 대한 실제 응답을 프록시하며, 외부 구성 파일을 정의하고, IPv6 등 많은 기능을 갖춘 크로스 플랫폼 애플리케이션입니다. 각 기능에 대한 자세한 설명과 제안된 사용 사례는 아래에서 확인할 수 있습니다.
DNS 프록시의 사용은 애플리케이션이 다른 프록시 서버를 직접 사용하도록 강제할 수 없는 상황에서 권장됩니다. 예를 들어, 일부 모바일 애플리케이션은 OS HTTP 프록시 설정을 완전히 무시합니다. 이러한 경우 DNSChef와 같은 DNS 프록시 서버를 사용하면 해당 애플리케이션을 속여 원하는 대상으로 연결을 전달하도록 할 수 있습니다.
DNSChef를 사용하기 전에, 도구가 실행 중인 DNS 네임서버를 사용하도록 머신을 구성해야 합니다. 사용 중인 운영 체제에 따라 몇 가지 옵션이 있습니다:
Linux - /etc/resolv.conf를 편집하여 트래픽 분석 호스트가 있는 줄을 맨 위에 추가합니다(예: 로컬에서 실행 중인 경우 "nameserver 127.0.0.1" 추가). 또는 Network Manager와 같은 도구를 사용하여 DNS 서버 주소를 추가할 수 있습니다. Network Manager 내에서 IPv4 설정을 열고 Method 드롭다운 상자에서 Automatic (DHCP) addresses only 또는 Manual을 선택한 다음 DNS Servers 텍스트 상자에 DNSChef가 실행 중인 IP 주소를 입력합니다.
Windows - 제어판에서 네트워크 연결을 선택합니다. 그런 다음 연결 중 하나(예: "로컬 영역 연결")를 선택하고 마우스 오른쪽 버튼으로 클릭한 후 속성을 선택합니다. 새로 나타나는 대화 상자에서 *인터넷 프로토콜(TCP/IP)*을 선택하고 속성을 클릭합니다. 마지막으로 다음 DNS 서버 주소 사용 라디오 버튼을 선택하고 DNSChef가 실행 중인 IP 주소를 입력합니다. 예를 들어 로컬에서 실행 중인 경우 127.0.0.1을 입력합니다.
OS X - 시스템 환경설정을 열고 네트워크 아이콘을 클릭합니다. 활성 인터페이스를 선택하고 DNS 서버 필드를 채웁니다. AirPort를 사용하는 경우 고급... 버튼을 클릭하여 DNS 서버를 편집해야 합니다. 또는 /etc/resolv.conf를 편집하여 맨 위에 가짜 네임서버를 추가할 수 있습니다(예: "nameserver 127.0.0.1").
iOS - 설정을 열고 일반을 선택합니다. 그런 다음 Wi-Fi를 선택하고 목록에서 활성 액세스 포인트 오른쪽의 파란색 화살표를 클릭합니다. DNS 항목을 편집하여 DNSChef가 실행 중인 호스트를 가리키도록 합니다. 셀룰러 인터페이스(사용 가능한 경우)를 비활성화했는지 확인합니다.
Android - 설정을 열고 무선 및 네트워크를 선택합니다. Wi-Fi 설정을 클릭하고 전화기의 옵션 버튼을 누른 후 고급을 선택합니다. 고정 IP 사용 체크박스를 활성화하고 사용자 지정 DNS 서버를 구성합니다.
기기의 DNS 설정을 수동으로 수정할 수 없는 경우에도 ARP 스푸핑, Rogue DHCP 및 기타 창의적인 방법과 같은 기술을 사용할 수 있는 옵션이 있습니다.
마지막으로 DNSChef가 모든 요청을 가리킬 가짜 서비스를 구성해야 합니다. 예를 들어 웹 트래픽을 가로채려는 경우 포트 80에서 실행되는 별도의 웹 서버를 실행하거나 웹 프록시(예: Burp)를 설정하여 트래픽을 가로채야 합니다. DNSChef는 적절하게 구성된 서비스가 있는 프록시/서버 호스트로 쿼리를 가리킵니다.
DNSChef는 Python으로 개발된 크로스 플랫폼 애플리케이션으로, Python 인터프리터가 있는 대부분의 플랫폼에서 실행되어야 합니다. 제공된 dnschef.exe 실행 파일을 사용하여 Python 인터프리터를 설치하지 않고 Windows 호스트에서 실행할 수 있습니다. 이 가이드는 Unix 환경에 중점을 둡니다. 그러나 아래의 모든 예제는 Windows에서도 작동하도록 테스트되었습니다.
DNSChef의 가장 기본적인 모니터링 기능을 살펴보겠습니다. 다음 명령을 root로 실행합니다(포트 53에서 서버를 시작하는 데 필요):
# ./dnschef.py
_ _ __
| | version 0.2 | | / _|
__| |_ __ ___ ___| |__ ___| |_
/ _` | '_ \/ __|/ __| '_ \ / _ \ _|
| (_| | | | \__ \ (__| | | | __/ |
\__,_|_| |_|___/\___|_| |_|\___|_|
[email protected]
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[*] No parameters were specified. Running in full proxy mode
매개변수 없이 DNSChef는 전체 프록시 모드로 실행됩니다. 즉, 모든 요청이 상위 DNS 서버(기본값 8.8.8.8)로 전달되고 쿼리하는 호스트로 반환됩니다. 예를 들어 도메인의 "A" 레코드를 쿼리하고 결과를 살펴보겠습니다:
$ host -t A thesprawl.org
thesprawl.org has address 108.59.3.64
DNSChef는 시간, 소스 IP 주소, 요청된 레코드 유형, 그리고 가장 중요한 쿼리된 이름을 보여주는 다음 로그 줄을 출력합니다:
[23:54:03] 127.0.0.1: proxying the response of type 'A' for thesprawl.org
이 모드는 통신에 사용하는 도메인을 파악해야 하는 간단한 애플리케이션 모니터링에 유용합니다.
DNSChef는 -6 또는 --ipv6* 플래그를 사용하여 활성화할 수 있는 IPv6를 완벽하게 지원합니다. 기본 수신 인터페이스가 ::1로 전환되고 기본 DNS 서버가 2001:4860:4860::8888로 전환된다는 점을 제외하면 IPv4 모드와 동일하게 작동합니다. 다음은 샘플 출력입니다:
# ./dnschef.py -6
_ _ __
| | version 0.2 | | / _|
__| |_ __ ___ ___| |__ ___| |_
/ _` | '_ \/ __|/ __| '_ \ / _ \ _|
| (_| | | | \__ \ (__| | | | __/ |
\__,_|_| |_|___/\___|_| |_|\___|_|
[email protected]
[*] Using IPv6 mode.
[*] DNSChef started on interface: ::1
[*] Using the following nameservers: 2001:4860:4860::8888
[*] No parameters were specified. Running in full proxy mode
[00:35:44] ::1: proxying the response of type 'A' for thesprawl.org
[00:35:44] ::1: proxying the response of type 'AAAA' for thesprawl.org
[00:35:44] ::1: proxying the response of type 'MX' for thesprawl.org
참고: 기본적으로 DNSChef는 UDP 리스너를 생성합니다. 대신 TCP를 사용하려면 나중에 설명할 --tcp 인수를 사용할 수 있습니다.
이제 DNSChef를 시작하는 방법을 알았으니 --fakeip 매개변수를 사용하여 모든 응답을 127.0.0.1로 위조하도록 구성해 보겠습니다:
# ./dnschef.py --fakeip 127.0.0.1 -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[*] Cooking all A replies to point to 127.0.0.1
[23:55:57] 127.0.0.1: cooking the response of type 'A' for google.com to 127.0.0.1
[23:55:57] 127.0.0.1: proxying the response of type 'AAAA' for google.com
[23:55:57] 127.0.0.1: proxying the response of type 'MX' for google.com
위 출력에서 DNSChef가 모든 요청을 127.0.0.1로 프록시하도록 구성된 것을 볼 수 있습니다. 08:11:23의 첫 번째 로그 줄은 "A" 레코드 응답을 127.0.0.1을 가리키도록 "조리(cook)"했음을 보여줍니다. 그러나 'AAAA' 및 'MX' 레코드에 대한 추가 요청은 실제 DNS 서버에서 단순히 프록시됩니다. 요청 프로그램의 출력을 살펴보겠습니다:
$ host google.com localhost
google.com has address 127.0.0.1
google.com has IPv6 address 2001:4860:4001:803::1001
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
보시다시피 프로그램은 IPv4 주소에 대해 127.0.0.1을 사용하도록 속았습니다. 그러나 IPv6(AAAA) 및 메일(MX) 레코드에서 얻은 정보는 완전히 합법적으로 보입니다. DNSChef의 목표는 프로그램의 올바른 작동에 최소한의 영향을 미치는 것이므로, 애플리케이션이 특정 메일 서버에 의존하는 경우 이 프록시 요청을 통해 올바르게 가져옵니다.
여러 레코드를 동시에 대상으로 지정하는 방법을 보여주기 위해 요청을 하나 더 위조해 보겠습니다:
# ./dnschef.py --fakeip 127.0.0.1 --fakeipv6 ::1 -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[*] Cooking all A replies to point to 127.0.0.1
[*] Cooking all AAAA replies to point to ::1
[00:02:14] 127.0.0.1: cooking the response of type 'A' for google.com to 127.0.0.1
[00:02:14] 127.0.0.1: cooking the response of type 'AAAA' for google.com to ::1
[00:02:14] 127.0.0.1: proxying the response of type 'MX' for google.com
--fakeip 플래그 외에도 'AAAA' 레코드 쿼리를 위조하도록 설계된 --fakeipv6를 지정했습니다. 업데이트된 프로그램 출력은 다음과 같습니다:
$ host google.com localhost
google.com has address 127.0.0.1
google.com has IPv6 address ::1
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
애플리케이션에 의해 명시적으로 재정의되지 않은 모든 레코드는 다시 프록시되어 실제 DNS 서버에서 반환되었습니다. 그러나 IPv4(A)와 IPv6(AAAA)는 모두 로컬 머신을 가리키도록 위조되었습니다.
DNSChef는 여러 레코드 유형을 지원합니다:
+--------+--------------+-----------+--------------------------+
| Record | Description |Argument | Example |
+--------+--------------+-----------+--------------------------+
| A | IPv4 address |--fakeip | --fakeip 192.0.2.1 |
| AAAA | IPv6 address |--fakeipv6 | --fakeipv6 2001:db8::1 |
| MX | Mail server |--fakemail | --fakemail mail.fake.com |
| CNAME | CNAME record |--fakealias| --fakealias www.fake.com |
| NS | Name server |--fakens | --fakens ns.fake.com |
+--------+--------------+-----------+--------------------------+
참고: 사용성을 위해 모든 DNS 레코드 유형이 명령줄에 노출된 것은 아닙니다. PTR, TXT, SOA 등과 같은 추가 레코드는 --file 플래그와 적절한 레코드 헤더를 사용하여 지정할 수 있습니다. 자세한 내용은 아래의 외부 정의 파일 섹션을 참조하세요.
마지막으로 애플리케이션이 ANY 유형의 쿼리를 처리하는 방법을 살펴보겠습니다:
# ./dnschef.py --fakeip 127.0.0.1 --fakeipv6 ::1 --fakemail mail.fake.com --fakealias www.fake.com --fakens ns.fake.com -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[*] Cooking all A replies to point to 127.0.0.1
[*] Cooking all AAAA replies to point to ::1
[*] Cooking all MX replies to point to mail.fake.com
[*] Cooking all CNAME replies to point to www.fake.com
[*] Cooking all NS replies to point to ns.fake.com
[00:17:29] 127.0.0.1: cooking the response of type 'ANY' for google.com with all known fake records.
DNS ANY 레코드 쿼리 결과, DNSChef는 해당 도메인에 대해 알고 있는 모든 위조 레코드를 반환합니다. 프로그램이 보게 될 출력은 다음과 같습니다:
$ host -t ANY google.com localhost
google.com has address 127.0.0.1
google.com has IPv6 address ::1
google.com mail is handled by 10 mail.fake.com.
google.com is an alias for www.fake.com.
google.com name server ns.fake.com.
위 예제를 사용하여 thesprawl.org에 대한 요청만 가로채고 webfaction.com과 같은 다른 모든 도메인에 대한 쿼리는 수정하지 않고 남겨두려는 경우를 생각해 보겠습니다. 아래와 같이 --fakedomains 매개변수를 사용할 수 있습니다:
# ./dnschef.py --fakeip 127.0.0.1 --fakedomains thesprawl.org -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[*] Cooking replies to point to 127.0.0.1 matching: thesprawl.org
[00:23:37] 127.0.0.1: cooking the response of type 'A' for thesprawl.org to 127.0.0.1
[00:23:52] 127.0.0.1: proxying the response of type 'A' for mx9.webfaction.com
위 예제에서 thesprawl.org에 대한 요청은 위조되었지만 mx9.webfaction.com에 대한 요청은 그대로 두었습니다. 도메인 필터링은 나머지 부분을 손상시키지 않고 단일 애플리케이션을 분리하려고 할 때 매우 유용합니다.
참고: DNSChef는 응답을 위조하기 전에 도메인이 존재하는지 확인하지 않습니다. 도메인을 지정하면 실제로 존재하는지 여부와 관계없이 항상 가짜 값으로 확인됩니다.
다른 상황에서는 정의된 도메인 목록을 제외한 모든 요청에 대해 응답을 위조해야 할 수도 있습니다. --truedomains 매개변수를 사용하여 다음과 같이 이 작업을 수행할 수 있습니다:
# ./dnschef.py --fakeip 127.0.0.1 --truedomains thesprawl.org,*.webfaction.com -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[*] Cooking replies to point to 127.0.0.1 not matching: *.webfaction.com, thesprawl.org
[00:27:57] 127.0.0.1: proxying the response of type 'A' for mx9.webfaction.com
[00:28:05] 127.0.0.1: cooking the response of type 'A' for google.com to 127.0.0.1
위 예제에서 몇 가지 사항이 있습니다. 먼저 와일드카드(*) 사용에 주목하세요. *.webfaction.com과 일치하는 모든 도메인은 역방향 매칭되어 실제 값으로 확인됩니다. 'google.com'에 대한 요청은 제외된 도메인 목록에 없었기 때문에 127.0.0.1을 반환했습니다.
참고: 와일드카드는 위치에 따라 다릅니다. *.thesprawl.org 유형의 마스크는 www.thesprawl.org와 일치하지만 www.test.thesprawl.org와는 일치하지 않습니다. 그러나 ..thesprawl.org 유형의 마스크는 thesprawl.org, www.thesprawl.org 및 www.test.thesprawl.org와 일치합니다.
모든 일치하는 도메인에 대해 단일 가짜 DNS 레코드를 정의하는 것만으로는 충분하지 않은 상황이 있을 수 있습니다. 요청이 이동할 위치를 정확히 정의하는 DOMAIN=RECORD 쌍의 모음이 있는 외부 파일을 사용할 수 있습니다.
예를 들어, 다음과 같은 정의 파일을 만들고 dnschef.ini라고 부르겠습니다:
[A]
*.google.com=192.0.2.1
thesprawl.org=192.0.2.2
*.wordpress.*=192.0.2.3
섹션 헤더 [A]는 DNSChef에 레코드 유형을 정의합니다. 이제 여러 쿼리의 출력을 주의 깊게 살펴보겠습니다:
# ./dnschef.py --file dnschef.ini -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[+] Cooking A replies for domain *.google.com with '192.0.2.1'
[+] Cooking A replies for domain thesprawl.org with '192.0.2.2'
[+] Cooking A replies for domain *.wordpress.* with '192.0.2.3'
[00:43:54] 127.0.0.1: cooking the response of type 'A' for google.com to 192.0.2.1
[00:44:05] 127.0.0.1: cooking the response of type 'A' for www.google.com to 192.0.2.1
[00:44:19] 127.0.0.1: cooking the response of type 'A' for thesprawl.org to 192.0.2.2
[00:44:29] 127.0.0.1: proxying the response of type 'A' for www.thesprawl.org
[00:44:40] 127.0.0.1: cooking the response of type 'A' for www.wordpress.org to 192.0.2.3
[00:44:51] 127.0.0.1: cooking the response of type 'A' for wordpress.com to 192.0.2.3
[00:45:02] 127.0.0.1: proxying the response of type 'A' for slashdot.org
google.com과 www.google.com 모두 *.google.com 항목과 일치하여 192.0.2.1로 올바르게 확인되었습니다. 반면 www.thesprawl.org 요청은 수정되지 않고 단순히 프록시되었습니다. 마지막으로 wordpress.com, www.wordpress.org 등의 모든 변형이 *.wordpress.* 마스크와 일치하여 192.0.2.3으로 올바르게 확인되었습니다. 마지막으로 정의되지 않은 slashdot.org 쿼리는 실제 응답과 함께 단순히 프록시되었습니다.
명령줄에 명시적으로 노출되지 않은 것을 포함하여 지원되는 다른 모든 DNS 레코드 유형에 대해 섹션 헤더를 지정할 수 있습니다: [A], [AAAA], [MX], [NS], [CNAME], [PTR], [NAPTR] 및 [SOA]. 예를 들어, 'dnschef.ini' 파일에 새 [PTR] 섹션을 정의해 보겠습니다:
[PTR]
*.2.0.192.in-addr.arpa=fake.com
이 새 레코드 유형으로 DNSChef의 동작을 관찰해 보겠습니다:
./dnschef.py --file dnschef.ini -q
[sudo] password for iphelix:
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[+] Cooking PTR replies for domain *.2.0.192.in-addr.arpa with 'fake.com'
[00:11:34] 127.0.0.1: cooking the response of type 'PTR' for 1.2.0.192.in-addr.arpa to fake.com
그리고 클라이언트가 역방향 DNS 쿼리를 수행할 때 볼 수 있는 내용은 다음과 같습니다:
$ host 192.0.2.1 localhost
1.2.0.192.in-addr.arpa domain name pointer fake.com.
일부 레코드는 정확한 형식이 필요합니다. SOA와 NAPTR이 좋은 예입니다:
[SOA]
*.thesprawl.org=ns.fake.com. hostmaster.fake.com. 1 10800 3600 604800 3600
[NAPTR]
*.thesprawl.org=100 10 U E2U+sip !^.*$!sip:[email protected]! .
추가 예제는 샘플 dnschef.ini 파일을 참조하세요.
파일과 명령줄의 입력을 혼합하여 사용할 수 있습니다. 예를 들어 다음 명령은 --file과 --fakedomains 매개변수를 모두 사용합니다:
# ./dnschef.py --file dnschef.ini --fakeip 6.6.6.6 --fakedomains=thesprawl.org,slashdot.org -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[+] Cooking A replies for domain *.google.com with '192.0.2.1'
[+] Cooking A replies for domain thesprawl.org with '192.0.2.2'
[+] Cooking A replies for domain *.wordpress.* with '192.0.2.3'
[*] Cooking A replies to point to 6.6.6.6 matching: *.wordpress.*, *.google.com, thesprawl.org
[*] Cooking A replies to point to 6.6.6.6 matching: slashdot.org, *.wordpress.*, *.google.com, thesprawl.org
[00:49:05] 127.0.0.1: cooking the response of type 'A' for google.com to 192.0.2.1
[00:49:15] 127.0.0.1: cooking the response of type 'A' for slashdot.org to 6.6.6.6
[00:49:31] 127.0.0.1: cooking the response of type 'A' for thesprawl.org to 6.6.6.6
[00:50:08] 127.0.0.1: proxying the response of type 'A' for tor.com
명령줄 매개변수의 thesprawl.org 정의가 dnschef.ini보다 우선한 것을 확인하세요. 구성 파일의 값을 재정의하려는 경우 유용할 수 있습니다. slashdot.org는 --fakedomains 매개변수에 지정되었기 때문에 여전히 가짜 IP 주소로 확인됩니다. tor.com 요청은 명령줄이나 구성 파일에 지정되지 않았으므로 단순히 프록시됩니다.
기타 구성 ====================보안상의 이유로, DNSChef는 기본적으로 로컬 127.0.0.1(IPv6의 경우 ::1) 인터페이스에서 수신 대기합니다. --interface 매개변수를 사용하여 DNSChef가 다른 인터페이스에서 수신 대기하도록 할 수 있습니다:
# ./dnschef.py --interface 0.0.0.0 -q
[*] DNSChef started on interface: 0.0.0.0
[*] Using the following nameservers: 8.8.8.8
[*] No parameters were specified. Running in full proxy mode
[00:50:53] 192.0.2.105: proxying the response of type 'A' for thesprawl.org
또는 IPv6의 경우:
# ./dnschef.py -6 --interface :: -q
[*] Using IPv6 mode.
[*] DNSChef started on interface: ::
[*] Using the following nameservers: 2001:4860:4860::8888
[*] No parameters were specified. Running in full proxy mode
[00:57:46] 2001:db8::105: proxying the response of type 'A' for thesprawl.org
기본적으로 DNSChef는 프록시 요청을 위해 Google의 공개 DNS 서버를 사용합니다. 그러나 --nameservers 매개변수를 사용하여 사용자 정의 네임서버 목록을 정의할 수 있습니다:
# ./dnschef.py --nameservers 4.2.2.1,4.2.2.2 -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 4.2.2.1, 4.2.2.2
[*] No parameters were specified. Running in full proxy mode
[00:55:08] 127.0.0.1: proxying the response of type 'A' for thesprawl.org
IP#PORT 표기법을 사용하여 비표준 네임서버 포트를 지정할 수 있습니다:
# ./dnschef.py --nameservers 192.0.2.2#5353 -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 192.0.2.2#5353
[*] No parameters were specified. Running in full proxy mode
[02:03:12] 127.0.0.1: proxying the response of type 'A' for thesprawl.org
동시에 -p port# 매개변수를 사용하여 DNSChef 자체를 대체 포트에서 시작할 수 있습니다:
# ./dnschef.py -p 5353 -q
[*] Listening on an alternative port 5353
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[*] No parameters were specified. Running in full proxy mode
DNS 프로토콜은 UDP(기본값) 또는 TCP를 통해 사용할 수 있습니다. DNSChef는 --tcp 플래그로 활성화할 수 있는 TCP 모드를 구현합니다.
도구를 필요에 맞게 수정해야 하는 경우 내부에 대한 몇 가지 정보를 제공합니다. DNSChef는 SocketServer 모듈을 기반으로 구축되었으며 스레딩을 사용하여 여러 요청을 동시에 처리합니다. 이 도구는 수신 요청을 위해 TCP 또는 UDP 포트(기본값은 포트 53)에서 수신 대기하고 필요한 경우 해당 요청을 UDP를 통해 실제 DNS 서버로 전달하도록 설계되었습니다.
훌륭한 dnslib 라이브러리는 DNS 패킷을 분석하고 재조립하는 데 사용됩니다. 특히 쿼리를 기반으로 응답 패킷을 생성할 때 유용합니다.
DNSChef는 "A", "AAAA", "MX", "CNAME", "NS", "TXT", "PTR", "NAPTR", "SOA", "ANY" 유형의 레코드에 대한 쿼리를 수정할 수 있습니다. 모든 레코드에 대해 동작을 확장하거나 수정하는 것은 매우 쉽습니다. 간단히 다른 if qtype == "RECORD TYPE") 항목을 추가하고 응답할 내용을 지정하면 됩니다.
도구를 즐기시고 모든 요청과 의견은 iphelix [at] thesprawl.org로 보내주세요.
즐거운 해킹되세요! -Peter