libc-database

https://chacker.pl/

Czasami udaje ci się znaleźć i wykorzystać lukę w zabezpieczeniach pliku informacyjnego, ale nie jest możliwe obliczenie przesunięcia w stosunku do bazy libc lub innych funkcji, chyba że znasz wersję libc używaną na zdalnym hoście. Biblioteka libcdatabase pobiera listę skonfigurowanych wersji ibc, wyodrębnia przesunięcia symboli i umożliwia sprawdzenie nazwy funkcji i adresu, który wyciekł, w celu zidentyfikowania używanej wersji libc.

1. Sklonujmy repozytorium GitHub libc-database:

  1. Możliwe jest pobranie wszystkich wstępnie udostępnionych wersji libc w ramach skryptu get, ale można także pobrać wersje specyficzne dla dystrybucji dla systemów Ubuntu, Debian, RPM, CentOS, Arch, Alpine, Kali i Parrot OS. Pobierzmy wersje libc używane przez Kali Linux. W folderze /home/kali/libc-database wykonaj następujące czynności:

3. Znajdź w bazie danych wszystkie wersje libc, które mają podane nazwy pod podanymi adresami. Użyjmy readelf, aby uzyskać przesunięcie put, a następnie użyjmy skryptu find libc-database:

3. Znajdź w bazie danych wszystkie wersje libc, które mają podane nazwy pod podanymi adresami. Użyjmy readelf, aby uzyskać przesunięcie put, a następnie użyjmy skryptu find libc-database:

checksec

https://chacker.pl/

Skrypt powłoki checksec analizuje nagłówek ELF programu, aby określić, które technologie ograniczające czas kompilacji są używane, takie jak RELRO, NX, Stack Canaries, ASLR i PIE. Pomaga to zidentyfikować ograniczenia w eksploatacji. Podobne funkcje i polecenia checksec są również dostępne w większości narzędzi i struktur programistycznych (takich jak funkcja pwntools checksec). Możemy pobrać checksec bezpośrednio ze strony GitHub2 lub zainstalować go za pomocą sudo apt install checksec. Uruchomienie checksec w skompilowanym wcześniej programie hello wyświetli włączone środki zaradcze (w zależności od ustawień domyślnych konfiguracji gcc dystrybucji), jak pokazano tutaj:

Skompilujmy ponownie nasz program hello.c z włączonymi wszystkimi zabezpieczeniami, a następnie uruchommy checksec:

Śledzenie

https://chacker.pl/

Głównym celem narzędzia ltrace jest śledzenie wywołań bibliotek współdzielonych i ich odpowiedzi, ale można go również wykorzystać do śledzenia wywołań systemowych. Upewnij się, że masz zainstalowany pakiet ltrace za pomocą polecenia dpkg -l ltrace, ponieważ nie jest on domyślnie dostarczany z Kali. Użyj sudo apt install ltrace na wypadek, gdybyś musiał go zainstalować. Oto wynik działania ltrace ./hello:

UWAGA: Możesz użyć opcji -S, aby wyświetlić wywołania systemowe.

strace

https://chacker.pl/

Narzędzie wiersza poleceń strace jest przydatne, gdy musimy śledzić wywołania i sygnały systemowe. Wykorzystuje wywołanie systemowe ptrace do sprawdzania programu docelowego i manipulowania nim, a poza tym, że pozwala nam lepiej zrozumieć zachowanie programu, może być również wykorzystywane do manipulowania zachowaniem wywołań systemowych w celu lepszego rozwiązywania problemów lub szybszego odtworzenia ataku w określonych warunkach sytuacjach (na przykład wprowadzenie błędu, wprowadzenie wartości zwracanej, wprowadzenie sygnału i wprowadzenie opóźnienia). Spójrzmy na kilka przykładów. Przede wszystkim upewnij się, że masz zainstalowany pakiet strace za pomocą polecenia dpkg -l strace, ponieważ domyślnie nie jest on dostarczany z Kali. Używaj sudo apt install strace, aby go zainstalować. Kiedy uruchomisz strace bez argumentów, wyświetli wszystkie wywołania systemowe i sygnały, tak jak poniżej:

Możemy użyć opcji -e trace=syscall, jeśli chcemy prześledzić/filtrować określone wywołanie systemowe, jak pokazano poniżej:

Jak zachowałby się program, gdyby funkcja zapisu nie została zaimplementowana?

Możemy również wstrzyknąć konkretną odpowiedź na błąd. Zamiast tego wstrzyknijmy błąd „EAGAIN (Zasób tymczasowo niedostępny)”:

Możliwe jest również użycie strace do wstrzykiwania opóźnień. Jest to bardzo pomocne w wielu przypadkach, ale dobrym przykładem jest sytuacja, w której musimy uczynić warunek wyścigu bardziej deterministycznym, pomagając zmniejszyć losowość wywłaszczania programu planującego. Wprowadźmy opóźnienie 1 sekundy przed wykonaniem funkcji odczytu (delay_enter) i opóźnienie 1 sekundę po wykonaniu funkcji zapisu (delay_exit). Domyślnie oczekiwana precyzja czasu to mikrosekundy:

Jeśli chcesz dowiedzieć się więcej o strace, Dmitry Levin ( przeprowadzi Cię przez listę zaawansowanych funkcji w swoim przemówieniu „Modern strace”.

objdump

https://chacker.pl/

Możemy używać objdump jako deasemblera wiersza poleceń, a także do uzyskiwania ważnych informacji o plikach wykonywalnych i obiektach. Zdobądźmy trochę informacji na temat pliku binarnego hello.

Uzyskiwanie tabeli globalnych przesunięć (GOT) i tabeli powiązań procedur (PLT)

Analizując pozbawiony plików binarnych, możesz użyć objdump, aby odwrócić adres pamięci interesującej funkcji. Za pomocą opcji -R możesz wyświetlić listę funkcji w GOT-u:

Teraz użyjmy objdump do zlokalizowania adresu, który zostanie wywołany w PLT, aby dostać się do funkcji puts():

Oto kilka punktów, na które warto zwrócić uwagę:

  • -M intel informuje objdump, aby używał trybu składni Intel zamiast domyślnego (AT&T).
  • -d jest skrótem od –disassemble.
  • -j .plt określa sekcję, którą chcemy wyświetlić (PLT).

Teraz użyjemy opcji -j .text, aby znaleźć wywołanie puts w analizowanym programie:

Znajdowanie odniesień do ciągów stałych

W niektórych sytuacjach może być konieczne znalezienie odniesień do ciągów znaków w pozbawionych plików binarnych, aby przyspieszyć proces debugowania, lub znaleźć magiczne gadżety w obiekcie. Odniesienia do ciągów znaków możemy znaleźć w dwóch krokach. Pierwszym krokiem jest

gdzie -tx (-t oznacza podstawę, x oznacza wartość szesnastkową) wypisuje przesunięcie w pliku na początku każdego łańcucha. Drugi krok to

bdd

https://chacker.pl/

Narzędzie ldd wyświetla biblioteki współdzielone ładowane przez programy w czasie wykonywania. Biblioteki te mają przyrostek .so (obiekt współdzielony) i składają się z pojedynczych plików zawierających listę funkcji. Korzystanie z bibliotek współdzielonych ma wiele zalet, takich jak promowanie możliwości ponownego użycia kodu, pisanie mniejszych programów i ułatwianie konserwacji dużych aplikacji. Z punktu widzenia bezpieczeństwa ważne jest, aby wiedzieć, jakich bibliotek współdzielonych używa program i w jaki sposób są one ładowane. Jeśli programista nie będzie wystarczająco ostrożny, biblioteki współdzielone mogą zostać wykorzystane do uzyskania wykonania kodu lub pełnego naruszenia bezpieczeństwa systemu. Możliwości ataku obejmują znajdowanie słabych uprawnień do plików i używanie rpath do zastąpienia udostępnionej biblioteki złą, możliwość wycieku adresu załadowanej biblioteki, a nawet nadużywanie jej interesujących gadżetów w celu uzyskania kontroli przepływu wykonywania za pomocą kodu ROP/JOP- ponowne wykorzystanie technik ataku. Oto wynik po uruchomieniu ldd /bin/ls:

Binarne, dynamiczne narzędzia do gromadzenia informacji

https://chacker.pl/

Niektóre z tych narzędzi mogą być Ci znane, ponieważ są przydatne nie tylko w dziedzinie tworzenia exploitów. Zaczniemy od tych bardziej popularnych (i oldschoolowych), ale pokazując nowsze narzędzia, w niektórych przypadkach pokażemy również, w jaki sposób można znaleźć te same informacje „ręcznie”.

Hello.c

Zacznijmy od podłączenia się do standardowej maszyny Kali. Otwórz swój ulubiony edytor tekstu i napisz następujący prosty program, który będzie używany jako laboratorium do testowania i zrozumienia różnych narzędzi:

Ten plik jest również dostarczany w folderze ~/GHHv6/ch03, po uprzednim sklonowaniu repozytorium Git Gray Hat Hacking 6th Edition. Teraz skompilujmy i wykonajmy plik binarny, aby upewnić się, że działa zgodnie z oczekiwaniami:

Narzędzia do tworzenia exploitów dla systemu Linux

https://chacker.pl/

Wraz z ewolucją kontroli bezpieczeństwa Linuksa i technik omijania tych ograniczeń, obszary wykrywania luk w zabezpieczeniach, analizy awarii i opracowywania exploitów stają się coraz większym wyzwaniem. Zmusza to badaczy do poświęcania większej ilości czasu i wysiłku na znajdowanie i wykorzystywanie krytycznych luk w zabezpieczeniach. Dokonamy przeglądu różnych nowoczesnych narzędzi do tworzenia exploitów, które mogą pomóc uprościć proces gromadzenia informacji, analizy awarii, debugowania i opracowywania exploitów.

Streszczenie

https://chacker.pl/

Przedstawiono wstępne koncepcje programowania i zagadnienia dotyczące bezpieczeństwa. Etyczny haker musi posiadać umiejętności programowania, aby tworzyć exploity i przeglądać kod źródłowy, a także musi rozumieć kod asemblera podczas odwracania szkodliwego oprogramowania lub znajdowania luk w zabezpieczeniach. Wreszcie, debugowanie jest umiejętnością niezbędną do analizy złośliwego oprogramowania w czasie wykonywania lub śledzenia wykonywania kodu powłoki w pamięci. Jedynym sposobem na naukę języka programowania lub inżynierii wstecznej jest praktyka, więc do dzieła!

Gniazda z Pythonem

https://chacker.pl/

Ostatnim tematem, który musimy poruszyć, jest obiekt gniazda w Pythonie. Aby zademonstrować gniazda w języku Python, zbudujmy prostego klienta, który łączy się ze zdalnym (lub lokalnym) hostem, a następnie wysyła polecenie „Powiedz coś:”. Aby przetestować ten kod, potrzebujemy „serwera”, który będzie nasłuchiwał połączenia tego klienta. Możemy symulować serwer, wiążąc słuchacza netcat z portem 4242 za pomocą następującej składni (musisz uruchomić nc w nowej powłoce):

Kod klienta (który powinien zostać uruchomiony w osobnej powłoce) wygląda następująco:

Należy pamiętać o zaimportowaniu biblioteki gniazd. Linia tworzenia gniazd również zawiera pewne opcje gniazd, o których należy pamiętać, ale reszta jest łatwa. Łączysz się z hostem i portem, wysyłasz, co chcesz, następnie używasz recv do przechowywania danych w obiekcie, a następnie zamykasz gniazdo. Kiedy wykonasz to w osobnej powłoce, wpisując python3 client.py, powinieneś zobaczyć „Powiedz coś:” na twoim odbiorniku netcat. Wszystko, co wpiszesz w odbiorniku, powinno zostać zwrócone klientowi. Aby uzyskać dodatkową zasługę, dowiedz się, jak symulować słuchacza netcat w Pythonie za pomocą instrukcji bind(), Listen() i Accept().