🐚Payloads
Nota: Este tipo de técnicas son muy invasivas, ya que vamos a ganar acceso a distintos sistemas, por lo que no podemos utilizar estas técnicas sin un consentimiento o aprobación por parte del objetivo
Introducción a los Payloads
En seguridad de la información, un payload es el comando y/o código que explota una vulnerabilidad en un sistema operativo y/o aplicación. El payload es el comando y/o código que realiza la acción maliciosa desde una perspectiva defensiva. Como vimos en la sección de Reverse Shells, Windows Defender detuvo la ejecución de nuestra carga útil de PowerShell porque se consideraba código malicioso.
Tenga en cuenta que cuando entregamos y ejecutamos cargas útiles, como cualquier otro programa, le damos a la computadora de destino instrucciones sobre lo que debe hacer. Los términos "malware" y "código malicioso" romantizan el proceso y lo hacen más misterioso de lo que es. Cada vez que trabajamos con cargas útiles, debemos explorar qué hacen realmente el código y los comandos. Comenzaremos este proceso desglosando los one-liners con las que trabajamos anteriormente:
One-Liners
Netcat/Bash Reverse Shell de una sola línea
Los comandos anteriores constituyen una frase común emitida en un sistema Linux para servir un shell Bash en un socket de red que utiliza un oyente Netcat. Usamos esto anteriormente en la sección Bind Shells. A menudo se copia y pega, pero no se entiende. Analicemos cada parte del resumen:
Elminar /tmp/f
Elimina el archivo /tmp/f
si existe, -f
hace que se ignoren los archivos inexistentes. El punto y coma ( ;
) se utiliza para ejecutar el comando de forma secuencial.
Hacer una tubería con nombre
Crea un archivo de canalización con nombre FIFO en la ubicación especificada. En este caso, /tmp/f es el archivo de canalización con nombre FIFO, el punto y coma ( ;
) se utiliza para ejecutar el comando secuencialmente.
Redirección de salida
Concatena el archivo de tubería FIFO llamado /tmp/f, la tubería ( |
) conecta la salida estándar de cat /tmp/f a la entrada estándar del comando que viene después de la tubería ( |
).
Establecer opciones de shell
Especifica el intérprete del lenguaje de comandos utilizando la opción -i
para garantizar que el shell sea interactivo. 2>&1
garantiza que el flujo de datos de error estándar ( 2
) &
el flujo de datos de salida estándar ( 1
) se redirija al comando que sigue a la tubería ( |
).
Abrir una conexión con Netcat
Utiliza Netcat para enviar una conexión a nuestro host de ataque 10.10.14.12
escuchando en el puerto 7777
. La salida será redirigida ( >
) a /tmp/f, entregando el shell Bash a nuestro oyente Netcat en espera cuando se ejecute el comando de una sola línea del shell inverso.
Explicación de One-Liner en PowerShell
Los shells y las cargas útiles que elegimos utilizar dependen en gran medida del sistema operativo que estemos atacando. Tenga esto en cuenta a medida que avanzamos a lo largo del módulo. Fuimos testigos de esto en la sección de shells inversos al establecer un shell inverso con un sistema Windows usando PowerShell. Analicemos la frase ingeniosa que utilizamos:
Powershell de una sola línea
Analizaremos el comando de PowerShell bastante grande que puede ver arriba. Puede parecer mucho, pero con suerte podremos desmitificarlo un poco.
Llamando a PowerShell
Se ejecuta powershell.exe
sin perfil ( nop
) y ejecuta el bloque de comando/script ( -c
) contenido entre comillas. Este comando en particular se emite dentro del símbolo del sistema, razón por la cual PowerShell está al principio del comando. Es bueno saber cómo hacer esto si descubrimos una vulnerabilidad de ejecución remota de código que nos permite ejecutar comandos directamente en cmd.exe
.
Vincular un Socket
Establece/evalúa la variable $client
igual a ( =
) del New-Object
cmdlet, lo que crea una instancia del System.Net.Sockets.TCPClient
objeto .NET framework. El objeto .NET framework se conectará con el socket TCP que figura entre paréntesis (10.10.14.158,443)
. El punto y coma ( ;
) garantiza que los comandos y el código se ejecuten secuencialmente.
Configuración del flujo de comandos
Establece/evalúa la variable $stream
igual a ( =
) la variable $client
y el método de .NET framework llamado GetStream que facilita las comunicaciones de red. El punto y coma ( ;
) garantiza que los comandos y el código se ejecuten secuencialmente.
Flujo de bytes vacío
Crea una matriz de tipo byte ( []
) llamada $bytes
que devuelve 65,535 ceros como valores en la matriz. Se trata esencialmente de un flujo de bytes vacío que se dirigirá al escucha TCP en un cuadro de ataque que espera una conexión.
Parámetros de transmisión
Inicia un bucle while
que contiene la variable $i
establecida igual a ( ) del método Stream.Read ( ) =
de .NET framework . Los parámetros: buffer ( ), offset ( ) y count ( ) se definen dentro de los paréntesis del método.$stream.Read$bytes0$bytes.Length
Establecer la codificación de bytes
Establece/evalúa la variable $data
igual a ( =
) una clase de marco .NET de codificación ASCII que se utilizará junto con el método GetString
para codificar el flujo de bytes ( $bytes
) en ASCII. En resumen, lo que escribamos no sólo se transmitirá y recibirá como bits vacíos, sino que se codificará como texto ASCII. El punto y coma ( ;
) garantiza que los comandos y el código se ejecuten secuencialmente.
Invoke-Expression
Establece/evalúa la variable $sendback
igual a ( =
) el cmdlet Invoke-Expression ( iex
) contra la variable $data
, luego redirige el error estándar ( 2>
) &
salida estándar ( 1
) a través de una tubería ( |
) al cmdlet Out-String
que convierte los objetos de entrada en cadenas. Debido a que se utiliza Invoke-Expression, todo lo almacenado en $data se ejecutará en la computadora local. El punto y coma ( ;
) garantiza que los comandos y el código se ejecuten secuencialmente.
Mostrar directorio de trabajo
Establece/evalúa la variable $sendback2
igual a ( =
) la variable $sendback
más ( +
) la cadena PS ( 'PS'
) más +
la ruta al directorio de trabajo ( (pwd).path
) más ( +
) la cadena '> '
. Esto dará como resultado que el símbolo del shell sea PS C:\workingdirectoryofmachine >
. El punto y coma ( ;
) garantiza que los comandos y el código se ejecuten secuencialmente. Recuerde que el operador + en programación combina cadenas cuando no se utilizan valores numéricos, con la excepción de ciertos lenguajes como C y C++ donde se necesitaría una función.
Establece el byte de envío
Establece/evalúa la variable $sendbyte
igual a ( =
) el flujo de bytes codificado en ASCII que utilizará un cliente TCP para iniciar una sesión de PowerShell con un oyente Netcat ejecutándose en el cuadro de ataque.
Terminar la conexión TCP
Este es el método TcpClient.Close que se utilizará cuando finalice la conexión.
El resumen que acabamos de examinar juntos también se puede ejecutar en forma de script de PowerShell ( .ps1
). Podemos ver un ejemplo de esto viendo el código fuente a continuación. Este código fuente es parte del proyecto nishang :
Código: powershell
Los Payloads toman diferentes formas
Comprender qué hacen los diferentes tipos de cargas útiles puede ayudarnos a comprender por qué AV nos bloquea la ejecución y darnos una idea de lo que podríamos necesitar cambiar en nuestro código para evitar las restricciones. Esto es algo que exploraremos más a fondo en este módulo. Por ahora, comprenda que las cargas útiles que utilizamos para obtener un shell en un sistema estarán determinadas en gran medida por el sistema operativo, los lenguajes de interpretación del shell e incluso los lenguajes de programación que estén presentes en el objetivo.
No todas las cargas útiles son de una sola línea y se implementan manualmente como las que estudiamos en esta sección. Algunos se generan utilizando marcos de ataque automatizados y se implementan como un ataque preempaquetado/automatizado para obtener un shell. Como en el poderoso Metasploit-framework
, con el que trabajaremos en la siguiente sección.
Última actualización