sono radice. Comprensione dell'escalation dei privilegi del sistema operativo Linux

Ho trascorso il primo trimestre del 2020 preparandomi per l'esame OSCP. La ricerca di informazioni su Google e tanti tentativi “alla cieca” hanno assorbito tutto il mio tempo libero. È stato particolarmente difficile comprendere i meccanismi per aumentare i privilegi. Il corso PWK pone molta attenzione a questo argomento, ma i materiali didattici non bastano mai. Ci sono molti manuali su Internet con comandi utili, ma non sono un fan di seguire ciecamente i consigli senza capire a cosa porterà.

Vorrei condividere con te ciò che ho imparato durante la preparazione e il superamento dell'esame (comprese le periodiche incursioni in Hack The Box). Ho provato un forte senso di gratitudine per ogni piccola informazione che mi ha aiutato a percorrere il percorso Try Harder in modo più consapevole, ora è il mio momento di restituire qualcosa alla comunità.

Voglio regalarti un manuale su come escalare i privilegi in OS Linux, che include un'analisi dei vettori più comuni e le relative funzionalità che ti saranno sicuramente utili. Spesso i meccanismi stessi per aumentare i privilegi sono piuttosto semplici; sorgono difficoltà durante la strutturazione e l'analisi delle informazioni. Pertanto, ho deciso di iniziare con un “giro turistico” e poi considerare ciascun vettore in un articolo separato. Spero di farti risparmiare un po' di tempo nella ricerca sull'argomento.

sono radice. Comprensione dell'escalation dei privilegi del sistema operativo Linux

Allora perché è possibile un’escalation dei privilegi anche nel 2020 se i metodi sono noti da molto tempo? Infatti, se l'utente gestisce correttamente il sistema, non sarà davvero possibile aumentare i privilegi al suo interno. Il principale problema globale che dà origine a tali opportunità è configurazione non sicura. Anche la presenza di versioni software obsolete contenenti vulnerabilità nel sistema è un caso particolare di configurazione non sicura.

Escalation dei privilegi tramite configurazione non sicura

Per prima cosa, affrontiamo la configurazione non sicura. Cominciamo con I professionisti IT utilizzano spesso manuali e risorse come StackOverflow, molti dei quali contengono comandi e configurazioni non sicuri. Un esempio lampante - notizie che il codice più copiato da StackOverflow conteneva un errore. Un amministratore esperto vedrà lo stipite, ma questo è in un mondo ideale. Anche specialisti competenti aumento del carico di lavoro capace di commettere errori. Immagina che un amministratore stia preparando e coordinando la documentazione per la prossima gara, approfondendo allo stesso tempo la nuova tecnologia che sarà implementata nel prossimo trimestre, risolvendo periodicamente i problemi di supporto agli utenti. E poi gli viene affidato il compito di configurare rapidamente un paio di macchine virtuali e di implementare i servizi su di esse. Quale pensi sia la probabilità che l'amministratore semplicemente non noterà lo stipite? Poi cambiano gli specialisti, ma le stampelle restano, mentre le aziende cercano sempre di minimizzare i costi, anche per il personale IT.

Pseudo-shell e jailbreak

La shell di sistema ottenuta durante la fase di sfruttamento è spesso limitata, soprattutto se ottenuta tramite l'hacking di un utente del server web. Ad esempio, le restrizioni della shell potrebbero impedirti di eseguire il comando sudo, producendo un errore:

sudo: no tty present and no askpass program specified

Una volta che hai una shell, ti consiglio di creare un terminale completo, ad esempio usando Python.

python -c 'import pty;pty.spawn("/bin/bash")'

Potresti chiedere: "Perché ho bisogno di mille comandi se posso usarne uno, ad esempio, per trasferire file?" Il fatto è che i sistemi sono configurati diversamente; un dato host potrebbe non avere Python installato, ma potrebbe avere Perl. L'abilità consiste nell'essere in grado di fare cose familiari nel sistema senza strumenti familiari. È possibile trovare un elenco completo delle funzionalità qui.

È possibile ottenere una shell con privilegi bassi utilizzando squadre 1 и squadre 2 (sorprendentemente, anche GIMP).

Visualizza la cronologia dei comandi

Linux raccoglie una cronologia di tutti i comandi eseguiti in un file ~/.bash_history. Se il server viene utilizzato attivamente e la sua cronologia non viene cancellata, esiste un'alta probabilità di trovare credenziali in questo file. Cancellare la cronologia è semplicemente scomodo. Se l'amministratore è costretto a selezionare comandi di dieci piani tramite , ovviamente, gli sarà più conveniente richiamare questo comando dalla cronologia piuttosto che inserirlo di nuovo. Inoltre, molte persone non conoscono questo “hack”. Se nel sistema sono presenti shell alternative come Zsh o Fish, queste hanno una propria storia. Per visualizzare la cronologia dei comandi in qualsiasi shell, basta digitare la cronologia dei comandi.

cat ~/.bash_history
cat ~/.mysql_history
cat ~/.nano_history
cat ~/.php_history
cat ~/.atftp_history

Esiste l'hosting condiviso, in cui il server viene utilizzato per ospitare diversi siti Web. In genere, con questa configurazione, ogni risorsa ha il proprio utente con una directory home separata e un host virtuale. Pertanto, se configurato in modo errato, puoi trovare il file .bash_history nella directory principale della risorsa web.

Ricerca di password nel file system e attacchi ai sistemi adiacenti

I file di configurazione per vari servizi potrebbero essere leggibili dal tuo utente attuale. In essi puoi trovare credenziali in chiaro: password per l'accesso a un database o servizi correlati. La stessa password può essere utilizzata sia per accedere al database che per autorizzare l'utente root (credenziali personale).
Accade che le credenziali trovate appartengano a servizi su altri host. Sviluppare un attacco all'infrastruttura attraverso un host compromesso non è peggio che sfruttare altri host. I sistemi adiacenti possono essere trovati anche cercando gli indirizzi IP nel file system.

grep -lRi "password" /home /var/www /var/log 2>/dev/null | sort | uniq #Find string password (no cs) in those directories
grep -a -R -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' /var/log/ 2>/dev/null | sort -u | uniq #IPs inside logs

Se l'host compromesso dispone di un'applicazione web accessibile da Internet, è meglio escludere i suoi log dalla ricerca degli indirizzi IP. È improbabile che gli indirizzi degli utenti delle risorse da Internet ci siano utili, ma gli indirizzi della rete interna (172.16.0.0/12, 192.168.0.0/16, 10.0.0.0/8) e dove vanno, a giudicare dai registri , potrebbe interessare.

sudo

Il comando sudo offre all'utente la possibilità di eseguire un comando nel contesto root utilizzando la propria password o senza utilizzare alcuna password. Molte operazioni in Linux richiedono privilegi di root, ma eseguire come root è considerata una pessima pratica. È invece preferibile applicare l'autorizzazione selettiva per eseguire i comandi nel contesto root. Tuttavia, molti strumenti Linux, compresi quelli standard come vi, possono essere utilizzati per aumentare i privilegi in modi legittimi. Per trovare un metodo adatto, ti consiglio di cercare qui.

La prima cosa che devi fare quando accedi al sistema è eseguire il comando sudo -l. Verrà visualizzato il permesso per utilizzare il comando sudo. Se si ottiene un utente senza password (come apache o www-data), il vettore di escalation dei privilegi tramite sudo è improbabile. Quando si utilizza sudo, il sistema richiederà una password. Non sarai nemmeno in grado di impostare una password utilizzando il comando passwd; richiederà la password corrente dell'utente. Ma se sudo è ancora disponibile, essenzialmente devi cercare:

  • qualsiasi interprete, chiunque può generare una shell (PHP, Python, Perl);
  • qualsiasi editor di testo (vim, vi, nano);
  • eventuali spettatori (meno, più);
  • qualsiasi capacità di lavorare con il file system (cp, mv);
  • Strumenti che hanno output in bash, interattivo o come comando eseguibile (awk, find, nmap, tcpdump, man, vi, vim, ansible).

Suid/Sgid

Ci sono molti manuali su Internet che consigliano di raccogliere tutti i comandi suid/sgid, ma un raro articolo fornisce dettagli su cosa fare con questi programmi. È possibile trovare opzioni per aumentare i privilegi che non tengono conto dell'uso di exploit qui. Inoltre, numerosi file eseguibili presentano vulnerabilità specifiche per la versione del sistema operativo, per esempio.

In un mondo ideale, eseguiresti tutti i pacchetti installati almeno tramite searchsploit. In pratica questo dovrebbe essere fatto con i programmi più diffusi come sudo. C'è sempre anche la possibilità di utilizzare e supportare lo sviluppo di strumenti automatizzati che evidenzieranno file eseguibili interessanti, dal punto di vista dell'escalation dei privilegi, con i bit suid/sgid impostati. Fornirò un elenco di tali strumenti nella sezione corrispondente dell'articolo.

Script scrivibili eseguiti da Cron o Init nel contesto di Root

I lavori cron possono essere eseguiti in diversi contesti utente, incluso root. Se un'attività cron è configurata con un collegamento a un file eseguibile ed è disponibile per la scrittura, può essere facilmente sostituita con una dannosa e con l'escalation dei privilegi. Tuttavia, per impostazione predefinita, i file con attività cron sono leggibili da qualsiasi utente.

ls -la /etc/cron.d  # show cron jobs 

La situazione è simile con init. La differenza è che le attività in cron vengono eseguite periodicamente e in init all'avvio del sistema. L'operazione richiederà il riavvio del sistema e alcuni servizi potrebbero non avviarsi (se non sono stati registrati all'avvio).

ls -la /etc/init.d/  # show init scripts 

Puoi anche cercare file scrivibili da qualsiasi utente.

find / -perm -2 -type f 2>/dev/null # find world writable files

Il metodo è abbastanza noto; gli amministratori di sistema esperti utilizzano con attenzione il comando chmod. Tuttavia, su Internet, la stragrande maggioranza dei manuali descrive l'impostazione dei diritti massimi. L'approccio “just make it work” degli amministratori di sistema inesperti crea opportunità per l'escalation dei privilegi in linea di principio. Se possibile, è meglio cercare nella cronologia dei comandi l'uso non sicuro di chmod.

chmod +w /path 
chmod 777 /path

Ottenere l'accesso alla shell ad altri utenti

Osserviamo l'elenco degli utenti in /etc/passwd. Prestiamo attenzione a chi ha una conchiglia. Puoi brutalizzare questi utenti: è possibile che attraverso l'utente risultante sia possibile eventualmente aumentare i privilegi.

Per migliorare la sicurezza, ti consiglio di aderire sempre al principio del privilegio minimo. Ha anche senso dedicare tempo alla verifica delle configurazioni non sicure che potrebbero rimanere dopo la risoluzione dei problemi: questo è il "dovere tecnico" dell'amministratore di sistema.

Codice autoscritto

Vale la pena dare un'occhiata più da vicino ai file eseguibili nella directory home dell'utente e del server web (/var/www/, se non diversamente specificato). Questi file potrebbero rivelarsi una soluzione completamente pericolosa e contenere incredibili stampelle. Naturalmente, se nella directory del server Web è presente una sorta di framework, non ha senso cercare zero-day al suo interno come parte di un pentest, ma si consiglia di trovare e studiare modifiche, plug-in e componenti personalizzati.

Per aumentare la sicurezza, è meglio, se possibile, evitare di utilizzare credenziali negli script autoprodotti, nonché funzionalità potenzialmente pericolose, come leggere /etc/shadow o manipolare id_rsa.

Elevazione dei privilegi attraverso lo sfruttamento delle vulnerabilità

Prima di tentare di aumentare i privilegi attraverso lo sfruttamento, è importante capire trasferimento di file all'host di destinazione. Oltre ai soliti strumenti come ssh, ftp, http (wget, curl) ce n'è uno intero "zoo" di possibilità.

Per migliorare la sicurezza del sistema, aggiornalo regolarmente alla versione più recente stabile versioni e provare anche a utilizzare distribuzioni progettate per Enterprise. Altrimenti è raro, ma ci sono situazioni in cui l'aggiornamento apt rende il sistema inutilizzabile.

Sfruttare i servizi in esecuzione nel contesto dell'utente root

Alcuni servizi Linux vengono eseguiti come root. Possono essere trovati usando il comando ps aux | radice grep. In questo caso il servizio potrebbe non essere pubblicizzato su Internet ed essere disponibile localmente. Se ha exploit pubblici, possono essere utilizzati in sicurezza: un crash del servizio in caso di guasto è molto meno critico di un crash del sistema operativo.

ps -aux | grep root # Linux

Il caso di maggior successo può essere considerato il funzionamento di un servizio compromesso nel contesto dell'utente root. Il funzionamento del servizio SMB fornisce un accesso SISTEMA privilegiato sui sistemi Windows (ad esempio, tramite ms17-010). Tuttavia, questo non è comune sui sistemi Linux, quindi puoi dedicare molto tempo all'escalation dei privilegi.

Sfruttare le vulnerabilità del kernel Linux

Questo è il percorso che dovresti intraprendere per ultimo. Un'operazione non riuscita può portare a un arresto anomalo del sistema e, in caso di riavvio, alcuni servizi (compresi quelli attraverso i quali è stata ottenuta la shell iniziale) potrebbero non avviarsi. Succede che l'amministratore si è semplicemente dimenticato di utilizzare il comando systemctl Enable. Inoltre causerà molta insoddisfazione per il tuo lavoro se l'operazione non è stata concordata.
Se decidi di utilizzare i codici sorgente di exploitdb, assicurati di leggere i commenti all'inizio dello script. Tra le altre cose, di solito dice come compilare correttamente un determinato exploit. Se sei troppo pigro o hai dovuto farlo “ieri” a causa delle scadenze, puoi cercare repository con exploit già compilati, per esempio. Tuttavia, dovresti capire che in questo caso otterrai un maiale in un colpo. D’altro canto, se un programmatore capisse fino in fondo come funziona un computer e quali software utilizza, non scriverebbe una sola riga di codice in tutta la sua vita.

cat /proc/version
uname -a
searchsploit "Linux Kernel" 

Metasplot

Per catturare e gestire la connessione è sempre meglio utilizzare il modulo exploit/multi/handler. La cosa principale è impostare il payload corretto, ad esempio generic/shell/reverse_tcp o generic/shell/bind_tcp. La shell prodotta da Metasploit può essere aggiornata a Meterpreter utilizzando il modulo post/multi/manage/shell_to_meterpreter. Con Meterpreter puoi automatizzare il processo post-sfruttamento. Ad esempio, il modulo post/multi/recon/local_exploit_suggester controlla la piattaforma, l'architettura e le entità richieste per lo sfruttamento e suggerisce moduli Metasploit per aumentare i privilegi sul sistema di destinazione. Grazie a Meterpreter, l'escalation dei privilegi a volte si riduce al lancio del modulo richiesto, ma l'hacking senza capire cosa sta succedendo sotto il cofano non è "vero" (devi comunque scrivere un rapporto).

Strumenti

Gli strumenti per automatizzare la raccolta locale delle informazioni ti faranno risparmiare molto tempo e fatica, ma da soli non sono in grado di identificare completamente il percorso verso l'escalation dei privilegi, soprattutto in caso di sfruttamento delle vulnerabilità del kernel. Gli strumenti di automazione eseguiranno tutti i comandi necessari per raccogliere informazioni sul sistema, ma è anche importante essere in grado di farlo analizzare dati ricevuti. Spero che il mio articolo ti sia utile a questo proposito. Naturalmente, ci sono molti più strumenti di quelli che elencherò di seguito, ma fanno tutti più o meno la stessa cosa: è piuttosto una questione di gusti.

Linpeas

Una Tula abbastanza recente, il primo commit risale a gennaio 2019. Il mio strumento preferito al momento. Il punto è che evidenzia i vettori più interessanti dell’escalation dei privilegi. D'accordo, è più conveniente ottenere una valutazione di esperti a questo livello piuttosto che analizzare dati grezzi monolitici.

LinEnum

Il mio secondo strumento preferito, raccoglie e organizza anche i dati ottenuti come risultato dell'enumerazione locale.

Suggerito-exploit-Linux (1,2)

Questo exploit analizzerà il sistema per individuare condizioni di exploit adeguate. In effetti, svolgerà il lavoro in modo identico al modulo Metasploit local_exploit_suggester, ma offrirà collegamenti ai codici sorgente di exploit-db anziché ai moduli Metasploit.

Linuxprivchecker

Questo script raccoglierà e organizzerà in sezioni una grande quantità di informazioni che potranno essere utili a formare un vettore per aumentare i privilegi.

Un'altra volta entrerò nei dettagli elevazione dei privilegi nel sistema operativo Linux tramite suid/sgid.

Fonte: habr.com

Aggiungi un commento