Registro de Windows. Una mirada Forense con tintes de Hacking Ético.

¡Muy buenas a todos amigos! Os pido perdón por la demora en volver a escribir, pero por favor creedme cuando os digo que ha sido un mes de LOCOS y no he tenido apenas tiempo para nada. Aún estoy por averiguar porque todo el mundo se pone a llamar a tu puerta a la vez. En fin, misterios de la vida….

A lo que vamos, enlazando con mi anterior post de Análisis de los registros de eventos en Windows y con los posts del gran @fpalenzuela aquí y aquí, me gustaría, con vuestro permiso of course, el seguir hablando del registro de Windows en general. Amigo InSoMnIA esta ronda, como te prometí, va por ti…

Quede claro que sigue sin gustarme NADA este sistema operativo Windows (esta es una opinión estrictamente personal, no digo que funcione mal, tan solo que a mí, no me gusta), pero es obvio que es el más extendido en Escritorio y es el que te vas en encontrar más pronto que tarde, cuando te toque realizar un análisis forense o un pentest, motivo por el cual es condición sine qua non podéis continuar correctamente o a costa de perder un enorme flujo de información y ¿por qué no decirlo? Posibilidades…

Vale, genial esto está muy bien, pero ¿cuál es su función?

Veamos, es una base de datos jerárquica que juega un papel vital en la configuración del sistema operativo. Dentro lleva todos los parámetros del sistema y las preferencias del usuario (ya sabéis, ese enemigo no declarado…). Es mucho más que un conjunto de datos, es la puerta abierta de par en par a corazón del equipo.

El registro comprende varias secciones lógicas o «subclaves o subárboles»). Las subclaves normalmente se nombran según las definiciones de sus API de Windows, las cuales empiezan siempre por «HKEY». Por ejemplo, con frecuencia se abrevian en un nombre de tres o cuatro letras que empieza con «HK» (por ejemplo  HKCU por HKEY_CURRENT_USER). Técnicamente, se puede decir que se trata de indicadores predefinidos (con valores constantes predefinidos) para claves específicas que se mantienen en la memoria o se almacenan en archivos de la subclave, almacenados en el sistema de archivos local y cargados por el núcleo del sistema en el momento del arranque del sistema, y que, a continuación se comparten (con varios derechos de acceso) entre todos los procesos que se están ejecutando en el sistema.

Estructura

Su estructura se basa en cinco claves raíz:

HKEY_CLASSES_ROOT (HKCR): Almacena todos los elementos relacionado a objetos COM y la información de registro de los objetos

HKEY_CURRENT_USER (HKCU): Almacena todas las configuraciones relacionadas a a la cuenta del usuario que haya iniciado una sesión en el ordenador

HKEY_LOCAL_MACHINE (HKLM): Todos los datos relativos al sistema

HKEY_USERS (HKU): Almacena todas las configuraciones de todos los usuarios del equipo

HKEY_CURRENT_CONFIG (HKCC): Almacena información acerca del perfil actual de hardware del pc

HKEY_PERFORMANCE_DATA: Aquí se guarda información del rendimiento del sistema.

¡Espera! ¿No habías indicado que eran cinco claves raíz? Yo cuento seis…

Cierto, y cuentas muy bien, tan solo las cinco primeras son visibles. Te cuento las seis a modo didáctico, pero en principio, tú solamente verás y podrás manipular las cinco primeras.

La razón de ser de esta sexta clave es que cada componente de software crea claves para sus objetos y contadores cuando se instala, y escribe datos del contador mientras se ejecuta. Estos datos no se almacenan en el Registro, aunque el Registro se utiliza para tener acceso a ellos. En su lugar, la llamada a las funciones de Registro mediante HKEY_PERFORMANCE_DATA hace que el sistema reúna los datos de los administradores de objeto de sistema adecuados.

CUIDADO: Debes tener en cuenta que en esta clave no se puede escribir normalmente; si se intentara editar en ella, se producirá una IOException.

¡Uff! Vaya peñazo eh… No os preocupéis, de momento vamos a dejar por ahora la parte teórica y vamos a embarrarnos un poco en breve, que es lo que nos gusta ¿a qué si? Paciencia, un poco mas de teórica y nos ponemos al lío.

¿Dónde se almacenan?

Una sección del Registro (cualquiera de ellas) en el fondo, es un grupo de claves, subclaves y valores del Registro que cuentan con un conjunto de archivos auxiliares que contienen copias de seguridad de sus datos. Los archivos auxiliares de todas las secciones excepto HKEY_CURRENT_USER están en la carpeta %SystemRoot%\System32\Config. Esta sección se guarda en %SystemRoot%\Profiles\nombreDeUsuarioque corresponda.

A ver… A nivel forense, ¿qué queréis que os diga? Esto debemos analizarlo si o si…

Observad lo que tenemos aquí, esta info para un forense en valiosísima. Podéis probar a parsearla con Regripper (https://github.com/keydet89/RegRipper2.8) y veréis las cositas tan chulas que sacáis. Probad, os va a encantar. Podréis encontrar desde dispositivos usb conectados en la vida del equipo, actualizaciones, software instalado… De verdad, probad y veréis la importancia de la información que se guarda ahí. Los posts del amigo @fpalenzuela antes nombrados os serán de gran ayuda para ello.

Bueno… Hasta aquí más o menos, se ha podido mostrar un poco, realmente muy poco de todo lo que se puede extraer a nivel forense, el problema que se plantea al escribir este tipo de posts es saber cuándo parar a fin de no saturar a quien lo lee y desmotivarlo a no seguir el/ella por su cuenta. Volveré sobre este tema más adelante, os lo prometo, de momento os muestro unas pinceladas para animar a que probéis y aprendáis y en breve volveré por estos temas profundizando aún más.

Pero yo había hablado de forense y de pentest y de momento solo ha salido el tema de forense. He elegido este post para teorizar y compartir una idea con vosotros.

Obviamente analista forense y auditor de seguridad son trabajos muy distintos entre si, pero un buen pentester que conozca bien su trabajo, podría ser ser un gran forense ya que conoce los posibles vectores de entrada en el sistema, del mismo modo que un analista forense que sepa de su trabajo también acertaría en bastantes momentos como pentester. ¿A dónde quiero llegar con esto?

Muy sencillo, yo creo que tenemos que, independientemente de nuestro entorno laboral (sea analista forense o sea pentester) aprender a mirar este fascinante mundo al menos desde esas dos perspectivas. Esto nos hará mucho mas eficaces en cualquiera de ellos. He elegido este post para esta pequeña divagación,  ya que su temática es un buen ejemplo de ello. El conocimiento del registro nos hará unos grandes analistas forenses y unos excelentes auditores de seguridad.

Ahora para relajarnos un poco después de todo esta “charla” vamos a jugar, vamos a ser chicos malos, malotes y vamos a ver qué podemos hacer modificando valores del registro. Quiero dejar claro que lo que vais a ver después de estas líneas son juegos en un entorno controlado, pero son juegos reales que usan los cyberdelincuentes, el malware, incluso (y esto lo he comprobado yo personalmente en mi día a día) lo llegar a usar los insiders. Así pues, no perdamos de vista esto por favor en nuestro trabajo diario.

Modifiquemos valores del registro y veamos sus consecuencias, ¿os parece?

¿Cómo lo hacemos?

Pues muy fácil (como todo lo de Windows, para que nos vamos a engañar), vas a Buscar Aplicaciones y archivos del menú Inicio y escribe: regedit.

¡Listo! Nos pedirá permiso ya que necesita esa autorización y a funcionar…

 

No parece mucha cosa ¿verdad? Veréis que pronto cambiáis de idea…

Pero así sería muy fácil, mejor lo hacemos un poco mas interesante, ¿quién quiere interfaz gráfica? Usemos powershell…

Planteamiento: A través de la técnica que más os guste de todas las que hay, hemos sido capaces de obtener una consola de Powershell dentro de la máquina víctima.

Supongamos que quiero eliminar una entrada del registro en concreto para “limpiar” mis huellas malvadas y malignas:

Tan fácil como:

Remove-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion –Name nombreclaveoregistroaborrar

Pequeños tips:

Creación De Claves:

New-Item -path hkcu:\Console -Name Nombreclave

Creación De Valores:

 New-ItemProperty -path hkcu:/Console/Nombreclave -propertyType DWord -Name Tipo-DWord -value 0

Para que puedas vaciar el contenido de claves y valores:

Clear-ItemProperty -path hkcu:/Console/Nombreclave

Y así podríamos continuar con muchas mas opciones, estas son tan solo una pequeña muestra. Imaginad lo que un pequeño script en powershell podría hacer en una máquina vulnerada o  bien que tuviéramos acceso físico a ella. Da muchas ideas ¿verdad? Os recomiendo buscar información sobre todas las posibilidades que esta herramienta ofrece, os va a asombrar si no las conocéis.

Esto es todo, no tiene más. Si sabes dónde buscar, con el suficiente conocimiento (que tampoco es tanto),  un cyberdelincuente o un malware (de hecho escribir en registro lo usa MUUUUCHO el malware) o un usuario maligno pueden manipular prácticamente TODO sin más complicación y nos pueden dificultar mucho más nuestra labor como sysadmin o forense.

Ejemplos prácticos:

DISCLAIMER:  Ningún PC sufrió daño alguno durante estas pruebas…

Si quieres recuperar una entrada específica de una clave del Registro, puedes usar uno de los diversos métodos posibles existentes.

En este ejemplo, vas a encontrar el valor de DevicePath en HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion.

Con Get-ItemProperty, use el parámetro Path para especificar el nombre de la clave y el parámetro Name para especificar el nombre de la entrada DevicePath.

Puedes listar el contenido de una clave, por ejemplo de HKEY_CURRENT_USER (HKCU):

Puedes usar el parámetro Force para listar elementos ocultos y el parámetro Recurse para poder expandir todo el árbol completo de registro desde ese punto:

Y media hora más tarde…

Con esto, al principio sé que es un poco lioso, pero os quiero mostrar que con una powershell dentro de un equipo Windows se pueden hacer barbaridades con casi total impunidad y de una manera muy limpia para un usuario novel o no suficientemente experto.

Por ejemplo, como ya sabemos dónde se guarda el registro relativo a, por poner una muestra sin importancia, el antivirus nativo de Windows (defender), podríamos crear una clave dentro de su registro del tipo DWORD, ponerle como nombre “DisableAntiSpyware” y como valor : 1.

Una ayudita de Microsoft para que sepáis cuál es el tipo de ProperType a elegir ;-):

¿Qué crees que pasaría?

¿Quieres hacer la prueba?

Al lío…

¿Qué ha pasado? Amigo mío, el antivirus se ha desactivado…

No puede ser… ¿O si?

Veamos, vamos al editor del registro desde ahí buscamos donde está el registro de defender:

Ha aparecido una clave nueva, al mirar su contenido se aprecia que es 1:

Intentamos abrir el antivirus y…

No está funcionando. Así de simple.

Imaginar del mismo modo que este, todas las posibilidades que tenéis, por poner unas pocas:

En el firewall:

  1. Autorizar todo tipo de compartición de archivos.
  2. Autorizar trazas.
  3. Autorizar o bloquear puertos.
  4. Definir excepciones de puertos entrantes.
  5. Definir excepciones de puertos entrantes
  6. Impedir notificaciones

En directivas de red:

  1. Deshabilitar compartir en red
  2. Administrar TODA LA COMUNICACIÓN DE INTERNET
  3. Deshabilitar informe de errores

En periféricos:

  1. Habilitar o no Autorun
  2. Instalar controladores sin control del administrador
  3. Saltarse la firma del código de los controladores de periféricos.

En Seguridad:

  1. Restringir o no descarga de archivos
  2. Bloqueo de protocolos de red
  3. Seguridad del bloqueo de la zona del Equipo Local
  4. Crear usuarios
  5. Dar permisos a usuarios sin control
  6. Borrar trazas de cualquier registro.

En fin, para que seguir, tendría control total sobre todo el equipo ya que aquí se guardan TODAS las configuraciones, no creo que haga falta decir mucho mas acerca de las posibilidades, ¿verdad?

Recordad esto cuando habilitéis edición de macros, ejecutéis cosas bajadas de internet o enchuféis usb encontrados cerca de vuestro puesto de trabajo. Usad en sentido común y disfrutad de la tecnología.

Y con esto ya basta por hoy, para ser una introducción creo que ya vale. Un saludo y hasta la próxima.

Guía Hardening – Configuración de redes y Firewall – IPtables Parte 1

Antes de continuar con esta guía quiero aclarar un aspecto de esta entrada, hace ya casi 5 años escribí en mi blog personal sobro el uso de IPtables, y hemos decidido rescatarlo para esta entrada de la guía, y ampliarlo para completarlo y mejorarlo.

Llegados a este punto de la guía tenemos que tomarlo con más calma, en esta ocasión trataremos la configuración óptima de la red y el uso de cortafuegos y medidas de protección, para ello primero debemos saber como funciona en este caso IPtables.

Iptables es seguramente la herramienta más conocida del Framework Netfilter, que se encuentra incluido en el núcleo de Linux desde marzo de 2000, es el predecesor de Ipcahins , aquí podéis encontrar algunas de las diferencias entre ambos, también podemos decir sin duda alguna que es una de las herramientas por excelencia para la gestión de servidores.

Con iptables nos podemos encargar de la administración de las políticas y reglas de las tablas que por defecto crea iptables, estas 3 tablas predeterminadas son, la tabla FILTER, tabla NAT y tabla MANGLE.

Para gestionar la tabla filter, nos bastara el comando iptables junto a sus diferentes opciones y especificaciones, y a continuación veremos como gestionar la tabla filters.

Empecemos por lo básico, cómo es la jerarquía de una tabla en Iptables, para ver nuestra tabla, abriremos un terminal y ejecutaremos el siguiente comando:

#iptables -L

Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Como podéis ver tenemos la tabla que esta compuesta por las cadenas (políticas) que a su vez definen las reglas, que por defecto acepta todo.

CADENAS INPUT, OUTPUT Y FORWARD

Estas 3 cadenas o políticas las podemos modificar para administra el comportamiento de los paquetes, estas políticas son las que definirán el comportamiento por defecto de iptables para todas las reglas.

input sera la encargada de decidir que hacer con los paquetes que entran, la cadena
output se encargara de los paquetes que salen y la cadena
forward se encarga de los paquetes que no van dirigidos a nosotros ni hemos creado localmente.

REGLAS

Con estas reglas indicamos a la cadena que hacer con el paquete, comparando las propiedades del destino, si es aceptado (ACCEPT), descartado (DROP), lo deja en cola (QUEUE) o lo retorna (RETURN), si coincide con la regla de destino de la cadena, aborta el proceso en el resto de cadenas y el paquete es destinado, si por el contrario no coincide con una cadena pasa a la siguiente.

ACCEPT: Acepta el paquete

DROP: Descarta el paquete

QUEUE: Deja en la cola el paquete

RETURN: Retorna el paquete

Este proceso se genera con todos los paquetes, ya sean generados localmente o procedentes del exterior, por lo que con iptables tendremos un control más específico de todo el tráfico de red, y aplicando diferentes reglas a las diferentes cadenas podemos conseguir una mayor seguridad de nuestro sistema, incluso dejarnos incomunicados totalmente, cuidado.

TRABAJANDO CON IPTABLES

Lo primero que debemos hacer es abrir una terminal como superusuario, una vez echo esto y para poder ver la ayuda de iptables escribimos lo siguiente:

#iptables -h

Como podéis ver al introducir iptables -h lo que hace es mostrarnos la ayuda de iptables, en la que se detalla todas las opciones de que disponemos, lo primero que haremos será listar las cadenas de la tabla filter:

#iptables -L

Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

También se puede especificar la cadena por el nombre, por ejemplo:

#iptables -L INPUT

Chain INPUT (policy ACCEPT)
target prot opt source       destination

Ahora ya podemos continuar con la creación y eliminación de cadenas con las siguientes opciones, para ello crearemos la cadena prueba y la eliminaremos.

#iptables -N prueba

Chain prueba (0 references)
target prot opt source  destination 

Y para eliminarla:

#iptables -X prueba

Ya hemos visto cómo listar, crear y eliminar cadenas, pero tenemos más opciones:

#iptables -A  Añade una regla al final de la cadena indicada.

#iptables -D Borra una regla pero indicando el numero de regla.

#iptables -E  Renombrar una cadena.

#iptables -F  Limpia la cadena indicada de las reglas, si no especificas la cadena borra todas las reglas de todas las cadenas.

#iptables -I  Añade una regla pero indicando en que lugar dentro de la cadena.

#iptables -P  Cambia la política de una cadena indicada.

#iptables -R  Remplaza una regla en una cadena indicada.

#iptables -Z  Pone a cero los contadores de bytes y paquetes de todas las cadenas de la tabla.

Como podemos ver tenemos varias opciones que todavía se deben de ampliar más, además con alguna de las opciones debemos fijarnos en especificar bien la cadena o podemos borrar las reglas de todas las cadenas, también podéis ver que todas las opciones se indican con letra mayúscula.

Si os habéis fijado cuando hemos creado la cadena y la listamos aparecía lo siguiente :

Chain prueba (0 references)
target prot opt source destination

Esto es debido, que al crear cadena no hemos indicado las reglas o políticas a seguir, ahora avanzaremos un poco más haciendo un cambio en la cadena, y además indicándole el puerto, protocolo y que hacer con los paquetes, os recuerdo que las cadenas existentes son INPUT, OUTPUT y FORWARD.

#iptables -A INPUT  -p tcp –dport 21 -i DROP

Aquí ya empezamos con más opciones, explicaremos un poco que es lo que estamos haciendo.

#iptables -A INPUT  Aquí estamos indicando que queremos añadir con -A al final del la cadena INPUT  las siguiente regla.

-p tcp  Con -p configuramos el protocolo y con tcp le indicamos cual (icmp, tcp, udp, all)

–dport 21  Con — dport le indicamos el puerto, en este caso el 21 (FTP)

-i DROP  Con -i  podríamos especificar alguna interfaz ( eth0, wlan1..) o como en este caso, si no le indicamos la interfaz se aplicara a todas.

Y finalmente con DROP, descartamos el paquete , por lo que en definitiva lo que hemos conseguido es cerrar el puerto 21, cómo es lógico podemos cambiar el protocolo, número de puerto y regla, y así ajustar iptables a nuestra necesidad.

Otro ejemplo, pero en este caso añadimos otra opción :

#iptables -A INPUT -s 87.34.57.8 -p tcp –dport 22 -i ACCEPT

Ahora con -A añadimos esta regla al final de la cadena y con -s  especificamos una ip entrante, si además al final de la dirección IP le añadimos /20 , le indicamos un rango de puertos entre el 8 y el 20 que pueden acceder por el puerto 22 de nuestro sistema.

Explico alguna opción más :

-p Configuramos el protocolo.

-s Indicamos la dirección de origen , también puede ser el nombre de un host, o una dirección de red. 

-d Indicamos el destino puede ser igual que en -s un host, dirección de red o IP.

-i  Especificamos la interfaz de entrada.

-o Especificamos la interfaz de salida.

-f: Aplica la regla solo a paquetes fragmentos.

-j Especificamos el destino del paquete.

¿Y como guardo los cambios que haga?

Ya que cada vez que reiniciemos el sistema o apaguemos, los cambios se perderán es necesario poder guardar los cambios , siguiendo estos pasos podrás hacerlo :

#iptables-save >  ruta/nombre del fichero

Si añadimos -c  también guardara los contadores y para recupera la configuración al inicio:

#iptables restore < ruta/nombre del fichero

Para poder cargar automáticamente la configuración de iptables podemos guardar el archivo el directorio /etc/ y editar el archivo interfaces en /etc/network con las siguientes lineas :

auto eth0
iface eth0
inet dhcp
pre-up iptables-restore < /etc/nombre de archivo

Como podemos ver podríamos extender esta entrada mucho más, pero creo que para tener unos conocimientos básicos de funcionamiento y configuración de iptables es suficientes, en la próxima parte y con la colaboración de @fpalenzuela, explicaremos cómo montar un script para proteger nuestro sistema o red y profundizar un poco más en IPtables.

¡¡ Hasta la próxima piratas !!