[ Pobierz całość w formacie PDF ]
Wróćmy do przykładu: serwer zwraca klientowi sformatowany, wynikowy ciąg jako
jeden z elementów odpowiedzi. Znacznie upraszcza to prac¹ wÅ‚amywacza szukajÄ…cego
sposobu na przenikni¹cie do serwera. Poniższy wydruk zawiera przykÅ‚adowy komunikat
serwera rwhoisd, którego treść wskazuje na istnienie w nim bÅ‚¹du ciÄ…gu formatujÄ…cego:
W powyższym przykładzie nawiązanie połączenia z usługą i przesłanie do niej specy-
fikatora formatu wewnÄ…trz parametru podejrzanego o wyst¹powanie w roli ciÄ…gu for-
matującego spowodowało dołączenie do odpowiedzi serwera ciągu 1073743563
w miejscu, gdzie w przekazanym ciÄ…gu znajdowaÅ‚ si¹ specyfikator . WyÅ›wietlona
liczba ujemna jest po prostu dziesi¹tnÄ… interpretacjÄ… 4 bajtów pami¹ci stosu znajdujÄ…-
cych si¹ przypadkiem tam, gdzie funkcja spodziewaÅ‚a si¹ obecnoÅ›ci pa-
rametru korespondujÄ…cego ze specyfikatorem . Jest to jawne potwierdzenie obecno-
Å›ci w kodzie serwera bÅ‚¹du ciÄ…gu formatujÄ…cego.
Po zidentyfikowaniu luki na podstawie zarówno analizy kodu zródłowego, jak i odpo-
wiedzi serwera, trzeba si¹ zastanowić nad możliwoÅ›ciÄ… jej wykorzystania. Ta konkretna
luka nadaje si¹ do wykorzystania przez zdalnego klienta za poÅ›rednictwem sieci. Atak
nie wymaga przy tym przejścia procedury uwierzytelniającej i prawdopodobnie może
doprowadzić do przej¹cia przez użytkownika zdalnego kontroli nad komputerem ob-
sługującym serwer.
W przypadkach takich jak ten (w których program wyświetla sformatowany ciąg wy-
nikowy) atakujÄ…cy ma możliwość odczytania zawartoÅ›ci pami¹ci stosu i zdobycia w ten
sposób dodatkowych informacji przydatnych w końcowym ataku. W prezentowany po-
niżej sposób atakujÄ…cy może odczytywać caÅ‚e sÅ‚owa pami¹ci:
Rozdział 9. f& Ciągi formatujące 307
Narzędzia i p łapki&
Więcej stosu, mniej ciągu formatującego
Może się zdarzyć, że ciąg formatujący przechowywany na stosie leży poza zasięgiem
funkcji . Przyczyn takiego stanu rzeczy może być kilka, jedną z nich jest obcięcie
ciągu wejściowego (formatującego) do określonej długości. Jeżeli wejściowy ciąg for-
matujÄ…cy zostanie na pewnym etapie wykonywania programu (przed przekazaniem go
do funkcji ) obcięty do pewnego maksymalnego rozmiaru, liczba specyfikato-
rów formatów, które zostaną wzięte pod uwagę będzie ograniczona. Istnieje kilka sposo-
bów na obejście takiego utrudnienia podczas konstruowania programu atakującego.
Cały problem polega wtedy na takim operowaniu specyfikatorami funkcji ,
aby odczytała ona jak największy blok pamięci przy zastosowania jak najkrótszego
ciągu formatującego. Można w tym celu posłużyć się jedną z poniższych technik:
Skorzystać z większych typów danych pierwszym i najbardziej oczywistym
rozwiązaniem jest zastosowanie specyfikatorów formatujących kojarzonych
z szerszymi typami danych; jednym z takich specyfikatorów jest ,
interpretowany ze zmiennÄ… typu . W 32-bitowych architekturach
Intel funkcja wstawi w miejsce każdego takiego specyfikatora 8 bajtów
obszaru stosu. Możliwe jest również wstawienie do ciągu wynikowego zmiennej
typu lub , choć dane przechowywane na stosie mogą
nie nadawać się do interpretacji zmiennoprzecinkowej, co może spowodować
załamanie procesu.
Skorzystać z kwalifikatorów długości ciągu wyjściowego niektóre wersje
biblioteki libc obsługują znak wielokrotności ( ) w specyfikatorach ciągu. Znak
ten informuje funkcję o tym, że długość (liczba znaków), do której ma
zostać wyrównana wartość zmiennej odpowiadającej specyfikatorowi definiowana
jest parametrem wywołania (funkcja odczytuje długość wypełnienia ze stosu).
Parametr ten musi być liczbą całkowitą. Każda gwiazdka powoduje więc połknięcie
4 kolejnych bajtów stosu. Ostateczna długość interpretowanej wartości może być
jednak zastąpiona przez liczbę określoną bezpośrednio przed właściwym
specyfikatorem. Przykładowo, specyfikator spowoduje wyświetlenie
przez funkcję wartości zmiennej całkowitej, reprezentowanej za pomocą dziesięciu
znakach. Jednakże wartość tej zmiennej zostanie odczytana spod adresu
przesuniętego o 32 bajty. Pierwsze zastosowanie tej techniki przypisuje się
niejakiemu lorianowi.
Odwoływać się bezpośrednio do parametrów możliwe jest zmuszenie funkcji
do odwoływania się wyłącznie do określonych parametrów. Służą
do tego specyfikatory formatujÄ…ce postaci , gdzie jest numerem parametru
(licząc od 1). Technikę tę można stosować jedynie na platformach wyposażonych
w bibliotekę C obsługującą ciągi formatujące z bezpośrednim dostępem
do parametrów.
Jeżeli nawet za pomocą omówionych wyżej trików nie uda się dosięgnąć adresu za-
szytego w ciągu formatującym, atakujący powinien przeanalizować kod procesu w ce-
lu określenia, czy gdziekolwiek w pamięci znajduje się obszar stosu, w którym można
by umieścić adres. Należy bowiem pamiętać, że adres niekoniecznie musi być osadzony
w ciągu formatującym, choć jest to wygodne, gdy ciąg ten alokowany jest w odpowied-
nim obszarze stosu. Atakujący może przecież przekazać na wejście programu nie tylko
ciąg formatujący. W przypadku wspomnianego programu Screen atakujący miał na przy-
kład dostęp do zmiennej konstruowanej na podstawie zmiennej środowiskowej .
Ciąg ten był przechowywany na stosie w łatwiej dostępnym miejscu.
308 Hack Proofing Your Network. Edycja polska
W tym przykÅ‚adzie klient odczytaÅ‚ jedno, dwa, trzy a nast¹pnie cztery sÅ‚owa pami¹ci
stosu. Wydruk wynikowy zostaÅ‚ sformatowany tak, że nadaje si¹ do automatycznej anali-
zy przez program atakujący. Prawidłowo skonstruowany program atakujący może wy-
korzystać odpowiedzi serwera do rekonstrukcji pełnej zawartości stosu procesu serwera.
Program taki mógÅ‚by odczytywać zawartość pami¹ci stosu aż do momentu napotkania
na stosie samego ciągu formatującego i na tej podstawie obliczyć pożądaną lokaliza-
[ Pobierz całość w formacie PDF ]