Pular para o conteúdo principal

DNS NINJA

 


DNS NINJA

O projeto Dns Ninja (Ideia criada por min), nada mais é o serviço de Dns (Domain Name System), com máximo de segurança possível e implantação fácil, Estaremos utilizando o debian 12 para essa missão.

Primeira recomendação, após instalação do debian, atualizar o sistema operacional e instalar o pacote o dns.

spinal@dns-ninja:~$ su - root
root@dns-ninja:/home/spinal# apt update -y
root@dns-ninja:/home/spinal# apt upgrade -y
root@dns-ninja:/home/spinal# apt install bind9 -y

Verificando se serviço está no inicializado de outro servidor, observa que o serviço de dns utiliza a porta 53 em cima do protocolo tcp e udp
Obs: Para realizar o scanner em tcp e udp, adicionar os parametros -sT e -sU

root@lenovo-legion5:/home/spinal# nmap -p 53 --open -sT -sU 192.168.15.176
Starting Nmap 7.80 ( https://nmap.org ) at 2024-01-22 08:28 -03
Nmap scan report for 192.168.15.176
Host is up (0.0011s latency).
PORT   STATE SERVICE
53/tcp open  domain
53/udp open  domain
MAC Address: 08:00:27:43:69:CD (Oracle VirtualBox virtual NIC)
Nmap done: 1 IP address (1 host up) scanned in 0.27 seconds

Instalando firewall local e realizar a primeira camada de segurança, a escolha para esse tutorial foi o firewalld.

root@dns-ninja:/home/spinal# apt install firewalld -y

Detalhe muito importante, liberar a regra de firewall para o serviço de dns, Atente-se que o serviço foi liberado tanto o protocolo tcp e udp

root@dns-ninja:/home/spinal# firewall-cmd --add-service=dns --permanent
success
root@dns-ninja:/home/spinal# firewall-cmd --reload
success
root@dns-ninja:/home/spinal# firewall-cmd --list-services
dhcpv6-client dns ssh

Criando uma zona e uma zona reversa simples:
Adicione o contéudo no arquivo /etc/bind/named.conf.local, esse arquivo é responsável por criar os dados de cada zona.

zone "spinal.com" {
    type master;
    file "/etc/bind/zones/spinal.com.db";
};
zone "15.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/spinal.com.rev";
};

Criando o diretório para o contéudo das zonas

root@dns-ninja:/etc/bind# mkdir -p /etc/bind/zones/

Criando o conteúdo da zona do domínio 'spinal.com', conteúdo mega simplificado. 
Obs: O serial inseri como número 1, lembrando que depois após qualquer alteração deve-se adicionar um número posterior, para atualizar as informações.

root@dnssec:/etc/bind# cat /etc/bind/zones/spinal.com.db
$TTL    604800
@       IN      SOA     ns.spinal.com. admin.spinal.com. (
                               1         ; Serial
                     604800         ; Refresh
                      86400         ; Retry
                    2419200         ; Expire
                     604800 )       ; Negative Cache TTL
;
@       IN      NS      ns.spinal.com.
ns      IN      A       192.168.15.176

modem   IN      A       192.168.15.1

Criando o conteúdo da zona reversa do domínio 'spinal.com', conteúdo mega simplificado

root@dnssec:/etc/bind# cat /etc/bind/zones/spinal.com.rev 
$TTL    604800
@       IN      SOA     ns.spinal.com. admin.spinal.com. (
                               1         ; Serial
                     604800         ; Refresh
                      86400         ; Retry
                    2419200         ; Expire
                     604800 )       ; Negative Cache TTL
;
@       IN      NS      ns.spinal.com.
1       IN      PTR     modem.spinal.com.

Verificando configuração inserida, sem erros, dica para verificar debug inclusive de configurações:

root@dns-ninja:/etc/bind# named-checkconf -z
zone spinal.com/IN: loaded serial 1
zone 15.168.192.in-addr.arpa/IN: loaded serial 1
zone localhost/IN: loaded serial 2
zone 127.in-addr.arpa/IN: loaded serial 1
zone 0.in-addr.arpa/IN: loaded serial 1
zone 255.in-addr.arpa/IN: loaded serial 1
root@dns-ninja:/etc/bind# named-checkzone spinal.com /etc/bind/zones/spinal.com.db
zone spinal.com/IN: loaded serial 1
OK
root@dns-ninja:/etc/bind# named-checkzone 15.168.192.in-addr.arpa /etc/bind/zones/spinal.com.rev
zone 15.168.192.in-addr.arpa/IN: loaded serial 1
OK

Altere e o arquivo /etc/resolv.conf para o ip do próprio servidor dns e vamos realizar um teste com o comando dig para testar o dns.

root@dns-ninja:/etc/bind# cat /etc/resolv.conf 
nameserver 192.168.15.176
root@dns-ninja:/etc/bind# dig @localhost modem.spinal.com +short
192.168.15.1

DNSSEC

O Que é?

DNSSEC (Domain Name System Security Extensions) é uma extensão de segurança para o DNS, garantindo autenticidade e integridade das informações DNS para prevenir falsificação e ataques, aumentando a confiança e segurança nas resoluções DNS.

Como funciona?
Para implementar DNSSEC, deve pares de chaves criptográficas, uma chave de assinatura (KSK - Key Signing Key) e uma chave de zona (ZSK - Zone Signing Key). As assinaturas digitais geradas com essas chaves são incluídas nos registros de recurso DNS para autenticar as informações.

Criar a ZSK (Zone Signing Key) e Chave KSK (Key Signing Key):

root@dns-ninja:/etc/bind/zones# dnssec-keygen -a RSASHA256 -b 2048 -n ZONE spinal.com
root@dns-ninja:/etc/bind/zones# dnssec-keygen -a RSASHA256 -b 2048 -n ZONE -f KSK spinal.com

Deve adicionar as informações da chave pública no zona criada.
root@dns-ninja:/etc/bind/zones# cat Kspinal.com.+008+*.key >> spinal.com.db

Assinar a zona com o dnssec

root@dns-ninja:/etc/bind/zones# dnssec-signzone -t -g -o spinal.com /etc/bind/zones/spinal.com.db Kspinal.com.+008+*.private
Verifying the zone using the following algorithms:
- RSASHA256
Zone fully signed:
Algorithm: RSASHA256: KSKs: 1 active, 0 stand-by, 0 revoked
                      ZSKs: 1 active, 0 stand-by, 0 revoked
/etc/bind/zones/spinal.com.db.signed
Signatures generated:                        9
Signatures retained:                         0
Signatures dropped:                          0
Signatures successfully verified:            0
Signatures unsuccessfully verified:          0
Signing time in seconds:                 0.040
Signatures per second:                 225.000
Runtime in seconds:                      0.064

Alterar  arquivo de zona pelo assinado:

sed -i 's#file "/etc/bind/zones/spinal.com.db";#file "/etc/bind/zones/spinal.com.db.signed";#' /etc/bind/named.conf.local

O mesmo precisa ser feito para zona reversa: 15.168.192.in-addr.arpa

root@dns-ninja:/etc/bind/zones# dnssec-keygen -a RSASHA256 -b 2048 -n ZONE 15.168.192.in-addr.arpa
root@dns-ninja:/etc/bind/zones# dnssec-keygen -a RSASHA256 -b 2048 -n ZONE -f KSK 15.168.192.in-addr.arpa
root@dns-ninja:/etc/bind/zones# cat K15.168.192.in-addr.arpa.+008+*.key >> spinal.com.rev
root@dns-ninja:/etc/bind/zones# dnssec-signzone -t -g -o 15.168.192.in-addr.arpa /etc/bind/zones/spinal.com.rev K15.168.192.in-addr.arpa.+008+*.private
root@dns-ninja:/etc/bind# sed -i 's#file "/etc/bind/zones/spinal.com.rev";#file "/etc/bind/zones/spinal.com.rev.signed";#' /etc/bind/named.conf.local
root@dns-ninja:/etc/bind/zones# systemctl reload named

Informações encontradas após a zona ser assinada pelo dnssec.

Tipos de Records:

São Recursos de assinaturas digitais para garantir a autenticidade e integridade das informações no DNS.
RRSIG (Assinatura Digital):
Garante que as informações sobre um nome de domínio sejam autênticas
NSEC (Indicador de Existência):
Diz se um nome de domínio tem ou não informações associada, mecanimos no qual auxilia proteção contra falsificações.
NSEC3 (Versão Mais Segura):
Uma versão mais segura do NSEC, que dificulta a descoberta de informações sobre nomes de domínio.
DNSKEY (Chave De Dns):
Trata-se de uma chave pública que valida as assinaturas digitais de um determinado domínio


Verificando um nome dns com dnssec implatado

root@dns-ninja:/etc/bind# dig @localhost modem.spinal.com +dnssec +short
192.168.15.1
A 8 3 604800 20240221131516 20240122131516 21244 spinal.com. RypCKjPliNKpwaSsUdh3Wb8XpxPeT1sHxya34getGUDvbCav6vqkj8wi efWGZ1F3BTnT829231ndmiDYru9MgU7SZzF6JfyR6jwC0m0LDn3BHBN/ fKHtyIKWgdnw4YZD+k0nih+O7U4mgq/E72H5cOQ+EGqOxQz/Z/YAJXN9 FTfExb7hp94Ts4HB6WL/nRSuN7Up8qvW6TlYw9Nl0e7VKSVOo+JpT9mZ +XZQVuH6gxog8aKyv8nFCvbYG4ihzSyMmVVKOHZPYWq+SSheAvBUfsFk 0UH1iO/sl4UhCdHIFx/wjqA8IxW0yEG/eKllnwYd8/f13/d1z/Nemg6U YtamuA==

Recarregue as configurações de dns:

root@dns-ninja:/etc/bind/zones# systemctl reload named

Habilitar Selinux no debian, para a configuração ser implatada deve reiniciar o servidor.
obs: Talvez seja necessário habilitar o módulo do firewalld com o selinux

root@dns-ninja:~# systemctl disable apparmor
root@dns-ninja:~# apt install policycoreutils selinux-utils selinux-basics selinux-policy-default policycoreutils-python-utils
root@dns-ninja:~# selinux-activate
root@dns-ninja:~# reboot
root@dns-ninja:~# sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
root@dns-ninja:~# useradd -r -U -s /sbin/nologin sddm
root@dns-ninja:~# semodule -e firewalld
root@dns-ninja:~# setenforce 1

Verificando as informações, o selinux realizou a configuração do contexto.

root@dns-ninja:~# getenforce 
Enforcing
root@dns-ninja:~# ls -ldZ /etc/bind
drwxr-sr-x. 3 root bind system_u:object_r:named_zone_t:s0 4096 Jan 22 11:19 /etc/bind

Dicas Extras

Implementação para incrementar a segurança por rede no bind (opcional), adicionar dentro do menu 'options' no arquivo de configuração: named.conf.options
Obs: Essa opção pode ser interessante caso somente o proxy precise realizar as consultas DNS.

allow-query { 192.168.15.0/24; };

Dica para prevensão rápida no caso de um um ataque proveniente ou desconfiança de um ip, o mesmo pode ser bloqueado via firewalld

root@dns-ninja:/var/lib# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.15.35" reject'
success
root@dns-ninja:/var/lib# firewall-cmd --reload
success
root@dns-ninja:~# firewall-cmd --list-rich-rules 
rule family="ipv4" source address="192.168.15.35" reject

Resovendo o problema de captura de banner do dns, evitar problemas relacionados principalmente a execução de exploits.

root@dnssec:/home/spinal# dig @192.168.15.176 -c CHAOS -t txt version.bind +short
"9.18.19-1~deb12u1-Debian"
root@dnssec:/home/spinal# dig @192.168.15.176 -c CHAOS -t txt version.bind +short
"none"

Como obter o resultado sem a versão do debian e do bind, basta adicionar o parâmetro de configuração dentro da seção 'options', no arquivo: /etc/bind/named.conf.options
Obs: Não esqueça de recarregar as configurações do serviço bind via systemd.

 
root@dns-ninja:/etc/bind# cat named.conf.options | grep -v '/' | grep -v '^$'
options {
dnssec-validation auto;
listen-on-v6 { any; };
version "none";
};

Incremento Surpresa d DNS com TLS


Para esta missão, devemos desfazer algumas configurações e implementar outras:

Instalar o pacote stunnel

root@dns-ninja:/home/spinal# apt-get install stunnel4 -y
root@dns-ninja:/home/spinal#  mkdir -p /etc/stunnel/ssl/private/ /etc/stunnel/ssl/public/

Gere uma chave privada

root@dns-ninja:/home/spinal# openssl genpkey -algorithm RSA -out /etc/stunnel/ssl/private/dns-key.pem

Gere um certificado autoassinado

root@dns-ninja:/home/spinal# openssl req -new -x509 -key /etc/stunnel/ssl/private/dns-key.pem -out /etc/stunnel/ssl/public/dns-cert.pem -days 3650

Crie o arquivo de configuração do dns com tls com stunnel.

root@dns-ninja:/home/spinal# cat /etc/stunnel/dnstls.conf 
[dns-tls]
accept = 853
connect = 127.0.0.1:53
cert = /etc/stunnel/ssl/public/dns-cert.pem
key = /etc/stunnel/ssl/private/dns-key.pem
root@dns-ninja:~# systemctl restart stunnel4

Verificando as informações: UPD e TLS

root@dnssec:/home/spinal# dig @192.168.15.176 -p 53 modem.spinal.com | grep SERVER
;; SERVER: 192.168.15.176#53(192.168.15.176) (UDP)
root@dnssec:/home/spinal# dig +tls @192.168.15.176 -p 853 modem.spinal.com | grep SERVER
;; SERVER: 192.168.15.176#853(192.168.15.176) (TLS)

Bloquear o acesso via porta 53, obs: será tanto nos protocolos tcp e udp. Liberando as conexões via tls para consultas dns.

root@dns-ninja:~# firewall-cmd --remove-service=dns --permanent
success
root@dns-ninja:~# firewall-cmd --add-port=853/tcp --permanent
success
root@dns-ninja:~# firewall-cmd --reload
success

Agora fazer a mágia acontecer do lado do cliente:
Siga esse tutorial para a estação de trabalho Linux como resolver via tls em outra porta:
Obs: Essa é uma ferramenta poderosa no qual é possível acessar multiplos dns, incluisve com domínios diferentes.

root@debian12-template:/home/spinal# apt install unbound -y
root@debian12-template:/home/spinal# cat /etc/resolv.conf 
nameserver 127.0.0.1
root@debian12-template:/home/spinal# cat /etc/unbound/unbound.conf.d/client-dns.conf 
server:
    interface: 127.0.0.1
    access-control: 127.0.0.1/32 allow

forward-zone:
    name: "spinal.com"
    forward-addr: 192.168.15.176@853
    forward-tls-upstream: yes

forward-zone:
    name: "."
    forward-addr: 8.8.8.8
    forward-addr: 1.1.1.1
    forward-addr: 8.8.4.4
    forward-addr: 1.0.0.1
    forward-addr: 208.67.222.222
    forward-addr: 208.67.220.220
root@debian12-template:/home/spinal# systemctl enable unbound --now
Synchronizing state of unbound.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable unbound


Dica Extra (Caso não for corrigido até o momento)

Devido a um bug encontrado com o selinux e utilizar os comandos do firewalld, inseri somente o serviço do firewalld para rodar em permissive e o resto em enforcing.

root@dns-ninja:/home/spinal# firewall-cmd --state
ERROR:dbus.proxies:Introspect error on :1.17:/org/fedoraproject/FirewallD1: dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NoReply: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.
Error: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.
root@dns-ninja:/home/spinal# semanage permissive -a firewalld_t
root@dns-ninja:/home/spinal# firewall-cmd --state
running
root@dns-ninja:~# getenforce 
Enforcing


Ass: Luiz Guilherme Nunes Fernandes
Email: narutospinal@gmail.com
Informativo: Entusiasta e colaborador em Software Livre.

Comentários