BlogPython Training

Cómo: Construir un Shell evasivo en Python, Parte 2: Construir el Shell

Bienvenidos a todos. En el artículo anterior, cubrimos las ideas y conceptos de puertos conocidos y explotación de confianza para evadir un firewall. Hoy, construiremos el shell, la parte que recibe comandos, los ejecuta y envía la salida al atacante.

Esta parte de nuestro shell es relativamente simple, pero todavía tenemos algo que debemos cubrir antes de saltar. Usaremos UDP como el protocolo de transporte para mover nuestros comandos y salidas dentro y fuera del shell. Esto es realmente importante, así que expliquemos con un poco más de detalle.

Usar UDP como protocolo de transporte

Es posible que se pregunte: “¿Qué tiene de importante UDP?” O puede que ni siquiera sepa qué es UDP. Bueno, UDP significa Protocolo de datagramas de usuario. Lo especial de UDP es que no tiene conexión. No se requiere conexión para enviar datos con UDP, por lo que es un candidato principal para nuestro shell de evasión.

UDP se comporta drásticamente con respecto a su contraparte de transporte, TCP, que se preocupa por lo que se entrega y retransmitirá si es necesario. Por otro lado, UDP solo transmitirá todo a la vez y no le importa si el destino recibió la transmisión completa. Esto puede hacer que sea un poco difícil trabajar con UDP, pero al final valdrá la pena.

¡Así que vamos a hacer nuestro caparazón ahora!

Paso 1: Configurar la ruta del intérprete e importar módulos

Al crear un script con Python (o cualquier otro lenguaje), lo primero que debemos hacer al crear un script es establecer la ruta del intérprete e importar los módulos que necesitemos en el script. Hagamos esto ahora:

La configuración de la ruta del intérprete le permite al archivo saber dónde se encuentra el intérprete de Python para que podamos ejecutarlo como un ejecutable normal en lugar de un script de Python.

Repasemos rápidamente los módulos que usaremos y su propósito:

  • enchufe – Esto se utilizará para recibir comandos y enviar la salida al atacante.
  • os – Esto se utilizará para ejecutar los comandos y devolver la salida.
  • sys – Esto se utilizará para salir del script, matando el shell.
  • plataforma – Esto se utilizará para recopilar información como el sistema operativo; jugará un papel clave en la creación de un mensaje para el atacante.

Ahora que sabemos lo que hace la ruta del intérprete y para qué sirven nuestros módulos, sigamos adelante.

Paso 2: inicializar la interacción

Vamos a crear una función para inicializar la comunicación con el atacante. Creará el socket y esperará a que el atacante inicie la interacción.

Al usar UDP con sockets de Python, debemos usar el recvfrom () y enviar a() funciones para inicializar correctamente la interacción. El uso de recvfrom () devolverá la dirección de origen y el número de puerto de los datos recibidos. Dado que estamos falsificando nuestra IP, debemos recordar dónde enviar los datos. Esto es perfecto porque podemos almacenar estos valores en sus propias variables para su uso posterior. Sigamos adelante y analicemos esta función:

Aquí puede ver que hemos definido nuestra función como lanzamiento(). Primero, creamos un objeto socket y lo almacenamos en s. Puede ver que este es de hecho un socket UDP ya que usa socket.SOCK_DGRAM.

Luego, el socket se vincula al puerto 80 en todas las interfaces. La vinculación a un puerto conocido disminuirá la probabilidad de que ese molesto firewall sospeche de nosotros.

Luego llamamos a lo discutido anteriormente recvfrom () función. Esto esperará a que los datos provengan de cualquier fuente; Luego extraerá la dirección de origen y los números de puerto de origen y los almacenará en addr y Puerto. Luego enviará una cadena de confirmación de “Hola maestro“de vuelta al atacante: confirmación de que la inicialización se ha realizado correctamente.

Luego devolverá el socket, la dirección y el número de puerto para que podamos usarlos más tarde.

Paso 3: recopile la información del sistema y cree un aviso

Nuestra próxima función recopilará información del sistema y creará un indicador adecuado para que lo use el atacante. Esta función se llamará getsysinfo (). Aquí es donde usaremos nuestro módulo de plataforma, así que echemos un vistazo y desglosémoslo:

Podemos ver arriba que el shell esperará a que el atacante envíe algo antes de construir y enviar el mensaje. Esto es para asegurar que el atacante esté listo para recibir los datos.

Luego usamos os.getuid () para recuperar los permisos del usuario actual. Si el resultado es cero, eso significa que el shell se está ejecutando como root y el indicador debe reflejar esto, por lo que ponemos raíz@ y un signo de libra#) dentro de nuestra lista de solicitudes. Si el usuario es cualquier cosa menos root, simplemente haremos que el mensaje comience con usuario@ y terminar con PS.

Ahora que tenemos nuestros permisos bajos, necesitamos conocer el sistema operativo de la víctima. Aquí es donde entra en juego el módulo de plataforma.

Si llamamos al platform.dist () función fuera del módulo de la plataforma, devolverá una lista con alguna información sobre el host, incluido el nombre del sistema operativo. Insertaremos lo que sea que sea esta cadena entre los dos elementos de nuestra lista. Usaremos el .unirse() para convertirlos en una sola cadena, luego enviaremos esta cadena al atacante.

Paso 4: recibir y ejecutar comandos

Ahora que hemos enviado el mensaje al atacante, necesitamos poder ejecutar comandos. Este es el propósito de esta tercera función, denominada cáscara.

Esta función recibirá comandos del atacante, ejecútelos usando os.popen (), recopile la salida utilizando el .readlines () y enviará esta salida al atacante. Solo hay una cosa sobre esto: si usamos un comando que no nos da ningún resultado, entonces el shell se bloqueará. La mayoría de los comandos seguirán funcionando y no serán un problema, pero hay un comando que es muy importante:CD.

Necesitaremos probar este comando antes de ejecutar el comando recibido. Si el atacante quiere cambiar de directorio, necesitaremos usar el os.chdir () función fuera de la os módulo. Necesitaremos probar este comando cada vez que se reciba un nuevo comando.

Sigamos adelante y echemos un vistazo a nuestro cáscara() función:

Esto puede parecer complicado, pero es realmente simple cuando lo desglosamos.

Primero, ingresamos a un bucle infinito; esto nos permitirá ejecutar comandos todo el tiempo que queramos. Luego configuramos todo dentro de un intentar para detectar cualquier error que se produzca. Si ocurre un error, simplemente enviamos un mensaje de error al atacante e ignoramos el error.

Una vez que recibimos un comando, lo dividimos en cada espacio usando el .separar() método. Luego probamos para ver si el primer elemento de esta lista es la cadena “CD“. Si es así, eliminaremos esta parte de la cadena y llamaremos os.chdir con el resto del comando recibido. ¡Esto nos permitirá cambiar de directorio!

Luego probamos para ver si la cadena “adiós“fue enviado. Si lo fue, enviamos la cadena”Adios amo“y cerrar el socket. Esto será utilizado por el atacante como una forma de terminar el shell.

Finalmente, si el comando recibido no es “CD” o “adiós“Lo ejecutaremos como un comando normal. Almacenaremos el objeto creado llamando os.popen () en una variable llamada proc (abreviatura de proceso), luego definiremos una variable para almacenar la salida en el convenientemente nombrado producción, y usaremos el .readlines () método para almacenar la salida del comando en esta variable. Luego enviamos el nuevo valor de esta cadena de salida al atacante.

Como nota al margen

Es muy recomendable no usar os.popen (). Ha sido reemplazado por subprocess.Popen (). Pero este método de ejecutar comandos tiene muchos problemas al ejecutar comandos que no dan salida, así que nos quedaremos con os.popen () por ahora. Pero recuerda, esto es no recomendado.

Eso es todo para esta parte del caparazón, ahora envuelvamos las cosas, ¿de acuerdo?

Terminando

Hoy, construimos la parte de la víctima de nuestro caparazón de evasión. En el próximo artículo, crearemos la parte de los atacantes, que inicializará la interacción y enviará comandos a la víctima.

Aquí está el Pastebin para el script de la víctima.

Si usted tiene ningún preguntas, déjelas en los comentarios a continuación, y haré todo lo posible para responderlas y aclarar cualquier confusión.

¡Gracias por leer!

-Defaltar

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Mira también
Cerrar
Botón volver arriba
Cerrar