Jos tämä haaste tuntui vaikeampaa kuin se on, olet oikeilla jäljillä. 
Minä juoksin koko tämän ongelman, kun kirjoittaessani Packet Decode työkalu. Minun täytyy sanoa, se oli viileä harjoitus minulle, koska en ole koskaan oikeastaan ajatellut luoda tcpdump ja Wireshark suodattimet kaikkiin mahdollisiin IP, TCP, UDP ja ICMP alalla ja / tai arvo. Ylivoimaisesti TCP Kenttä on kaikkein "rikki" mistä paketti purkaa näkökulmasta kuin muut IP-kenttään.
Ensimmäinen Puhutaanpa miten TCP vaihtoehtoja olisi pitänyt panna täytäntöön. Jos katsot IPv4 vaihtoehtoja kentän, se alkaa "Type" tunniste. Jos olet kiinnostunut tietyn IP-vaihtoehto, se on vain asia tarkistaa tämän alan oikeutta bittinen yhdistelmä. Oli TCP vaihtoehtoja on toteutettu tällä tavalla, tähän haasteeseen olisi ollut melko yksinkertaista.
Lähes kaikki TCP vaihtoehtoja on "laji" ja "Pituus" kentässä, jotka molemmat ovat 1 tavu kooltaan. Poikkeuksia ovat "End of Option List" ja "Ei-operaatio", joka vain on eräänlainen toimintaedellytykset ja ovat yhden tavun kokoisia. Tässä lista yhteistä TCP vaihtoehdoista:
Sivu 15 RFC 793 kertoo meille "TCP header (yksikin optiot mukaan lukien) on olennainen määrä 32 bittiä pitkä." Toisin sanoen, TCP-otsikon koko tavuina on jaollinen neljällä (20 tavua, 24 tavua, jne.). Jos tarkastellaan luetteloa TCP vaihtoehtoja, vain "segmentin enimmäiskoko" on jaollinen neljällä. Joten käyttää mitään muita vaihtoehtoja, on tehtävä täyte.
Miten pehmuste olisi sovellettava on vähän epäselvä. Jos katsomme sivu 26 RFC 1323 löydämme tähän:
LIITE: TOTEUTUS EHDOTUKSET Seuraavat asettelujen suositellaan lähetysvalintoja Ei-SYN segmentit, maksimaalisen mahdollista yhdenmukaistamista 32-bittinen ja 64-bittisillä koneilla. +--------+--------+--------+--------+ | NOP | NOP | TSopt | 10 | + --- -----+--------+--------+--------+ | TSval timestamp | +--------+--- -----+--------+--------+ | TSecr timestamp | +--------+--------+--- -----+--------+
Huom NOP täyte näkyy ennen timestamp vaihtoehto, ei lopussa kuten arvata saattaa. Huomaa myös RFC nimenomaan sanoo että tämä on "ei-SYN segmentit" ja että se on "suositeltu", ei tarvita. Näyttää kuitenkin siltä, että useimmat käyttöjärjestelmät noudattaa suositusta ja aina paikka pehmuste ennen Kind ja pituus tavua. Olen tarkistanut Windows, Linux, Mac, eri laitteisto, jne. ja ne kaikki laittaa pehmusteet alussa.
Joten voimme luottaa että tämä on "standardi", eikö? Ei aivan. Sivu 17 RFC 793 kuvaa NOP näin:
Tämä vaihtoehto koodia voidaan käyttää eri vaihtoehtojen välillä, esimerkiksi
Kohdista alusta myöhemmän vaihtoehdon sanan rajan.
Ei ole mitään takeita siitä, että lähettäjä käyttää tätä vaihtoehtoa, joten
vastaanottimia on oltava valmis käsittelemään vaihtoehtoja, vaikka ne eivät
ei alkaa sanan rajan. Toisin sanoen, se ei ole vain siitä, että NOP välttämättä näy alussa, NOP ei välttämättä käytetä lainkaan! On täysin laillista layout TCP Option Field ilman NOP pehmusteet ja vain käyttää loppu Asetusluettelo täyteaineena lopussa saavutettaisiin asianmukainen raja.
Mitä me lopulta varten suodattimen? Jos me luottaa NOP ennen optio päädymme suodatin näyttää tältä:
tcp [13] & 2 = 2 ja tcp [12] ja 240> 80 ja ((tcp [20] = 1 ja tcp [21:2] = 0 × 0303) tai (TCP [24] = 1 ja tcp [25:2 ] = 0 × 0303) tai (TCP [28] = 1 ja tcp [29:2] = 0 × 0303) tai (TCP [32] = 1 ja tcp [33:2] = 0 × 0303) tai (tcp [ 36] = 1 ja tcp [37:2] = 0 × 0303) tai (TCP [40] = 1 ja tcp [41:2] = 0 × 0303) tai (TCP [44] = 1 ja tcp [45:2 ] = 0 × 0303) tai (TCP [48] = 1 ja tcp [49:2] = 0 × 0303) tai (TCP [52] = 1 ja tcp [53:2] = 0 × 0303) tai (tcp [ 56] = 1 ja tcp [57:2] = 0 × 0303))
Murtamaan mitä tämä suodatin on tekemässä:
- Vain Tarkista SYN & SYN / ACK-paketteja: tcp [13] & 2 = 2
- TCP header on suurempi kuin 20 tavua (asetukset ovat): TCP [12] ja 240> 80
- Tarkista ensimmäinen tavu kunkin neljän tavun rajalla on NOP: tcp [20] = 1, tcp [24 = 1, ...
- Tarkista seuraavat kaksi tavua, onko Kind = 3 ja pituus = 3: TCP [21:2] = 0 × 0303, tcp [25:2] = 0 × 0303, ...
Jos kuitenkin haluamme varmistaa, että me kiinni kaikki mahdollisuudet asiassa järjestelmä ei toteuta NOP päädymme:
tcp [13] & 2 = 2 ja tcp [12] ja 240> 80 ja (tcp [20:2] = 0 × 0303 tai tcp [21:2] = 0 × 0303 tai tcp [22:2] = 0 × 0303 tai tcp [23:2] = 0 × 0303 tai tcp [24:2] = 0 × 0303 tai tcp [25:2] = 0 × 0303 tai tcp [26:2] = 0 × 0303 tai tcp [27:2] = 0 × 0303 tai tcp [28:2] = 0 × 0303 tai tcp [29:2] = 0 × 0303 tai tcp [30:2] = 0 × 0303 tai tcp [31:2] = 0 × 0303 tai tcp [32:2] = 0 × 0303 tai tcp [33:2] = 0 × 0303 tai tcp [34:2] = 0 × 0303 tai tcp [35:2] = 0 × 0303 tai tcp [36:2] = 0 × 0303 tai tcp [37:2] = 0 × 0303 tai tcp [38:2] = 0 × 0303 tai tcp [39:2] = 0 × 0303 tai tcp [40:2] = 0 × 0303 tai tcp [ 41:2] = 0 × 0303 tai tcp [42:2] = 0 × 0303 tai tcp [43:2] = 0 × 0303 tai tcp [44:2] = 0 × 0303 tai tcp [45:2] = 0 × 0303 tai tcp [46:2] = 0 × 0303 tai tcp [47:2] = 0 × 0303 tai tcp [48:2] = 0 × 0303 tai tcp [49:2] = 0 × 0303 tai tcp [50 : 2] = 0 × 0303 tai tcp [51:2] = 0 × 0303 tai tcp [52:2] = 0 × 0303 tai tcp [53:2] = 0 × 0303 tai tcp [54:2] = 0 × 0303 tai tcp [55:2] = 0 × 0303 tai tcp [56:2] = 0 × 0303 tai tcp [57:2] = 0 × 0303 tai tcp [58:2] = 0 × 0303)
Ero Kun suodatin on, että olemme tarkistaa Kind = 3 ja pituus = 3 kaikki läpi vaihtoehtoja kentän (kuten Elizabeth ehdotti).
Voi jompikumpi näistä suodattimet aiheuttaa vääriä positiivisia? Ehdottomasti! Kaksi mahdollisuutta:
- Arvo aikaleima voi vastaisivat mallia etsimme.
- Suodatin olettaa 40 tavun vaihtoehto kenttään. Se voisi olla vähemmän näitä arvoja hyötykuorma.
Joten mikä suodatin tulisi käyttää? Ensimmäinen tuottaa vähemmän vääriä positiivisia, mutta miss järjestelmiä, jotka ovat RFC-yhteensopiva, mutta eroaa normi. Toinen on aina kiinni Window mittakaavassa, jos se on asetettu, mutta mahdollisuus vääriä positiivisia on korkeampi.
Aion nimetä Elizabeth kuin voittaja haaste. Muutamat muut olivat yhtä lähellä, mutta hän oli ainoa, jolla on kanttia lähettää hänelle ajatusketju kommenteissa. Aion tehdä toisen palkinnon Jeff kuka keksi tähän ratkaisuun osittain vitsi ympärillä:
tcpdump-nn | grep 'wscale "> wscale-matches.txt
Tämä ei synny todellista packet capture, mutta voit tehdä:
tcpdump-nn-X-s 0 | grep 'wscale "> wscale-matches.txt
Ja sitten ajaa ääntä txt2cap saada se takaisin pcap muotoon. Hän ei noudata haaste erityisesti, mutta sinun pitää antaa Kudos ajatella ulkopuolella ruutuun, koska se korjaa kaikki vääriä positiivisia asioita. 
Elizabeth ja Jeff, otan sinuun yhteyttä niin sähköpostitse. Onnea!