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().

Pliki z Pythonem

https://chacker.pl/

Dostęp do plików jest tak samo łatwy, jak reszta języka Python. Pliki można otwierać (do odczytu lub zapisu), zapisywać, czytać i zamykać. Przygotujmy przykład wykorzystujący kilka różnych omówionych tutaj typów danych, w tym pliki. W tym przykładzie założono, że zaczynamy od pliku o nazwie targets i przenosimy jego zawartość do poszczególnych plików docelowych luk w zabezpieczeniach. (Słyszymy, jak mówisz: „W końcu koniec przykładów Dilberta!”). Zwróć uwagę na wymagane wcięcia stosowane w blokach. W tym przykładzie używamy powłoki Pythona 3 do analizowania pliku i przenoszenia zawartości tego pliku do dwóch innych plików. W Kali używamy dwóch powłok, każda w tym samym katalogu. Komentarze rozpoczynające się od symbolu # znajdują się w kodzie. Oczywiście nie musisz ich wpisywać.

Ten przykład wprowadza kilka nowych koncepcji. Po pierwsze, teraz widzisz, jak łatwo jest używać plików; open() przyjmuje dwa argumenty: pierwszy to nazwa pliku, który chcesz przeczytać lub utworzyć, a drugi to typ dostępu. Możesz otworzyć plik do odczytu (r), zapisu (w) i dołączenia (a). Dodanie + po literze dodaje więcej uprawnień; na przykład r+ powoduje dostęp do pliku w trybie odczytu i zapisu. Dodanie b po pozwoleniu otwiera je w trybie binarnym. Po drugie, masz teraz przykład pętli for. Struktura pętli for jest następująca:

UWAGA: W Pythonie białe znaki mają znaczenie, a wcięcia służą do oznaczania bloków kodu. Większość programistów Pythona trzyma się wcięcia składającego się z czterech spacji. Wcięcie musi być spójne w całym bloku. Cofnięcie wcięcia o jeden poziom lub umieszczenie znaku powrotu karetki w pustej linii zamyka pętlę. Nie ma potrzeby stosowania nawiasów klamrowych w stylu C. Podobnie skonstruowane są instrukcje if i pętle while. Oto przykład:

Słowniki

https://chacker.pl/

Słowniki są podobne do list, z tą różnicą, że do obiektu przechowywanego w słowniku odwołuje się klucz, a nie indeks obiektu. Okazuje się, że jest to bardzo wygodny mechanizm przechowywania i odzyskiwania danych. Słownik tworzy się poprzez dodanie { i } wokół pary klucz-wartość, w następujący sposób:

W następnej sekcji będziemy również częściej korzystać ze słowników. Słowniki to świetny sposób na przechowywanie dowolnych wartości, które można powiązać z kluczem, gdzie klucz jest bardziej użytecznym sposobem pobrania wartości niż indeks listy.

Listy

https://chacker.pl/

Następnym typem obiektu wbudowanego, który omówimy, jest lista. Możesz wrzucić dowolny obiekt na listę. Listę tworzy się zwykle poprzez dodanie [ i ] wokół obiektu lub grupy obiektów. Możesz wykonać ten sam rodzaj sprytnego „krojenia”, jak w przypadku sznurków. Krojenie odnosi się do naszego przykładowego ciągu znaków zwracającego tylko podzbiór wartości obiektu — na przykład od piątej do dziesiątej wartości z etykietą1[5:10]. Przyjrzyjmy się, jak działa typ listy:

Następnie szybko przejrzymy słowniki, a następnie pliki, a następnie złożymy wszystkie elementy w jedną całość.

Liczby

https://chacker.pl/

Podobnie jak w przypadku ciągów znaków w Pythonie, liczby wskazują obiekt, który może zawierać dowolną liczbę. Ten typ danych może przechowywać małe liczby, duże liczby, liczby zespolone, liczby ujemne i dowolne inne liczby, jakie możesz wymyślić. Składnia jest taka, jak można się spodziewać:

Teraz, gdy już wiesz, jak działają liczby, możemy zacząć łączyć obiekty. Co się stanie, gdy obliczymy ciąg znaków plus liczbę?

Błąd! Musimy pomóc Pythonowi zrozumieć, co chcemy, aby się wydarzyło. W tym przypadku jedynym sposobem połączenia „abc” i 12 jest przekształcenie 12 w ciąg znaków. Możemy to zrobić w locie:

Jeśli ma to sens, można używać różnych typów razem:

I jeszcze jedna uwaga dotycząca obiektów – samo działanie na obiekcie często nie powoduje jego zmiany. Sam obiekt (liczba, ciąg znaków lub inny) jest zwykle zmieniany tylko wtedy, gdy jawnie ustawisz etykietę obiektu (lub wskaźnik) na nową wartość, w następujący sposób:

Ciągi

https://chacker.pl/

Użyłeś już jednego obiektu typu string . Ciągi znaków są używane w Pythonie do przechowywania tekstu. Najlepszym sposobem pokazania, jak łatwo jest używać ciągów znaków i manipulować nimi, jest zademonstrowanie tej techniki, ponownie przy użyciu powłoki Pythona 3, w następujący sposób:

Oto podstawowe funkcje manipulacji ciągami, których będziesz używać podczas pracy z prostymi ciągami. Składnia jest prosta i przejrzysta, dokładnie taka, jakiej można się spodziewać po Pythonie. Jednym z ważnych rozróżnień, które należy od razu wprowadzić, jest to, że każdy z tych ciągów (nazwaliśmy je ciągiem1, ciągiem2 i ciągiem3) jest po prostu wskaźnikiem — dla osób zaznajomionych z C — lub etykietą bloku danych znajdującego się gdzieś w pamięci. Jedną z koncepcji, która czasami nasuwa się nowym programistom, jest koncepcja jednej etykiety (lub wskaźnika) wskazującej na inną etykietę. Poniższy kod i rysunekilustrują tę koncepcję:

>>> label1 = 'Dilbert’

>>> etykieta2 = etykieta1

W tym momencie mamy gdzieś w pamięci kawałek pamięci z zapisanym ciągiem Pythona „Dilbert”. Mamy też dwie etykiety wskazujące na tę plamę pamięci. Jeśli następnie zmienimy przypisanie etykiety1, etykieta2 nie ulegnie zmianie:

… continued from above

>>> label1 = 'Dogbert’

>>> label2

’Dilbert’

Jak widać na poniższym rysunku , etykieta2 sama w sobie nie wskazuje na etykietę1. Wskazuje raczej na to samo, na co wskazywała etykieta1, dopóki etykieta1 nie została ponownie przypisana.