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) |