Jak wymacać IPS
Czasami jest tak, że niektóre żądania do serwera HTTP kończą się nagłym acz gwałtownym zakończeniem połączenia przy pomocy RST. Zdarzenie takie z dużą dozą pewności sugeruje, że do akcji wkroczył IPS. Jak wymacać, w którym miejscu sieci rzeczony IPS się znajduje?
Sprawa jest teoretycznie prosta. Manipulując wartością TTL możemy kontrolować jak daleko dany pakiet zawędruje. W chwili, gdy zawędruje w miejsce, w którym znajduje się IPS, zareaguje on na zawarte w pakiecie “złe” treści i wyśle znany już pakiet RST. Problem w tym, że w przypadku protokołu TCP całkiem dowolnie pakietami manipulować nie można. Pakiet, który nie jest związany z sesją TCP najprawdopodobniej nie przejdzie przez firewall (jeśli taki jest po drodze), sam IPS również może taki pakiet zignorować. W rezultacie zadanie przyjmuje postać:
- nawiązać połączenie TCP z serwerem,
- wysłać żądanie HTTP z ograniczonym TTL,
Dzięki temu sesja TCP jest nawiązana, pakiety z nią związane będą przechodziły przez “znające je” firewalle, będą również widziane przez monitorujące ruch sieciowy systemy IPS, o ile taki pakiet do nic dotrze. A jak zobaczą – zareagują. Tak przynajmniej mówi teoria, bo (znów) teoretycznie system IPS może ignorować pakiety IP, których TTL jest za mały, by dotrzeć do systemu docelowego. Mogą, ale nie muszą.
Skoro wiadomo już jak problem rozwiązać, pozostaje pytanie – jak zrobić to w sposób prosty, łatwy i przyjemny. Dziś wymyśliłem sobie taki prosty sposób:
import httplib import socket
h = httplib.HTTPConnection(“adres”, 80) h.connect() h.sock.setsockopt(socket.IPPROTOIP, socket.IPTTL, 1) h.request(“GET”, “/evil”) h.close()
Jak to działa? Wykorzystuję moduł httplib , który służy do obsługi protokołu HTTP. Za jego pomocą nawiązuję połączenie z serwerem, przed którym znajduje się szukany IPS. W tej chwili istnieje sesja TCP, która jest znana wszystkim firewallom oraz urządzeniom IDS/IPS po drodze. Następnie modyfikuję opcje socketu, który powstał po nawiązaniu połączenia HTTP. Modyfikuję tak, że kolejne pakiety IP wysyłane są z niższym TTL, w związku z czym giną po drodze zanim dojdą do serwera docelowego. Pozostaje zwiększać wartość TTL aż odezwie się szukany IPS.
Ten kod działał mi w Windows Vista. W Windows XP pakiety wysyłane były ze standardowym TTL, choć getsockopt zwracał wartość TTL zgodną z ustawioną przez setsockopt.
Oryginał tego wpisu dostępny jest pod adresem Jak wymacać IPS
Autor: Paweł Goleń