




























































































Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Appunti di Sicurezza Informatica [CT0539]
Tipologia: Appunti
1 / 112
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!





























































































Impareremo ad attaccare e difendere un sistema! Dobbiamo capire quando un bug potrebbe diventare una vulnerabilità!
Vedremo :
La shell Unix consente di automatizzare rapidamente l'interazione con processi e dati. Conoscere la shell aiuta a comprendere l'interazione con i programmi (processi)
La shell Unix è l'interfaccia più semplice per i sistemi operativi ● Esegui programmi ● Reindirizza input / output ● Collega programmi insieme ● Esegui script
Ci concentriamo su bash (Bourne-again shell, pronunciato born-again), successore di Bourne shell sh.
ls: mostra il contenuto della directory corrente. -l visualizza il formato lungo; -a mostra i file nascosti (punto)
file filename: mostra il tipo di file denominato filename pwd: (print working directory) mostra il percorso della directory di lavoro corrente mkdir name: crea una nuova directory in quella di lavoro corrente cd path: (change directory) sposta la directory di lavoro in path cat file: mostra il contenuto del file cat f1 f2 f3: visualizza la concatenazione di f1 f2 f echo "hello": stampa "hello" grep word file: cerca la parola nel file e stampa le righe che la contengono man: mostra la pagina man del comando. Frecce su e giù per navigare, q esce, / cerca (n hit successivo, N hit precedente) find path expression: cerca i file nel percorso (ricorsivamente) che corrispondono all'espressione specificata sort file: ordina le righe di un file di testo strings file: trova stringhe stampabili in un file (binario)
Meccanismo fondamentale della shell Unix per reindirizzare l'input e l'output del programma da / a un file. ● Quando l'output viene reindirizzato a un file (simbolo >), qualsiasi output del programma verrà scritto nel file ● Quando l'input viene reindirizzato da un file (simbolo <), il contenuto del file verrà inviato come input al programma
Esempi: ● ls > tmpfile: scrive il contenuto della cartella corrente nel file tmpfile. Controlla con cat tmpfile ● grep shell < tmpfile: reindirizza il contenuto del file al comando grep. Stessa cosa di cercare “shell” dal file “tmpfile” con il comando grep shell tmpfile
Con il simbolo >> possiamo aggiungere l'output a un file esistente.
semplicemente sovrascrive.
date >> tmpfile: aggiunge la data corrente al file tmpfile. date > tmpfile: sovrascrive!
Cosa succede se reindirizziamo l'output di un comando che prende l'input dal terminale? Esempio:
Ciò che abbiamo scritto è stato messo nel file test.txt
In Unix ci sono tre flussi di input / output separati: ● stdin (0): standard input, dove il programma riceve l'input ● stdout (1): standard output, output normale del programma ● stderr (2): standard errore, dove il programma stampa l'errore
1> e 2> reindirizzano rispettivamente stdout e stderr.
Esempio : nascondere gli errori
$ cat > test.txt Hello this is a test of two lines (ctrl-D) $
$ ls test1.txt test2.txt $ cat test* cat: test1.txt: Permission denied This is readable $ cat test* 2> /dev/null This is readable $ cat test* 1> /dev/null cat: test1.txt: Permission denied
Meccanismo fondamentale per la comunicazione di processo in Unix Simile al reindirizzamento ma funziona tra due programmi Canale tra processi : un processo può scrivere sulla pipe e un altro può leggere da essa
Nella shell Unix, le pipe vengono specificate utilizzando il simbolo | cmd1 | cmd2 | ... | cmdn, esegue tutti i comandi e l'output di ogni comando i-esimo viene fornito come input per il comando successivo i+ L'output dell'ultimo comando viene stampato sul terminale
Esempio: ● ls | grep shell: mostra tutti i nomi di file che contengono la parola shell ● ls | shell grep | sort -r: come prima ma i nomi dei file sono ordinati in ordine alfabetico inverso (opzione -r). Si noti che in questo caso abbiamo tre programmi che cooperano insieme; ● ls | shell grep | grep txt: mostra tutti i nomi di file che contengono sia shell che txt
Vediamo che ls stampa per riga, ma grep analizza riga per riga e se grep in pipe prendesse l'output di ls in riga prenderebbe solo quella riga lì, in realtà ls sa se è in pipe o se sta stampando a terminale, se sta stampando a terminale scrive in riga mentre se è in pipe scrive in colonna
A nare le tue abilità di shell: risolvere i livelli (fino a 9) di Bandit wargame. https://overthewire.org/wargames/bandit/ Livello 0
Livello 1
Non posso usare cat -
$ ls myshell.pdf shell.txt test.txt $ ls | grep shell my shell .pdf shell .txt $ ls | grep shell | sort -r shell .txt my shell .pdf $ ls | grep shell | grep txt shell. txt
$ ssh [email protected] -p 2220
$ cat readme boJ9jbbUNNfktd78OOpsqOltutMc3MY $ exit
$ ssh [email protected] -p 2220 $ boJ9jbbUNNfktd78OOpsqOltutMc3MY
$ pwd /home/bandit $ cat /home/bandit1/- CV1DtqXWVFXTvM2F0k09SHz0YwRINYA oppure potrei scrivere $ cat ./- CV1DtqXWVFXTvM2F0k09SHz0YwRINYA
sed è uno strumento Unix semplice ma potente per filtrare e trasformare il testo sed viene invocato come sed SCRIPT INPUTFILE ...
Esempio: sostituisci hello con world nel file input.txt
I seguenti comandi sono equivalenti:
Un programma sed è costituito da uno o più comandi sed I comandi sed seguono questa sintassi :
● X è un comando sed di una sola lettera ● [addr] indirizzo di riga: numero di riga singola, regexp o intervallo di righe ● [options] per alcuni comandi
Eliminazione Delete : il comando d elimina le righe sed '1d' input.txt: elimina la prima riga sed '1,3d' input.txt: cancella le prime tre righe
Print : il comando p stampa le righe sed '1p' nomefile: stampa la prima riga
NOTA : la riga viene stampata due volte
Esempi:
L'opzione della riga di comando -n dice a sed di non stampare le righe a meno che non siano stampate esplicitamente.
sed 's/hello/world/' input.txt sed -i 's/hello/world/' input.txt
sed 's/hello/world/' input.txt > output.txt sed 's/hello/world/' < input.txt > output.txt cat input.txt | sed 's/hello/world/' - > output.txt
[addr]X[options]
$ sed '1d' test.txt line 2 line 3 line 4 $ sed '1,3d' test.txt line 4 $ sed '1p' test.txt line 1 line 1 line 2 line 3 line 4
Sostituzione Il comando s sostituisce le stringhe
Per impostazione predefinita, la sostituzione avviene una volta per ogni riga.
L'opzione g rende globale la sostituzione
L'opzione i rende la ricerca senza distinzione tra maiuscole e minuscole e un numero specifica quale occorrenza deve essere sostituita
Altri esempi: È possibile utilizzare un separatore personalizzato con comando di sostituzione
Per quanto riguarda d e p, è possibile indicare quali righe devono essere esaminate :
si applica solo alle linee 6 e 7 Stampa solo le righe che corrispondono alla stringa :
Elimina le righe che corrispondono alla stringa:
Applicare una mappatura:
sostituisce ciascuna occorrenza di a, b, c con A, B, C, rispettivamente.
Le espressioni regolari sono modelli che rappresentano set di stringhe Utile per eseguire ricerche avanzate in cui è necessario trovare stringhe con una struttura particolare I programmi grep e sed supportano entrambi le espressioni regolari
^ è l'inizio della riga Esempio : ls -al | grep '^ d' Corrisponde a tutti i file di directory nella directory corrente ( d è il flag che indica un file di directory ) Se omettiamo il simbolo ^ , grep troverà tutte le righe contenenti una d , non necessariamente nella prima posizione
$ indica la fine della riga
. rappresenta un singolo carattere Esempio: grep ".ino" corrisponderà a nomi come Nino, Pino, Gino, ...
$ sed ' s /hello/hi/' input.txt
$ cat input.txt hello guys hello everyone $ sed 's/hello/hi/' input.txt hi guys hello everyone
$ sed 's/hello/hi/g' input.txt hi guys hi everyone
$ sed 's/HELLO/hi/i2' input.txt hello guys hi everyone
$ sed 's:hello:hi:' input.txt
$ sed '6,7s/hello/hi/' input.txt
$ sed -n '/hello/p' input.txt
$ sed '/hello/d' input.txt
$ sed 'y/abc/ABC/'
I file per gli esercizi sono disponibili in /home/rookie/Shell/ nell'host del testbed.
Esercizio 1: pretty printing Dato un elenco di numeri di telefono nel formato 123456789 usa sed per riscriverli come (123) 456- Qualsiasi cosa nel formato sbagliato dovrebbe essere lasciata invariata.
Soluzione con regexp standard. Tre gruppi di tre cifre ciascuno. Inoltre, abbiniamo l'inizio e la fine della riga in modo che corrispondano solo le righe contenenti esattamente numeri di 9 cifre.
usando le estensioni GNU possiamo usare \ {3 } per ripetere ogni cifra tre volte
Esercizio 2: break ROT Il testo seguente è stato criptato sostituendo ogni lettera con quella di 13 posizioni più avanti nell'alfabeto (modulo 26) aka ROT
Spezzalo con sed!
È su ciente ruotare l'alfabeto di 13 posizioni ottenendo nopqrstuvwxyzabcdefgh klm e utilizzare per mappare una lettera nell'altra. Si noti che questa è sia crittografia che decrittografia.
Esercizio 3: filename conversion Usa sed per selezionare e convertire tutti i nomi di file con su sso .html fornito come output da ls in lettere maiuscole con su sso .HTM I file non corrispondenti devono essere omessi
Usiamo due comandi sed separati da; Il primo usa y per mettere in maiuscolo il nome del file Il secondo utilizza un riferimento all'indietro \1 per sostituire il su sso HTML con HTM, notare l'opzione p alla fine p è necessario poiché usiamo -n per sopprimere tutto ciò che non corrisponde a .HTML, come richiesto dall'esercizio
usando le estensioni GNU possiamo usare \U per scrivere in maiuscolo direttamente all'interno del comando s:
$ sed 's/^([[:digit:]][[:digit:]][[:digit:]])([[:digit:]][[:digit:]][[:digit:]])([[ :digit:]][[:digit:]][[:digit:]])$/(\1)\2-\3/g' numeri.txt
$ sed 's/^([[:digit:]]{3})([[:digit:]]{3})([[:digit:]]{3})$/(\1)\2-\3/g' numeri.txt
$ sed 'y/nopqrstuvwxyzabcdefghijklm/abcdefghijklmnopqrstuvwxyz /' rot.txt
$ ls | sed -n 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/; s/^(.*).HTML$/\1.HTM/p'
$ ls | sed -n 's/^(.*).html$/\U\1.HTM/ p'
Esercizio 4: data extraction Usa sed per estrarre i nomi utente completi (5 ° campo) da /etc/passwd/
I campi sono separati da : quindi dobbiamo usare [^:] * per abbinare i valori dei campi, cioè, tutto ciò che NON è : Quindi è su ciente mettere un gruppo nel quinto campo ed "estrarlo" con
Si noti che i nomi utente completi a volte hanno virgole, prendiamo la parte prima della prima virgola. A questo scopo che usiamo [^ :,]+ (il + non corrisponde a nomi vuoti)
usando le estensioni GNU possiamo ripetere il primo campo quattro volte con {4}. Il riferimento a ritroso diventa \2 come la ripetizione richiede l'utilizzo di un gruppo.
Standard nel settore della sicurezza IT , molti strumenti sono scritti in Python o supportano plug-in / collegamenti in Python Flessibile : supporta più paradigmi (imperativo, orientato agli oggetti, funzionale) Altamente supportato : enorme libreria Interpretato: prototipazione rapida Estensibile : aggiungi moduli integrati in C Digitazione dinamica : nessun tipo statico ma tipi dinamici forti. Vieta operazioni non ben tipizzate in fase di esecuzione: nessun errore sottile come in PHP o JS Sintassi semplice : facile da leggere, facile da scrivere: nessun punto e virgola, nessuna parentesi graffa... Attenzione: il rientro è importante!
L'interprete , senza argomenti, si avvia in modalità interattiva ● Utile per semplici esperimenti e per abituarsi a tipi di dati e comandi
Useremo python3 (python eseguirà python 2.7 quindi usa python3)
$ sed -n 's/^[^:]:[^:]:[^:]:[^:]:([^:,]+)[^:]:.$/\1/p' /etc/passwd
$ sed -n 's/^([^:]:){4}([^:,]+)[^:]:.*$/\2/p' /etc/passwd
$ python Python 3.6.9 (default, Nov 7 2019, 10:44:02) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information.
print('Hello, World!') Hello, World!
3/4 # float division 0.75 >>> 3//4 # integer division 0 4%3 # modulo 1