| garoeda | gegroet iedereen , dit is de laatste presentatie van de openingsdag van Umeet 2002 |
|---|---|
| garoeda | als laatste is Dan Kaminsky, hij werkte 2 jaar als securityeengineer bij cisco |
| garoeda | vandaag presenteert hij enkele netwerk tools geheten paketto keiretsu |
| garoeda | welkom Dan, |
| garoeda | (exit sarnold) |
| garoeda | DanKamin |
| garoeda | hallo iedereen |
| garoeda | zoals Seth zei, onlangs heb ik een serie tools vrijgegeven die ik Paketto Keiretsu heet |
| garoeda | ze kunnen op volgende url gevonden worden |
| garoeda | http://www.doxpara.com/paketto/paketto-1.0.tar.gz |
| garoeda | versie 1.01 zal snel gereleased worden daar ik een vervelende compilatie fout heb :-) |
| garoeda | ik heb het volgende onderzocht |
| garoeda | als ik directe controle neem over het netwerk, mijn eigen packets maak, mijn eigen stack maak en de oorspronkelijke betekenis van de datavelden niet respecteer |
| garoeda | wat kan ik dan doen? |
| garoeda | machines crashen is niet echt het belangrijskte voor me |
| garoeda | Maar er zijn heel wat interessante functionaliteiten die netwerken nog niet kunnen voorzien |
| garoeda | wel, niet alles wat ik wilde doen is gelukt (bij voorbeeld, er is geen goede manier om snel UDP poorten te scannen) maar ik vond heel wat onontdekt potentieel in de bestaande tcp/ip netwerken |
| garoeda | hierover ga ik vandaag wat vertellen |
| garoeda | de handigste tool is van Keiretsu is scanrand. |
| garoeda | scanrand is een stateless TCP scanner met de bijkomstiheid dat ie routes en eindpunten kan ontdekken |
| garoeda | het kan heel snel itereren over hosts,ports en hops om een gedetaileerd beeld van de beschikbare services en routes van een netwerk te geven |
| garoeda | door de stateless opbouw, krijgt 'heel snel' een nieuwe betekenis |
| garoeda | tijdens het testen,was scanrand geconfigureerd om een klasse B netwerk van een grote multinational te onderzoeken |
| garoeda | ze waren hiervan volledig op de hoogte natuurlijk :-) |
| garoeda | 65k hosts ontvingen een 'probe' op hun http poort |
| garoeda | 83000 hosten antwoorden positief, nog meer anderen antwoorden negatief |
| garoeda | de scan duurde ongeveer 4 seconden |
| garoeda | de architectuur van scanrand is eigenlijk vrij simpel |
| garoeda | tijdens de instantiatie splitst de applicatie in 2: een die een enorme hoeveelheid connecties aanmaakt , of SYNs, en het andere deel ontvangt deze SYNs en doet de parsing van van de hosts die up en down zijn (of dat zo doorgeven) |
| garoeda | er is geen inter-proces communicatie tussen deze 2 processen |
| garoeda | en, alles wat geweten moet worden van een scan wordt uitgevist door de reply op het eindpunt |
| garoeda | dit betekent dat één machine 65k eindpunten kan scannen, zelfs veel meer, zonder een steeds groter worden hoeveelheid geheugen bij te houden voor alle antwoorden |
| garoeda | dit is de reden waarom vroegeren scantechnieken stopten bij 100 scans per seconde |
| garoeda | het probleem met een stateless aanpak is dat wanneer we niet bijhouden met wie we praten, iemand zou kunnen zien: |
| garoeda | hé, ze zijn ons aan het scannen, doelloos zelfs, laat hem valse antwoorden sturen |
| garoeda | (Dan bedankt de vertalers :-)) |
| garoeda | nu, dit is misschien vervelend maar afhankelijk van het gebruik van scanrand (de backend bijvoorbeeld, eg een database) kan dit een serieus security gevaar worden |
| garoeda | ik kom vanuit de security wereld (ik werkte namelijk met OpenSSH) dus dit was onaanvaardbaar voor mij |
| garoeda | de oplossing is door (zoals ik ze noem) inverse SYN Cookies te gebruiken |
| garoeda | in TCP, wanneer je een SYN stuurt om een connectie te vragen ontvang je a SYN|ACK(the port is up) or a RST|ACK(the port is down) |
| garoeda | Beide SYN|ACKs and RST|ACKs |
| garoeda | hebben meer mogelijkheden dan "Up" of "Down" ze bevatten onder andere addresserings informatie die we nodig hebben om stateless te bepalen wie we een request stuurden en naar welke poort we kijken |
| garoeda | maar, ook ze bevatten een 32 bit nummer dat we kunnen kiezen van de SEQ# |
| garoeda | euh |
| garoeda | van de SYN |
| garoeda | dit nummer is gekend als het Sequence Number of SEQ# |
| garoeda | en dat is 'gereflecteerd' in het Ackowledgement Number or ACK# van eender welke geldige SYN|ACK or RST|ACK |
| garoeda | 32 bis is genoeg om cryptografisch sterke variable te bevatten die een antwoord aan een geldige scan linkt |
| garoeda | in technische termen, we gebruiken SHA-1 in the HMAC, or Hashed Message Authentication Code, om een 160 bit waarde te construeren die een combinatie is van : source ip, source port, destionation ip, destination port |
| garoeda | dan worden de eerste 32 bits eraf gehaald en worden ze in de SEQ# gegooid |
| garoeda | wanneer de SYN|ACK or RST|ACK terugkomt, keren we het proces om (verminder ACK# met 1, want reflectie stijgt) om te kijken of de host echt wel een scan van ons ontvangen heeft |
| garoeda | HMAC houdt een geheime waarde in die enkel voor de scanner geweten is |
| garoeda | dit laat de host met keuze: reply met geldig antwoord of niet antwoorden |
| garoeda | (eender welk geldig ding kan genegeerd worden) |
| garoeda | http://www.doxpara.com/read.php/docs/scanrand_logs.html |
| garoeda | hier vind je logs van Scanrand in gebruik |
| garoeda | zoals je kan zien, 254*20 poorten zijn gescanned op een 100 mbit Lan en de resultaten zijn gekend in 0.182 seconden |
| garoeda | dit is een simpele techniek en heel succesvol |
| garoeda | veronderstel dat dat remote hosts packets zenden met een waarde modulo 32 -- 64, 128, 255 |
| garoeda | dan een der welk verschil je krijgt van die waarde, dat is het aantal hops dat het packet nodig had om bij jou te geraken |
| garoeda | dus wanneer ik slashdot scan is het zo'n 12 hops verder |
| garoeda | laat ons dat nagaan, statelessly :-) |
| garoeda | Scanrand's stateless traceroute neemt voordeel van een hiervoor vergeten feit |
| garoeda | ICMP fouten kunnen meerdere fouten bevatten |
| garoeda | ze bevatten een volledige copy van de conflicteredende IP header en de eerste 8 bytes van de laag 4 data van het packet |
| garoeda | TCP/UDP/ICMP |
| garoeda | traceroute werkt als volgt: |
| garoeda | er bestaat een ip in een waarde geheten TTL |
| garoeda | dit staat voor Time To Live |
| garoeda | TTL is *verondersteld* naar seconden te verwijzen maar dit is geevolueerd naar het het aantal hops dat een packet mag doorreizen voor het gedumpt wordt |
| garoeda | met een TTL van 5 gaat een packet na 5 stappen verdwijnen |
| garoeda | door een ICMP Time Exceeded Message tte sturen (met een IP en TCP header , hint) |
| garoeda | dus traceroute zend enkel een packet met TTL van 1,2,3,4 of 5 enzovoort tot het op zijn doel raakt |
| garoeda | a stateless traceroute stuurt zijn iteraties in een keer, in het voorbeeld van 1 tot 13 die verzonden worden |
| garoeda | wanneer het antwoord terug komt, kijken we naar IP en TCP headers om uit te vinden wie we probeerden te scannen |
| garoeda | in dit geval keken we naar 66.35.250.150 |
| garoeda | op het einde van de scan ontdekken we dat het 13 hops zijn ipv 12 |
| garoeda | maar zoals we later zullen zien, de schatting blijft nuttig |
| garoeda | latere voorbeelden demonstreren geavanceerdere toepassingen van scanrand |
| garoeda | DNS resolution is redelijk synchroon dus het vertraagt de werken, ideaal zou je een tool gebruiken dat http logs neemt en automatisch alle ip's vervangt door hostnames |
| garoeda | en zo zijn er heel veel |
| garoeda | (noot vertaler: vertraagt de werking) |
| garoeda | Dan verdwijnt eventjes wegens kleine technische problemen |
| garoeda | een van de meer interessantere dingen van een gecombineerde poort scanner en tracerouter is dat we beiden op hetzelfde moment kunnen doen |
| garoeda | dit wordt aangetoond door de volgende entry in de scanrand logs (opnieuw zie http://www.doxpara.com/read.php/docs/scanrand_logs.html ) |
| garoeda | de terugkeren zijn 'out-of-order' maar zoals je kan zien, de eerste hops zijn gelijke maar hoe verder we gaan, hoe meer onze scan divergeert |
| garoeda | dit is natuurlijk wat we verwachten |
| garoeda | toekomstige versies van scanrand gaan expliciet 'remote mesh' ontdekking ondersteunen |
| garoeda | dit gaat inhouden: source routting tot een bekend punt, n hops verder, zet de TTL naar n+1, probeer dan verschillende adressen te bereiken die verwacht zijn zo ver mogelijk van elkaar verwijderd te zijn in remote route tabellen |
| garoeda | de snelheid van de stateless aanpak zou de meeste netwerken traceerbaar kunnen maken in verbazingwekkend weinig tijd |
| garoeda | maar dat zullen we nog zien :-) |
| garoeda | een belangrijk ding is dat het zeer doenbaar is het scan en ontvang proces te verspeiden over verschillende machines |
| garoeda | bijvoorbeeld, een systeem kunnen we als scan verzamelaaar beschouwen terwijl alle andere hun resultaten ernaar doorsturen |
| garoeda | dit is de meest 'alternate' methode van source routing :-) |
| garoeda | en het is gedemonstreerdt in de allerlaatste log entry |
| garoeda | het volgende dat ik ga bespreken is een paratrace, eigenlijk een afsplitsing van scanrand |
| garoeda | een afsplitsing omdat het iets geheel anders doet dan scanrand |
| garoeda | http://www.doxpara.com/read.php/docs/paratrace_logs.html |
| garoeda | terwijl scanrand nieuwe connecties opent om netwerken te zoeken gebruikt paratrace bestaande connecties |
| garoeda | dit is de enige effectieve manier om policy routes en door statefull firewalls te raken |
| garoeda | het idee is simpel: traceroute is volledig op Laag 3 gebaseerd, itereer over de TTL , bekijk de ICMP Time Exceeded reply. |
| garoeda | het maakt niet uit wat we op Laag 4 hebben |
| garoeda | dus als Laag 4 geldig TCP verkeer is geeft Traceroute er niet om |
| garoeda | nu, TCP heeft de mogelijk om redundante packets te ondersteunen, het maakt deel uit van (en is voorzien voor) het onbetrouwbare netwerk dat IP aanbiedt |
| garoeda | eigenlijk, deze eigenschap is gebruikt als een soort 'in-session' TCP ping, "tcp keepalive" |
| garoeda | in essentie gebruikt paratrace keepalives als transport voor een IP traceroute |
| garoeda | de resulaten zijn zichtbaar in de logs |
| garoeda | passieve hoptelling schatting wordt gebruikt om te ontdekken hoeveel je parasitic traceroute moet iterernen |
| garoeda | laat ons over Minewt spreken |
| garoeda | zoals ik zei, het oorpsronkelijke design doel van Paketto was om te onderzoeken wat we kunnen doen door de draad fysisch te benaderen |
| garoeda | Minewt is een NAT gateway die volledig werkt in software, de draad direct manipuleert om zichzelf te instantieren |
| garoeda | het gebruikt geen kernel resources, behalve dan de pure netwerk verbinding aangeboden door ibnet/libpcap's manipulation of sockets and bpf |
| garoeda | sarnold: BPF ? |
| garoeda | inderdaad, zelfs het MAC adres wordt niet gedeeld met de kernel, het lijkt echt alsof een nieuw device op de draad is gekomen |
| garoeda | sarnold: gebruikt linux BPF? ik dacht dathet netlink of gelijkaardig gebruikt ipv bpf |
| garoeda | BPF is the Berkeley Packet Filter: een standaard interface om netwerk verkeer op te vragen dat een bepaalde vorm matched/overeen komt |
| garoeda | zoals sarnold al toonde, bpf zelf is niet direct geimplementeerd door alle kernels |
| garoeda | libcpcap implementeerdt bpf in userspace wanneer nodig, alhoewel ik geloof dat ze hun eigen kernel interface hebben voor linux |
| garoeda | het belangrijkste is dat Paketto in het algemeen vrij goed afgeschermd is van de verschillende kernel netwerk interfaces, met een frame kan ik al werken |
| garoeda | laat ons kijken naar minewt logs at http://www.doxpara.com/read.php/docs/minewt_logs.html |
| garoeda | dit wordt gedaan |
| garoeda | ./minewt -i 10.0.1.180 -I 10.0.1.190 -r 10.0.1.254 -v |
| garoeda | -i 10.0.1.180 == het ip waar machines op mijn netwerk mee moeten communiceren is 10.0.1.180 |
| garoeda | -I 10.0.1.190 == het ip dat de buitenwerld verwacht 10.0.1.190 |
| garoeda | -r 10.0.1.254 == het ip dat packets naar (the default gateway) zal sturen is 10.0.1.254 |
| garoeda | -v voor verbose |
| garoeda | merk op dat minewt zal heel snel verkeer opvangen het en het correct NATten |
| garoeda | Minewt is een stateful programma, mar het is flexibel, eender welk uitgaand packet (SYN, TCP, Keepalive etc) bevat de state om een nieuwe sessie te starten |
| garoeda | tussen dat en het feit dat minewt zijn eigen MAC addressen beheert |
| garoeda | is het mogelijk minewt te starten op een machine, het af te sluiten en het op een andere machine te starten zonder dat hosts hun verbinding verliezen |
| garoeda | minewt is vrij snel, sub-ms dealy |
| garoeda | FreeBSD is waarschijnlijk het snelste platform, maar ik heb problemen gehad op andere vlakken |
| garoeda | In termen van queso/xprobe identification, minewt biedt enkel volgende service: ICMP Echo -> ICMP Echo Reply |
| garoeda | het gebuikt de incomende ping om een uitgaande ping te construeren, dus ik verwacht een soort ping die *alleen* minewt kan genereren |
| garoeda | ik heb dit nog niet getest |
| garoeda | wanner minewt een ping ontvangt dumpt het programma de huidige state tabel, dit zie je naar het einde van de logs |
| garoeda | Minewt heeft 2 features die redelijk interessant zijn |
| garoeda | ten eerste, Minewt implementeert wat ik noem MAC Address Translation |
| garoeda | dit feature krijg je gratis als deel van de infrastructuur |
| garoeda | sinds ik geen kernel interface gebruik kan ik ook geen gebruik maken van aardigheidjes zoals de ARP cache |
| garoeda | nu, hier is iets interessant |
| garoeda | ARP bestaat om L3(IP) naar L2(MAC) te mappen |
| garoeda | nu, hier is iets interessant: |
| garoeda | de manier waarop NAT werkt is om de lokale poort naar een uitgaande connectie te mappen naar het interne IP addres die ze creerde |
| garoeda | effectief |
| garoeda | NAT mapt L4(Port) naar L3(IP) |
| garoeda | en ARP mapt L3(IP) naar L2(MAC) |
| garoeda | dus transitief: we kunen MAT mappen L4(Port) naar de combinatie van L3(IP) en L2(MAC) |
| garoeda | en sinds we geen kernel ARP cache gebruiken moeten we wel :-) |
| garoeda | dit is een interessant bij-effect |
| garoeda | we hoeven ons nu geen zorgen te maken om het IP adres dat de backend client neemt |
| garoeda | als ze een 10.x ip willen ,geen probleem |
| garoeda | als ze het exterieure IP willen , het *echte* ip, eigenlijk ook geen probleem |
| garoeda | als er 10 zijn die het exteren IP willen hebben |
| garoeda | nog altijd geen probleem |
| garoeda | omdat de MACS's allemaal verschillend zijn |
| garoeda | dit betekent: in een beperkt aantal gevallen kan men de packet integriteit bewaren |
| garoeda | een interessante vraag dook op |
| garoeda | "dus, met minewt kan je jezelfd verstoppen achter een virtuele router zonder teruggevonden te worden? want als je afsluit is de router weg..of blijven er toch sporen achter?" |
| garoeda | Minewt is even effectief als je MAC en IP adres te veranderen, als dat de traceerbaarheid bemoeilijkt, zal minewt dat ook doen |
| garoeda | je zal vrijwel altijd traceerbaar zijn tot in je subnet daar minewt naar iets moet routen |
| garoeda | een andere interessante eigenschap van minewt is Guerilla Multicast |
| garoeda | dit zal meer onderzocht worden in de volgende versie van Paketto |
| garoeda | maar het basisidee is om rond een van de grote moeilijkheden van moderne netwerk te geraken: één packet, één bestemming |
| garoeda | als ik een packet wil versturen naar verschillende bestemmingen, met het huidige internet |
| garoeda | in het geval het je nog niet opgevallen is: het internet ondersteunt multicast niet te goed |
| garoeda | voor zover het al multicast ondersteunt :-) |
| garoeda | het Internet, het IP routeerbare universum, is geblokkeerd op unicast |
| garoeda | maar we maken niet direct een verbinding op IP niveau, we neigen ernaar om ethernet te gebruiken als interface met IP en ARP vertaalt Ethernet MACS naar Internet IP's |
| garoeda | Ethernet ondersteunt broadcast en multicast perfect, MAC of FF:FF:FF:FF:FF:FF of 01:00:5E:??:??:??, respectively |
| garoeda | laat ons ARP gebruiken om een *unicast* IP , perfect voor het internet, naar een *broadcast/multicast* IP adres te linken, perfect voor iedereen op ons LAN |
| garoeda | daarom dat, wanneeer de router verderop packets terugstuurd, ze zullen ARP'enen BC/MC zien en dat naar de switch sturen, die de frame naar iedereen zal splitten |
| garoeda | er is weinig wat we hier mee kunnen doen, behalve alle uitgaande verkeer van minewt sniffen,er is VEEL interessanter werk met deze techniek komende in toekomstige versies |
| garoeda | de Helix Community Source gaat een workout krijgen |
| garoeda | een IP op een LAN zal bestempeld worden als het unicast IP waar al de gedeelde verbindingen over gerouteeerd zullen worden |
| garoeda | en elke oplettende client zal zijn deel van het antwoord werk op zich nemen, UDP als nodig, TCP als het moet |
| garoeda | maar dat is voor versie 1.1/2.0 :-D |
| garoeda | er zijn nog veel meer mogelijkheden met laag niveau netwerking |
| garoeda | heel wat waar ik hoop dat ik er niet over zal moeten schrijven |
| garoeda | C heeft goede ondersteuning om rechtstreeks op laag niveau te werken, andere talen hebben dat niet |
| garoeda | ik zou willen programmeurs van die talen 'in the fold' willen brengen |
| garoeda | dat is het doel van Linkcat or IC |
| garoeda | Ic is eigenlijk een netcat op Laag 2, geef me data, ik gooi het op de draad |
| garoeda | netcat maakt er een TCP sessie van |
| garoeda | linkcat gooit het echt op het ethernet |
| garoeda | http://www.doxpara.com/read.php/docs/lc_logs.html |
| garoeda | deze logs tonen hoe ik een ICMP echo kan copy pasten met linkcat |
| garoeda | text-mode etherreal bewijst dat we echt een geldig packet versturen |
| garoeda | linkcat ondersteunt zowel een bijna raw netwerk modus gebaseerd op libpcap (je kan tcpdump logs aan linkcat geven voor herversturing alhoewel tcprealy hierveer een beter tool is |
| garoeda | let op de ASCII modus in de logs |
| garoeda | er is ondersteuning voor HMAC's in Ethernet TRailers |
| garoeda | Ip heeft een expliciet lengte veld dat vertelt over hoeveel data het zich bekommert |
| garoeda | maar Ethernet laat je toe om meer toe te voegen, met als limiet the Maximum Transmission Unit(MTU) size |
| garoeda | dus je kan gewoon extra data toevoegen, zelfs een optionele geparste cryptovariabele die de data authenticeert |
| garoeda | dus als je ooit je ARP's wou ondertekenen |
| garoeda | dit is de manier om het te doen :-) |
| garoeda | in volgende versies zal er meer rond Ethernet Trailers gedaan zijn, dit is juist een een proof of concept |
| garoeda | Linkcat ondertekent willekeurige frames met een 'shared secret' |
| garoeda | en uiteindelijk, last but not least |
| garoeda | fototjes |
| garoeda | http://www.doxpara.com/pics/index.php?album=phentropy/ |
| garoeda | gebaseerd op de exellente research van Michel Zalewski (http://razor.bindview.com/publish/papers/tcpseq.html), phentropy geeft een 3 dimensionale visualisatie van de willekeur (het random zijn) van willekeureige datasets |
| garoeda | gebuik is simpel |
| garoeda | phentropy data |
| garoeda | wanneer de data in ascii formaat staat |
| garoeda | phentropy -a data |
| garoeda | de output is heel interessant |
| garoeda | bash_rand1 is waarschijnlijk het meest handige, dit is een plot van de Bash $RAND variabele |
| garoeda | het toont opvallende stijgingen en dalingen, niet direct wat je zou verwachten van random data |
| garoeda | bash_rand2 toont de dataset geroteerd |
| garoeda | de tool om deze renderings te doen is enorm snel, vrijgegeven op SIGGRAPH 2002 en nu beschikbaar op openqvis.sourceforge.net, OpenQVIS rendert *willekeurige* 3dimensionale datasets in realtime, gebruik makende van de pixel shaders in moderne 3D kaarten |
| garoeda | het is goed om meer met 3D te doen dan dingen opblazen :-) |
| garoeda | opzettelijke random input is *heel* interessant |
| garoeda | de BSD kernel lijkt op een Borg Cube |
| garoeda | de default achtergrond van windows XP lijkt op 3 driehoeken |
| garoeda | een vergelijking tussen het linker en rechterkanaal van muziek die ik schreek bleek heel interessant te zijn: het werd een buis, met schijnbaar hol 'hollow' binnenste |
| garoeda | zie ook stereo_r_vs_l_8 |
| garoeda | linkcat kan met '-o m-n ' data generen die phentropy kan visualiseren |
| garoeda | het zal heel interessant zijn om te zien wat phentropy/openqvis zal doen met verschillende datasets |
| garoeda | wat representeert phentropy: neem 4 waarden an de data: a, b , c;d . tussen die 4 zijn er 4 deltas, b-a, c-b, d-c, Maak hiervan een XYZ en teken ze |
| garoeda | dat is wat elk punt is |
| garoeda | nu, de verzameling van alle punten kan gezien worden als een cluster, dit zijn de secties waar de delta's, onafhankelijk van hoe ze gedistribueerd zijn over de totale range van values , gelijkaardig beginnen te zijn |
| garoeda | volledige random data zou geen clusters mogen hebben |
| garoeda | niet random data (zoals, slashdot comments) focussen op bepaalde zones |
| garoeda | dus dat is het |
| garoeda | in 2003 gaan er verschillende nieuwe dingen in Paketto komen |
| garoeda | maar daar zijn we nu nog volop mee bezig :-) |
| garoeda | (einde presentatie) |