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!

Reseteando la contraseña de root en debian

Hola amigos, tras unas semanas de “relaxing”, volvemos a la carga con la serie de hardening linux, como somos algo meticulosos y no nos gusta hacer las cosas a medias, la idea de esta serie es demostrar que pasa o que podría pasar si no implementamos las recomendaciones que os damos el equipo de aprendizdesysadmin así que sin más vacilación empezemos.

El post de hoy es como atacar o “recuperar” la contraseña de root de un sistema DEBIAN, siguiendo el post de nuestro amigo @israelmgo  “Guía Hardening – Seguridad en la bios y bootloader” .

Hoy le daremos un poco de cera al grub, para eso necesitaremos también el concepto de single user mode, que como esta explicado en infinidad de sitios, no lo vamos a explicar nosotros. Además tenéis que tener en cuenta que para esta técnica necesitais tener acceso físico a la máquina.

Al tajo:

Cuando iniciamos una máquina debian nos encontraremos con nuestro grub tal que asi:

grub1

Si os fijáis en el cuadro rojo, veréis que tenemos la opción de editar las entradas que queremos, para nuestro caso pulsaremos “e”  sin comillas para realizar las modificaciones que nos interesa.

Nos aparecerá una pantalla donde buscaremos la siguiente línea:

linux    /boot/vmlinuz-3.16.0-4-amd64 root=UUID=d6b3160f'-7e1f-486e-bdb0-4ff960afc0a7 ro quiet

y lo modificamos con lo siguiente:

grub2

Ojo, cambiamos el ro (read only) por rw (read write) y al final de la línea añadimos init=”/bin/bash” y posteriormente pulsamos F10.

Si por cualquier cosa, no hemos cambiado el ro por rw, tras iniciarse en single mode nos daremos cuenta que el sistema está en modo ro (read only), y necesitaremos ejecutar el comando “mount -rw -o remount /” sin comillas para dejar el sistema en read write ANTES de ejecutar el passwd, ya que si lo ejecutamos en modo ro, nos dará error.

El sistema rearranca en single mode, y nos permitirá ejecutar el comando passwd con el que reiniciaremos la contraseña de root.

singlemode

Posteriormente, pulsamos ctrl+alt+sup para reinicar el equipo, y comprobamos que al realizar un su e introducir la nueva contraseña funciona correctamente.

crackeado

Habiendo seguido las indicaciones del post de nuestro amigo @israelmgo, esto se habría evitado… y esto es todo, espero que os guste el post.

 

Especial Sysadmins, Tips con EXT

Extra para los Sysadmins y sufridos seres humanos de sistemas

¡Muy buenas a todos/as! Hoy hace un día estupendo y caluroso y os voy a dejar descansar de tanto forense y tanta técnica. La terminal esta genial, pero también debemos disfrutar de este maravilloso clima y salir a tomar el sol y unas cañas con los amigos/familia.  Os voy a comentar unos breves y fáciles tips, para que trabajéis mejor con el sistema de archivos Ext y para que el mundo sea un lugar feliz y sonriente. Espero que os sirva.

Asimismo os comento que este el el primero de una serie de tips o trucos que iremos soltando de vez en cuando, para intentar ayudaros en vuestros deberes diarios.

Como convertir un sistema de archivos ext3 existente a ext4

Para habilitar las características de ext4 en un sistema de archivos existente ext3, debes usar el siguiente comando:

# tune2fs -O extents,uninit_bg,dir_index /dev/dispositivo

CUIDADO: Aviso para navegantes, una vez ejecutado este comando, el sistema de archivos sobre el que se ejecute, ya no podrá volver a ser montado como ext3.

Después de ejecutar este comando, debes ejecutar fsck, ¿ y por qué motivo?  Para arreglar alguna de las estructuras que tune2fs ha modificado:

# e2fsck -fD /dev/dispositivo

Debes tener en cuenta que, para verificar el sistema de archivos de una partición correctamente, esta partición debe ser desmontada. Esto podría ser un problema si hablamos de la partición raíz (“/”), en este caso, es recomendable que configures el archivo /etc/fstab como te indico y luego reinicies el sistema para que la verificación se lleve a cabo automáticamente:

#               /dev/dispositivo         /           ext4   relatime         0 1

Para crear un nuevo sistema de archivos con ext4

Un sistema de archivos ext4 puede ser creado mediante el siguiente comando:

mkfs.ext4 /dev/dispositivo

Donde “dispositivo” hace las veces  del nombre del dispositivo por bloques donde se creará el sistema de archivos ext4 (sda,sdb,sdc…)

A tener en cuenta

Cuando habilites la nueva característica extent, los archivos nuevos serán creados con el formato extent, pero no se convertirán los archivos que ya existan para utilizar extent. Sin embargo los archivos que no sean extent podrán ser leídos y escritos sin ningún problema por ext4.

¿Qué soporte tiene ext4 en GRUB?

¡Buena pregunta! Si la raíz del sistema (“/”) es convertida a ext4, y se utiliza GRUB como cargador de arranque, debe actualizarse GRUB si o si a una versión que soporte ext4. Si no lo actualizas, el sistema puede llegar a iniciar correctamente la primera vez, pero cuando el kernel sea actualizado, este no volverá a iniciarse, de modo que tu mismo…

 

Por hoy ya vale, espero que lo escrito encima de esto os  pueda servir en algún momento. Pasad buenos días. ¡Nos vemos!

Análisis forense en Linux. Sistema de archivos EXT (I)

¡Muy buenas a todos!

Como no siempre toca sufrir en la vida, hoy vamos a disfrutar un poco. Hoy vamos a empezar a hablar de un sistema de archivos de verdad, de los que usan las personas mayores. Vamos a hablar del sistema de archivos Ext, pasando desde Ext2 hasta Ext4.

Como siempre antes de ir mas adelante, quiero avisar que esto es una intro, para que aprendáis los básicos de cada sistema de archivos y luego podáis seguir otras explicaciones posteriores. Ext es un sistema de archivos relativamente fácil de entender si se aprende despacio, pero es enorme no os engañéis. Por tanto, lo que me interesa con este post, es  que adquiráis unos conocimientos básicos sobre el, que luego os vendrán genial para seguirme más fácilmente en otros conceptos mas complicados. Iremos profundizando poco a poco en este sistema, no os preocupéis. ¿Me acompañáis en este viaje en el tiempo?

Pero… ¿Qué es Ext?

Historia

El sistema de archivos extendido (extended file system o ext), fue el primer sistema de archivos creado en concreto para Linux. Fue diseñado por Rémy Card para vencer las limitaciones de MINIX (que recuerdos…). Al principio hubo competencia tanto por Ext2, como por parte de Xiafs (se podría llamar un pequeño pique), sin embargo finalmente ganó ext2, ya que era mas viable a largo plazo.

Esta basado en UFS (Unix File System).

Sistema de Archivos EXT (Estructura y conceptos generales)

El fichero está representado con estructura de i-nodo (índice-nodo, para mayor claridad)

Básicamente consiste en una serie de ficheros con una serie de entradas donde se almacenan los números de i-nodos. Así pues, cada i-nodo “apunta” la dirección, path, tamaño…etc de cada archivo.

Es brillantemente funcional. Concretemos.

Sistema de archivos Ext2

En el principio de los tiempos…

Ext empezó como quien dice  con Ext2, su estructura de funcionamiento es relativamente fácil de entender y extremadamente lógica.

Consta de:

  1. Un Superbloque de 1024 bytes al principio del sistema de archivos, que contiene información, metadatos del propio sistema de ficheros (el tamaño del bloque, el número total de bloques…etc).
  2. Grupos de bloques :Tienen un Backup de Superbloque, un Block Group Descriptor Table (o tabla de estructura para cada grupo de bloques, dirección de los bitmaps de bloques de i-nodos), un bitmap de bloques del grupo y un bitmap de i-nodos (del grupo).
  3. El sistema de ficheros tiene una tabla donde se almacenan los i-nodos. Un i-nodo guarda información de un archivo (ruta o path, tamaño, ubicación física…etc). En cuanto a la ubicación, es una referencia a un sector del disco donde están todas y cada una de las referencias a los bloques del archivo fragmentado. Asimismo, estos bloques son de tamaño especificable cuando se crea el sistema de archivos, desde los 512 bytes  hasta los 4 KiB, asegurando esto un buen aprovechamiento del espacio libre con archivos pequeños.

¿Complicado? Bueno, poco a poco. Con esta imagen lo vais a ver mas cómodamente…

Captura

 

¿Veis? Tenemos un Superbloque, tenemos la Tabla de Descriptor de Bloque  y se aprecia claramente que apunta a cada uno de los grupos de bloque y las tablas de i-nodos. Es la típica estructura de árbol.

Ahora podría hablar de la estructura de los i-nodos, pero de momento creo que ya es mas que de sobra. No quiero complicarlo mas, de momento. Si lográis asimilar todo lo expuesto hasta aquí estaré mas que contento. Irá avanzando mas, pero todo a su debido momento. De momento os dejo un anticipo por si queréis investigar vosotros…

Captura de pantalla 2016-06-16 a las 19.23.26

Una vez puestos en la estructura y como es la estructura de de ext2 hay que saber que este sistema tenía-tiene un problema, bueno, tenía varios a decir verdad, pero uno importante, era que no disponía de soporte para transacciones, lo que significa, así en plan sencillo de asimilar, que las comprobaciones rutinarias (entre otras muchas cosas) al arrancar, podían llegar a tardar bastante tiempo, pero bastante de verdad. A día de hoy, hay muchas opciones alternativas, sistemas de ficheros de nueva generación con soporte para transacciones cuya integridad puede ser verificada con mayor rapidez, pero por aquel entonces no. Los sistemas transaccionales previenen retrasos durante el reinicio del equipo, incluso cuando el sistema de ficheros está en un estado inconsistente. Por este y otros motivos apareció EXT3 como una evolución lógica y necesaria  de Ext2.

Sistema de archivos Ext3

Características:

Es igual que ext2 pero con journaling, ahora te preguntarás: ¿Qué es el journal? Muy fácil, el journal guarda registros de las actualizaciones de los ficheros, una especie de bitácora, ANTES de que sucedan esos cambios en los ficheros. ¿Veis las implicaciones que esto puede legar a tener verdad? ¿No? Esto aporta mucha consistencia al sistema de ficheros. Un ejemplo rápido y fácil, supongamos que antes de que se escriba algo en un archivo, hay un problema, se va la corriente eléctrica de repente y los cambios no quedan guardados en los archivos correspondientes.

En este caso, como los cambios se guardan en esa especie de bitácora que es el journal, se pueden recuperar de un modo relativamente fácil. Además de que, cuando el disco se vuelve a montar correctamente, el journal advierte que hay unos cambios guardados y no efectuados y antes de nada, lleva a cabo esos cambios, con lo que se minimiza bastante la pérdida de archivos. Una maravilla como se puede apreciar, una maravilla que aporta mucha consistencia al sistema.

Además en el caso de que se borren archivos, se pone a cero el valor del tamaño del fichero y direcciones de bloque en el i-nodo, esto nos aporta mucha mas seguridad en la eliminación de archivos ya que nos aporta una certeza casi absoluta de que nadie va a poder extraer nada que nosotros eliminemos. A nivel forense, debemos tener en cuenta que se resetea el journal cada vez que se monta, es por ello que,  en temas de investigación forense, es muy recomendable “tirar del cable” para apagar el equipo a analizar,  ya que, de no hacerlo, si se apaga normalmente se perdería el journal, con toda la pérdida de información que ello implicaría. Esto ya comienza a ser mas interesante, ¿verdad?

Pregunta rápida: Una vez visto esto, la sensación que queda es que entonces el espacio ocupado por el journal debe ser enorme ¿no?

¡Pues no! Porque una vez que los datos se escriben correctamente, el journal desaparece.

Ventajas Ext3

1.     Disponibilidad

2.     Integridad

3.     Velocidad

4.     Fácil migración

5.     Versión transaccional de ext2

6.     Indexación basada en árboles que proporciona un alto rendimiento en casi todas las situaciones.

Desventajas

1.     Menor funcionalidad

2.     Fragmentación

3.     Da problemas de compresión

4.     No hay comprobación del journal

 Limitaciones Ext3

Limites ext3

Sistema de archivos Ext4

ext4-file-system

Ext4 (fourth extended filesystem), es un sistema de archivos con bitácora (Journaling) que fue diseñada como una mejora compatible de ext3. Ext4 se hizo público como estable el 25 de diciembre de 2008 con la versión 2.6.28 del núcleo Linux y desde entonces se encuentra disponible para usarlo en sistemas en producción.

Mejoras con respecto a ext3 y ext2

Mucha gente opina que la auténtica mejora, el auténtico salto se produjo de ext2 a ext3, personalmente, aún reconociendo la notable diferencia entre ext2 y ext3 y por supuesto, con el mayor de los respetos hacia las opiniones ajenas, opino que el sistema de archivos ext4 tiene bastante mejora sobre ext3, en comparación bastante mas que ext3 sobre ext2. La mayor mejora del sistema de archivos ext3 sobre ext2 fue añadir el soporte de jornaling (NOTA ACLARATORIA: el journaling consiste en que guarda los cambios en el sistema de archivos ANTES de que se produzcan (journal, ordered y writeback)), que no es poco y mas para nosotros, sufridos forenses. Sin embargo ext4 modifica importantes estructuras de datos del sistema de archivos, tales como aquellas destinadas a almacenar los archivos de datos. Como resultado, tenemos un sistema de archivos, con un diseño mejorado, mejores características y con mucho mas rendimiento y confiabilidad que los anteriores.

Características principales

1.     Soporte de volúmenes de hasta 1 exabyte (260 bytes) y archivos con tamaño hasta 16 terabytes.

2.     Capacidad de reservar un área contigua para un archivo denominada “extent”, que puede reducir y hasta eliminar completamente la fragmentación de archivos.

3.     Menor uso del CPU.

4.     Mejoras sustanciales en la velocidad de lectura y escritura.

  1. Direccionamiento 48bits :

▫ Tamaño sistema de archivos 1EiB

▫ Tamaño de archivos 16 TiB

▫ 64000 subdirectorios

  1. Asignador multibloque que asigna varios bloques en una sola llamada
  2. Obviamente es totalmente compatible con Ext3
  3. I-nodos mucho mas grandes
  4. Preasignación de espacio
  5. Comprobación del journaling con todo lo que redunda en fiabilidad
  6. Tiene una serie de barreras activadas por defecto, con ello mejora mucho la integridad aunque reduce un poco la eficiencia, en mi opinión esto nos compensa.
  7. Tiene un fsck muy rápido, es decir actualiza muy rápido la lista de i-nodos después de cada grupo.

 

Bueno, por hoy ya vale, lo dejamos aquí. Espero no haber aburrido demasiado a los que hayan tenido la paciencia de seguir hasta aquí abajo. Pero debéis entender que esto es necesario para poder entender otros conceptos que vendrán después. Gatear=> Andar=> Correr. Esa es la idea.

¡Hasta la próxima!