martes, 12 de septiembre de 2017

¡Gracias por compartir RIPE!

Para un proyecto que se tenía entre manos se quería conocer todas las IPs que tenía desplegado cierto cliente, con la intención de conocer todas "las "ventanas al exterior" del mismo.

Esto nos permitiría cubrir nuestro objetivo, escanear todos los puertos de todas "las ventanas al exterior" del cliente.  

Para ello, se acudió al servicio que todo lo sabe en este sentido: RIPE NCC (Centro de Coordinación de redes IP Europeas), que es el Registro Regional de Internet (RIR) para  Europa, Oriente Medio y partes de Asia Central.

Más información:

https://es.wikipedia.org/wiki/RIPE_NCC
https://www.ripe.net/

Gracias a la función de búsqueda que ofrece el sitio web se pudo obtener información en función de los patrones introducidos. Todo ello analizado a mano.

Un ejemplo de patrón de búsqueda podría ser: microsoft.


Patrón de búsqueda: microsoft.
Uno de los resultados obtenidos

Esto está muy bien para una simple consulta.

Pero siempre es mejor automatizar el proceso, nunca se sabe cuando se volverá a necesitar hacer lo mismo. Es decir, es preferible generar un script que solicite información a RIPE para posteriormente parsearla y conseguir las direcciones IP buscadas. Para ello se puede utilizar la API ofertada por RIPE y así poder lanzar una consulta desde nuestro script.

Más información:

https://www.ripe.net/manage-ips-and-asns/db/support/documentation/ripe-database-documentation/how-to-query-the-ripe-database/14-3-restful-api-queries/14-3-2-api-search
https://github.com/RIPE-NCC/whois/wiki/WHOIS-REST-API-search


Un ejemplo de petición de búsqueda desde la línea de comando es:

Petición a través de la línea de comandos de consulta a RIPE.

Parte de los resultados obtenidos.

Si parseamos la información obtenida en formato XML, mediante un simple script, teniendo en cuenta la clausula de que sólo se quiere aquellos rangos que se encuentren en España se obtendría los siguientes datos.

Rangos de Microsoft en España

De ahí a pasar la información a una escáner de puertos, sólo hay un paso.

Pero no sólo se puede quedar ahí, la información que puede devolver RIPE es extremadamente interesante, como todo el mundo sabe, o no: emails, direcciones, teléfonos, descripciones de interés, etc. Está información, como es obvio, nos puede servir como nuevos patrones de búsqueda, o para otras cosas ...

Información proporcionada por RIPE

Por supuesto, la idea se puede ampliar para preguntar a los otros RIR del mundo.


Lo que hagas con la información es cosa tuya, no mía ... pero ten conciencia.

lunes, 21 de agosto de 2017

Categorización de la ofuscación utilizada en ciertos códigos JavaScript

Quiero desde aquí hacer eco, como recordatorio para todo el mundo entre los que me incluyo, del artículo: Reverse Engineering a JavaScript Obfuscated Dropper , del día 31/07/2017, que referencia al estudio: The Power of Obfuscation Techniques in Malicious JavaScript Code: A Measurement Study (no muy actual que digamos), en donde se puede obtener información sobre la categorización de los distintos tipos de ofuscación utilizada en archivos JavaScript.

NOTA: Recomiendo encarecidamente la lectura del artículo en toda su totalidad, el ejemplo puesto en el artículo es clarificador. Además ofrece un par de herramientas muy útiles al realizar ingeniería inversa de archivos JavaScript.

El estudio define cuatro tipos de técnicas de ofuscación:

Randomization Obfuscation

En este tipo de ofuscación, ciertos elementos del código JavaScript son modificados sin por ello modificar la semántica del código. Los "elementos" más tu utilizados son: espacios en blanco, comentarios, variables que no aportan nada al código y nombres de variables incomprensibles.

Data Obfuscation

El principal objetivo de estas técnicas es convertir los valores de variables y constantes en formatos que no afecten a la ejecución del código pero dificulten la lectura del mismo.

Las dos principales técnicas son:

    1. String splitting (división de cadenas de texto). Consiste en convertir un cadena de texto e un concatenación de subcadenas de texto.
                  
             2. Keyword substitution (sustitución de palabras clave). Consiste en colocar un comando JavaScript dentro de una variable y utilizar dicha variable en el resto del código.

      3. Encoding Obfuscation

Normalmente, hay tres maneras de codificar un código:

1.  Convertir el código en caracteres ASCII, Unicode o hexadecimales.

2.  Personalizar la codificación mediante funciones que se encarguen de codificar el código, este método implica que el propio código adjuntará un función de descodificación que deberá ser ejecutada antes de nada.

3.  Emplear métodos de cifrado/descifrado estándar. Por ejemplo: JScript.Encode, es un método creado por Microsoft para codificar código JavaScript.

 Logic Obfuscation

Está técnica consiste en manipular el flujo de ejecución del código javaScript sin afectar la semántica original del código mediante la modificación de estructuras lógicas. Existen dos maneras de hacerlo:

1.  Insertando instrucciones que nada tiene que ver con el flujo original del código.

2.  Añadiendo o cambiando estructuras condicionales.



NOTA FINAL

Cada técnica por sí sola no complica demasiado el análisis del código, el problema viene cuando se combinan.

Lo que hagas con la información es cosa tuya, no mía ... pero ten conciencia.

martes, 1 de agosto de 2017

¡Te estoy viendo!, no puedes ocultarte.

Se leyó el día 27/07/2017 la noticia en RedesZone: "Cómo ocultar tu equipo en la red local para no ser detectado" (https://www.redeszone.net/2017/07/26/ocultar-equipo-red-local/), en la cual se comenta como hacer indetectable tú equipo en la red interna en donde se encuentre conectado.

Se consigue configurando el firewall de Windows para bloquear las comunicaciones a través del protocolo ICMP, ya que es el protocolo más utilizado para detectar las presencia de equipos conectados en una red.  Las herramientas que se suelen utilizar son:"Ping" y "Trace", que son, en definitiva, tipos especiales de paquetes del protocolo ICMP.

También indican que habría que revisar todo protocolo susceptible de indicar que nuestro equipo se encuentra conectado a la red para poder así estar 100% seguros de que nadie es capaz de detectarnos.

Pues, se puede afirmar que dicho planteamiento no es del todo correcto. Aunque se bloquee las peticiones entrantes del protocolo ICMP en un equipo o cualquier otro protocolo, es posible detectar dicho equipo.

Párrafo de la noticia leída

Nunca se puede estar al 100 % seguro de que nadie es capaz de detectar nuestra máquina.

¿Por qué?

Porque, en redes IPv4, siempre se puede utilizar  el protocolo de capa 2 (Nivel o Capa de Enlace del modelo OSI): ARP, para determinar la presencia de una máquina en la red.

En cualquier comunicación, se marca una dirección IP (Nivel o Capa de Red del modelo OSI) y un puerto de destino (Nivel o Capa de Transporte del modelo OSI). Pero, por debajo de todo esto y de manera transparente al usuario se trabaja con el Nivel o Capa de Enlace del modelo OSI, ya que toda red es a su vez una red local, es decir, Internet es una red local dentro de una red local y dentro de una red local, y así en bucle.

Esta Capa de Enlace se utiliza, básicamente, para buscar la dirección MAC del dispositivo que tiene asignada la IP buscada o la IP de aquel dispositivo que conoce cómo llegar a ese dispositivo (comúnmente conocido como: Puerta de Enlace).

Esa información, la relación de IP y MAC,  que se almacena en la tabla ARP, permanece en el equipo durante un cierto tiempo.

En definitiva, el protocolo ARP determina la MAC de la IP a la que va dirigida la comunicación saliente y genera un tabla con esa información.

De todo esto, se obtiene el famoso ataque ARP Spoofing para poder realizar el también afamado ataque: MiTM (Man in the Middle - Hombre en el medio).

Más información:
https://es.wikipedia.org/wiki/Internet_Control_Message_Protocol
https://es.wikipedia.org/wiki/Protocolo_de_resoluci%C3%B3n_de_direcciones
https://es.wikipedia.org/wiki/Ataque_de_intermediario
https://es.wikipedia.org/wiki/ARP_Spoofing

Un ejemplo

Sobre una máquina virtual  de uso propio, con el direccionamiento que se muestra en pantalla, se aplica la instrucción indicada en el artículo precursor de este artículo, y que permite la inclusión en el firewall de Windows de una regla para bloquear comunicaciones a través del protocolo ICMP.


Se comprueba desde otra máquina virtual que se encuentra en el mismo rango de direccionamiento que un "ping" a la máquina anteriormente comentada, no responde y no podemos afirmar que se encuentre activa.


Pero que ocurre cuando tras lanzar un "ping", se consulta la tabla ARP


Se obtiene la dirección MAC, y por lo tanto podemos afirmar que la máquina se encuentra activa.

Por lo tanto, no se puede afirmar que una máquina puede encontrarse 100% oculta frente al resto de equipos de su red.

RECORDEMOS: NUNCA SE ESTA 100% SEGURO

Lo que hagas con la información es cosa tuya, no mía ... pero ten conciencia.

lunes, 24 de julio de 2017

Buceando en la MBR.

Siempre que arrancamos un ordenador compatible con la estructura de la Tabla de Particiones (los conocidos como: PC clónicos o , simplemente, clónicos),  necesariamente terminamos buscando la  MBR (Máster Boot Record) para poder arrancar. La no existencia de la misma, parara el proceso de arranque.

Esta MBR indica al proceso de inicio del sistema, cual es el siguiente salto para poder arrancar el sistema operativo. Más concretamente, indica la partición activa que contiene el sistema operativo que será cargado.

El MBR debe residir en el primer sector del disco de arranque, el cual siempre está compuesto de "n" clúster, dependiendo del proceso de formateado dado.  Pero, no empezará en la posición 0 del sector, si no que comienza en la posición 446h del primer sector (offset 446h)

IMPORTANTE: La unidad básica de un disco duro es el clúster, que se agrupa en sectores en función del formateo que el disco duro ha tenido.

Del total del tamaño del sector, la MBR se compone de 512 bytes de información, divididos en:


Código ejecutable


Códigos de error


Tabla de particiones


El código ejecutable, más formalmente llamado: Máster Boot Code, es el programa usado en el arranque para determinar cuál de las particiones de la tabla de particiones es la activa.

Los códigos de error, son los mensajes en texto plano que pueden aparecer si el MBC (Máster Boot Code) determina que ha habido un problema al encontrar la partición activa. Dichos mensajes pueden ser:

1.- Invalid partition table
2.- Error loading operation system
3.- Missing operating system

En cuanto a la tabla de particiones a su vez se subdivide en 4 registros de 16 bytes cada uno, formando un total de 64 bytes. Cada registro se corresponde con una posible partición activa, por ello, un ordenador sólo puede tener 4 particiones primarias, y el resto, si se quieren tener más, deben ser particiones extendidas.

Cada byte de cada registro de la partición activa tiene su propio significado, que se pasa a comentar:

Bytes
Función
1
Determina si la partición es la partición activa o no.
Para determinar que estamos ante la partición activa debería existir el valor: 80h, en cualquier otro caso, debería existir el valor: 00h
2
Determina el sector inicial de la partición en formato CHS (Cilindros, Heads and Sectors - Cilindros, Cabezas y Sectores)

3
4
5
Tipo de partición
Más información (listado de tipos): https://en.wikipedia.org/wiki/Partition_type
6
Determina el sector final de la partición en formato CHS (Cilindros, Heads and Sectors - Cilindros, Cabezas y Sectores)

7
8
9
Offset de la ubicación de la partición respecto de la MBR
10
11
12
13
Tamaño de la partición en sectores
14
15
16

Al final de la tabla de particiones, siempre encontraremos los caracteres 55AAh, que indicarán el fin de la MBR.

Si el proceso de arranque puede determinar la partición activa, este saltará al sector correspondiente. El cuál tendrá una VBR (Volumen Boot Record) o una EPT (Extensión Partition Table)

Podemos verlo gráficamente mediante un editor hexadecimal. Un ejemplo sería:

Primeros bytes del sector 0 del Disco óptico 1

Analizada la MBR podemos ver:

Análisis de la MBR desde el offset 446

Más información:
https://es.wikipedia.org/wiki/Registro_de_arranque_principal
https://github.com/hamptus/pyMBR
https://raw.githubusercontent.com/gleeda/misc-scripts/master/misc_python/mbr_parser.py

Lo que hagas con la información es cosa tuya, no mía ... pero ten conciencia.




miércoles, 12 de julio de 2017

¡Ese UPnP como mola, se merece una ola!

No hace mucho tiempo, en una auditoria de red interna (intranet), un protocolo del cual no se habla demasiado dio una clave fundamental para poder hacerme con la red.

Esta clave vino a ser: usuarios totalmente validos, que permitieron hacer otras muchas cosas.

El responsable de dicha revelación fue el protocolo de comunicaciones: UPNP (Universal plug and Play).

Se recoge la definición de dicho protocolo desde Wikipedia

Universal Plug and Play (UPnP) es un conjunto de protocolos de comunicación que permite a periféricos en red, como computadoras personales, impresoras, pasarelas de Internet, puntos de acceso Wi-Fi y dispositivos móviles, descubrir de manera transparente la presencia de otros dispositivos en la red y establecer servicios de red de comunicación, compartición de datos y entretenimiento. UPnP está diseñado principalmente para redes de hogar sin dispositivos del ámbito empresarial.

Más información:
https://es.wikipedia.org/wiki/Universal_Plug_and_Play
https://tools.ietf.org/html/rfc6970

Entre los datos que devuelve el protocolo,  encontraremos el tag: <friendlyName>. Dicho tag, trae consigo  datos relativos al: nombre de la máquina y a un nombre de usuario valido.

La estructura que presentaba se correspondía al siguiente patrón:

<friendlyName> NOMBRE MÁQUINA:USUARIO </friendlyName>

Este protocolo utiliza dos puertos:

1.- 1900/UDP, que devuelve la URL donde se puede visualizar los datos.
2.- 2869/TCP, sobre el que se monta un servicio web que devuelve la información estructurada en formato XML

Si queremos buscar activos que posean el puerto 1900/UDP, y así conseguir la URL donde se encuentra la información, se puede utilizar una herramienta terriblemente útil: NMAP. Más concretamente uno de sus script (.NSE: upnp-info.nse. Este script nos permite obtener la URL donde se podrán visualizar los datos del host.

Más información:
https://nmap.org/nsedoc/scripts/upnp-info.html

Un ejemplo de la información que se obtiene con dicho script es:

Uso del script: upnp-info.nse, de la herramienta nmap

Si se visita dicha URL, obtendremos la siguiente información:


Información del servicio UPnp en formato "xml"

Si nos fijamos en el tag: <friendlyName>, podemos ver:

1.- El nombre de la máquina: GRANHERMANO
2.- El usuario: 4null0

Personalmente, me cree un pequeño script en bash para que dado una red (en formato CIDR) me detectará aquellas que tenga el puerto 1900/UDP abierto y me diera los datos correspondientes al nombre de la máquina y a el usuario.

El código es:


Código del script en bash

Un ejemplo de lo que devuelve el script es:

Información devuelta por el script



Lo que hagas con la información es cosa tuya, no mía ... pero ten conciencia.

miércoles, 21 de junio de 2017

Recordatorio: Torificar cualquier comunicación con TOR Browser

Aunque mucho se ha escrito sobre este asunto, quiero crear un recordatorio para las personas con mala memoria.

El objetivo es: torificar cualquier programa que utilice comunicaciones TCP.

Para ello, sólo necesitaremos:

1.- TOR Browser (https://www.torproject.org/)
2.- ProxyChain (http://proxychains.sourceforge.net/)

-----------------------------------------------------------------------------------------------------------------------------------------------------------
NOTA:  El TOR Browser lo puedes cambiar por el comando TOR (linux). El siguiente enlace explica perfectamente como instalar y usar la combinación: TOR/ProxyChain

https://www.redeszone.net/2014/10/17/como-instalar-y-usar-proxychains-y-tor-en-kali-linux/

                O usar la combinación: TOR/ProxyChain/nmap.

https://www.shellhacks.com/anonymous-port-scanning-nmap-tor-proxychains/
 ----------------------------------------------------------------------------------------------------------------------------------------------------------

TOR Browser, es nuestro navegador web favorito que utiliza la red TOR para establecer su conexiones web. Para lo cual utiliza un túnel VPN, el cual utilizará ProxyChain.

Se encuentra disponible para múltiples sistema operativos, y su instalación es muy sencilla tanto en sistema Linux como en sistema Windows.

ProxyChain, permite tunelizar comunicaciones TCP y DNS a través de proxys.

Sólo se encuentra disponible para versiones Linux, y su uso es tan fácil como escribir el siguiente comando:

proxychain <programa a torificar> <opciones del programa a torificar>

Pero antes de lanzar el comando se tiene que hacer:

1.- ESENCIAL Y DE CARACTER PERMANENTE: Este paso consiste en modificar la configuración de ProxyChain, para que traslade todas las comunicaciones TCP a través del túnel vinculado con la red TOR. Para ello, abrimos el archivo: /etc/proxychains.conf, y :

                 1.1.- Des-comentamos la línea 10 (en mi archivo): #dynamic_chain


Línea 10 (#dynamic_chain), des-comentada.

                1.2.- Comentamos la línea 18 (en mi archivo): strict_chain.

Línea 18 (strict_chain), des-comentada.

               1.3.- Y por supuesto, creamos/modificamos las últimas líneas del archivo con las que indicaremos al ProxyChain por donde debe enviar las comunicaciones.

                El TOR browser, por defecto, habilita el puerto 9150/TCP, como puerto de entrada al túnel dirigido hacía la red TOR.

Camino por donde se envian los paquetes al utilizar el comando: proxychain.

2.- ESENCIAL: Levantar una instancia de TOR Browser.

Y ahora ya, sí que sí, podemos torificar el programa que "deseemos"

Ejemplo: Torificación de la navegación web a través del firefox


Solicitud de la IP que se utiliza para navegar por internet a través del Firefox y a través del TOR Browser


Lo que hagas con la información es cosa tuya, no mía ... pero ten conciencia.