Pažeidžiamumas, leidžiantis užgrobti TCP ryšius, užmegztus per VPN tunelius

Paskelbta atakos technika (CVE-2019-14899), leidžianti suklastoti, modifikuoti arba pakeisti paketus TCP ryšiuose, perduodamuose VPN tuneliais. Problema paliečia Linux, FreeBSD, OpenBSD, Android, macOS, iOS ir kitas į Unix panašias sistemas. „Linux“ palaiko IPv4 rp_filter (atvirkštinio kelio filtravimo) mechanizmą, o jį įjungus „griežtu“ režimu ši problema neutralizuojama.

Metodas leidžia pakeisti paketus TCP jungčių, einančių šifruotame tunelyje, lygiu, tačiau neleidžia įsiterpti į ryšius, naudojančius papildomus šifravimo sluoksnius (pvz., TLS, HTTPS, SSH). VPN naudojami šifravimo algoritmai neturi reikšmės, nes suklastoti paketai gaunami iš išorinės sąsajos, o branduolys juos apdoroja kaip paketus iš VPN sąsajos. Labiausiai tikėtinas atakos tikslas – trukdyti nešifruotiems HTTP ryšiams, tačiau neatmetama ir naudojant ataką manipuliuoti DNS atsakymais.

Sėkmingas paketų klastojimas buvo įrodytas naudojant „OpenVPN“, „WireGuard“ ir „IKEv2/IPSec“ sukurtas „Tor“ problemas, nes jis naudoja SOCKS srautui perduoti ir yra susietas su atgaline sąsaja. Naudojant IPv4, ataka galima, jei rp_filter nustatytas į „Loose“ režimą (sysctl net.ipv4.conf.all.rp_filter = 2). Iš pradžių dauguma sistemų naudojo „griežtą“ režimą, bet nuo 240, išleistas pernai gruodį, numatytasis veikimo režimas buvo pakeistas į „Loose“ ir šis pakeitimas atsispindėjo daugelio Linux platinimų numatytuosiuose nustatymuose.

rp_filtro mechanizmas taikoma papildomai patikrinti paketų kelius, kad būtų išvengta šaltinio adreso klastojimo. Nustačius 0, šaltinio adreso tikrinimas neatliekamas ir bet koks paketas gali būti persiunčiamas tarp tinklo sąsajų be apribojimų. 1 režimas „Griežtas“ apima kiekvieno iš išorės gaunamo paketo patikrinimą, ar jis atitinka maršruto parinkimo lentelę, ir jei tinklo sąsaja, per kurią buvo gautas paketas, nėra susieta su optimaliu atsakymo pristatymo maršrutu, paketas atmetamas. 2 režimas „Laisvas“ atpalaiduoja patikrinimą, kad apkrovos balansavimo priemonės arba asimetrinis maršrutas veiktų
Atsakymo maršrutas gali eiti per kitą tinklo sąsają nei ta, per kurią buvo gautas paketas.

Laisvu režimu gaunamas paketas tikrinamas pagal maršruto parinkimo lentelę, bet laikomas galiojančiu, jei šaltinio adresas pasiekiamas per bet kurią prieinamą tinklo sąsają. Siūloma ataka pagrįsta tuo, kad užpuolikas gali išsiųsti paketą su suklastotu šaltinio adresu, atitinkančiu VPN sąsają, ir nepaisant to, kad šis paketas pateks į sistemą per išorinę tinklo sąsają, o ne per VPN, rp_filter "Loose" režimas toks paketas nebus išmestas.

Norėdamas įvykdyti ataką, užpuolikas turi valdyti šliuzą, per kurį vartotojas pasiekia tinklą (pavyzdžiui, per MITM organizaciją, kai auka prisijungia prie užpuoliko valdomo belaidžio prieigos taško arba per maršrutizatoriaus įsilaužimas). Valdydamas šliuzą, per kurį vartotojas yra prisijungęs prie tinklo, užpuolikas gali siųsti netikrus paketus, kurie bus suvokiami VPN tinklo sąsajos kontekste, tačiau atsakymai bus nukreipti per tunelį.

Generuojant fiktyvių paketų srautą, kuriame pakeičiamas VPN sąsajos IP adresas, bandoma paveikti kliento užmegztą ryšį, tačiau šių paketų įtaka gali būti stebima tik pasyviai analizuojant susietą šifruoto srauto srautą. su tunelio veikimu. Norėdami įvykdyti ataką, turite sužinoti VPN serverio priskirto tunelio tinklo sąsajos IP adresą, taip pat nustatyti, ar šiuo metu tunelyje yra aktyvus ryšys su konkrečiu pagrindiniu kompiuteriu.

Norint nustatyti VPN virtualaus tinklo sąsajos IP, į nukentėjusiąją sistemą siunčiami SYN-ACK paketai, nuosekliai ieškant visame virtualių adresų diapazone (pirmiausia pagal numatytuosius nustatymus ieškoma VPN naudojamų adresų, pvz. OpenVPN naudoja 10.8.0.0/24 potinklį). Apie adreso egzistavimą galima spręsti pagal gautą atsakymą su RST vėliava.

Panašiu būdu nustatomas prisijungimo prie tam tikros svetainės buvimas ir prievado numeris kliento pusėje – surūšiuojant prievadų numerius vartotojui siunčiamas SYN paketas, kaip šaltinio adresas, kuriame IP svetainės adresas yra pakeistas, o paskirties adresas yra virtualus IP VPN. Serverio prievadą galima nuspėti (80 HTTP atveju), o kliento prievado numerį galima apskaičiuoti naudojant brutalią jėgą, analizuojant skirtingų skaičių ACK atsakymų intensyvumo pokyčius kartu su paketo su RST nebuvimu. vėliava.

Šiame etape užpuolikas žino visus keturis ryšio elementus (šaltinio IP adresus / prievadą ir paskirties IP adresą / prievadą), tačiau norėdamas sugeneruoti fiktyvų paketą, kurį aukų sistema priims, užpuolikas turi nustatyti TCP seką ir patvirtinimo numeriai (seq ir ack) – ryšiai. Norėdami nustatyti šiuos parametrus, užpuolikas nuolat siunčia netikrus RST paketus, bandydamas skirtingus eilės numerius, kol aptinka ACK atsako paketą, kurio gavimas rodo, kad skaičius patenka į TCP langą.

Tada užpuolikas išsiaiškina apibrėžimo teisingumą siųsdamas paketus su tuo pačiu numeriu ir stebėdamas ACK atsakymų gavimą, po kurio jis pasirenka tikslų dabartinės sekos numerį. Užduotį apsunkina tai, kad atsakymai siunčiami šifruotame tunelyje, o jų buvimas perimtame sraute gali būti analizuojamas tik naudojant netiesioginius metodus. Ar klientas siunčia ACK paketą, skirtą VPN serveriui, nustatoma pagal užšifruotų atsakymų dydį ir delsą, kurie koreliuoja su suklastotų paketų siuntimu. Pavyzdžiui, „OpenVPN“ užšifruotas 79 paketo dydis leidžia tiksliai nuspręsti, ar jame yra ACK.

Kol operacinės sistemos branduolyje nebus pridėta apsauga nuo atakų kaip laikinas problemos blokavimo būdas rekomenduojama naudodami paketų filtrą „išankstinio maršruto“ grandinėje, užblokuokite paketų, kuriuose kaip paskirties adresas nurodytas virtualus tunelio IP adresas, perdavimą.

iptables -t raw -I PREROUTING ! -i wg0 -d 10.182.12.8 -m adrtype ! --src-type LOCAL -j DROP

arba nftables

nft pridėti lentelę ip raw
nft add chain ip raw prerouting '{ tipo filtras kabliukas prerouting prioritetas 0; }'
nft pridėti taisyklė ip raw prerouting 'iifname != "wg0" ip daddr 10.182.12.8 fib saddr type != local drop'

Norėdami apsisaugoti naudodami tunelius su IPv4 adresais, tiesiog nustatykite rp_filter režimą „Griežtas“ („sysctl net.ipv4.conf.all.rp_filter = 1“). VPN pusėje eilės numerio aptikimo metodas gali būti blokuojamas pridedant papildomą užpildymą prie šifruotų paketų, todėl visi paketai yra vienodo dydžio.

Šaltinis: opennet.ru

Добавить комментарий