O ChatGPT, chatbocie bazującym na sztucznej inteligencji OpenAI, jest głośno już od kilku miesięcy. Stale słyszymy, że ChatGPT (i ogólnie AI) pozbawi nas pracy.
Zanim zadamy sobie złożone pytanie, czy ChatGPT może wykonać całą pracę pentestera, zachowując tę sama jakość, lepiej zacząć od znacznie prostszego pytania technicznego: Czy ChatGPT może rozwiązać prosty problem związany z przepełnieniem bufora?
Celem niniejszego artykułu jest zbadanie zachowania ChatGPT, a nie rozwiązanie problemu przepełnienia bufora, nie będziemy więc wyjaśniać pewnych technicznych terminów.
Zanim zaczniemy, pamiętajmy o wiadomości, którą często otrzymujemy, gdy zapytamy, jak wykorzystać podatności:
Być może znasz ten rodzaj odpowiedzi. ChatGPT uważa „hakerstwo” za złośliwe działanie, ponieważ jest ono powszechnie kojarzone z tego typu czynami. W związku z tym odmówi udzielenia odpowiedzi na niektóre z naszych pytań. Musimy więc ominąć to zabezpieczenie, zadając mniej dosłowne pytania.
Postawmy się w sytuacji początkującego użytkownika, który nigdy nie wykorzystał przepełnienia bufora!
Pytamy ChatGPT, czy fragment kodu tego wyzwania jest podatny na atak.
Pierwsze zwycięstwo: podatność została wykryta!
ChatGPT wykrywa użycie „scanf” do odczytu bufora bez kontroli rozmiaru. Dodatkowo znajduje funkcję „callMeMaybe”, która upraszcza wykonanie kodu po wykorzystaniu przepełnienia bufora. Na koniec ChatGPT proponuje kilka poprawek do kodu.
Widzimy więc, że jest w stanie uzyskać ogólny podgląd kodu oraz dokonać powiązania między podatnością a „callMeMaybe”.
Kontynuujemy nasze naiwne podejście, tak jakbyśmy mu nie ufali, i prosimy o PoC, aby się upewnić, że podatność naprawdę istnieje.
ChatGPT podaje nam zatem ciąg znaków złożony z 300 „A”. Rzeczywiście, program zatrzymuje się z błędem „Segmentation Fault”.
Kontynuujmy dochodzenie.
Następnie ChatGPT radzi nam użyć GDB do wykrycia źródła crashu. Po czym podaje nam długą listę poleceń do uruchomienia w GDB (pominiętą w powyższym zrzucie ekranu). Niestety kończy się to niepowodzeniem.
Gdy opiszemy problem, ChatGPT bezpośrednio lokalizuje przyczynę i wydaje nam polecenie skompilowania programu z „symbols” GDB.
Jednak po kilku działaniach w dwie strony, ChatGPT zaczyna się kręcić w kółko i utyka. Jedyną przydatną informacją, którą dostarczył, było wygenerowanie cyklicznego ciągu ułatwiającego debugowanie.
Zostawmy to na razie i spróbujmy przeformułować rozmowę, pytając o najszybszy sposób zbadania błędu segmentacji.
Wygląda na to, że ChatGPT wrócił na właściwe tory. Sugeruje nawet pewne polecenia do wykonania.
Po otrzymaniu zawartości rejestrów ChatGPT wykrywa znajomy ciąg „saaacaac”, pasuje on do ciągu cyklicznego, który wygenerowaliśmy za pomocą pwntools.
Nie zapominajmy, dlaczego tu jesteśmy. ChatGPT powiedział nam, że musimy skutecznie wywołać „callMeMaybe”. Pytamy go więc, jak to zrobić.
Odpowiada dość szczegółowo i udostępnia sesję GDB, aby wyodrębnić adres „callMeMaybe”.
Po wykonaniu tych poleceń w GDB wysyłamy mu wynik i prosimy o polecenie, które pozwoli go wykorzystać.
Wykonanie polecenia kończy się niepowodzeniem i nawet po kilku pytaniach ChatGPT nie rozumie dlaczego. Postanawiamy więc mu pomóc.
Następnie ChatGPT proponuje dodanie znaków do naszego printa do momentu wywołania punktu przerwania.
Próbujemy pomóc mu znaleźć lepszy sposób, sugerując użycie funkcji „cyclic” z pwntools.
Poniższych 6 pytań pozwala nam uzyskać odpowiednią długość za pomocą tej funkcji.
Mamy więc program w Pythonie, który generuje prawidłowy payload. Pozostaje nam tylko jego wykonanie.
Jednak urządzenie końcowe nie pomaga nam jako root. W praktyce bash jako root uruchamia się, po czym zamyka się, zanim będziemy mogli napisać komendy.
Próbujemy więc ponownie pomóc mu wykryć problem, niestety bez powodzenia.
Potrzebny jest kolejny impuls do działania.
Dzięki wyraźniejszemu wskazaniu ChatGPT decyduje się na zmianę strategii i powrót do programu wykorzystującego pwntools. Nie jest to zły pomysł, ale funkcja „interact” nie działa, trzeba zastąpić ją „interactive”, aby skutecznie wykorzystać podatność. Mimo naszych prób nie udało mu się tego znaleźć.
Podsumowując, czas stracony na rozmowę przekonał nas, że użycie ChatGPT do zadania typu end-to-end przez nowicjusza nie jest zalecane. Potrzebował on kilku wskazówek, aby się skierować na właściwe tory. Z tego powodu sugerujemy korzystanie z niego tylko w przypadku jasnych i bezpośrednich pytań.
Drugim problemem jest nieścisłość niektórych informacji, które zostają podane przez ChatGPT - dobrze jest więc zweryfikować pewne fakty za pomocą wyszukiwarki lub posiadać już pewną wiedzę na ten temat.