Extracción memoria ram en Linux, Parte I.

Esta semana me he encontrado en la situación de tener que realizar una adquisición de memoria RAM de un server linux para realizar un análisis ante la posibilidad mas que real (como al final fue) de que estuviera owneada por un delincuente.

Esto me puso en la siguiente disyuntiva:

1.- En el caso de tener que hacerlo en sistemas Windows, es relativamente sencillo ya que hay muchas herramientas, tanto libres como  comerciales, para hacerlo, debido a que simple y llanamente, hay un predominio total de de ese sistema (lo que nos indica que aún nos queda mucho trabajo por delante).

2.-Pero, ¿qué pasa en Gnu/Linux? Pues de ello, amigo mio, va este post…

En Linux, hay muchas menos herramientas libres. Están mantenidas y actualizadas por la comunidad.

Además, debemos tener en cuenta que cada kernel, en cada distro , es dintinto uno de otro. Esto  nos obliga a realizar un montón de procesos previos para poder hacer la adquisición de la memoria, que “alterarían” el sistema a analizar, de realizarlo en el y de paso, alarga considerablemente el proceso. Pero ya veréis como es relativamente sencillo, para ello vamos a usar LIME (https://github.com/504ensicslabs/lime). Os recomiendo encarecidamente la lectura de la documentación de este proyecto, os aclará muchas dudas que os puedan surgir.

 

Planteamiento: Necesitamos obtener, como parte de un análisis la memoria ram de una máquina presuntamente vulnerada. Esto nos plantea una serie de dilemas a la hora de extraerla en Linux.A la hora de extraerla no es como en Windows con su dumpit y sus 50000 de herramientas de botón y tal… No, aquí esto es Linux y las cosas se hacen en condiciones, se supone que somos profesionales ¿no?…

A lo que vamos, los pasos a realizar son estos:

 

1.- Podría hacerlo de manera mucho mas sencilla y menos liosa, pero no lo voy a hacer así y os diré el motivo. Es muy factible que de una acción así, salga una asistencia a juicio, por ello el proceso debe ser impecable y las modificaciones que realicemos sobre la máquina a analizar deben ser las mínimas posibles a fin de que no nos lo puedan echar atrás en el proceso, alegando alteración de la evidencia original. Si se genera suficiente duda nos lo puedan “tumbar”. Es por ello que a fin de no modificar la máquina origen de la investigación, tenemos que crear otra máquina, que en este caso será virtual, con exactamente el mismo kernel que la máquina a analizar y compilar ahí nuestra herramienta. Y ¿por qué hacerlo así? Por muchos motivos, entre ellos no contaminar la máquina a analizar por ejemplo y de tener que hacerlo que sea la mínima modificación y contaminación posible. También podemos tener en cuenta que podríamos “pisotear” cualquier rastro que hubiera al compilar. De este modo al hacerlo en otra máquina con el mismo kernel “ensuciamos” la otra modificando lo mínimo aquella que nos interesa analizar.  Una vez hecho todo esto

2.- Una vez compilado en el mismo kernel pero en otra máquina, lo instalamos en la máquina destino y lo “ejecutamos” ahí.

3.- En ese mismo momento se producirá el volcado de memoria y ya podremos analizar la ram con total tranquilidad con volatility (o la herramienta que tu prefieras).

 

Una vez explicado el contexto nos vamos a preparar el terreno, tenemos una máquina cent0s en virtualbox, para extraer su ram nos aseguramos cual es su versión de kernel y crfeamos otra máuina con el mismo kernel. Que es una máquina reciente y tiene el último kernel de cent0s, pues genial y si no lo es, vemos cuál es y procedemos a instalarle el kernel que nos interesa.

Comencemos

Hay que instalar las librerías necesarias para compilar…

captura-de-pantalla-2016-09-29-a-las-10-01-52

Y empezamos…

captura-de-pantalla-2016-09-29-a-las-10-02-09

El que deseamos es exactamente este….

captura-de-pantalla-2016-09-29-a-las-10-47-54

Si fuera otro, pues nada, a buscar y listo…

captura-de-pantalla-2016-09-29-a-las-10-48-48

Por falta de kernels va a ser…

 

Copiamos la dirección y con un wget lo solucionamos…

captura-de-pantalla-2016-09-29-a-las-13-43-42

Una vez descargado lo descomprimimos  con un tar –Jxf Linux(versión que corresponda…)…

captura-de-pantalla-2016-09-29-a-las-13-46-57

Entramos dentro de la carpeta descomprimida  y … bueno, lo típico vaya..

Antes de compilarlo, hay que generar una configuración en el kernel. Para hacerlo de manera gráfica, podemos ejecutar el siguiente comando:

 

make menuconfig

captura-de-pantalla-2016-09-29-a-las-10-15-09

¿A que esto ya os suena?

Si deseas que el nuevo kernel quede con la configuración del anterior y  deseas aceptar todas las respuestas en “si” (podría ser oye…), ejecutas el siguiente comando:

# sh -c ‘yes “” | make oldconfig’ 

Después de esto, ahora sí podemos compilar el kernel. Esto llevará un rato (según la potencia de la máquina, la conjunción de los astros  y todoesto…):

 

# make

 

Consejo: Tómate un café, escribe un libro, ten un hijo, planta un árbol y luego vuelves a ver que tal va la cosa…

 

Después toca instalar  el kernel y sus módulos:

# make modules_install install 

captura-de-pantalla-2016-09-29-a-las-11-42-48

captura-de-pantalla-2016-09-29-a-las-11-44-48

AVISO PARA NAVEGANTES:

En versiones anteriores de  Cent0s, había que ir a /boot/grub/grub.conf  y editar cierto parámetro para que al arrancar de nuevo cargara el nuevo kernel, en cent0s 7 debes ir a otro lugar  /boot/grub2/ y ahí editar y hacer últimos ajustes, (a ver, esto no es necesario tan solo queremos obtener un archivo que usaremos en otra máquina y esto no seria necesario, pero ya que nos ponemos a enseñar…).

captura-de-pantalla-2016-09-29-a-las-13-56-56

Se ve donde ir ¿no? Luego…

captura-de-pantalla-2016-09-29-a-las-11-54-02

Después de todo esto lo reiniciamos y…

captura-de-pantalla-2016-09-29-a-las-11-59-09

Nos ha cogido bien el kernel y ya arranca desde ahí, los pasos previos se han realizado…

captura-de-pantalla-2016-09-29-a-las-12-00-18

 

Perfecto, vamos a descargarnos en el equipo la herramienta en cuestión:

La url es: https://github.com/504ensicsLabs/LiME

captura-de-pantalla-2016-09-29-a-las-12-00-41

Descargando desde su repo…

captura-de-pantalla-2016-09-29-a-las-12-29-21

Después de hacerlo lo descomprimimos (no hace falta explicar cómo ¿verdad?).

captura-de-pantalla-2016-09-29-a-las-12-31-16

Le he cambiado el nombre y lo he puesto como LiMe (caprichos de uno).

Después  se escribe src;make y ya está preparada la herramienta¡ ¿Tanto jaleo para esto?

Pues si hijos míos, esto lo que toca.

Nos ha creado un pequeño archivo de nombre lime-3.18.42.ko. Esto es lo que tenemos que subir a la máquina a analizar, o llevarlo en un usb… Como prefieras, en este caso, al ser un laboratorio, podemos permitirnos ciertas licencias. Usaremos el nunca suficientemente explotado comando  scp:

captura-de-pantalla-2016-09-29-a-las-12-36-16

Me lo bajo a la máquina host (no olvidemos que hablamos de máquinas virtualizadas).

captura-de-pantalla-2016-09-29-a-las-12-50-28

Ya está subido en la máquina analizar, ahora toca usarlo…

Llegados a este punto conviene que nos demos cuenta de algo, esto es un entorno de laboratorio, todas las librerías necesarias para la compilación en la primera máquina estaban instaladas, no olvidéis que vais a necesitar instalar cabeceras, gcc…etc para que compile a la primera. En la documentación de cada distro encontraréis información mas que de sobra para que todo vaya bien, pero no lo dejéis sin revisar. No se ha puesto aquí por no alargarlo innecesariamente y porque tampoco aporta nada nuevo, pero cada uno de vosotros en vuestro puesto tendréis unas necesidades distintas.

Asimismo también quiero que tengáis en cuenta que estas son máquinas instaladas en virtualbox y que, de haberlo querido hubiera podido extraerlas así:

 

Vboxmanage debugvm “nombre de la máquina virtual”  dumpvmcore –filename mem.elf

 

Y ya estaría solucionado, pero lo que he pretendido al hacerlos de esta manera, ha sido que fuera lo más realista posible, motivo por el cual os he dado toda esta chapa. Para hacer pruebas y ahorrar un buen rato podéis hacerlo así, pero en entorno real sería como os lo indico yo ¿de acuerdo?

 

Retomemos donde lo habíamos dejado, había subido todo a la máquina a investigar y ahora toca ejecutar…

captura-de-pantalla-2016-09-29-a-las-12-52-12

 

Ahí lo tenemos, ya hemos adquirido la memoria de esa máquina… Tan solo queda bajarlo de esa máquina y analizarlo con volatitlity…

captura-de-pantalla-2016-09-29-a-las-12-54-44

Archivo bajado a mi escritorio

De aquí en adelante toca analizar, pero eso, amigos míos, ya será otra batalla. Espero que os sean útiles estas líneas y que os hayáis aburrido mucho..

 

Un saludo…

 

P.D: Como anticipo de lo siguiente, mucha gente cree que solo se puede usar volatility desde la línea de comandos, ¿verdad?

evolve

 

¡Hasta la próxima!

Deja un comentario

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