Skip to main content

¿Qué es un Shellcode?

Shellcode es una secuencia de código de máquina, o instrucciones ejecutables, que se inyecta en la memoria de una computadora con la intención de tomar el control de un programa en ejecución. En dicho ataque, uno de los pasos es obtener el control del contador del programa, que identifica la siguiente instrucción que se ejecutará. El flujo del programa se puede redirigir al código insertado. El código de máquina intrusivo se llama la carga útil del ataque y es el elemento comúnmente referido por el término shellcode. Este método a menudo se ha utilizado para otorgar acceso a un atacante al abrir un shell de comandos del sistema operativo, por lo que los ataques de inyección de código en general se conocen como shellcode.

La vulnerabilidad que se explota generalmente implica cómo un programa asigna memoria, verifica la validez de los datos de entrada y maneja los errores de memoria. Los desarrolladores de software generalmente pueden evitar esta amenaza definiendo estrictamente los datos de entrada y rechazando los valores incorrectos. Si no está marcada, los valores que necesitan más espacio de almacenamiento que la memoria asignada para ese valor podrían ser aceptados. Esto provoca una violación de seguridad llamada desbordamiento de búfer, donde parte de los datos se escriben en ubicaciones de memoria adyacentes al espacio asignado al valor. Cuando se manipula cuidadosamente, esta anomalía puede permitir la introducción de código intrusivo.

Shellcode normalmente se escribe en un lenguaje de programación con acceso al sistema de bajo nivel, como ensamblado, C o C ++. Sin embargo, dependiendo de la vulnerabilidad objetivo, se puede obtener el mismo resultado insertando código para un lenguaje de script interpretado, como PERL, o bytecode para una máquina virtual, como JAVA. El código se puede implantar antes, durante o después del secuestro del contador del programa. Por lo tanto, el código intrusivo puede estar contenido en un archivo en la máquina objetivo o transmitirse a través de una conexión de red en tiempo real.

Los exploits de shellcode locales están diseñados para dar a un atacante el control sobre una máquina a la que tiene acceso físico. Un objetivo en este caso podría ser crear una cuenta con privilegios de administrador, por ejemplo. Del mismo modo, si un proceso en ejecución tiene un alto nivel de privilegio, un exploit exitoso otorgaría temporalmente el mismo nivel de acceso al intruso.

Los procesos que se ejecutan en una máquina remota pueden explotarse utilizando protocolos de red estándar para comunicarse con la computadora de destino. El código de shell de conexión le indica a la máquina de destino que inicie una conexión con la computadora del intruso. Si el intruso inicia la conexión, el código se llama bindshell, ya que intenta tomar el control de una conexión de red llamada puerto en la máquina remota. El método de conexión de retorno se usa más ampliamente, ya que los cortafuegos rara vez prohíben las conexiones salientes.