Ranjivost koja omogućava otmicu TCP veza napravljenih kroz VPN tunele

Objavljeno tehnika napada (CVE-2019-14899) koja omogućava lažiranje, modificiranje ili zamjenu paketa u TCP konekcijama proslijeđenim kroz VPN tunele. Problem pogađa Linux, FreeBSD, OpenBSD, Android, macOS, iOS i druge sisteme slične Unixu. Linux podržava mehanizam rp_filter (filtriranje obrnutog puta) za IPv4, pa ga uključivanje u “Strogom” načinu neutralizira ovaj problem.

Metoda dozvoljava zamjenu paketa na nivou TCP veza koje prolaze unutar šifriranog tunela, ali ne dozvoljava uglavljivanje u veze koje koriste dodatne slojeve šifriranja (na primjer, TLS, HTTPS, SSH). Algoritmi šifriranja koji se koriste u VPN-u nisu bitni, budući da lažni paketi dolaze iz vanjskog sučelja i kernel ih obrađuje kao pakete iz VPN sučelja. Najvjerovatniji cilj napada je ometanje nešifriranih HTTP veza, ali nije isključeno i korištenje napada za manipulaciju DNS odgovorima.

Uspješno lažiranje paketa je demonstrirano za tunele kreirane korištenjem OpenVPN-a, WireGuard-a i IKEv2/IPSec-a.Tor nije podložan problemu, jer koristi SOCKS za prosljeđivanje prometa i vezan je za loopback interfejs. Za IPv4, napad je moguć ako je rp_filter postavljen na “Loose” mod (sysctl net.ipv4.conf.all.rp_filter = 2). U početku je većina sistema koristila “Strogi” način rada, ali počevši od systemd 240, objavljen prošlog decembra, podrazumevani režim rada je promenjen u "Loose" i ova promena se odrazila na podrazumevane postavke mnogih Linux distribucija.

rp_filter mehanizam se primjenjuje za dodatnu verifikaciju putanja paketa kako bi se spriječilo lažiranje izvorne adrese. Kada je postavljeno na 0, ne vrši se provjera izvorne adrese i bilo koji paket se može proslijediti između mrežnih sučelja bez ograničenja. Režim 1 „Strogi“ uključuje provjeru usklađenosti svakog paketa koji dolazi izvana sa tablicom rutiranja, a ako mrežni interfejs preko kojeg je paket primljen nije povezan s optimalnom rutom isporuke odgovora, onda se paket odbacuje. Režim 2 "Labavo" opušta provjeru kako bi omogućio balansiranje opterećenja ili asimetrično usmjeravanje da rade kada
Ruta odgovora može proći kroz mrežni interfejs koji nije onaj kroz koji je stigao dolazni paket.

U Loose modu, dolazni paket se provjerava prema tabeli usmjeravanja, ali se smatra važećim ako je izvorna adresa dostupna preko bilo kojeg dostupnog mrežnog interfejsa. Predloženi napad se zasniva na činjenici da napadač može poslati paket sa lažnom izvornom adresom koja odgovara VPN sučelju, i uprkos činjenici da će ovaj paket ući u sistem preko vanjskog mrežnog sučelja, a ne preko VPN-a, u rp_filter “Loose” mod takav paket neće biti odbačen.

Da bi izvršio napad, napadač mora kontrolirati gateway preko kojeg korisnik pristupa mreži (na primjer, preko MITM organizacije, kada se žrtva povezuje na bežičnu pristupnu tačku koju kontroliše napadač ili preko hakovanje rutera). Kontrolom gatewaya preko kojeg je korisnik povezan na mrežu, napadač može poslati lažne pakete koji će biti percipirani u kontekstu VPN mrežnog sučelja, ali će se odgovori usmjeriti kroz tunel.

Generiranjem toka fiktivnih paketa u kojima je zamijenjena IP adresa VPN sučelja, pokušava se utjecati na konekciju koju uspostavi klijent, ali se utjecaj ovih paketa može promatrati samo kroz pasivnu analizu pridruženog šifriranog toka prometa. sa radom tunela. Da biste izvršili napad, morate saznati IP adresu tunelskog mrežnog sučelja koju je dodijelio VPN server, te također utvrditi da je veza s određenim hostom trenutno aktivna kroz tunel.

Da bi se utvrdila IP adresa VPN sučelja virtuelne mreže, SYN-ACK paketi se šalju sistemu žrtve, uzastopno nabrajajući cijeli raspon virtualnih adresa (prije svega, adrese koje se koriste u VPN-u se nabrajaju prema zadanim postavkama, na primjer, OpenVPN koristi podmrežu 10.8.0.0/24). Postojanje adrese može se proceniti na osnovu prijema odgovora sa RST zastavicom.

Na sličan način se utvrđuje prisustvo konekcije na određenom sajtu i broj porta na strani klijenta – sortiranjem brojeva portova korisniku se šalje SYN paket, kao izvorna adresa, na kojoj se nalazi sajt. IP je zamijenjen, a odredišna adresa je virtuelni IP VPN. Port servera se može predvideti (80 za HTTP), a broj porta na strani klijenta može se izračunati grubom silom, analizirajući za različite brojeve promenu intenziteta ACK odgovora u kombinaciji sa odsustvom paketa sa RST-om. zastava.

U ovoj fazi, napadač poznaje sva četiri elementa veze (izvorne IP adrese/port i odredišne ​​IP adrese/port), ali da bi generirao fiktivni paket koji će sistem žrtve prihvatiti, napadač mora odrediti TCP sekvencu i brojevi potvrde (seq i ack) - veze. Da bi odredio ove parametre, napadač neprekidno šalje lažne RST pakete, pokušavajući različite brojeve sekvence, sve dok ne otkrije ACK paket odgovora, čiji dolazak ukazuje da broj spada u TCP prozor.

Zatim napadač pojašnjava ispravnost definicije tako što šalje pakete sa istim brojem i posmatra dolazak ACK odgovora, nakon čega bira tačan broj trenutnog niza. Zadatak je kompliciran činjenicom da se odgovori šalju unutar šifriranog tunela i da se njihovo prisustvo u presretnutom prometnom toku može analizirati samo pomoću indirektnih metoda. Da li klijent šalje ACK paket adresiran na VPN server određuje se na osnovu veličine i kašnjenja šifriranih odgovora, koji su u korelaciji sa slanjem lažnih paketa. Na primjer, za OpenVPN, veličina šifriranog paketa od 79 omogućava vam da precizno ocijenite da postoji ACK unutra.

Dok se zaštita od napada ne doda kernelu operativnog sistema kao privremena metoda blokiranja problema preporučuje se koristeći filter paketa u lancu “preroute”, blokirajte prolaz paketima u kojima je virtuelna IP adresa tunela navedena kao odredišna adresa.

iptables -t raw -I PREPROSUTIRANJE ! -i wg0 -d 10.182.12.8 -m addrtype ! --src-tip LOKALNO -j DROP

ili za nftables

nft add table ip raw
nft add chain ip raw prerouting '{ type filter hook prerouting priority 0; }'
nft add rule ip raw prerouting 'iifname != "wg0" ip daddr 10.182.12.8 fib saddr type != lokalno ispuštanje'

Da biste se zaštitili kada koristite tunele sa IPv4 adresama, samo postavite rp_filter na “Strogi” način (“sysctl net.ipv4.conf.all.rp_filter = 1”). Na strani VPN-a, metoda detekcije sekvencijalnog broja može se blokirati dodavanjem dodatnog dopuna šifriranim paketima, čineći sve pakete iste veličine.

izvor: opennet.ru

Dodajte komentar