18 noviembre 2011

Buscando el país de origen de un malware

Cuando aparece un nuevo malware muchas veces leemos en documentos técnicos de compañías antivirus en qué país se ha creado, pero ¿cómo lo saben?, con esta entrada pretendo explicar de dónde sale esta información. Para entender el ejercicio, se va a utilizar una muestra del malware Noppuca.

Lo primero y más importante es saber que existen varias formas de detectarlo, la más sencilla es buscar cadenas de texto y del idioma sacar la procedencia. Estos datos pueden ser falsos, pero ayudan a tener una  aproximación.

Otra opción inmediata es ver si con el propio explorador de ficheros muestra los detalles en la pestaña Versión.

Propiedades del binario
Estos datos realmente son obtenidos de uno de los recursos del ejecutable. Si recordamos la estructura de un binario PE, estos contienen una sección denominada recursos (.rsrc) donde  en forma de árbol se almacenan algunos elementos como bitmaps, iconos o diálogos. Cada uno de estos elementos tiene que estar identificado por un nombre, el tipo y su lenguaje.

Estructura de .rsrc
Muchos ejemplares de malware no disponen del recurso Version y cuando se muestran sus propiedades, todos los campos están vacíos (Vista/7) o ni si quiera hay pestaña Versión (XP):

Propiedades de malware sin recurso Version
Volviendo al bicho original, si se abre el malware con alguna aplicación para analizar archivos PE , como  CFF Explorer  y se recorre los recursos desde "Resource Editor", bajo la estructura de "Version Info", se encuentra la información mostrada por Explorer en su pestaña Versión.

CFF Explorer 
En la imagen superior se observa que tras la cadena Translation, hay cuatro bytes 0904 (0409) y 04b0, que en decimal equivale a 1033 y 1200. Estos números son el código de lenguaje y el código de página. Si se consulta la referencia de MSDN, se encontrará de donde sale el English/United States que se mostró inicialmente.

Tabla de Locales ID
Hasta aquí todo perfecto pero esta información se puede editar y si se compara el lenguaje con el que se identifica (1033) con el que este y otros recursos han sido creados, estos no concuerdan. 

Comparando el Lenguaje de Version (1033) con el de un Recurso (2052)
Ya que tal y como se ha explicado anteriormente todos los recursos se forman por un nombre, un tipo y un lenguaje y esta información es añadida por el compilador que genera el binario utilizando la configuración local del equipo. Usando la misma tabla anterior, se observa que 2052 corresponde con lenguaje chino. Esto mismo se puede consultar en las propiedades del recurso desde el propio CFF, que ya lo identificará como tal.

Propiedades de recurso
Como prueba final, el binario es subido a una sandbox online como la de ThreadExpert, que lo identifica con el mismo origen: China.


Por supuesto, estos datos también podrían haber sido modificados o incluso algo mucho más común, que no dispusiera de ningún recurso o el lenguaje fuera "0" que significa que se utilice el lenguaje local.


Leer más...

17 noviembre 2011

Uso de Burp Intruder para ataques de diccionario y fuerza bruta


Existen múltiples herramientas para ejecutar ataques de fuerza bruta contra aplicaciones web. Vamos a ver una forma de realizar esta operativa con una bastante potente, Burp Intruder, incluida en BurpSuite. Con ella se pueden automatizar varios procesos, como el de obtención de credenciales de acceso de una aplicación, búsqueda de valores aceptados en los parámetros de una petición (vayan por GET o por POST), ataques de inyección de código, descubrimiento de directorios... vamos, en general, un completo fuzzer para web. Para mostrar su uso, la explicación se centrará en hacer un ataque de diccionario, utilizando como víctima el panel de identificación de DVWA. 

Para empezar, se debe activar el Burp Proxy, también incluido en la suite, así como preparar el navegador para ir a través del proxy. Una vez se tenga seleccionada la petición que contiene los parámetros, bien por intercepción (intercept) o desde el histórico (history), habrá que pulsar el botón derecho y pinchar en “send to intruder”, cuya pestaña se pondrá en color rojo.

Menú contextual que aparece al hacer clic con el botón
derecho en la petición que contiene los parámetros

Situándose en la pestaña intruder, se observan debajo 4 nuevas pestañas, que son las que se deberán personalizar para cada tipo de ataque. Generalmente, no es necesario modificar nada en la pestaña target en el que viene especificado el objetivo. En positions, habrá que indicar dos aspectos: el tipo de ataque que se desea realizar y sobre qué parámetros se aplicará.


Los parámetros se eligen con los botones de la parte derecha (add, clear, auto y refresh). Por defecto suelen marcarse algunos. Lo mejor es hacer click en clear e ir seleccionando uno a uno los que interesen cada vez.

Los tipos de ataque (attack type) posibles son:
  • Sniper
  • Battering ram
  • Pitchfork
  • Cluster bomb
Sniper: En este tipo de ataque, se fijarán todos los parámetros excepto uno, en el que se probarán todas las opciones posibles del payload seleccionado. Una vez finalizado para ese parámetro, tomará el valor que recibió en la petición original e irá variando el siguiente parámetro. Así hasta haber completado el proceso para todos los parámetros seleccionados.

En position se indica el parámetro sobre el que se está aplicando el payload.
En este ejemplo, el parámetro 1 es username y el 2 password.

Battering ram: Permite la carga de un único payload por lo que, si hay más de un parámetro, se utilizarán los mismos datos en todas las posiciones simultáneamente.

Ejemplo de uso del mismo payload en ambos parámetros.

Pitchfork: Se prueba cada entrada del payload con su correspondiente en orden del resto de bloques de datos, es decir, el primer elemento del payload de la primera posición con el primer elemento del de la segunda posición marcada, el segundo con el segundo, y así sucesivamente.


Cluster bomb: En este caso, teniendo varias posiciones en las que automatizar el proceso, el ataque se realizará de manera que se prueben todos los valores de un parámetro contra todas las posibles combinaciones de valores del resto.


Como se puede intuir, en caso de tener una sola posición que automatizar, dará lo mismo el tipo de ataque seleccionado, ya que en todos los casos se permitirá elegir un solo payload con el que ejecutar el ataque.

La selección del payload dependerá del tipo de dato que se quiera utilizar. Las opciones que ofrece Intruder son amplias: desde la carga de diccionarios, hasta la selección de caracteres para efectuar una fuerza bruta clásica, pasando por fechas o generador en base a una cadena dada. Además, pueden realizarse operaciones sobre los datos seleccionados, como codificación en Base64 o aplicación de funciones hash.

Desde "payload set" se selecciona el tipo de dato que se utilizará como entrada, dinámico o diccionario.
En "payload processing rules" se puede seleccionar la operación a realizar sobre el tipo de dato.
Normalmente, se sabrá que el ataque ha tenido éxito por alguno de los siguientes aspectos:
  1. La respuesta del servidor (status): el servidor devuelve distintos códigos en función de tener éxito o no tenerlo.
  2. La longitud de la respuesta cuando el status no varía (length): Los casos de éxito tienen un longitud de respuesta diferente al resto.
  3. Otros factores.
En este ejemplo, aplica el tercer caso, ya que hasta que no se envía la petición que se había interceptado con el proxy (una vez ya finalizado el ataque), no se muestra el contenido de las respuestas, teniendo que retornar a la ventana del ataque, para ver qué posición ocupa la petición exitosa, algo incómodo, todo sea dicho de paso.


Pero lo normal es que salga algo similar a esto donde tanto la respuesta del servidor como la longitud varían respecto al resto de opciones:


BurpSuite ofrece dos versiones, una gratuita y otra de pago. Las diferencias entre ellas las podéis ver en la página oficial: http://portswigger.net/burp/download.html, pero os avanzo que para el intruder la diferencia radica en la velocidad de ejecución del ataque, ralentizado para la versión free.

---------------------------
Contribución por Beatriz Portela
Leer más...

16 noviembre 2011

Tu WordPress intocable con Mutex



La cantidad de ataques y exploits que se publican para WordPress es bastante considerable, hace poco hubo un 'deface masivo' de blogs que afectó a más de 2.500 sitios que tenían como denominador común WordPress + Plugin defectuoso.

Por aquí ya hablamos sobre 'PhpIds', un proyecto que tiene como misión desarrollar una librería para bloquear amenazas en proyectos escritos en PHP, de forma que permita fácilmente a un desarrollador añadir una capa de defensa en sus aplicaciones web.

PhpIds bloquea ataques de tipo XSS, SQLI o RFI


Mutex es un plugin para WordPress que incorpora PhpIds y además, lo integra perfectamente en WordPress permitiendo su administración desde el panel de gestión.

Veamos como instalarlo:

Descargamos la última versión:

wget http://downloads.wordpress.org/plugin/mute-screamer.1.0.3.zip

Lo 'unzipeamos':

unzip mute-screamer.1.0.3.zip

Copiamos la carpeta de mutex a la carpeta de plugins de WordPress:

cp -r mute-screamer /var/www/html/wordpress/wp-content/plugins/

Y finalmente ajustamos los permisos correctamente:

chown -R apache.apache /var/www/html/wordpress/wp-content/plugins/

Y aquí termina la parte en línea de comandos. La configuración la hacemos desde el panel de administración.

Activamos el Plugin desde la sección 'Plugins':


Una vez activado podemos configurar las opciones de Mutex, entre otras cosas permite:
  • Enviar un correo electrónico cuando se supere un límite de actividad (de esa forma podemos descartar los típicos scaneos aleatorios de una actividad realmente peligrosa)
  • Opción de 'banear' una IP si supera cierto número de ataques realizados (así como el tiempo que va a durar el bloqueo)
  • Definir excepciones para evitar falsos positivos

Para revisar los incidentes de seguridad detectados, tan solo tenemos que ir al Dashboard donde veremos la opción de 'Intrusions' para visionar los ataques recibidos, su fisonomía y las IPs


En definitiva, Mutex es un gran proyecto que debería estar instalado en todo WordPress que preste servicio de cara a Internet
Leer más...

15 noviembre 2011

Disponibles los vídeos de 5ENISE

A finales de Octubre se celebró en León el quinto 'ENCUENTRO INTERNACIONAL DE SEGURIDAD DE LA INFORMACIÓN', evento que celebra anualmente INTECO.

Durante el evento pude participar en el 'Encuentro Bloggers de Seguridad 2011' junto a Jose Selvi, David Hernández (dabo), Manolo Benet y Sergio De Los Santos. Evento promovido por INTECO-CERT

La mesa redonda fue bastante amena e interesante, compartimos ideas y formas de ver las cosas, personalmente yo sigo erre-que-erre con la idea de que, igual que yo no necesito saber las interioridades del ABS para disponer de el en el coche, al usuario final no se le puede 'enredar' con terminología exógena y extraña para que disponga de un nivel de seguridad informática adecuado.

Durante el debate hubo cierta controversia sobre la eficacia de concienciar al usuario VS imponer sanciones a quien lo haga mal y entregar al usuario productos seguros 'By Default'.

Mención especial para Javier Berciano y Francisco Losada por la profesionalidad, trato dispensado y gestión del evento

Los vídeos de las ponencias y talleres de ENISE se pueden ver aquí

El vídeo de la mesa redonda se puede ver aquí

Adicionalmente, mis compañeros de mesa escribieron interesantes reseñas con sus puntos de vista:

Leer más...

14 noviembre 2011

Fortificación de nginx

nginx es un popular servidor web y proxy inverso libre y gratuito que ya aloja más de 43 millones de dominios, entre los que se encuentra Wordpress, Dropbox, Facebook o TechCrunch.

En esta entrada vamos a ver algunos aspectos a configurar para que su instalación sea más segura.

Lo primero es eliminar información que identifique la versión de nginx todo lo que se pueda. Esto no hace el servicio más seguro, pero pone trabas a la hora de intentar buscarle fallos.

Para eliminar la cadena "nginx" de la cabecera Server, es necesario modificar el código fuente, en concreto del fichero  src/http/ngx_http_header_filter_module.c  siguientes líneas:

static char ngx_http_server_string[] = "Server: nginx" CRLF;
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;

Por
static char ngx_http_server_string[] = "Server: httpd" CRLF;
static char ngx_http_server_full_string[] = "Server: httpd" CRLF;

Si únicamente se desea eliminar el número de versión, dejando  tan solo "nginx", o no se puede recompilar, en la configuración se puede especificar con la directiva:

server_tokens off;

Una vez instalado, hay que asegurarse de que no se ejecuta con un usuario con privilegios de administración. En su configuración ha de figurar el usuario y grupo son distintos de root.

user              nginx nginx;

La identificación de la versión también es posible si se observan los mensajes de error del servicio. Para asegurar que no se reporta en ningún momento lo mejor es modificar las siguientes líneas del fichero src/http/ngx_http_special_response.c:

static u_char ngx_http_error_full_tail[] =
"<hr><center>" NGINX_VER "</center>" CRLF
"</body>" CRLF
"</html>" CRLF
;


static u_char ngx_http_error_tail[] =
"<hr><center>nginx</center>" CRLF
"</body>" CRLF
"</html>" CRLF
;

Por otras que no incluyan la variable NGINX_VER:

static u_char ngx_http_error_full_tail[] = CRLF;
static u_char ngx_http_error_tail[] = CRLF;

También se puede especificar en el fichero de configuración, dentro de server {}, cuáles serán las páginas de error personalizadas para cada una de los errores. En este ejemplo se redirige a error.html:

error_page 400 401 402 403 404 405 406 407 408 
409 410 411 412 413 414 415 416 417 495 496 497 500 501 502 503 504 
505 506 507 /error.html;
location /error.html {
    internal;
}

Una vez modificado el código fuente, se compila deshabilitando todos los módulos que no se usen. La web de nginx facilita una lista completa con su descripción. Especialmente interesante de eliminar es el autoindex. Para deshabilitar se utiliza una línea como la siguiente:

./configure --with-http_ssl_module --without-http_autoindex_module
--without-http_browser_module --without-http_fastcgi_module
--without-http_geo_module --without-http_empty_gif_module 
--without-http_map_module  --without-http_proxy_module
--without-http_memcached_module --without-http_ssi_module
--without-http_userid_module  --with-http_ssl_module 

Como se gestionan los recursos dependerá más de las necesidades de rendimiento que de la propia seguridad, salvo se detecte y conozca algún fallo concreto. Si es posible y no impacta a este factor, se especifican tamaños de buffer pequeños donde sea más difícil explotar una vulnerabilidad.

client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
client_body_timeout 10;
client_header_timeout 10;
send_timeout 10;
keepalive_timeout 60 60
send_timeout 60

Otra directiva interesante es activar la opción para ignorar todas las cabeceras invalidas:

ignore_invalid_headers   on;
Para deshabilitar métodos HTTP, la mejor opción es usar listas blancas, marcando únicamente aquellos que se vayan a utilizar. Esta configuración también afecta al rendimiento, ya que procesar la expresión regular es costoso. También es importante destacar que nginx no soporta el método TRACE, ni PUT/DELETE/MKCOL/COPY/MOVE siempre y cuando no se compile con soporte Webdav

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 500;
}

Otras características interesantes son la posibilidad de devolver un código de error en base al user-agent o al referer con una expresión regular, tal y como se muestra en el siguiente ejemplo, que además no hace distinción entre mayúsculas y minúsculas al haber especificado: ~*

if ($http_user_agent ~* (acunetix|nikto) ) {
  return 500;
}
if ($http_referer ~* (porn|webcam|bing) ) {
return 500;
}

También es posible evitar que enlacen directamente a las imágenes (hotlinking)  desde la configuración de nginx:

location ~* (\.jpg|\.png|\.css)$ {
 if ($http_referer !~ ^(hxxp://www.sbd.com) ) {
  return 500;
 }
}
Por último, si el servicio necesita servir páginas mediante HTTPS, una configuración válida y robusta que evita el ataque BEAST es la siguiente:

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers RC4:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=2592000; includeSubdomains";

Aunque es aconsejable saber los requerimientos de navegación y comprobar los resultados en el servicio de análisis de SSL de Qualys.
Leer más...

13 noviembre 2011

Enlaces de la SECmana - 97

Leer más...

12 noviembre 2011

Premios Bitácoras 2011: Enhorabuena Infospyware!


Al igual que el año pasado, el blog Security By Default ha sido finalista en la categoría de mejor blog de Seguridad Informática de los premios Bitácoras, entregados en el evento blogger Interque.

El año pasado, gracias los votos de nuestros lectores y simpatizantes, así como la decisión final del jurado, ganamos los premios Bitácoras 2010. 

Por este motivo, y fundamentalmente por un malentendido, pensamos que este año formaríamos parte del jurado, por lo que no podíamos presentarnos como candidatos. Así, decidimos no hacer ningún tipo de campaña mediática, ni promoción para pedir el voto a nuestros lectores.

Sin embargo, estábamos equivocados. No sólo no fuimos parte del jurado, sino que además podíamos presentarnos perfectamente. Aun así y todo, y gracias a nuestra comunidad de lectores, a la que no tenemos palabras para expresar tanta gratitud, hemos recibido, sin campaña, votaciones suficientes para quedar segundos en número de votos en la última clasificación. 

Como candidatos finalistas contamos con InfoSpyware y la Comunidad Dragonjar, prestigiosos blogs del mundo de la seguridad informática en español.

Por elección del jurado, este año el ganador ha sido InfoSpyware. Desde Security By Default, queremos mandar una calurosa enhorabuena a Marcelo Rivero, fundador y CEO del blog ganador. Una pena no poderte ver en la entrega de premios Marcelo!

Por supuesto, en primer lugar, queremos agradecer desde Security By Default a toooodos vosotros, lectores y amigos, que contasteis con nosotros, de una forma absolutamente incondicional, en la votación como mejor blog de seguridad: GRACIAS, GRACIAS y GRACIAS!!!!!

Nos vemos el año que viene!

Leer más...