Lezione 4a: La piccola bottega degli orrori

Vediti: epigrams on programming → https://cpsc.yale.edu/epigrams-programming

L’obiettivo sarebbe cercare di vedere gli errori più comuni dei programmatori: vediti la prima dozzina di slides che riassumono tutto ciò.

Nebula: live cd con esericizi di sicurezza basilari in ambiente UNIX, ben catturate in questa macchina virtuale. Dal livello 00 al 19. L’utente deve cercare di ottenere un determinato obiettivo in ogni modo possibile. Gli attaccanti sono levelN dove N è uguale al livelo mentre le vittime sono flagN. La password di root è nebula. L’obiettivo è lo sfruttamente di vulnerabiltià di unix.

Vedremo anche Protostar, sono 24 esercizi, con diversi temi e abbiamo solamente un utente solo: user, provando a far partire applicazioni con privilegi elevati con credenziali di root. obiettivi: modifica di memoria, …

Web for pentester: esercizi di sicurezza basilari per sicurezza web.

Sono spesso immagini ISO quindi puoi usare un virtual manager qualunque, senza grossi problemi. Sono spesso dei live cd, potrei non avere nemmeno bisogno del disco. Si suggerisce di abilitare l’inoltrodi porte TCP specifiche sul proprio host.

Link utili: https://exploit.education/

[07/03/2023]

Mandare un pacchetto di rete FIN random potrebbe portare a risposte diverse da parte del server. A partire da queste richieste posso andare a comprendere chi ho davanti. Praticamente mando un pacchetto con tutti i flag accessi al fine di farmi mandare una risposta che lo scopri. Per fare i pacchetti non posso usare i socket. Come posso fare? Serve un meccanismo per allocare un buffer di 64k e poi con le operazioni di bit lavorare sugli header, produco manualmente che cosa viene prodotto automaticamente dallo stack TCP-IP. Questo schifo si chiama: raw socket. Perché non è fatto dallo stack tcp-ip. Per aprire un socket di questa famiglia ci servono i privilegi di root. Di fatto se usiamo nmap senza essere utenti root non faccio scan in maniera così furba. Questo metodo si chiama sin scan per cui appena ricevo un pacchetto di ritorno che sia buono posso dire di essermi già connesso senza fare anche tutti gli altri acknowledgment. L’elevazione posso fare in modi diversi:

solitamente quando lancio il processo questo viene lanciato con delle “credenziali” che appartengono a chi lo lancia, ma se ho attivato il setuid succede che io lancio il comando con lo user id pari a quello del creatore del file. Praticamente faccio eseguire il processo a due persone diverse. Che sia userid o groupid. Posso fare vestire con due cappelli diversi il processo, in uno io e nell’altro caso il creatore del file. Come posso gestire il tutto?

chown root *binario*
chmod u+s *binario*

chgrp root *binario*
chmod g+s *binario*

Come posso trovare i permessi di tutti i file setuid e seguid?

find / -perm -6000

6000 → è setuser id e setgroup id, il meno davanti serve per dire che almeno devo fare stuid e guid, il resto non mi interessa che cosa sia. Ovviamente avrebbe senso come 2000 o 4000 come comando, il 6000 non ha senso che esista. Più troviamo file del genere peggio è per la distribuzione. Troviamo anche uid effettivo e gid effettivo, normalmente è identico a quella reale. Ma mi serve per fare perché se ho i bit disattivati questi no servono come dicevamo prima a lanciare comandi con i gid e uid del creatore. L’algoritmo di controllo dei permessi di unix si attiva sulla chiamata di sistema open, prima di poter scrivere o leggere devo aprire un file. Le credenziali effettive del processo son messe a confronto con i permessi di ogni elemento del percorso di un file. Questo algoritmo di controllo dei permessi salta con root. C’è un meccanismo per rilasciare alcuni privilegi gli sviluppatori UNIX nella loro sapienza hanno meccanismi per andare ad abbassare privilegi quando non serve: privilege drop and restore. Io ho due coppie: ruid e euid, … come introduco una funzione che mi gestire l’elevazione ed il drop dei privilegi userò l’user id dell’utente principale e quando elevo mi comporto come root. Deve esserci un dato che certifica lo stato dell’utente però in ogni istante. Come faccio? Uso le credenziali effettive per andare a capire l’effettiva potenza di un utente. Se sovrascrivo l’unica sorgente poi il sistema si deve ricordare che ero stato root per fare il ripristino a root. Cioè come faccio ad avere un ricordo degli stati dei miei privilegi. Con due terne è difficile, i sistemi operativi BSD ci riuscivano con un trucco straordinario (vedilo da solo). La soluzione più semplice è quello di salvare ID Salvato che salva lo stato dello uid e gid quando è partito il processo. Il SO in questo modo sa a chi andare a gestire i privilegi.

Come faccio tecnicamente tutto questa gestione di drop e elevation? Vatti a vedere la lezione in cui c’è la storia della API di sistema. Abbiamo due famiglie principali: POSIX e LSB

Privilegio elevato non si usa tanto, quanto il concetto di privilegio appropriato. Nei sistemi UNIX posso acquisire in modi diversi: diventare reale root, diventare root effettivo, acquisire le capability CAP_SETUID. Le capability sono un modo splendido per destrutturare tutto quanto in mini permessi di root spacchettati e darli a determinati processi.

Non esiste solamente divento root ma ho tantissimi modi di farlo. Interessante vedere come ci sono comandi che sono sia parte della libreria, call di sistema, etc