Servidor comprometido por segunda vez, no puede localizar la fuente del ataque

12

Necesito ayuda para rastrear una vulnerabilidad en mi servidor. Por segunda vez, mi servidor se ha visto comprometido con la sustitución de archivos por descargas repletas de virus.

Según las fechas del sistema de archivos, durante un período de 45 minutos, 4 archivos exe de mi servidor fueron reemplazados por versiones renombradas del mismo virus.

Mi servidor web está ejecutando Ubuntu 10.4.3 LTS con la versión del kernel 2.6.32-31-genérico, completamente actualizado y actualizado.

La única forma de acceder al shell es a través de SSH y una clave privada protegida por contraseña que tengo conmigo en una memoria USB. La contraseña de inicio de sesión de SSH está deshabilitada y los registros del servidor (que sé que pueden modificarse, pero tengo buenas razones para creer que no lo han hecho) indican que no se utilizó SSH para iniciar sesión en el servidor.

La pila de software de servicio web es muy complicada. Hay PHP (5.3.3-1) w / Suhosin v0.9.29, nginx 1.0.9 (ahora actualizado a 1.0.10), Tomcat (en una cárcel y sospecho que no está asociado), y MySQL 5.1.41.

Admito que en el momento del primer ataque, me había contentado con alegremente chmod -R 777 mi directorio web con el fin de mitigar el dolor de cabeza. Ahora ejecuto un completo lío de scripts PHP que incluyen, entre otros, WordPress, vBulletin y varios productos hechos en casa; los dos primeros están siempre actualizados y el último ha sido escrito con bastante cuidado para escapar o normalizar cualquier valor ingresado por el usuario.

Dados los permisos de archivos débiles pero el acceso al servidor fuertemente bloqueado, tuve la tentación de sospechar una vulnerabilidad en uno de los muchos scripts PHP que permitían la ejecución de código aleatorio.

Desde entonces he bloqueado completamente los permisos de archivo. nginx / php se ejecutan como www-data: www-data con todos los archivos dados solo ejecutan y leen los permisos ( chmod -R 550 /var/www ).

Sin embargo, hoy, después de todo esto, mi servidor se vio comprometido nuevamente.

El problema es que los archivos que fueron reemplazados aún tienen 550 de permisos, los registros de SSH indican que no hay inicio de sesión y estoy completamente perdido en cuanto a qué hacer o intentar a continuación.

Intenté recrear el ataque en las rutas que fueron reemplazadas por un script PHP muy básico:

$file = fopen('/var/www/mysite.com/path/to/file', 'w');
fwrite($file, 'test');
fclose($file)

Pero eso me dio los permisos apropiados, error denegado.

¿Puede alguien, por favor, indicarme dónde buscar la fuente de esta vulnerabilidad? ¿Me estoy perdiendo algo con mis permisos de archivo?

Sé que ese servidor, una vez comprometido, está prácticamente "desaparecido" para siempre. Pero esa no es realmente una opción aquí. Recursivamente grepped toda mi carpeta / var / log para los nombres de archivos afectados con la esperanza de encontrar algo, pero no surgió nada.

También busqué cualquier script en la carpeta cron o en otro lugar que pudiera haber sido colocado en el momento del primer ataque para atacar nuevamente en una fecha posterior, pero (a) no encontró nada y (b) no debería encontrar cualquier cosa como los archivos en / etc / no son modificables por www-data (asumiendo un punto de infiltración nginx / PHP).

Debo agregar que las dos veces que he greped los registros de acceso nginx (estilo combinado) para los nombres de los archivos infectados, pero no he encontrado nada. Sin embargo, entiendo / me doy cuenta de que existen muchas formas de ocultar los nombres de los archivos de mis greps.

    
pregunta Mahmoud Al-Qudsi 28.11.2011 - 06:47
fuente

6 respuestas

21

Algunas técnicas para tratar de encontrar cómo entró tu atacante:

  1. Observe las marcas de tiempo en cualquier archivo que sepa que el atacante cambió, luego revise todos sus registros para obtener entradas lo más cerca posible de cada marca de tiempo. Como han dicho otros, los registros de acceso web y los registros de errores web son los que tienen más probabilidades de contener la evidencia del vector de ataque original, pero otros archivos de registro también pueden contener pistas. Los registros de errores a menudo contienen las mejores pistas. Los registros de todos los demonios accesibles a través de la red también son buenos lugares para buscar.
  2. También puede valer la pena buscar otros archivos con marcas de tiempo cercanas a las que usted conoce. /etc/passwd es obvio pero incluso los archivos de registro pueden ser sospechosos si tienen una marca de tiempo inusual. Si logrotate se ejecuta a la misma hora todos los días y uno de sus archivos de registro tiene una marca de tiempo que no coincide, esta probablemente fue modificada para cubrir sus huellas, y ahora usted sabe un poco más sobre lo que hizo. No olvide los archivos .bash_history en los directorios de inicio del usuario. el comando find debería poder manejarlo por usted.
  3. Ejecute scalp sobre sus registros de acceso web. El ataque original puede haber ocurrido algún tiempo antes de que aparecieran los archivos. El cuero cabelludo producirá falsos positivos, pero debería reducir las entradas potenciales del registro sospechoso para que usted pueda analizar manualmente las irregularidades. También puede pasar por alto el ataque por completo, no es perfecto, pero puede ayudar.

No gaste demasiado tiempo en análisis forense en el sistema comprometido. Como han señalado otros, el atacante ha tenido la oportunidad de eliminar todas las pruebas del ataque original y agregar un rootkit para ocultar su presencia continua. Si se ha perdido algo o si ni siquiera lo ha intentado, las tareas anteriores pueden funcionar, pero si se ha ocultado bien, entonces estaría perdiendo un tiempo valioso.

Si no encuentra la fuente del ataque, limpie y vuelva a instalar el servidor en cuestión pero con algunas adiciones para atraparlo la próxima vez.

  1. Envíe sus registros a un servidor diferente usando alguna variante de syslog. ( rsyslog y syslog- ng son las opciones recomendadas) Preferiblemente, este servidor no debe hacer nada más que recibir registros y no debe compartir claves de acceso o contraseñas con ningún otro servidor. El objetivo es asegurarse de que sus registros no puedan ser manipulados o eliminados.
  2. Agregue un registro adicional más allá del valor predeterminado. Jeff ya mencionó AppArmor y, dado que está utilizando Ubuntu, esta será probablemente la mejor opción. Asegúrese de que sus registros se envíen al cuadro de registro.
  3. Instale y active el auditoría demonio . Asegúrese de que sus registros se envíen al cuadro de registro.
  4. Ejecute un IDS como Snort, PHP-IDS o mod_security. (o más de una, estas herramientas no hacen exactamente el mismo trabajo) Algunos firewalls de hardware vienen con módulos IDS / IPS. Asegúrese de que los registros de IDS se envíen al cuadro de registro.
  5. Agregue un sistema de monitoreo de integridad de archivos como AIDE o Tripwire . Asegúrese de que los registros de estas herramientas se envíen al cuadro de registro.
  6. Supervisa tus registros. Al no alcanzar un sistema SIEM comercial, algo como Splunk se puede instalar de forma gratuita y puede analizar una cantidad limitada de registros. Configure las reglas para que coincidan con lo que es normal para sus servidores y filtrelas. Lo que queda es digno de una inspección más cercana.

Hay mucho más que puede hacer si tiene tiempo y dinero, como las capturas de paquetes de la red completa, pero en realidad esto es todo lo que puede esperarse que un administrador de sistemas único maneje. Si el atacante aparece de nuevo, será mucho más probable que encuentre el vector de ataque y mucho más probable que lo detecte tan pronto como se realice el ataque.

    
respondido por el Ladadadada 29.11.2011 - 00:56
fuente
6

@Iszi es absolutamente correcto aquí. Necesitas limpiar y reconstruir completamente, ya que un buen rootkit evitará que veas cualquier evidencia de su existencia.

De lo contrario, existe una gran probabilidad de que cualquier cosa que hagas ahora no tenga sentido. En cualquier caso, ya no puede confiar en el servidor.

    
respondido por el Rory Alsop 28.11.2011 - 10:56
fuente
6

Muhammad, en algunos casos vi que el ataque fue realizado por un bot que explotó una vulnerabilidad en el sistema (generalmente PhpMyAdmin) y cargó archivos en el servidor (principalmente / tmp). Lo que sucede es que esos archivos permanecen allí y el administrador no se dará cuenta hasta que el atacante revise sus registros de bot y comience a desarrollar el primer compromiso.

Es bastante posible que se haya explotado una vulnerabilidad en PhpMyAdmin o vBulletin o algún script que esté utilizando. Más adelante, actualizó la aplicación vulnerable, pero el compromiso ya ocurrió.

Si no hace una reconstrucción, lo que sucede es que los archivos dejados por el atacante se utilizaron para comprometer su sistema, nuevamente. Instalar OSSEC en su sistema y monitorear archivos / carpetas críticos lo ayudará a detectar dicha actividad y le permitirá tomar medidas más rápidamente.

    
respondido por el Bassec 29.11.2011 - 00:48
fuente
5

Solo para agregar un par de pensamientos a los comentarios ya proporcionados. Como dice @symcbean, el código de terceros es una fuente probable de problemas.

Si tuviera que arriesgarme a adivinar, consideraría que la aplicación de Wordpress y los complementos asociados son una fuente probable de su compromiso. Ha habido una gran cantidad de problemas de seguridad descubiertos recientemente en los complementos de Wordpress y muchos de ellos están siendo explotados activamente, por lo que si tiene eso instalado y no está actualizado al 100%, podría tener problemas.

En términos de abordar la parte de Wordpress de su problema, puede consultar wpscan , que es un escáner de seguridad de wordpress y también el complemento de wordpress seguro

    
respondido por el Rоry McCune 28.11.2011 - 12:18
fuente
4
  

Se reemplazaron 4 archivos exe en mi servidor con versiones renombradas del mismo virus ... Mi servidor web ejecuta Ubuntu 10.4.3

Implica que ya tienes la funcionalidad de carga de archivos en tu servidor, lo que sería un buen lugar para comenzar a buscar agujeros.

  

Sé que ese servidor, una vez comprometido, está prácticamente "desaparecido" para siempre

No es así. Si realiza los preparativos adecuados, siempre es posible devolver el sistema a un estado conocido (IDS basado en host y copias de seguridad). Pero incluso entonces no elimina la vulnerabilidad original. Pero eliminaría cualquier puerta trasera adicional instalada.

  

incluyendo pero no limitado a WordPress, vBulletin y varios productos hechos en casa

OMG. Solo porque alguien más lo escribió no significa que sea seguro. El hecho de que sea de código abierto no significa que sea seguro. Incluso si tiene las habilidades para auditar el código correctamente, la base del código de Wordpress es enorme, y vbulletin también es grande. Esta será una gran tarea. Además, tanto Wordpress como vbulleting (IRC) admiten complementos de terceros, que a menudo son de una calidad mucho peor que los productos principales.

Si estuvieras ejecutando apache, sugeriría usar mod_security para intentar identificar el vector de ataque. Pero incluso con un nivel de carga bastante alto, debería poder reconciliar el mtime en el archivo con el registro de acceso (como ha descubierto, mirar los nombres de los archivos es una pérdida de tiempo).

    
respondido por el symcbean 28.11.2011 - 12:06
fuente
4

Generalmente, cuando las personas dicen que no pueden darse el lujo de borrar un servidor, significan que el tiempo para restablecer la configuración será demasiado. Sin embargo, hay una manera de hacer esto y no tener que encontrar la vulnerabilidad de inmediato, aunque debe reemplazar los archivos comprometidos. Sugiero implementar la seguridad antes de exponer sus archivos limpios a Internet. Lo que los rompió una vez los romperá de nuevo.

Los siguientes pasos están centrados en Debian (no dijiste cuál tenías, así que tomé mis propias preferencias), pero también puedes realizarlos en los sistemas de Red Hat. En un sistema basado en Red Hat, puede ser más fácil sustituir las sugerencias de AppArmor con la configuración de SELinux correspondiente. Cambie "dpkg" a los comandos "yum" que coincidan.

  • Cree un nuevo sistema utilizando los paquetes que ya tiene instalados. dpkg --get-selections le dará una lista que se puede enviar al nuevo sistema usando dpkg --set-selections .

  • Configure apparmor para restringir en gran medida nginx y cualquier otro daemons (Tomcat, etc.) que use. Permitir la lectura únicamente de los archivos de configuración y páginas web. Es posible que algunas escrituras deban estar habilitadas en el directorio web dependiendo de lo que esté haciendo. Asegúrese de que su configuración obligue a los procesos secundarios a heredar las restricciones de Apache.

  • Copia todo lo demás.

Preste mucha atención a sus registros de AppArmor. Cuando vea que Apache intenta violar sus permisos, puede correlacionar eso con sus registros de acceso / error HTTP y determinar qué es lo que está mal.

También, voy a declarar que establecer controles de acceso obligatorios alrededor de cualquier daemon es una mejor práctica moderna y esperada. Tenga en cuenta que esto no justifica dejar la vulnerabilidad sin parchear. La defensa en profundidad es ayudar a detectar fallas, no a cambiar completamente la carga. Además, tenga en cuenta la idea de que su servidor puede estar comprometiendo a los visitantes de su sitio.

    
respondido por el Jeff Ferland 28.11.2011 - 16:53
fuente

Lea otras preguntas en las etiquetas