Generowanie
szelkodów w Pythonie
Piotr Sobolewski
Bywa, że potrzebny jest
nam nietypowy szelkod.
Bywa, że szelkod musi być
tworzony dynamicznie,
podczas wykonywania się
eksploita. W takiej sytuacji
przydać się może InlineEgg
biblioteka umożliwiająca
pisanie w Pythonie programów
generujących szelkody.
o stworzenia eksploita wykorzystują- tworzymy obiekt klasy InlineEgg, a następnie
cego błąd przepełnienia bufora po- wywołujemy odpowiednie metody, na przy-
Dtrzebny jest szelkod mały progra- kład dodaj do szelkodu kod zmieniający uid
mik, napisany w asemblerze, który zostanie na zero, dodaj do szelkodu kod uruchamiający
przesłany do dziurawego programu i wykona-
ny w atakowanym systemie. Szelkod jest zwy-
Z artykułu nauczysz się...
kle zaszyty na sztywno w eksploicie. Ponie-
waż czynności, które ma wykonać, są zazwy-
" będziesz umiał napisać własny eksploit przy
czaj standardowe (zmiana UID na zero, uru-
użyciu biblioteki InlineEgg.
chomienie powłoki itp.), więc autor eksploita
Powinieneś wiedzieć...
nie musi pisać szelkodu samemu, może sko-
rzystać z gotowego, na przykład znalezione-
" Zakładamy, że Czytelnik rozumie, na czym po-
go w Internecie.
lega przepełnianie bufora na stosie (na przy-
Bywają sytuacje, kiedy takie podejście nie kład przeczytał Artykuł Przepełnianie stosu pod
Linuksem x86 w poprzednim numerze nasze-
wystarcza. Zdarza się, że potrzebny jest nam
go pisma),
nietypowy szelkod, który zrobi coś, czego nie
" Opisujemy skrótowo, na czym polega progra-
robi żaden z powszechnie dostępnych. Bywa,
mowanie gniazd sieciowych; warto uzupełnić
że szelkod musi być tworzony dynamicznie,
wiedzę na przykład czytając dołączony na CD
podczas wykonywania się eksploita, dostoso-
(w dziale dokumentacja->programowanie->C)
wany do konkretnej sytuacji. W takiej sytuacji
dokument Beej's Guide to Network Program-
przydać się może InlineEgg biblioteka umoż-
ming,
liwiająca pisanie w Pythonie programów gene-
" Do pisania szelkodów wykorzystujemy Pytho-
rujących szelkody.
na, jednak nie zakładamy, że Czytelnik ma do-
świadczenie z tym językiem, powinno wystar-
Koncepcja czyć ogólne doświadczenie z programowa-
niem.
Koncepcja korzystania z InlineEgg jest prosta
(patrz Rysunek 1): aby wygenerować szelkod
36 www.hakin9.org Hakin9 Nr 5/2004
Atak
Szelkod w Pythonie
Listing 1. egg_1.py
kod w Pythonie: wygenerowany szelkod:
najprostszy szelkod stworzony
za pomocą InlineEgg
Start Start
#!/usr/bin/python
from inlineegg import *
Stwórz nowy obiekt
klasy InlineEgg.
def main():
egg = InlineEgg(Linuxx86Syscall)
egg.execve('/bin/ls',ż
Dodaj do szelkodu kod
UID=0
('ls','-l'))
zmieniaj cy UID na 0.
egg.exit()
print egg.getCode()
Dodaj do szelkodu
Uruchom /bin/sh.
kod otwieraj cy powłokę.
main()
Dodaj do szelkodu kod
Koniec
kończ cy jego wykonywanie.
Start
Koniec
Korzystaj z biblioteki
InlineEgg.
Rysunek 1. Generowanie szelkodu za pomocą InlineEgg
Wywołaj procedurę
.
powłokę. Każda z wywołanych me- Jako argument podajemy jej ścież-
tod dodaje do tworzonego szelko- kę do programu, który chcemy uru-
procedura :
du kawałek kodu w języku maszy- chomić (czyli ls), i argumenty, z ja-
Stwórz nowy obiekt
nowym wybranego procesora. Na kimi uruchomiony zostanie pro-
klasy InlineEgg.
koniec otrzymujemy gotowy do uży- gram. Sprawdzmy ścieżkę do pro-
cia szelkod. gramu ls:
Dodaj kod
uruchamiaj cy
Nasz pierwszy szelkod $ which ls
.
Spróbujmy napisać własny szelkod /bin/ls
za pomocą InlineEgg (Listing 1). Za-
cznijmy od czegoś prostego: stwórz- Podając argumenty nie zapomnij-
Dodaj kod kończ cy
działanie szelkodu.
my szelkod, który wykonuje polece- my, że każdy program urucha-
nie ls (wypisuje zawartość bieżące- miany pod Linuksem oprócz zwy-
go katalogu). kłych argumentów otrzymuje jako
Zaczynamy od stworzenia klasy argument pierwszy własną nazwę Koniec
reprezentującej szelkod: (patrz Ramka Pierwszy argument
nazwa programu). Pierwszym
egg=InlineEgg(Linuxx86Syscall) argumentem będzie więc ciąg ls.
Rysunek 2. Schemat działania
Jako drugi argument podajmy na
programu z Listingu 1
Użyty argument Linuxx86Syscall przykład -l, co spowoduje, że wy-
oznacza platformę, dla której gene- pisane zostaną dodatkowe infor- Metoda dodająca taki kod (patrz Ta-
rujemy szelkod: w tym przypadku macje o plikach. bela 1) to exit():
jest to Linux na x86. Ostatecznie linijka powodująca
Następnie musimy dodać do dodanie do tworzonego szelkodu ka- egg.exit()
szelkodu kod wykonujący polece- wałka kodu, który uruchamia polece-
nie ls. Odbywa się to przez wywoły- nie ls -l, wygląda tak: Spróbujmy, czy rzeczywiście w ten
wanie metod klasy InlineEgg (patrz sposób da się stworzyć szelkod.
Tabela 1). Po przejrzeniu tabeli za- egg.execve('/bin/ls',('ls','-l')) Przeanalizujmy program przedsta-
uważymy, że do naszego celu zna- wiony na Listingu 1. Z jego zrozumie-
komicie nada się metoda execve(), Ostatnim elementem szelkodu bę- niem nie powinny mieć kłopotu na-
uruchamiająca dowolny program. dzie kod kończący jego działanie. wet osoby, które pierwszy raz styka-
2004 Hakin9 Nr 5/2004 www.hakin9.org
37
Wyszukiwarka
Podobne podstrony:
hakin9 5 04 atak jabber?mohakin9 6 04 przechowywanie?nych?mohakin9 6 04 testy penetracyjne?mohakin9 6 04 wykrywanie sniffingu?mohakin9 5 04 rozpoznawanie honeypotow?mohakin9 5 04?os obrona?mohakin9 5 04?maskowanie nadawcy?mohakin9 6 04 cisco ios?mohakin9 6 04 inzynieria odwrotna?mohakin9 5 04 skanowanie portow?mo04 PythonMatematyk04 (131)2006 04 Karty produktów04 Prace przy urzadzeniach i instalacjach energetycznych v1 104 How The Heart Approaches What It Yearnsstr 04 07 maruszewski[W] Badania Operacyjne Zagadnienia transportowe (2009 04 19)więcej podobnych podstron