Zanim zobaczymy HeapME w akcji, zacznijmy od instalacji i konfiguracji gdb oraz zmodyfikowanego Gef fork13 z wtyczką HeapME. Jeśli gdb nie jest zainstalowany (dpkg -l gdb), zainstaluj go za pomocą sudo apt install gdb.
Zanim zobaczymy HeapME w akcji, zacznijmy od instalacji i konfiguracji gdb oraz zmodyfikowanego Gef fork13 z wtyczką HeapME. Jeśli gdb nie jest zainstalowany (dpkg -l gdb), zainstaluj go za pomocą sudo apt install gdb.
Heap Made Easy (HeapME)12 to narzędzie typu open source opracowane przez Huáscara Tejedę , aby pomóc uprościć proces analizy sterty i współpracy. Oto lista niektórych funkcji HeapME:
• Wsparcie dla ptmalloc2 w aktualnej wersji
Najpierw kompilujemy kod podatny na przepełnienie bufora:
Następnie uruchamiamy exploit napisany w Pythonie za pomocą pwntools:
Można tu zastosować mniejszy i prostszy exploit, ale celowo użyjemy nieco bardziej skomplikowanego exploita, aby pokazać jego możliwości. Oto wynik:
Otwórzmy nasz terminal Python, zaimportuj moduł pwn i poznajmy niektóre z potężnych funkcji Pwntools:
Inne funkcje obejmują funkcje pomagające w typowych prymitywach i technikach eksploatacji, takich jak budowanie łańcuchów ROP, kodów powłoki i struktur SROP, pomocników dynamicznych wycieków pamięci, wykorzystywanie ciągów formatujących, generowanie wzorców cyklicznych i wiele innych. Opracowujemy dwuetapowy exploit, który omija ASLR, PIE i NX przy użyciu ładunku ROP + SROP.
Biblioteka Rozwoju
Pwntools to biblioteka do przechwytywania flagi (CTF) i programowania exploitów, która doskonale nadaje się do szybkiego prototypowania exploitów. Oszczędza dużo czasu i wysiłku podczas pisania typowych zadań związanych z eksploatacją, pozwala skupić się na logice exploita, a także zapewnia szeroki zestaw przydatnych funkcji. Wykonaj następujące polecenia, aby zainstalować pwntools:
W wersji 7 dodano obsługę rozszerzania gdb za pomocą Pythona. Ta funkcja jest dostępna tylko wtedy, gdy gdb został skompilowany z opcją konfiguracyjną –withpython. Dzięki tej funkcji, poza możliwością pisania niestandardowych funkcji i automatyzacji wielu zadań, aktywnie rozwijano wiele projektów wtyczek gdb w celu uproszczenia i wzbogacenia procesu debugowania o takie funkcje, jak osadzony widok zrzutu szesnastkowego, wyłuskiwanie danych lub rejestrów, sterta analiza, automatyczne wykrywanie stanu bez użycia (UAF) i inne zaawansowane funkcje. Oto niektóre z najpopularniejszych skryptów gdb:
3. PEDA11 Pomoc w opracowywaniu exploitów w języku Python dla GDB.
Ropper to przydatne narzędzie do generowania łańcuchów ROP i znajdowania gadżetów do ponownego wykorzystania kodu. Jest w stanie ładować pliki binarne w formatach ELF, PE i Mach-O i obsługuje wiele architektur (x86, x86_64, MIPS, MIPS64, ARM/Thumb, ARM64, PowerPC i Sparc) przy użyciu platformy deasemblacji Capstone7. Aby zainstalować Roppera, użyj sudo apt install ropper. Jedną z jego najciekawszych funkcji jest możliwość wyszukiwania gadżetów na podstawie ograniczeń i warunków formatu pliku. Utwórzmy łańcuch ROP, który wywoła mprotect(), aby włączyć uprawnienia wykonywalne dla dowolnego adresu
Powstały fragment kodu Pythona zostanie utworzony:
Możemy również użyć wyszukiwania semantycznego, aby znaleźć gadżet, który zwiększa wskaźnik stosu o 16 bajtów, unikając zaśmiecania rejestrów R15 i RDI: ropper — plik <plik-binarny> –semantic „rsp+=16 !r15 !rdi”. Aby skorzystać z tej funkcji, musisz zainstalować pyvex i z3, postępując zgodnie z instrukcjami na stronie projektu GitHub. Jak widać, oszczędza to dużo czasu i wysiłku, a także zapewnia wiele innych interesujących funkcji — od programowania zorientowanego na skok (JOP) po obracanie stosu.
Zamiast ręcznie szukać one_gadgets dla wielu wersji glibc, możesz użyć narzędzia one_gadget, napisanego w języku Ruby przez david942j i dostępnego w RubyGems (gem install one_gadget). To narzędzie wykorzystuje wykonanie symboliczne do znalezienia one_gadgets i ich ograniczeń. Projekt ten jest dostępny na GitHubie.6 Aby go zainstalować, użyj polecenia sudo gem install one_gadget. Aby automatycznie znaleźć one_gadgets, uruchamiamy narzędzie, podając bibliotekę docelową w następujący sposób:
One_gadgets znajdują się w bibliotece libc i zapewniają prosty sposób uzyskania powłoki poprzez przeskoczenie do pojedynczego gadżetu w celu wykonania execve(„/bin/sh”, NULL, NULL). Te magiczne gadżety możemy znaleźć na dwa sposoby: ręcznie za pomocą ciągów znaków i objdump lub za pomocą narzędzia one_gadget.
Ręczne użycie ciągów i objdump
Najpierw użyjmy ciągów znaków, aby uzyskać adres przesunięcia /bin/sh w docelowej bibliotece libc:
Następnie możemy użyć objdump do wyszukania odniesień do adresu ciągu /bin/sh:
Jedynym ograniczeniem jest to, że w momencie wykonania r12 i r13 muszą być równe NULL. W ten sposób rejestry rdi, rsi i rdx będą zawierać odpowiednio wartości /bin/sh, NULL, NULL.
Narzędzie wiersza poleceń Patchelf pozwala nam modyfikować biblioteki pliku wykonywalnego ELF. Jest to bardzo przydatne, gdy przeprowadzamy analizę sterty na innej wersji libc niż ta używana przez system zdalny lub gdy nie mamy dostępu do kodu źródłowego i chcemy uruchomić wiele wersji libc w tym samym systemie. Możesz pobrać patchelf z repozytorium GitHub5 lub po prostu zainstalować go za pomocą sudo apt install patchelf. W tym laboratorium załatamy plik binarny hello, aby korzystał z interpretera i wersji libc: