Portál AbcLinuxu, 2. května 2025 05:42
Mám obývací pokoj oknem "prosvícen" wifi signálem jednoho místního providera. Koukal jsem se jak pokročila technologie louskání WEPu, a překvapeně zjistil že slabé inicializační vektory jsou minulostí, že aircrack-ng
používá jiný, mnohem účinnější útok. Stačí nasbírat dost inicializačních vektorů, spustit na ně aircrack, a máte WEP heslo. Podrobných návodů je na netu dost. Jenže co s takovým heslem? Krást se nemá, a to ani internetová konektivita.
Spokojím se proto s pasivním monitorováním, a dekódováním šifrovaných packetů pomocí airdecap-ng
. Po mírném opatchování umí fungovat i jako filtr, číst pcap file ze standardního vstupu, a posílat dekódované packety na standardní výstup. Na vstupu i výstupu může být tcpdump
, nebo něco jiného. Asi jsem blízko antény která je na straně gatewaye, protože packety které vidím chodí vždy z internetu směrem k uživatelům. Samotný tcpdump
či wireshark
je docela nepraktický, proto jsem spáchal jednoduchý skript, který packety mění na něco použitelného, tj soubory. Co skript dělá:
- rekonstruuje TCP streamy, a zpracovává "HTTP 200 OK" odpovědi.
- prázdné packety a SYN/FIN flagy pro jednoduchost zcela ignoruje, spoléhá se na timeouty.
- connection: keep-alive, a transfer-encoding: chunked jsou podporovány.
- content-encoding: gzip produkuje .gz soubory, takže se snadno prohlížejí.
- soubory rozhazuje do adresářů podle cílové IP adresy, čísluje a pojmenovává podle zdrojové IP. Škoda že nejde zjisit původní URL, program proto použije alespoň předchozí CNAMEs k dané IP.
- příponu nastavuje podle content-type hlavičky.
A jak to vypadá? Normálně, co by kdo taky mohl čekat.. updaty antivirů, google, seznam, centrum, idos, dpmb, atlas.cz, O2, vodafone, motobazar, libimseti, baculky.cz, fotbal.sport.cz, youtube, super.cz...
$ cat decouder.py #! /usr/bin/python from struct import unpack from string import join, split, index import sys, re, os cn = {} ns = {} def ip(a): n = ns.get(a) if not n: return join([str(ord(i)) for i in a], '.') return cn.get(n) or n # prefer CNAMEs def pcap(read): if unpack('IH14xI', read(24)) != (0xA1B2C3D4, 2, 1): print 'not an ethernet pcap file' sys.exit(1) flow = {}; flow_lim = 16 while 1: try: tm, l = unpack('I4xI4x', read(16)) pkt = read(l) dm, sm, t, i, l, p, chk, s, d = unpack( '!6s6sHBxH5xBH4s4s', pkt[:34]) except: break # eof if t != 0x800 or i & 0xf0 != 0x40: continue # not ip pkt = pkt[14 + 4*(i & 0xf) : 14 + l] if p == 0x6: # tcp sp, dp, seq, l, f, chk = unpack( '!HHI4xBB2xH', pkt[:18]) pkt = pkt[4*(l >> 4):] if not pkt: continue if len(flow) > flow_lim: # collect garbage flush(flow, tm - 180) flow_lim = len(flow) * 2 data = flow.setdefault((s, d, sp, dp), [tm, '', seq]) if data[0] < tm - 180: # reusing old tcp(s, d, data[1]) data[1] = '' elif data[2] != seq: continue data[0] = tm; data[1] += pkt data[2] = (seq + len(pkt)) & 0xffffffff if p == 0x11: # udp sp, dp, l, chk = unpack('!HHHH', pkt[:8]) if sp == 53: dns(pkt[8:l]) flush(flow, 1e99) def flush(flow, tm): n = 0 l = flow.items() l.sort(key = lambda x: x[1][0]) # in tm order for k, data in l: if data[0] >= tm: break tcp(k[0], k[1], data[1]) del flow[k]; n += 1 def dns(pkt): f, q, r = unpack('!2x3H4x', pkt[:12]); i = 12 if f & 0xfa0f != 0x8000: return def name(i, pkt = pkt): s = ''; si = None; c = 0 while 1: n = ord(pkt[i]); i += 1 if n >= 0xc0: c += 1 if not si: si = i + 1 elif c > 10: return # prevent dos i = (n - 0xc0) << 8 | ord(pkt[i]) continue if n == 0: return s[:-1], si or i s += pkt[i:i + n] +'.'; i += n for p in range(q): # skip queries i = name(i)[1] + 4 for p in range(r): # response s, i = name(i) t, c, n = unpack('!HH4xH', pkt[i:i + 10]) if t == 1 and c == 1 and n == 4: # A ns[pkt[i + 10:i + 14]] = s if t == 5 and c == 1: # CNAME cn[name(i + 10)[0]] = s i += 10 + n dirs = {} def rx(regex, s, n = 1): m = re.search(regex, s) return m and m.group(n) def tcp(s, d, doc): while doc[:5] == 'HTTP/': try: l, doc = split(doc, '\r\n', 1) except: return ok = split(l)[1] ct = ce = sz = None while 1: # mime cruft try: l, doc = split(doc, '\r\n', 1) except: return if not l: break ct = ct or rx('^Content-Type: (\S+/)?([^; ]+)', l, 2) ce = ce or rx('^Content-Encoding: (\S+)', l) sz = sz or rx('^Transfer-Encoding: (\S+)', l) \ or rx('^Content-Length: (\d+)', l) if doc[:5] == 'HTTP/': continue # IIS/6.0 @#%$$&!! if ct in ('x-javascript', 'javascript'): ct = 'js' elif not ct: ct = 'unknown' if ce == 'gzip': ct += '.gz' if sz == 'chunked': # unchunk out = '' while 1: try: l, doc = split(doc, '\r\n', 1); l = int(l, 16) except: return out += doc[:l] doc = doc[l + 2:] if l == 0: break else: try: sz = int(sz) except: sz = len(doc) if len(doc) < sz: return out = doc[:sz] doc = doc[sz:] if ok != '200' or len(out) < 1024: continue dir = 'HTTP-'+ ip(d) n = dirs[dir] = dirs.get(dir, 0) + 1 if n == 1: os.mkdir(dir) n = '%s/%04d-%s.%s' % (dir, n, ip(s), ct) open(n, 'w').write(out) print n, len(out) pcap(sys.stdin.read)
Tiskni
Sdílej:
Nikdo nesmí porušit listovní tajemství ani tajemství jiných písemností a záznamů, ať již uchovávaných v soukromí, nebo zasílaných poštou a nebo jiným způsobem, s výjimkou případů a způsobem, které stanoví zákon. Stejně se zaručuje tajemství zpráv podávaných telefonem, telegrafem nebo jiným podobným zařízením.
elektronická pošta je poštou a i písemnosti v elektronické podobě jsou písemnostmi (ve smyslu § 40 občanského zákoníku) a i pro ně platí obdobná pravidla jako pro ostatní písemnosti
S tou čínštinou je to špatný příklad. Mnohem přilehavější je ten s tou dopisní obálkou.Vzhledem k jisté podobnosti mezi šířením zvukových a rádiových vln a (ne)srozumitelnosti přenášené informace mi připadá lepší ten můj. Chápu, že podle zákona je to jinak. Tímto postojem rozhodně neříkám, že fandím odposlechům sousedů... jen se mi víc líbí, když to v Internetu/sítích funguje více jako svět za dávných dob (tj. žádná státní regulace/kontrola)
Ovšem oni na sebe asi nekřičí čínsky za účelem znemožnění odposlechu, ale protože jsou to dva Číňani.Špatný příklad. Já osobně ve škole používám španělštinu pro utajení obsahu konverzace s kamarádem
Rozdíl je mezi vnikat někam a pasivně poslouchat. Rádiové vlny jsou plně pasivní odposlech.Pokud nelámete šifrovací klíče. A i kdyby komunikace byla nešifrovaná, vy při tom odposlechu moc pasivní nejste. Když narazíte na obsazený kanál, měl byste z něj uhnout, ne poslouchat. Když uslyšíte ve škole, že se někdo baví tajně španělsky, zvolíte s kamarádem taky jiný jazyk
Navíc - proč oni smí a já ne.Oni toho smí, co vy ne…
airodump-ng
ukazuje RXQ 80-100%, bez jakékoliv antény, jen na běžnou PCMCIA kartu...
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.