Esempi Pratici: Scenari di Scansione Completi e Decomposizione dei Comandi
Baseline di Rete Aziendale: Discovery Completo Tramite Reporting
Scenario: Rete aziendale interna 10.0.0.0/8, 12.000 host stimati, che richiede un inventario completo delle risorse per la sincronizzazione con CMDB e l'ingestione nella piattaforma di vulnerability management.
Comando Selezionato:
sudo nmap -Pn -sS -sV -sC -O --version-intensity 5 \
-p- --max-retries 2 --max-rtt-timeout 300ms --initial-rtt-timeout 150ms \
--min-hostgroup 256 --max-hostgroup 1024 --min-parallelism 50 \
--defeat-rst-ratelimit \
--script "banner,(http* or ssl*) and not brute and not dos" \
--script-args "http.max-cache-size=1000000,http.useragent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'" \
-oA enterprise-baseline-$(date +%Y%m%d) \
--stats-every 60s \
10.0.0.0/8
Decomposizione dei Flag:
| Flag | Razionale | Alternativa Rifiutata | |------|-----------|----------------------| | -Pn | Salta il discovery degli host; ICMP bloccato dai firewall host | -sn mancherebbe host attivi; -PE fallisce sul firewall predefinito di Windows | | -sS | SYN stealth; nessun handshake TCP completo minimizza il logging | -sT richiesto per non-root ma crea connessioni completate visibili nei log applicativi | | -sV / --version-intensity 5 | Fingerprinting dei servizi a intensità moderata; scala 0-9, 5 bilancia accuratezza vs. tempo | Intensità 9 aggiunge ~400% di tempo per guadagni marginali su servizi oscuri | | -sC | Script predefiniti sicuri; rileva configurazioni errate ovvie | Omettendo si perdono problemi certificati SSL, stato SMB signing | | -O | Fingerprinting OS per arricchimento CMDB | -A include traceroute che attiva IDS in segmenti sensibili | | -p- | Tutte le 65.535 porte; la compliance non ammette scorciatoie "top ports" | --top-ports 1000 manca servizi non standard, comuni in azienda | | --max-retries 2 | Riduce il tempo su porte filtrate dal default di 10 | Più basso (1) causa falsi negativi su link congestionati | | --min-hostgroup 256 | Elaborazione parallela degli host; scala con la larghezza di banda disponibile | Default 4-1024 auto; il floor manuale previene sottoutilizzo su reti veloci | | --defeat-rst-ratelimit | Critico per target Linux che limitano le risposte RST | Senza questo, il tempo di scansione aumenta 10x su ambienti Linux-dominanti |
Caratteristiche dell'Output Atteso:
Nmap scan report for 10.0.15.87
Host is up (0.0032s latency).
Not shown: 65531 filtered ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99 (RSA)
|_ 256 11:22:33:44:55:66:77:88:99:00:aa:bb:cc:dd:ee:ff (ECDSA)
3389/tcp open ms-wbt-server Microsoft Terminal Services
| ssl-cert: Subject: commonName=DESKTOP-ABC123
|_ssl-date: 2024-01-15T09:23:17+00:00; -2s from scanner time.
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
49668/tcp open msrpc Microsoft Windows RPC
MAC Address: 00:50:56:AA:BB:CC (VMware)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose|phone
Running: Microsoft Windows 10|2019
OS CPE: cpe:/o:microsoft:windows_10 cpe:/o:microsoft:windows_server_2019
OS details: Microsoft Windows 10 1903 - 2004 or Windows Server 2019
Network Distance: 1 hop
OS and Service detection performed.
Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 65536 IP addresses (2847 hosts up) scanned in 8472.34 seconds
Stima Tempo: ~2,5 ore per 2.847 host responsivi; 8,5 ore totali wall-clock incluso lo spazio non responsivo.
Limitazioni: Il rilevamento OS è inaffidabile senza almeno una porta aperta e una chiusa—verificare con -sU su target selezionati o integrare con analisi passiva p0f. L'ambiguità delle porte filtrate richiede follow-up con -sV --version-all su asset critici.
Valutazione Infrastruttura Cloud: NAT, Security Group e Target da API
Scenario: Ambiente AWS multi-VPC con 200+ istanze EC2, auto-scaling group e funzioni Lambda con VPC endpoint. Necessità di validare l'efficacia dei security group e identificare interfacce di gestione esposte.
Generazione Dinamica dei Target:
#!/bin/bash
# Genera lista target attivi dalle API AWS, filtrando per stato running e allegato interfaccia di rete
aws ec2 describe-instances \
--filters "Name=instance-state-name,Values=running" \
--query 'Reservations[*].Instances[*].{ID:InstanceId,IP:PrivateIpAddress,PubIP:PublicIpAddress,VPC:VpcId,SG:SecurityGroups[*].GroupId}' \
--output json > /tmp/aws-inventory.json
# Estrae target scoped: IP pubblici per assessment esterno, privati per pivot interno
jq -r '.[][] | select(.PubIP != null) | .PubIP' /tmp/aws-inventory.json > /tmp/targets-public.txt
jq -r '.[][] | select(.PubIP == null) | .IP' /tmp/aws-inventory.json > /tmp/targets-private.txt
Comando Selezionato (Prospettiva Esterna):
sudo nmap -Pn -sS -sV --version-light \
-p 22,80,443,3389,5432,3306,6379,27017,9200,8080,8443,9443,5000 \
--source-port 53 \
--data-length 24 \
-iL /tmp/targets-public.txt \
--max-rate 500 \
--max-retries 1 \
--script "http-title,ssl-cert,ssh-hostkey,mongodb-info,redis-info" \
-oX /tmp/aws-external-$(date +%Y%m%d).xml \
--script-args "http.max-redirects=2,http.pipeline=1" \
2>&1 | tee /tmp/nmap-aws-log.txt
Complicazioni Specifiche del Cloud:
| Sfida | Mitigazione nel Comando | Verifica Richiesta | |-----------|----------------------|----------------------| | Rate Limiting AWS | --max-rate 500 limita a 500 pacchetti/secondo; regolare per analisi VPC flow log | Monitorare ThrottledRequests in CloudTrail; burst a 1000 solo con ticket di aumento limite API EC2 | | Allocazione Porte NAT Gateway | --source-port 53 mimica risposte DNS, riducendo esaurimento tabella NAT | Verificare che la metrica CloudWatch ErrorPortAllocation rimanga zero | | Lacune Logging Security Group | --data-length 24 evita firme pacchetto vuoto che attivano rumore REJECT VPC Flow Log senza dati actionable | Correlare con VPC Flow Logs: aws logs filter-log-events --log-group-name /aws/vpc/flowlogs | | Logging Azure NSG | Per ambienti ibridi, preporre --randomize-hosts per distribuire tra subnet, riducendo burst pricing log NSG | Query tabella Azure Monitor NetworkSecurityGroupEvent per trend flussi denied | | Correlazione GCP VPC Flow Log | Usare --max-hostgroup 64 per prevenire che l'aggregazione flow log offuschi pattern per-target | Esportare in BigQuery: SELECT src_ip, dest_port, COUNT(*) FROM flow_logs WHERE reporter='SRC' GROUP BY 1,2 |
Caratteristiche dell'Output Atteso:
Nmap scan report for ec2-52-XX-XX-XX.compute-1.amazonaws.com (52.XX.XX.XX)
Host is up (0.018s latency).
PORT STATE SERVICE VERSION
22/tcp filtered ssh
80/tcp open http nginx 1.18.0 (Ubuntu)
| http-title: Site doesn't have a title (text/html).
443/tcp open ssl/http nginx 1.18.0
| ssl-cert: Subject: commonName=*.example.com
| Subject Alternative Name: DNS:*.example.com, DNS:example.com
| Not valid before: 2023-08-15T00:00:00
|_Not valid after: 2024-09-14T23:59:59
3389/tcp filtered ms-wbt-server
5432/tcp open postgresql PostgreSQL 12.8
|_ssl-date: TLS randomness does not represent time
Verifica Critica: Porta 22 filtrata con 5432 aperta indica inconsistenza security group—aws ec2 describe-security-groups --group-ids sg-XXXX per validare regole previste vs. drift implementativo.
Engagegment Red Team: Evasione Graduale con Timing, Esca e Offuscamento Protocollo
AVVISO CONFINE LEGALE: Tutti i comandi richiedono autorizzazione esplicita, documentata con scope definito, confini temporali e regole di engagement. L'uso non autorizzato viola il Computer Fraud and Abuse Act (US), Computer Misuse Act (UK) e giurisdizioni equivalenti. Questa sezione presuppone lettera di engagement valida e firmata con procedure di contatto incident response.
Approccio Graduale:
Fase 1: Ricognizione Passiva (Nessun Nmap)
# Solo lista target driven da OSINT; zero contatto diretto
theHarvester -d targetcorp.com -b all -f /tmp/th-recon-passive
Fase 2: Discovery Lento con Esca
sudo nmap -sS -Pn -p 22,80,443,445,3389 \
-T2 \
--scan-delay 5s --max-retries 1 \
-D RND:10,ME \
--source-port 443 \
--data-string "GET / HTTP/1.0\r\n\r\n" \
--spoof-mac Cisco \
--badsum \
-f \
--mtu 24 \
-oN /tmp/stage2-discovery.txt \
203.0.113.0/24
| Tecnica di Evasione | Flag | Meccanismo di Evasione Rilevamento | |-------------------|------|----------------------------| | Offuscamento timing | -T2, --scan-delay 5s | Sotto la maggior parte degli IDS basati su soglia; 5s supera il default scan.rules di Snort 60s/30porte | | Traffico esca | -D RND:10,ME | 10 IP esca casuali distribuiscono il logging; ME colloca la scansione reale tra le esche | | Abuso trust source port | --source-port 443 | Sfrutta regole firewall che permettono traffico di ritorno da sessioni HTTPS stabilite | | Mimicry protocollo | --data-string | Il payload TCP iniziale assomiglia a una richiesta HTTP, non a una probe SYN-only | | Invalidazione checksum | --badsum | Bypassa filtri stateless semplici che verificano checksum; stack validi scartano, alcuni IPS passano | | Frammentazione | -f, --mtu 24 | Frammenti di 8 byte evadono pattern-matching su IDS signature-based; richiesta riassemblaggio | | Spoofing MAC | --spoof-mac Cisco | Offuscamento ARP a livello segmento locale; inutile in routed ma confonde monitoraggio layer-2 |
Fase 3: Offuscamento Protocollo-Specifico per Discovery C2
sudo nmap -sS -Pn -p 4444,5555,6666,7777,8888,9999,31337 \
-T1 \
--scan-delay 15s \
--randomize-hosts \
-D RND:5,ME \
--source-port 53 \
--ip-options "L 10.0.0.1" \
-oN /tmp/stage3-c2-probe.txt \
--script "ssl-cert,banner" \
203.0.113.0/24
Albero Decisionale: Perché Non Alternative
- Rifiutato
-sF(FIN),-sN(NULL),-sX(Xmas): Firewall stateful moderni ed endpoint protection li gestiscono correttamente; efficaci solo contro ACL stateless legacy - Rifiutato
-sI(idle scan): Richiede sequenza IPID prevedibile, sempre più rara; alto tasso di fallimento, lungo tempo di esecuzione - Selezionato
-sScon timing su-sA(ACK): ACK scan utile per mappare regole firewall ma non fornisce informazioni servizio; approccio combinato aggiunge superficie di rilevamento
Limitazioni Esplicite: Le esche richiedono IP routabili reali o generano ARP storms; -D RND usa indirizzi casuali che possono essere blackholati. Pacchetti --badsum scartati da qualsiasi stack RFC-compliant—utile solo contro specifiche configurazioni IPS. Verificare efficacia esca con tcpdump 'host [decoy-ip]' sul posizionamento sensori.
Forensics Incident Response: Identificazione Rapida Infrastruttura Minaccia
Scenario: Allerta SOC per beaconing sospetto Cobalt Strike. Necessità di mappatura rapida infrastruttura C2 da indicatori.
Sequenza di Comandi:
# Fase 1: Ispezione approfondita single-host (2 minuti)
sudo nmap -Pn -sS -sV --version-intensity 9 -A \
-p 1-65535 \
--script "malware*,backdoor*,vulners" \
--script-args "vulners.cvsslimit=7.0" \
-oX /tmp/ir-deep-192.168.1.100.xml \
192.168.1.100
# Fase 2: Ricerca pattern movimento laterale (5 minuti per /24)
sudo nmap -Pn -sS -p 445,135,139,5985,5986,47001 \
--script "smb-enum-shares,smb-enum-sessions,smb-security-mode" \
--script-args "smbuser=DOMAIN\\analyst,smbpass=[REDACTED]" \
-oG /tmp/ir-lateral.gnmap \
192.168.1.0/24
Signature Pattern Discovery C2:
| Pattern | Metodo di Rilevamento Nmap | Comando di Verifica | |---------|----------------------|----------------------| | Certificato default Cobalt Strike | Script ssl-cert pattern CN=, O=, OU= | openssl s_client -connect [IP]:443 </dev/null 2>/dev/null \| openssl x509 -text -noout | | Payload RC4 Metasploit | Analisi entropia cookie http-header | Python zscoring su valori Set-Cookie su multiple probe | | Empire/Invoke-Obfuscation | User-Agent insolito in risposta http-title | Manuale curl -A [agent] -v [target] | | Precursore DNS tunneling | --script dns-* su host scoperti con porta 53 aperta | dig @[IP] version.bind chaos txt per versione BIND |
Output Atteso (Cert Default Cobalt Strike):
443/tcp open ssl/https
| ssl-cert: Subject: commonName=192.168.1.100/organizationName=./stateOrProvinceName=./countryName=--
| Issuer: commonName=192.168.1.100/organizationName=./stateOrProvinceName=./countryName=--
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-01-01T00:00:00
|_Not valid after: 2025-01-01T00:00:00
|_ssl-date: TLS randomness does not represent time
Nota Critica IR: Certificato default Cobalt Strike auto-firmato con codice paese -- e organizzazione ./. Non definitivo (configurabile), ma indicatore ad alta confidenza che richiede isolamento immediato host per playbook.
Pipeline DevSecOps: Scansione Vulnerabilità Automatizzata
Integrazione GitLab CI:
# .gitlab-ci.yml
stages:
- security-scan
variables:
NMAP_TARGET: "${CI_ENVIRONMENT_URL:-staging.internal}"
NMAP_SEVERITY_THRESHOLD: "7.0"
NMAP_FAIL_ON_CVSS: "true"
nmap-vulnerability-scan:
stage: security-scan
image: instrumentisto/nmap:latest
script:
- |
nmap -Pn -sV --version-all \
-p $(cat config/ports.txt | tr '\n' ',') \
--script "vulners,smb-vuln-ms17-010,ssl-enum-ciphers,http-sql-injection" \
--script-args "vulners.cvsslimit=${NMAP_SEVERITY_THRESHOLD}" \
-oX /tmp/nmap-results.xml \
--stats-every 30s \
${NMAP_TARGET}
- |
# Conversione in SARIF per ingestione dashboard sicurezza GitLab
python3 /usr/local/bin/nmap-to-sarif.py \
/tmp/nmap-results.xml \
/tmp/nmap-results.sarif
- |
# Criterio pass/fail: zero CVSS >= soglia
CRITICAL_COUNT=$(grep -o 'cvssScore="[7-9]\.[0-9]"' /tmp/nmap-results.xml | wc -l)
if [ "${NMAP_FAIL_ON_CVSS}" = "true" ] && [ "${CRITICAL_COUNT}" -gt 0 ]; then
echo "FAIL: ${CRITICAL_COUNT} vulnerabilità a o sopra CVSS ${NMAP_SEVERITY_THRESHOLD}"
exit 1
fi
artifacts:
reports:
sast: /tmp/nmap-results.sarif
paths:
- /tmp/nmap-results.xml
- /tmp/nmap-results.sarif
expire_in: 30 days
when: always
allow_failure: false
only:
- merge_requests
- schedules
Equivalente GitHub Actions:
# .github/workflows/nmap-scan.yml
name: Nmap Security Scan
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
schedule:
- cron: '0 2 * * 1' # Lunedi settimanale 2AM
jobs:
nmap:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Nmap vulnerability scan
uses: hackerschoice/nmap-action@v1
with:
target: ${{ vars.SCAN_TARGET || 'localhost' }}
args: '-Pn -sV --script vulners --script-args vulners.cvsslimit=7.0 -oX nmap-results.xml'
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: nmap-results
path: nmap-results.xml
- name: Parse and enforce threshold
run: |
CRITICAL=$(grep -o 'cvssScore="[7-9]\.[0-9]"' nmap-results.xml | wc -l)
echo "critical_count=${CRITICAL}" >> $GITHUB_ENV
if [ "${CRITICAL}" -gt 0 ]; then
echo "::error::${CRITICAL} critical vulnerabilities detected"
exit 1
fi
Validazione Compliance: Mapping PCI DSS e CIS Benchmark
| Requisito | Tecnica di Verifica Nmap | Snippet Comando | |-------------|---------------------------|---------------| | PCI DSS 2.2.2: Abilitare solo servizi necessari | Scansione porte complete con identificazione servizi; confronto con registro servizi autorizzati | nmap -Pn -sS -sV -p- --open -oG - \| awk '/Host:/{ip=$2}/Ports:/{print ip, $0}' \| diff - authorized-services.txt | | PCI DSS 4.1: Usare crittografia forte | ssl-enum-ciphers per rilevamento TLS 1.0/1.1; validazione certificato | --script ssl-enum-ciphers --script-args min-tls-version=1.2 | | PCI DSS 4.2.1: Crittografia forte per trasmissione | Equivalente ssh-audit via ssh2-enum-algos | --script ssh2-enum-algos poi grep per 3des, rc4, diffie-hellman-group1-sha1 | | CIS 3.1: Assicurare invio redirect pacchetto disabilitato | Non direttamente scansionabile; usare script ip-forwarding come indicatore proxy | --script ip-forwarding combinato con rilevamento anomalia traceroute | | CIS 3.6: Configurare iptables/Windows Firewall | Conferma negativa --script firewall-bypass; assenza di risposta != sicurezza | nmap -Pn -sA -p 445 --reason per rilevare presenza ACK-filtering |
Comando di Validazione PCI DSS 4.1:
sudo nmap -Pn -sS -p 443,8443,9443 \
--script "ssl-enum-ciphers,ssl-cert,ssl-heartbleed" \
--script-args "ssl-enum-ciphers.showall" \
-oX /tmp/pci-ssl-validation.xml \
target.payment-gateway.example.com
Criteri Pass/Fail nell'Output:
443/tcp open https
| ssl-enum-ciphers:
| TLSv1.2:
| ciphers:
| TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
| compressors:
| NULL
| cipher preference: server
| TLSv1.3:
| ciphers:
| TLS_AKE_WITH_AES_256_GCM_SHA384 (ecdh_x25519) - A
| cipher preference: client
|_ least strength: A
Condizione FAIL: Qualsiasi voto sotto B, o presenza di TLSv1.0, TLSv1.1, SSLv3, o nomi cipher contenenti _RC4_, _3DES_, _DES_, EXPORT, NULL.