> For the complete documentation index, see [llms.txt](https://sansong.gitbook.io/cyber/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sansong.gitbook.io/cyber/reseau/tunnel/tunnel-dns/dns2tcp.md).

# dns2tcp

Outils de tunnelisation DNS pour relayer des connexions TCP par le biais de DNS.

## Fonctionnement

<figure><img src="https://1813806532-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZRRTPIEA4wb6exZozwS0%2Fuploads%2F3Jxjjh6gpKzI9g8BA53y%2Fdns2tcp.png?alt=media&amp;token=b4e830eb-a567-44dd-91ba-f63e7ee91f34" alt=""><figcaption><p>Fonctionnement de dns2tcp</p></figcaption></figure>

## Utilisation

Dans cet exemple on a 3 machines sur un réseau local 192.168.xxx.0/24 (elles ont été configurées avec des IP statiques).

### Setup le serveur DNS local avec bind

**Installation**

```
sudo apt install bind9 dnsutils
```

**Configuration**

Ajouter dans `/etc/bind/named.conf.local`:

```
zone "dns2tcp.tunnel.com" {
    type forward;
    forward only;
    forwarders { <ip du serveur dns2tcp> port 53; };
};
```

Ajouter dans `/etc/bind/named.conf.options`:

```
options {
    [...]
    allow-query { trusted; };
    listen-on port 53 { <ip du serveur DNS>; };
};

acl trusted {
    192.168.xxx.0/24;
    localhost;
    localnets;
};
```

{% hint style="info" %}
Les points virgules sont importants.
{% endhint %}

**Redémarrer le service**

```
sudo systemctl restart named
# vérifier le status
sudo systemctl status named
```

{% hint style="success" %}
Si `named` ne peut plus redémarrer à cause de l'erreur suivante:&#x20;

**"Start request repeated too quickly."**

* Ouvrir le fichier du service `named.service`
  * Sur Debian: `/lib/systemd/system/named.service`
* Ajouter la ligne suivante au fichier dans la section `[Service]`

```
StartLimitBurst=0
```

* Reload

```
sudo systemctl daemon-reload
```

* Redémarrer le service

```
sudo systemctl restart named
```

{% endhint %}

Maintenant le serveur DNS est configuré pour forward les requêtes pour le domaine `dns2tcp.tunnel.com` vers le serveur dns2tcp.

### Installer dns2tcp

Installer sur les machines serveur et client.

**Depuis les dépôts APT**

```
sudo apt install dns2tcp
```

**Depuis github**

```
git clone https://github.com/alex-sector/dns2tcp.git
cd dns2tcp
./configure
make
sudo make install
```

{% hint style="warning" %}
L'installation avec github ne marche probablement pas...
{% endhint %}

#### Serveur

```
nano .dns2tcp-server-config
```

```
listen = <ip du serveur dns2tcp>
port = 53
user = nobody
key = mysecretkey
chroot = /tmp/
domain = dns2tcp.tunnel.com
resources = ssh:127.0.0.1:22
```

**Lancer le serveur**

```
dns2tcpd –F –d 3 –f .dns2tcp-server-config

15:36:33 : Debug options.c:97	Add resource ssh:127.0.0.1 port 22
15:36:33 : Debug socket.c:54	Listening on 192.168.129.100:53 for domain dns2tcp.tunnel.com
Starting Server v0.5.2...
15:36:33 : Debug main.c:134	Chroot to /tmp/
14:36:33 : Debug main.c:144	Change to user nobody

```

#### Client

```
nano .dns2tcp-client-config
```

```
domain = dns2tcp.tunnel.com
resource = ssh
local_port = 2222
debug_level = 1
key = mysecretkey
server = <ip du serveur DNS>
```

{% hint style="info" %}
Le champ `server` peut être remplacé par l'utilisation de `/etc/resolv.conf`
{% endhint %}

**Lancer le client**

```
dns2tcpc –d 3 –f .dns2tcp-client-config

No DNS given, using 192.168.129.150 (first entry found in resolv.conf)
debug level 3
Debug socket.c:233      Create socket for dns : '192.168.129.150' 
Listening on port : 2222
When connected press enter at any time to dump the queue


```

**Connexion SSH**

On se connecte au serveur dns2tcp en SSH.

```
ssh user@localhost -p 2222
```

{% hint style="success" %}
Remplacer `user` par le nom d'utilisateur sur la machine serveur dns2tcp
{% endhint %}

## Aperçu des paquets

La connexion est établie et les payloads SSH sont envoyés dans les sous domaines.

Le TCP handshake a lieu dans les premiers paquets:

* xxx.=auth.dns2tcp.tunnel.com
* xxx.=connect.dns2tcp.tunnel.com

Les 4 premiers octets dans les sous domaines correspondent à un identifiant de session (toujours le même dans les payloads pour une même session), ici `6uQA`.

<figure><img src="https://1813806532-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZRRTPIEA4wb6exZozwS0%2Fuploads%2FeYoiRBvVFgUyBmJYRqgI%2Fdns2tcp-pcap.png?alt=media&amp;token=acac91ee-f8c7-445f-93a1-741ebfed939c" alt=""><figcaption><p>Capture Wireshark du trafic dns2tcp</p></figcaption></figure>

Les données sont encodées en base64 après l'identifiant de session.

<figure><img src="https://1813806532-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZRRTPIEA4wb6exZozwS0%2Fuploads%2FYG3SvFc4zqgYWpgePj4c%2Fdns2tcp-b64-openssh.png?alt=media&amp;token=7d814855-d9cb-4c46-9f97-e853afcc52da" alt=""><figcaption><p>Décodage du payload en base 64</p></figcaption></figure>
