Mostrando entradas con la etiqueta GNU. Mostrar todas las entradas
Mostrando entradas con la etiqueta GNU. Mostrar todas las entradas

viernes, junio 13, 2025

LLM as Hackers: Autonomus Linux Privilege Escalation Attacks con Agentes AI

Hay un paper del año pasado del que no había hablado por aquí en el blog, pero que tenía guardado. He podio verlo esta semana, y está curioso el trabajo, aunque creo que los resultados, con un arquitectura de Agentic AI basado en MCPs probablemente diera mejores resultados, aún así la premisa es evaluar cómo funcionan los diferentes LLMs para hacer Elevación de Privilegios en entornos GNU/LINUX usando diferentes ataques sobre diferentes escenarios.

El paper, titulado "LLM as Hackers: Autonomus Linux Privilege Escalation Attacks" plantea un total de doce escenarios vulnerables donde se van a evaluar los diferentes modelos LLMs, hoy en día ya totalmente desactualizados con los nuevos modelos de Deep Reasoning.

En el planteamiento de la investigación es ver cómo se desempeñan los diferentes modelos LLama3 70B, SLMs y diferentes versiones de GPT-3.5-Turbo y GPT-4 Turbo, para que puedan ser corridos en local, y con poca ventana de contexto para lo que tenemos hoy en día. Casi com para poder llevar en una máquina de esas que llevan los pentesters en su mochila.

Figura 3:  Las vulnerabilidades de use-after-free se explican en detalle
en el libro de Linux Exploiting de la editorial 0xWord.
Consíguelo con Tempos de MyPublicInbox.

Los doce escenarios están basados en entornos creados para hacer los benchmarks de las herramientas - y en este caso de los LLMs -, donde como podéis ver, cada uno tiene que ser explotado con una técnica de Elevación de Privilegios diferente.
Como es normal, hemos publicado muchas veces artículos sobre Elevación de Privilegios en GNU/Linux utilizando diferentes técnicas, que son las que tienen que encontrar y explotar los LLMs. Os dejo por aquí los artículos sobre este tema que hemos publicado en el blog:
Para resolver estos escenarios los investigadores han creado una arquitectura de Agente de IA tal y como podéis ver a continuación. El agente, que se llama wintermute es el que recibe el comando del LLM con la llamada de "next-command" y le da los resultados con el Prompt de "update-state".
Para decidir el siguiente comando, el motor LLM tiene una base de datos con la historia del proceso completo, una base de datos con el "State" que son los "Facts" o hechos descubiertos hasta el momento, además de contar con una "pista" estática que puede meterse en la base de datos de "Guidance" que usa el pentester para guiar al agente.
Los Prompts de next-command y update-state son los que tenéis en la Figura 6 y Figura 7 respectivamente, donde como veis es bastante sencillo. No utiliza una capa intermedia de abstracción para configurar los comandos, como se hace con los MCP (Model Context Protocol) o como hacía el paper de ataques de redes de forma autónoma, donde se usaba la capa de Incalmo.
Sobre esta arquitectura, cada uno de los modelos va enviando los comandos, donde pueden dar problemas, ser irrelevantes, o simplemente estar mal escritos - que es uno de los problemas que se reduce drásticamente con las capas de abstracción -. 
Y el resultado final lo tenéis en la siguiente tabla, donde están todas las combinaciones entre escenarios y modelos, con o sin "hint" (pista), donde se puede ver qué modelo funcionó mejor resolviendo estos retos. Nada que no os podáis imaginar.
Mirando la tabla se puede ver que algunos modelos funcionan bastante mal con esta arquitectura, como el caso de Llama3 o GPT-3.5-turbo, pero GPT-4-turbo alcanza la resolución en una de las pruebas del 83% de los retos, lo que es muy prometedor. 

Conclusión

De nuevo, con los modelos de más avanzadas de Deep Reasoning de hoy en día, y usando una arquitectura con capa de abstracción, podemos estar casi seguros de que un Agentic AI construido para hacer estas funciones podría resolver el 100% de los escenarios o estar muy cerca de ellos. Tened en cuenta los resultados que obtuvieron los Agentic AI en los CTF que os publiqué la semana pasada. 

Figura 10: "The Art of Pentesting" El libro de Pablo González
 en 0xWord para formarse como pentester.

Sin embargo, me ha parecido interesante dedicarle una entrada a este paper, para que veáis de qué forma tan sencilla se puede hacer un Agentic AI para casi cualquier tarea. Con un par de Prompts y unas bases de datos de información está listo. Si ya le metes una arquitectura RAG con writeups de hacking, blogs que hablen de hacking - como éste - y herramientas conectadas con capas de abstracción como MCPs... seguro que podéis crear vosotros mismos agentes para casi todo.

¡Saludos Malignos!

Autor: Chema Alonso (Contactar con Chema Alonso)  


lunes, enero 27, 2025

El poder de la formación: Cómo crear una herramienta de escaneo para GNU/Linux

El aprendizaje teórico es solo el inicio, el verdadero valor de la formación en ciberseguridad se alcanza cuando llevamos ese conocimiento a la práctica, adaptándolo a problemas reales del mundo tecnológico. Y los Trabajos de Fin de Curso/Carrera (TFC), Trabajos de Fin de Grado (TFG), o como hoy, un Trabajo de Fin de Máster (TFM) del Máster de Fundamentos de Ciberseguridad del Campus Internacional de Ciberseguridad, son una oportunidad fantástica.

Figura 1: El poder de la formación. Cómo crear
una herramienta de escaneo para GNU/Linux

En mi caso particular he aprovechado todos esos trabajos para avanzar las investigaciones que estaba llevando a cabo, y usarlos en mi vida personal. Mi Trabajo de Fin de Carrera de la Ingeniería Técnica de Informática de Sistemas en la UPM fue la implementación nLog(n) de un algoritmo para calcular de un par de puntos de una nube dada. En el Trabajo de Fin de Grado de la Ingeniería de Informática en la URJC se lo dediqué a las técnicas de Time-Based Blind SQL Injection Using Heavy Querys y el Trabajo de Fin de Máster de mi Máster en Tecnologías de la Información y Sistemas Informáticos de la URJC a las técnicas de LDAP Injection y Blind LDAP Injection.


Todos ellos me sirvieron profesional para mucho, pero también para luego hacer mi Doctorado con el análisis y modelado de algoritmos para detectar ataques explotados a ciegas, que aunaba y recolectaba todo el trabajo que había hecho antes. Cuando haces una formación, lo importante no es el título, sino el aprovechamiento que sacas de ella, y yo os garantizo que he aprovechado todos los trabajos para hacer cosas chulas. Y por eso hoy quiero compartir con vosotros el TFM de Víctor Laguna Bandrés, alumno de la primera edición del Máster en Fundamentos de Ciberseguridad del Campus Internacional de Ciberseguridad.


Este máster es para personas que empiezan desde cero, así que su proyecto era un desafío clave para él y algo fundamental en el ámbito de la seguridad de sistemas GNU/Linux. En este caso la creación de una herramienta propia para escanear y analizar la arquitectura de máquinas GNU/Linux. Este proyecto era para no sólo demostrar su capacidad técnica, sino también de visión, ya que un buen profesional de ciberseguridad puede y muy a menudo tiene que crear soluciones nuevas que mejoren la herramientas de seguridad con las que se cuenta.

El reto del escaneo en arquitecturas GNU/Linux

Las arquitecturas GNU/Linux se han convertido en uno de los sistemas operativos más utilizados tanto en entornos empresariales con en Internet como en servidores de muchos de los servicios digitales que se consumen o publican en la red.

A medida que las amenazas evolucionan, la capacidad de evaluar la seguridad de estos sistemas en tiempo real también debe hacerlo. El escaneo de arquitecturas GNU/Linux es crucial para detectar vulnerabilidades, identificar brechas de seguridad y proteger las infraestructuras.

Por supuesto, existen infinidad de herramientas, y algunas de ellas muy conocidas para estas tareas como Nmap, OpenVAS y Lynis, que realizan escaneos para detectar vulnerabilidades y mejorar la seguridad de las máquinas GNU/Linux.

Sin embargo, a pesar de la eficacia de estas soluciones, con este proyecto se quería unificar las funcionalidades más potentes de estas herramientas en una única plataforma que permita personalizar los escaneos en función de las necesidades específicas de cada entorno.

El TFM: Creación de una herramienta de escaneo de arquitecturas GNU/Linux

El objetivo del TFM de Víctor Laguna Bandrés era desarrollar una herramienta integral para el escaneo de arquitecturas en máquinas GNU/Linux, utilizando las mejores características de las herramientas existentes, pero combinadas en un solo sistema y adaptadas a las necesidades de proyectos futuros. A continuación, destaco algunos de los aspectos técnicos del trabajo:
  • Selección de la tecnología adecuada: Este trabajo se realizo en Python debido a su versatilidad, facilidad de implementación y capacidad de escalabilidad. Esta elección permite diseñar una herramienta flexible que pueda ajustarse a diferentes requisitos de escaneo y adaptarse fácilmente a futuros desarrollos.
Figura 4: Libros de Python para Pentesters y Hacking con Python
de Daniel Echeverri publicados en 0xWord.
  • Escaneo de características de fortificación: La herramienta realiza un análisis exhaustivo de diversas características críticas en la fortificación de cualquier máquina GNU/Linux. Esto incluye la obtención de información sobre usuarios y grupos (pwd y grp), la verificación de permisos en directorios sensibles (os.stat()), y la identificación de módulos y drivers cargados en el sistema mediante lsmod y modinfo. Además, se escanea la versión del Kernel para detectar vulnerabilidades conocidas a través de /proc/version.
Figura 5: El TFM está hecho en python3
  • Red y dispositivos conectados: En este trabajo se implementa un escaneo de red utilizando herramientas como ifconfig, netstat y lsof, y también se realiza una identificación de puertos abiertos y dispositivos conectados. Esto se complementó con un análisis de las configuraciones de la red y las interfaces de acceso mediante sockets en Python.
Figura 6: Fichero main.py
  • Escaneo de recursos y configuración del sistema: La herramienta permite evaluar el uso de recursos como la memoria RAM, los discos duros y la configuración del cortafuegos. Utiliza psutil para obtener datos sobre el sistema, garantizando que los recursos estén configurados de manera segura.
Conclusiones del TFM

Este TFM no sólo está enfocado en demostrar conocimientos para dar una solución técnica que puede ser requerida en un puesto profesional de ciberseguridad en un momento dado, sino también una visión pragmática sobre cómo mejorar la seguridad de un sistema GNU/Linux de una manera práctica y útil para una empresa en un momento dado. La herramienta creada no es solo un ejercicio académico; es una solución práctica que puede ser utilizada para reforzar la seguridad en entornos reales como lo haría cualquier profesional de ciberseguridad.


Lo que se busca con estos proyectos, es que los alumnos de un Máster en Fundamentos de Ciberseguridad del Campus Internacional de Ciberseguridad cuando hagan el TFM lo hagan pensando en su futuro como profesionales de ciberseguridad, y en este caso concreto, en cómo su herramienta se puede seguir adaptando y mejorando con el tiempo, lo que refleja lo que se busca con esta formación, que es preparar a los estudiantes no sólo para enfrentar los retos de ciberseguridad de hoy, sino para anticiparse a los del mañana.

¿Qué aporta el Máster en Fundamentos de Ciberseguridad?

El TFM de Víctor Laguna Bandrés no es por casualidad, el Máster en Fundamentos de Ciberseguridad del Campus Internacional de Ciberseguridad ofrece una formación integral en los pilares de la seguridad informática, brindando a los alumnos las herramientas necesarias para desarrollar proyectos técnicos como el de hoy comenzando desde cero, para que lo puedan aplicar en una carrera profesional en ciberseguridad.


Además, con un enfoque netamente práctico, este máster permite a los estudiantes enfrentarse a problemas reales del trabajo en cibeseguridad y construir soluciones que marquen la diferencia. Si estás interesado en iniciarte en el apasionante mundo de la ciberseguridad pero empiezas casi desde cero, el Máster en Fundamentos de Ciberseguridad del Campus Internacional de Ciberseguridad te proporciona una base sólida, impartida por profesionales de reconocido prestigio, y con el respaldo de una escuela de negocios líder en el sector.

Si quieres adquirir los conocimientos y habilidades para proteger sistemas críticos y desarrollar proyectos innovadores en ciberseguridad, puedes reservar una de las plazas que quedan libres en la 7º edición del Máster en Fundamentos de Ciberseguridad que comienza elpróximo 25 de marzo y formar parte de una comunidad de expertos que están construyendo su futuro en el mundo profesional de la seguridad informática.


¡Saludos Malignos!

Autor: Chema Alonso (Contactar con Chema Alonso)  


martes, enero 21, 2025

LinPEAS versus IA: Cómo usar un Copilot para escalar privilegios en GNU/Linux

Cuando uno se enfrenta al proceso de escalada de privilegios en sistemas GNU/LinuxLinPEAS es una de las herramientas obligatorias para mí. Me gusta por muchos motivos, pero sobre todo por toda la información que nos proporciona y que facilita el encontrar vectores de actuación. Cuando uno está empezando, entender toda la información que verifica y que nos muestra LinPEAS no es sencillo.

Figura 1: LinPEAS versus IA - Cómo usar un Copilot
para escalar privilegios en GNU/Linux

Hay que echarle tiempo y entender todo lo que la herramienta nos está diciendo. Lo más recomendable es entender todo lo que hace “por debajo” y poder usarla para optimizar el tiempo, encontrando un vector o varios que nos puedan llevar a la escalada en un pentest.

En este artículo se enseñará cómo LinPEAS ayuda a identificar vectores potenciales para lograr la escalada en un sistema GNU/Linux y cómo la IA también puede ayudarnos siendo el ayudante operativo que nos ayude a procesar gran cantidad de información. 

ç 3: "The Art of Pentesting" El nuevo libro de
0xWord para formarse como pentester

Lo ideal es que utilicemos un modelo privado (en local) por temas de que si fuera un pentest real los datos son críticos. Como esto es una demostración, utilizaremos a ChatGPT (y aprovecharemos su potencial). Para el ejemplo, partiremos del siguiente escenario. Vamos allá.
  • Tenemos una máquina con dos configuraciones diferentes.
  • En la primera configuración, tenemos dos errores que provocarán la escalada de privilegio. Partiendo de un usuario, por ejemplo, ‘pepito’ el cual no es un sudoer, ni tiene privilegio de nada en el sistema. Deberemos pasar al usuario ‘pablo’, el cual sí es un sudoer. Posteriormente, deberemos pasar a root.
  • En la segunda configuración pasaremos del usuario ‘pablo’ a root, pero ¿Qué técnicas deberemos utilizar en cada una de las configuraciones?
  • El objetivo del ejercicio es ver cómo LinPEAS nos ayuda y cómo un modelo de IA fundacional (y mejor si está especializado en este campo) nos pueden guiar. Incluso, podemos utilizar herramientas clásicas y comprenderlas mejor con el modelo de IA.
Escenario 1: LinPEAS from scratch

En este escenario partimos de que tenemos una shell remota, la cual se puede haber obtenido a través de una explotación remotamente. Ahora, identificamos privilegios en el sistema y se ve que el usuario no pertenece a ningún grupo con privilegio en el sistema. Todo esto, realmente, lo va a poder realizar LinPEAS, por lo que voy a lanzar LinPEAS en el sistema. 

Figura 4: Ejecución de LinPEAS

Ejecutamos a través de la shell remota el siguiente comando:

curl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh.

Ahora, toca analizar los resultados que desprende el uso de la herramienta. Lo primero de todo es tener claro la leyenda que nos proporciona LinPEAS. Se puede ver como un RED/YELLOW proporciona un vector de escalada con una probabilidad alta. Los valores en rojo, tal como se ve en la imagen, también hay que tenerlos en cuenta y analizarlos, ya que pueden ayudar a la escalada.

Figura 5: Posibles Vectores de Escalada

Una de las primeras cosas que se enseña que hay que revisar en la escalada son las versiones de las aplicaciones con privilegio, revisar los hotfix instalados y revisar versiones de kernel. Como se puede ver en la imagen, LinPEAS hace uso de una enumeración y análisis para poder identificar posibles vulnerabilidades. Para ello hace uso de Linux Exploit Suggester (hay que recordar también su versión en Windows, llamada Windows Exploit Suggester) y muestra una serie de resultados de la posibilidad de que haya encontrado un vector de explotación.


La salida es muy larga, por lo que no se puede mostrar todo (recomendado probarlo en vuestro laboratorio). Siguiendo hacia abajo se puede encontrar una serie de datos interesantes: son ficheros relacionados con SSH. Una clave pública (y la privada también estaba en el sistema), el fichero de equipos conocidos (es decir, las máquinas a las que se ha conectado el usuario ‘pepito’ (o nopriv) y el fichero de claves autorizadas.

En este caso, se puede ver un dato curioso el valor de authorized_keys del usuario ‘pablo’ es el mismo que el de la clave pública del usuario ‘pepito’. No nos lo dice LinPEAS, pero se puede relacionar viendo el valor de los ficheros. Esto quiere decir que, muy probablemente, el usuario ‘pepito’ puede hacer login como usuario ‘pablo’ a través del uso de clave pública (y la clave privada se encuentra en el home de ‘pepito’.

Figura 7: Claves ssh

Justamente, si seguimos un poco más abajo en la salida de LinPEAS encontramos esto. En efecto, la clave privada se encuentra disponible. El pentester podría llevarse la clave privada a su equipo e intentar acceder como el usuario ‘pablo’ (sin conocer la credencial de éste, ya que la autenticación se realizará por clave pública).

Figura 8: Posibles claves privadas encontradas

En un movimiento un tanto extraño, se puede identificar que el usuario ‘pepito’ (o nopriv en la máquina) puede autenticarse como el usuario ‘pablo’. ¿Será algún tipo de escalada? También LinPEAS nos vuelva toda la información de usuarios y grupos y se puede ver que ‘pablo’ es un usuario de tipo sudoer, por lo que respecto al usuario ‘pepito’ sí hay una escalada (sin llegar a ser root).

Una vez que somos ‘pablo’ a través de una conexión local de SSH (como decía un tanto raro) hay que seguir analizando con LinPEAS. La herramienta marca que el usuario pablo pertenece al grupo sudo. Esto hace pensar que habrá que configurar la configuración de éste.

Figura 10: Usuario pablo en el grupo sudo

En la revisión de la configuración de sudo se puede encontrar la etiqueta NOPASSWD, algo no recomendado de configurar. Se puede ejecutar como sudo y sin contraseña 3 scripts. Esto, a priori, puede no suponer mucho, habrá que estudiar si se puede hacer algo con esos scripts.

Figura 11: Se pueden ejecutar 3 scripts sin password

Por un lado, la etiqueta NOPASSWD sobre 3 scripts y después, LinPEAS, indica que el script /usr/local/bin/echo.sh tiene permisos de escritura para otros usuarios, es decir, podremos modificar el contenido de dicho fichero (o sobrescribirlo completamente). A partir de aquí, se puede ejecutar como sudo y colocando, por ejemplo, una llamada de netcat desde el propio script a un listener que tengamos nosotros y conseguir ser root

Figura 12: Script echo.sh con permiso de escritura

Analizando en la siguiente configuración con LinPEAS podemos encontrar algunas cosas interesantes: el bit SUID activo sobre algún binario que no debiera, tareas programadas con permisos débiles, un posible path hijacking, etcétera. LinPEAS nos da mucha información y proporciona un gran número de chequeos, los cuales hay que podar y quedarse con la información de interés.

Figura 13: Más posibles vectores de explotación

En la imagen, se puede la evaluación del bit SUID y como se encuentra un binario interesante. Por otro lado, se recomienda utilizar el proyecto GTFOBins con el que se puede obtener mucha información de los binarios y de los vectores de escalada que se pueden utilizar.

Figura 14: Tareas ejecutadas en el cron como root

Otro punto débil es el cron. Tareas ejecutadas cada minuto como root. Hay que revisar el fichero /deploy.sh.

Escenario 2: El modelo como ayudante de pentester

Ahora, el segundo escenario consiste en dos cosas:
  • Evaluar la información que recopila LinPEAS y mostrar las capacidades de un modelo como copiloto.
  • Ir desgranando el proceso paso a paso e ir ayudándote del modelo con pequeños trozos de información.
Éstas serían las dos primeras aproximaciones que se pueden llevar a cabo. Para empezar, volcaremos la información sobre el modelo (todo lo que ha recopilado LinPEAS) y le diremos que analice y que nos diga que encuentra. La verdad es que devuelve mucha información. Hay que fijarse que en el punto 4 (de los 10 que nos saca) nos habla de las claves SSH (siempre son un punto a tener en cuenta). De momento es una aproximación y el modelo da algunas pautas y un análisis un poco más superficial de lo que se ha ido encontrando con LinPEAS.

Figura 15: Analizando la salida de LinPEAS

Ahora, le pedimos que haga un análisis del componente de las claves SSH y ficheros relacionados. El resultado nos indica que la clave pública id_rsa.pub y authorized_keys son idénticas y nos sugiere que la clave pública permite al usuario ‘pepito’ (en la máquina usuario ‘nopriv’) autenticarse en el sistema como usuario ‘pablo’ sin necesidad de contraseña. El análisis es correcto por parte del modelo.

También se realiza un análisis de la seguridad de las claves utilizadas en la máquina. Y por último, nos indica el modelo que si la clave privada id_rsa está comprometida (y lo está, ya que tenemos acceso) se puede utilizar para autenticarse en el mismo sistema, por SSH, como el usuario ‘pablo’.

Figura 16:  Análisis del problema de las claves

Este es un buen ejemplo de lo que es un copiloto o ayudante en ciberseguridad y en este caso en pentesting. Ahora, se le indica al modelo que analice toda la salida generada por LinPEAS y el resultado nos indica muchas cosas:

1.- Nos analiza lo que se puede ejecutar con sudo sin contraseña (evalúa la etiqueta NOPASSWD). Además, nos indica que echo.sh es escribible, por lo que nos da un ejemplo de como conseguir una shell con privilegio de root (dicha técnica funcionaría en este ejemplo).

Figura 17: Ejecuciones con sudo sin contraseña

2.- Detecta que el fichero /etc/passwd es escribible, por lo que se puede añadir un usuario al sistema con el UID y GID de 0, siendo root en el sistema.

Figura 18: Fichero /etc/passwd con permisos de escritura


3.- Evalúa ficheros con SUID activo e indica cuál cree que puede ser utilizado. Nos pone en el camino. Aquí es recomendable que el pentester revise junto al proyecto GTFOBins comentado anteriormente. Todo lo que el modelo nos dice tenemos que tratarlo de la forma adecuada. Son ayudas de un ayudante, la palabra final es nuestra como especialistas.

Figura 19: Ficheros con SUID activado

4.-Evalúa el crontab. Nos indica una posibilidad para escalar, siempre y cuando /deploy.sh se pueda modificar. El modelo no tiene información sobre los permisos del fichero deploy.sh, por lo que no puede indicarnos más, pero nos deja el vector marcado.

Figura 20: Análisis del crontab

5.- Aquí está de nuevo el caso de las claves SSH y los ficheros relacionados. Lo explica de nuevo bastante claro, aunque este caso, quizá lo explicó mejor cuando le preguntamos concretamente sobre ello.

Figura 21: Análisis de las claves SSH

Esto es el contexto híbrido. Trabajo como especialista y me ayudo de un ayudante que la IA me proporciona. Importante, hay que tener en cuenta que en muchos campos será necesario utilizar modelos locales que aporten privacidad a los datos manejados. Esto será fundamental, para que los copilotos y ayudantes estén en el día a día de los profesionales de la ciberseguridad. Esto es solo un ejemplo, de lo que puede ayudarnos un modelo, donde no pretendemos que nos haga todo, si no que nos de puntos de vista y ayude en lo que pueda.

Moraleja 

El contexto híbrido y la incursión de la IA en ciertos procesos de la ciberseguridad es obvio. Además, el concepto de copiloto o ayudante será cada vez más utilizado para que entendamos que podemos valernos de estos sistemas que harán nuestro trabajo más eficiente.

Saludos,

martes, septiembre 10, 2024

Cómo crear un volcado de procesos en GNU/Linux y buscar "leaks" de información

Hacía tiempo que no pasaba por aquí para poder escribir sobre inquietudes tecnológicas o pequeñas pruebas de concepto que pueden surgir en el día a día. Todos conocemos diferentes herramientas de volcado de procesos de memoria. Por ejemplo, Volatility, que es una de mis favoritas por todo lo que ofrece y aporta en el análisis de un volcado de memoria.

Figura 1: Cómo crear un volcado de procesos en GNU/Linux
y buscar "leaks" de información con Volatility

Volatility no es la única herramienta que se tiene, se tienen otras muchas que aportan en mayor o menor medida diferentes posibilidades, otra opción es gcore. Revisando un poco lo que ofrece /proc en los sistemas GNU/Linux se pueden sacar muchas cosas interesantes. Entre ellas, se puede leer directamente de la memoria de un proceso. Casi como si fuera un fichero. No exactamente como en un fichero, pero le estuve dando vueltas. Al final es una forma sencilla de poder leer qué información hay dentro de un proceso.

Figura 2: Linux Exploiting

Se sabe que, en un proceso, hay elementos que están compartidos con otros procesos. Se sabe que hay páginas de memoria que tienen ciertos permisos y otras otros. Aquí es donde hablamos de lectura, escritura, ejecución. Decidí revisar más sobre este tema y preparar una pequeña prueba de concepto con Bash (un ejemplo de lo que se puede hacer con este lenguaje en GNU/Linux).

Gestión del memoria en sistemas GNU/Linux   

Antes de hablar de la prueba de concepto, vamos a pararos a estudiar un poco sobre /proc y lo que ofrece en términos de información sobre los procesos. Sabemos que /proc es un directorio especial, ya que almacena información sobre elementos volátiles (como es la memoria). Lo primero que nos puede llamar la atención es que si hago un ls sobre el directorio podremos visualizar un montón de “carpetas” con números. Estas carpetas son el ID de los procesos que hay en ejecución en la máquina.

Figura 3: /proc en GNU/Linux

¿Qué información se puede sacar de la memoria de un proceso? Cualquier cosa que esté ahí y no esté protegida (y mucha no lo estará). Para esta pequeña prueba de concepto vamos a abrir un mousepad (el bloc de notas al uso en GNU/Linux) y vamos a introducir algo de texto. Todo lo que se escribe debe estar en memoria. De eso no hay duda. Hay que recordar que la memoria es un elemento volátil, por lo que puede pasar que esté, pero con el tiempo no lo esté. En este caso, el proceso del mousepad recibe el PID 2477 por parte del sistema operativo. Vamos a acceder al directorio de /proc/2477, que es el que corresponde al proceso que hemos ejecutado.

Figura 4: /Proc/2477

Aquí encontramos bastante información interesante sobre el proceso, que nos daría para otro artículo, pero vamos a centrarnos en mem y en maps. El fichero mem nos dará acceso directo a la lectura del proceso en memoria, en crudo. Por otro lado, el fichero maps almacena todas las direcciones de lo que hay cargado en memoria sobre el proceso y nos indica las direcciones base y el offset de las páginas. Vamos a revisar un poco el fichero maps:

Figura 5: Cat maps

En este fichero, se puede ver en primer lugar la dirección de memoria dónde comienza y después del guión la dirección dónde finaliza. Esto es un ejemplo, no es todo lo que tiene en memoria el proceso mousepad que hemos ejecutado. Se puede ver dónde comienza la zona de heap (más abajo veríamos la stack), alguna librería cargada, etcétera. Se pueden ver fácilmente los permisos que existen y si son elementos compartidos. 
Este fichero da mucho juego si quieres recorrer la memoria de un proceso buscando información en diferentes zonas de la memoria. Bien, ahora vamos a ver el fichero mem. Si hacemos un cat mem, esto no va a funcionar, ya que es algo especial (y muy cambiable). Si se quiere leer de este fichero, se debe utilizar la herramienta dd para poder hacer una copia de un flujo de bytes. Para ello, se debe ejecutar la siguiente instrucción:

dd if=/proc/PID/mem bs=BLOCK_SIZE skip=$((DIRECCION_BASE))

 count=$((DIRECCION_TOPE – DIRECCON_BASE))

Con esto, copiamos desde la dirección que se le diga (saltamos a esa posición en memoria) y leeremos lo que indique count, que será la resta entre el tope de la página y el inicio. Si probamos a ejecutarlo, esto devolverá un gran flujo de bytes, la mayoría binario que no se podrá imprimir (ni leer). Aquí es donde empezará a tener sentido utilizar un binario como strings para poder filtrar entre lo que es imprimible y lo que no.

Figura 7: Volcado e impresión de bytes

Si aplicamos a esta salida el comando strings, la cosa cambiará mucho, tal y como se puede ver en la imagen, ya que eliminamos lo que no podemos entender de primeras y dejaremos lo que se puede analizar (strings).

Figura 8:  Strings

Para automatizar un poco todo, ya que recorrer el fichero maps a mano puede ser eterno, debido a todas las librerías y zonas de memoria que hay que recorrer en un proceso, pensé en hacer un pequeño script en Bash a modo de prueba (se puede crear una herramienta fácilmente, aunque ya hay algunas escritas en Python bastante interesantes).
El pseudocódigo del script es el siguiente:

Mientras haya líneas que leer en el fichero maps del proceso PID
Hacer
Obtengo dirección base
Obtengo dirección tope
Ejecuto dd para leer de memoria saltando a dirección base y con un count de la resta de tope y base
Aplico filtro de strings
Aplico filtro de elementos que estoy buscando
Fin_Hacer

Para verlo codificado en Bash os dejo la imagen. Es una PoC, muy PoC, ya que ni el PID se le pasa como argumento al script, ni hay un control mínimo de argumentos, pero queda claro que se puede automatizar.

Figura 10:  PoC en Bash

Puede ser interesante detener un proceso antes de hacer la lectura (no se ha dicho, pero lógicamente podrás leer procesos sobre los que tienes privilegios) de la memoria. Para esto se puede ejecutar un kill -SIGSTOP PID, mientras que para volver a ponerlo en marcha hay que ejecutar kill -SIGCONT PID. Hay un detalle en el script y es que hay que ponerle el “0x” a las direcciones que se leen desde el fichero maps, ya que se operará con ellas y debemos convertirlas en hexadecimal. 
En la imagen, se puede ver un ejemplo a mano de la búsqueda de la palabra “user:”. Con el script automatizamos este proceso y logramos buscarlo en cada zona o, incluso, para todos los procesos sobre los que tenemos privilegio.

Figura 12:  Búsqueda a mano de "user"

Con esto, llegamos al final del artículo. Lo mejor es poder entender cómo funciona la memoria y cómo poder leer sobre ella en busca de información jugosa en un Ethical Hacking. ¿Sería sencillo incorporarlo a nuestra mochila de pentester? Sí y, además, tiene un valor añadido como herramienta de post-explotación.

Entrada destacada

+300 referencias a papers, posts y talks de Hacking & Security con Inteligencia Artificial

Hace un mes comencé a recuperar en un post mi interés en los últimos años, donde he publicado muchos artículos en este blog , y he dejado mu...

Entradas populares