domingo, 22 de febrero de 2015

Cómo dumpear las claves SSH desde el firmware de un router

Algunos me preguntan como sacar las claves ssh de los routers. los veo venir... pero bueno, veremos rápidamente como hacerlo extrayendo la imagen del firmware de un router ;)

En esta ocasión sin embargo vamos a dejar al *pobre* Comtrend VG-8050 y vamos a ir a por el D-Link Dsl-2750u (la belleza de la derecha). En concreto vamos a echar un vistazo a una de las versiones de firmware que también viene con un demonio Dropbear 0.46 con "premio": la ME_1.11 de octubre de 2013:

http://www.dlinkmea.com/partner/media/product_item_downloadables/1351-DSL2750U-U1_FW1.11.rar

Después de descargar los menos de 7mb que ocupa el rar, lo descomprimimos y analizamos la imagen con Binwalk, el estándar de facto para el análisis de firmwares:



root@kali:~/firmwares# file GAN9.9T113A-B-DL-DSL2750U-R5B0024-Dubai.EN_2T2R_text_for_lan_update.img 
GAN9.9T113A-B-DL-DSL2750U-R5B0024-Dubai.EN_2T2R_text_for_lan_update.img: data

root@kali:~/firmwares# binwalk GAN9.9T113A-B-DL-DSL2750U-R5B0024-Dubai.EN_2T2R_text_for_lan_update.img 

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 5402908 bytes
1722624       0x1A4900        Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 5080877 bytes,  1142 inodes, blocksize: 262144 bytes, created: Thu Oct 24 07:46:30 2013

Como veis el filesystem es SquashFS, uno de los más ampliamente utilizados en sistemas con Linux embebido, y está comprimido con LZMA en lugar del estandar zlib (algo que también suelen hacer):


root@kali:~# binwalk --dd='squashfs:squashfs' GAN9.9T113A-B-DL-DSL2750U-R5B0024-Dubai.EN_2T2R_text_for_lan_update.img

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 5402908 bytes
1722624       0x1A4900        Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 5080877 bytes,  1142 inodes, blocksize: 262144 bytes, created: Thu Oct 24 07:46:30 2013

root@kali:~/_GAN9.9T113A-B-DL-DSL2750U-R5B0024-Dubai.EN_2T2R_text_for_lan_update.img.extracted# file 1A4900.squashfs 
1A4900.squashfs: Squashfs filesystem, little endian, version 4.0, 5080877 bytes, 1142 inodes, blocksize: 262144 bytes, created: Thu Oct 24 07:46:30 2013

El siguiente paso es extraer la imagen y, para ello, vamos a instalar y utilizar la utilidad unsquashfs-2.1 de Jeremy Collake:



apt-get install liblzo2-dev 
git clone https://github.com/devttyS0/sasquatch
make

root@kali:~/_GAN9.9T113A-B-DL-DSL2750U-R5B0024-Dubai.EN_2T2R_text_for_lan_update.img.extracted# ./sasquatch/sasquatch 1A4900.squashfs 
SquashFS version [4.0] / inode count [1142] suggests a SquashFS image of the same endianess
Parallel unsquashfs: Using 1 processor
Trying to decompress using default lzma decompressor...
Successfully decompressed with default lzma decompressor
1083 inodes (1113 blocks) to write

[=============================================================\] 1113/1113 100%

created 679 files
created 59 directories
created 123 symlinks
created 281 devices
created 0 fifos

Ahora veremos el filesystem colgando del directorio squashfs-root, por lo que sólo tenemos que ir a pescar nuestras claves...



root@kali:~/firmwares/_GAN9.9T113A-B-DL-DSL2750U-R5B0024-Dubai.EN_2T2R_text_for_lan_update.img.extracted# cd squashfs-root/etc/dropbear/
root@kali:~/firmwares/_GAN9.9T113A-B-DL-DSL2750U-R5B0024-Dubai.EN_2T2R_text_for_lan_update.img.extracted/squashfs-root/etc/dropbear# ls -las
total 16
4 drwxr-xr-x  2 594 594 4096 Oct 24  2013 .
4 drwxr-xr-x 10 594 594 4096 Oct 24  2013 ..
4 -rwxr-xr-x  1 594 594  459 Oct 24  2013 dropbear_dss_host_key
4 -rwxr-xr-x  1 594 594  427 Oct 24  2013 dropbear_rsa_host_key

... y con la herramienta dropbearkey mostrar la clave pública:



root@kali:~/firmwares/_GAN9.9T113A-B-DL-DSL2750U-R5B0024-Dubai.EN_2T2R_text_for_lan_update.img.extracted/squashfs-root/etc/dropbear# dropbearkey -y -f dropbear_rsa_host_key
Public key portion is:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgwCAmPVBs6DX2/2G6NcLwFI6jP055kbQzxGNNaYngPhR3TT9MMiGnR2waCQYrZq0n7D+RKu9tEiYU05tPiaMqm5z4qHq2OePKIL4jFhcTJk8p0yz1IpPp9FJjvZ6Daw4Mvr+r+RNNnSTn7Iq7bIxWyNgXnQc7Lx7IPmm8JDqskFEtOC7 root@kali
Fingerprint: md5 63:05:01:4f:cd:09:6d:ad:ed:95:ae:89:19:2c:b8:bc

Finalmente sólo nos queda buscar el fingerprint correspondiente:

Link shodan


 
y tenemos otros 40.000 equipos cuyas comunicaciones podremos descifrar :)


Fuente

jueves, 12 de febrero de 2015

JASBUG! es el momento de actualizar todos los equipos de una red con Directorio Activo

En el pasado, la seguridad de la red se diseñó en torno a "mantener el interior seguro desde el exterior", en lugar de la idea más general "proteger cada computadora de todos los demás". En estos días la defensa de la red como un perímetro definido rígidamente no es lo suficientemente buena, ya que muchos atacantes vienen de dentro. JASBUG, bautizado así porque fue descubierto (y reportado hace meses) por la firma de seguridad JAS Global Advisors, es más que un bug un fallo de diseño remanente desde desde Windows Server 2003 que puede permitir la ejecución remota de código (RCE) suplantando los archivos que el servidor envía a un cliente: software de confianza por malware.  

Este martes Microsoft ha publicado correcciones del core de su sistema para solventar estas vulnerabilidades críticas (CVE-2015-0008), concretamente dos que implican directivas de grupo y objetos de directiva de grupo (GPO):

MS15-014 - Una vulnerabilidad en SMB

  
Al iniciar sesión en una red con Directorio Activo, el servidor le enviará las actualizaciones según su directiva de grupo, por lo que el administrador de sistemas tiene la oportunidad de establecer una configuración estandarizada y segura en cada PC de su red. Sin embargo cuando la actualización falla, existe un fallo en SMB mediante el cual es posible desactivar los requisitos de firmado SMB, por lo que el cliente no comprobará que ya no está recibiendo los ficheros del servidor y un atacante podrá modificar la tabla ARP del switch para que acceda a su equipo y obtenga un fichero malicioso, todo esto sin que la víctima se percate.



La corrección es sencilla, cuando falle la actualización de directiva se cerrará la misma sin dejártela abierta sin firmado SMB.

MS15-011 - Una vulnerabilidad en la directiva de grupo

MS15-011 es similar, pero mucho más difícil de arreglar. Un atacante podría también hacer la misma suplantación pero mediante una especie de Catch-22: para averiguar si la firma SMB está activada, un cliente tiene que revisar una directiva de grupo del servidor de Active Directory y, mientras lo comprueba, el firmado SMB es irrelevante. El servidor valida el cliente a través del proceso de inicio de sesión, pero el cliente no valida el servidor (esto, en pocas palabras, es el fallo de diseño).

Para corregirlo Microsoft ha tenido que 1/ añadir una función para implementar el firmando SMB durante el proceso de directiva de grupo, para que su cliente pueda validar el servidor antes de confiar en sus datos de directiva de grupo y 2/ habilitar esta nueva característica en cada cliente.

Aunque ambas vulnerabilidades podrían explotarse a través de Internet, su escenario típico es mediante un ataque MITM en una red interna (LAN) con un Directorio Activo corporativo, por lo que los administradores de Microsoft deberían darse prisa en aplicar los parches publicados por Microsoft ayer...


pd. y no sólo los administradores... los usuarios domésticos también deben aplicar las actualizaciones ya que en este boletín de febrero se solventan otras vulnerabilidades a tener en cuenta: Internet Explorer, Windows Driver, Ms Office...

Fuentes:
JASBUG Fact Sheet
MS15-011 & MS15-014: Hardening Group Policy
The "JASBUG" Windows vulnerability - beyond the hype, what you need to know
15-Year-Old JasBug Vulnerability Affects All Versions of Microsoft Windows

viernes, 6 de febrero de 2015

Simular un falso ataque de LFI para que “salte” el WAF

Antes de realizar un ataque a una servidor, conviene tener información sobre qué medidas de seguridad tiene. Saber si el sistema tiene algún firewall delante protegiendo con redes el tráfico entrante, un reverse proxy para ocultar la ubicación real o una solución antimalware concreta que esté vigilando los ficheros que se suben, puede venir bien antes de preparar una intrusión. En el mundo del pentesting de aplicaciones web, cuando se realiza un escaneo, conviene saber si delante de la web hay algún WAF (Web Application Firewall) que pueda bloquear los intentos de explotación de vulnerabilidades. Localizar si existe, y cuál es, algún WAF es una buena idea, además de que puede ayudar a generar mucha más información del escenario completo con el que te encuentras.

Figura 1: Simular un ataque LFI para que "cante" el WAF

Existen muchas formas de saber si hay un WAF en un sitio web, pero hay una que es bastante sencilla y que funciona relativamente bien. Normalmente, cuando un WAF bloquea una petición, éste genera un menaje de respuesta HTTP 403 Forbidden, con una página de respuesta por  defecto que debería ser configurada para dar poca información a un posible atacante. Con el objeto de conseguir forzar ese error HTTP 403 del WAF, lo suyo es simular un ataque, y una forma muy sencilla de hacerlo es conseguir que el WAF crea que se está produciendo un ataque de LFI (Local File Inclusión) para acceder a ficheros sensibles.

Figura 2: Mensaje de error del WAF de un blog tecnológico

Estas técnicas se utilizan mucho en auditorías de seguridad e intrusiones de atacantes, y suelen tener la característica de querer escalar en el árbol de directorios del servidor web con la cadena ../../, algo que las reglas por defecto de la mayoría de los WAF - incluyendo el popular mod_security que se utiliza parafortificar servidores web GNU/Linux -, detectan por defecto y bloquean. Basta con añadir a una URL algo como ?file=../../ para hacer creer al WAF que se está produciendo el ataque, y ver qué mensaje obtenemos.

Figura 3: Mensaje 403 de un dominio de Apple.com

Como en los muchos casos vistos con los mensajes de error de los servidores web, estos mensajes pueden ser igual de útiles, no solo para saber que hay un WAF, sino para conocer exactamente el tipo de WAF y hacerse una idea del tipo de posibilidades que ofrece.

Figura 4: Mensaje de Error 403 de una empresa que indica la detección del LFI

Además, si la página ha sido personalizada, tal vez se pueda acceder a alguna información útil que haya podido quedarse allí por una mala configuración.

Figura 5: Mensaje de Error 403 en la web de DefCon generado por McAfee Global Threat Intelligence

Si tienes un WAF, comprueba los mensajes de bloqueo que estás mostrando en losHTTP 403. Si puedes evita dar demasiada información a los atacantes. Puedes configurar el WAF para devolver un HTTP 200 genérico con un bonito mensaje de error, y habrá mucha menos información que un atacante pueda llevarse a la boca.


lunes, 2 de febrero de 2015

GHOST (CVE-2015-0235), el fantasma que se cierne sobre Linux


Qualys ha publicado una vulnerabilidad grave de desbordamiento de buffer en la función__nss_hostname_digits_dots()usada por otras funciones tan comunes como gethostbyname() y gethostbyname2() de glibc, que un atacante podría provocar al intentar resolver un nombre de host inválido (/etc/hosts o DNS). 

Concretamente la función __nss_hostname_digits_dots() no calcula correctamente el tamaño del buffer que tiene que reservar y, bajo ciertas circunstancias, se pueden sobrescribir datos arbitrariamente mediante este desbordamiento. Aunque en principio sólo se pueden sobrescribir 4 bytes de memoria, se ha demostrado que son suficientes para evadir mitigaciones como ASLR y PIE y conseguir la ejecución remota de código.
En la práctica, esto se podría explotar solicitando resolver un nombre de host lo suficientemente largo (al menos 1KB) que cumpla los requisitos normales de nomenclatura (a.b.c.d).

  
Esta vulnerabilidad bautizada como GHOST (por su paralelismo con el nombre de la función afectada) y con código CVE-2015-0235, puede hacer que el atacante tome el control de un servidor Linux con el usuario de la aplicación que está ejecutando la resolución de nombre: Apache, Exim, Sendmail, Nginx, MySQL, TAZAS, Samba, ... ¡la lista es enorme!

Las versiones afectadas son:

- glibc 2.2 a 2.17 (incluidas) son vulnerables
- glibc 2.18 a 2.20 (incluidas) NO son vulnerables
- las versiones anteriores de glibc (<= 2.1.3) NO son vulnerables

Mediante el siguiente script en C hecho por la Universidad de Chicago podemos comprobar si somos vulnerables:

GHOSTTEMP=$(mktemp /tmp/ghost.XXXXXXXXXXXXXX)
GHOSTEXEC=$(mktemp /tmp/ghost.XXXXXXXXXXXXXX)
cat <<"EOF" > $GHOSTTEMP
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define CANARY "in_the_coal_mine"

struct {
  char buffer[1024];
  char canary[sizeof(CANARY)];
} temp = { "buffer", CANARY };

int main(void) {
  struct hostent resbuf;
  struct hostent *result;
  int herrno;
  int retval;

  /*** strlen (name) = size_needed - sizeof (*host_addr) - sizeof (*h_addr_ptrs) - 1; ***/
  size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1;
  char name[sizeof(temp.buffer)];
  memset(name, '0', len);
  name[len] = '\0';

  retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno);

  if (strcmp(temp.canary, CANARY) != 0) {
    puts("vulnerable");
    exit(EXIT_SUCCESS);
  }
  if (retval == ERANGE) {
    puts("not vulnerable");
    exit(EXIT_SUCCESS);
  }
  puts("should not happen");
  exit(EXIT_FAILURE);
}
EOF
gcc -x c $GHOSTTEMP -o $GHOSTEXEC
$GHOSTEXEC
rm -f $GHOSTTEMP $GHOSTEXECPaste your text here.

En caso que seamos vulnerables tendremos:
(...)
# gcc -x c $GHOSTTEMP -o $GHOSTEXEC
# $GHOSTEXEC
vulnerable
# rm -f $GHOSTTEMP $GHOSTEXEC 

Las siguientes distribuciones de Linux tiene versiones vulnerables de glibc:


Ubuntu
10.04 LTS     fix available     fixed in libc6 2.11.1-0ubuntu7.20
12.04 LTS     fix available     fixed in libc6 2.15-0ubuntu10.10
14 and newer     not vulnerable

Debian
6.x - squeeze     vulnerable
6.x - squeeze (LTS)     vulnerable
7.x - wheezy     vulnerable
7.x - wheezy (security)     fix available     fixed in glib 2.13-38+deb7u7
8.0 - jesse     not vulnerable
dev - sid     not vulnerable

Red Hat Enterprise
fix information
Desktop (v. 6)     fix available     fixed in glibc-2.12-1.149.el6_6.5
Desktop (v. 7)     fix available     fixed in glibc-2.17-55.el7_0.5
HPC Node (v. 6)     fix available     fixed in glibc-2.12-1.149.el6_6.5
HPC Node (v. 7)     fix available     fixed in glibc-2.17-55.el7_0.5
Server (v. 6)     fix available     fixed in glibc-2.12-1.149.el6_6.5
Server (v. 7)     fix available     fixed in glibc-2.17-55.el7_0.5
Server EUS (v. 6.6.z)     fix available     fixed in glibc-2.12-1.149.el6_6.5
Workstation (v. 6)     fix available     fixed in glibc-2.12-1.149.el6_6.5
Workstation (v. 7)     fix available     fixed in glibc-2.17-55.el7_0.5

Mint
13 “Maya”     fix available     Tracks Ubuntu 12.04, should get update from Ubuntu servers
17 “Qiana”     not vulnerable
17.1 “Rebecca”     not vulnerable

Gentoo
libc information
stable     not vulnerable      uses glibc 2.19-r1

Arch
fixed in all releases since August 2013, discussion here and package info here
anything recent     not vulnerable

Fedora
discussion
19 and earlier     vulnerable     uses glibc 2.17 and earlier
20     not vulnerable     uses glibc 2.18
21     not vulnerable     uses glibc 2.20

Mandriva Linux
all     vulnerable     appears to use glibc 2.16

openSUSE
vulnerability information
Enterprise 11 & older     vulnerable
Enterprise 12     not vulnerable
openSUSE 13.1 & newer      not vulnerable

Slackware
current     not vulnerable     uses glibc 2.20
14.1 and earlier     vulnerable     uses glibc 2.17 and earlier

Knoppix
information about glibc versions
7.2 and earlier     vulnerable     uses glibc 2.17 and earlier
7.4 and later     not vulnerable     uses glibc 2.19 and later

Slax
all     vulnerable     appears to use glibc 2.15

Lo llamativo de esta vulnerabilidad, sobre la que se informó públicamente ayer, es que estaba en glibc desde el año 2000 y no fue resuelta hasta 2013; sin embargo, la corrección no se marcó como de seguridad, por lo que distribuciones de largo recorrido como las LTS de Ubuntu, Debian o RHEL, no aplicaron el parche.

Sea como fuere, si tu distribución tiene ya parches disponibles aplicalos cuanto antes:

- Actualiza a glibc 2.18 o más reciente
- Reinicia todos los procesos que cargan la biblioteca glibc
- Corrige los nuevos binarios de software que estén enlazados estáticamente contra versiones vulnerables de la biblioteca glibc. 


Fuentes: 
The GHOST Vulnerability
Critical “GHOST” Vulnerability Released
GHOST, el fantasma que acechaba en glibc
Comprobar si somos vulnerables a Ghost CVE-2015-0235 
Ghost, un agujero de seguridad en Linux más peligroso para Internet que Heartbleed 
Vulnerability Overview: Ghost (CVE-2015-0235)
Severe “Ghost” flaw leaves Linux systems vulnerable to takeover 
Scary 'Ghost' vulnerability leaves Linux systems vulnerable to possession
GHOST: glibc: buffer overflow en gethostbyname CVE-2015-0235


miércoles, 28 de enero de 2015

Puerto TCP 32764 o una puerta abierta en numerosos routers de Cisco, ¿bug masivo o backdoor intencionado?

Hace tiempo alguien se extrañó al ver que en su router Netgear estaba abierto el puerto TCP 32764... pero es ahora a principios de año cuando el francés Eloi Vanderbeken ha alertado a la Comunidad al advertir la presencia de un backdoor corriendo en este puerto en numerosos routers Netgear, Linksys y Cisco.

Después de un análisis de firmware, Vanderbeken descubrió numerosas vulnerabilidades como desbordamientos de memoria basados en pila o path traversal, llegando a conseguir el acceso y control total del dispositivo (shell) a través de este puerto sin ningún tipo de autenticación. Así mismo se podrían realizar denegaciones de servicio, pudiendo resetear la configuración de fábrica o la obtención de la configuración del sistema (routercfg.cfg).

En el repositorio GitHub de Vanderbeken podrás encontrar un listado de los modelos de routers vulnerables ya confirmados así como una descripción de la vulnerabilidad y la PoC correspondientes:


https://github.com/elvanderb/TCP-32764
  
Ante eso, Cisco ha tenido que confirmar finalmente la existencia de esta puerta trasera indocumentada en varios de sus routers que podrían permitir a un atacante remoto "obtener acceso de root en un dispositivo afectado" por medio de lo que llaman "una interfaz de prueba indocumentada en el servicio TCP 32764".

"Un atacante podría aprovechar esta vulnerabilidad mediante el acceso al dispositivo afectado desde la interfaz de la LAN y ejecutar arbitrariamente comandos en el sistema operativo subyacente. Un exploit podría permitir al atacante acceder a las credenciales de usuario de la cuenta de administrador del dispositivo, y leer la configuración del dispositivo" afirmó la empresa.

¿Realmente se trata de un fallo y olvidaron eliminar un "interfaz de prueba" en NUMEROSAS versiones de firmware de NUMEROSOS dispositivos? Ni de cagando Cuesta creerlo... así que parece tratarse de otro backdoor que nos regala el fabricante...


Fuentes:
Cisco Discloses Existence of Undocumented Backdoor in Routers 
Acceso remoto no documentado en routers DSL Linksys y Netgear 
Backdoor found in many consumer routers and WAPs (Port 32764 vulnerability) 
Netgear, Linksys and many other Wireless Routers have a backdoor 
CVE-2014-0659

martes, 27 de enero de 2015

Maldrone, el primer malware (conocido) para drones

El experto de seguridad Rahul Sasi (@fb1h2s) ha descubierto y explotado un backdoor en Parrot AR, un popular cuadricóptero que puede ser controlado fácilmente mediante un smartphone.

AR Drone posee un 9-DOF*, un sensor de ultrasonidos (baja altitud), un sensor de presión (altitud alta) y un sensor GPS.

*"Degrees Of Freedom" o "DOF" es una serie de ejes y sensores combinados para el equilibrio de un avión, un helicóptero o un robot.
Un 9-DOF es un 6-DOF (acelerómetros de 3 ejes combinados con un giroscopio de 3 ejes) combinado con un magnetotérmico (brújula).


El AR Drone tiene un binario llamado program.elf que controla el dron entero usado los datos de estos sensores. Este pequeño programa es suficiente para llevar acabo aterrizajes automáticos, estabilidad en vuelo y otras operaciones. El acceso a estos sensores se realiza mediante puertos serie:

/dev/ttyO0 —> rotors and leds
/dev/ttyO1 —> Nav board
/dev/ttyPA1 — > Motor driver
/dev/ttyPA2 —> accelerometer, gyrometer, and sonar sensors
/dev/video0 -->
/dev/video1 — > video4linux2 devices
/dev/i2c-0
/dev/i2c-1
/dev/i2c-2
/dev/usb-i2c

AR Drone también tiene una API de alto nivel, de código abierto, que permite controlar el dron mediante comandos AT y que podría aprovecharse para construir el backdoor más fácilmente, si bien Rahul quería controlar drones y robots en general y por lo tanto su objetivo fue interacturar directamente con los sensores y datos de navegación. Por ello la idea del backdoor se centra directamente en el binario program.elf:

Paso 1: matar program.elf
Paso 2: instalar un proxy de puertos serie para la navboard y otros
Paso 3: redireccionar la comunicación de los puertos serie reales a los puertos serie falsos
Paso 4: parchear el binario program.elf para que use los puertos serie del proxy
Paso 5: Maldrone se comunica con los puertos de serie directamente

En la próxima conferencia Nullcon se dará mayor detalle técnico, aunque parece que Maldrone [MALware DRONE] ya podría secuestrar a distancia drones:

"Una vez que mi programa detiene los controladores reales de los drones, hace que los motores se paren y el dron cae como un ladrillo", dijo Sasi. "Pero mi puerta trasera devuelve al instante el control por lo que si el dron vuela alto en el aire, los motores pueden arrancar otra vez y Maldrone puede evitar que se caiga".

Rahul Sasi también proporciona una prueba de concepto-video para demostrar su eficacia:



 
"En este video mostramos cómo infectar un avión no tripulado con Maldrone, esperando una conexión tcp inversa. Una vez establecida la conexión, podemos interactuar con el software, así como con los drivers/sensores del avión no tripulado directamente. Existe un programa de pilotaje de AR drone. Nuestras puertas traseras matan al piloto automático y toma el control. El Backdoor es persistente a través de reajustes":

Fuentes:
http://garage4hackers.com/entry.php?b=3105
http://thehackernews.com/2015/01/MalDrone-backdoor-drone-malware.html
http://securityaffairs.co/wordpress/32767/hacking/maldrone-malware-for-drones.html

lunes, 19 de enero de 2015

Apps mágicas para hackear Facebook

Conseguir la contraseña de Facebook de una cuenta es una de las peticiones más usuales que se suele recibir de la gente que busca solucionar sus problemas invadiendo la intimidad de las personas cercanas. Hay una gran demanda para este tipo de servicios, y por ende aparece la oferta de este tipo de servicios por medio de muchas maneras, casi todas con el fin de engañar al que busca hackear Facebook. Desde engaños al uso de "págame y ya me pongo yo a conseguirte la contraseña que yo hago unos troyanos superfuertes", hasta las típicas falsas apps mágicas que se comercializan para espiar WhatsApp en las que supuestamente pones un número de teléfono y al instante te da las conversaciones que de la otra persona. 

Figura 1: Apps mágicas para hackear Facebook
Estas apps mágicas para espiar son algo muy utilizado en el mundo del fraude online, y en casos como las apps mágicas para WhatsApp han generado auténticos negocios como hemos visto en el pasado. Hoy yo venía a hablaros de una de esas apps mágicas para hackear. En concreto de una App mágica para Hackear Facebook que me encontré ayer jugando con nuestra plataforma Path 5.
Figura 2: FaceHack, una app para robar passwords de Facebook con 0days de SQL Injection y Brute Force
La encontré mientras buscaba apps hablaran de SQL Injection y me llamó poderosamente la atención.  "¿Una app para hackear Facebook que está relacionada con SQL Injection? Esto hay que verlo". Tal y como se puede ver en la imagen de arriba, el crespón negro indica que la app fue retirada de Google Play hace varios meses, pero lo bueno de Path 5 es que nos hace el archivado automático de todas las apps y todas las versiones, así que podría jugar con ella.
Figura 3: Descripción, descargas e información de FaceHack en Google Play
El asunto del SQL Injection aparecía en la descripción, donde los autores presumen de que son unos tipos son unos mega hax0RDs con capacidades superiores a las que tienen los ingenieros de seguridad de Facebook y todos los investigadores que participan en el Bug Bounty y son capacidades de sacar las passwords usando Fuerza Bruta y bugs de SQL Injection que solo ellos tienen. Tiene gracia, pero ya que vas a meter una trola a alguien, que sea a lo grande, ¿no?. De hecho no será la primera vez que alguna gran empresa como Apple se come ataques de Brute Force en sus servidores o bugs de SQL Injection en sitios de renombre.
Aún así, publicar un par de 0days de Facebook en una app en Google Play no parece lo más inteligente para un hax0RD del nivel de estos autores, así que la trola canta muchísimo, así que decidí descargarla y darle un vistazo. Primero una descompresión del APK, luego una extracción del código con dex2jar para sacar los ficheros .class y luego usando JAD y Show My Code a leer un poco el código de la app y para ver la magia.
Al extraer el código se podía ver que la parte del ataque SQL Injection la tenían en una rama completamente a parte, así que me fui a ver qué hacían por allí. La función que más me gustó fue esta de DoSomeTasks para tener entretenido al usuario de la app.
Figura 4: Función para hacer cosas
Esta función se llamaba de vez en cuando con algunos retardos de tiempo para que se viera lo duro y cansado que era el trabajo de esta pobre app tratando de sacar la contraseña de la víctima.
Figura 5: Retardos de tiempo periódicos en la app
Eso sí, la contraseña la saca, y la saca con emoción. Al estilo que buscan los periodistas cuando graban un reportaje para la tele. Visualizando la tensión poco a poco por pantalla. Primero intentando conectar una vez con mucha dificultad.
Figura 6: Tensión, se está intentando conectar a...¿a qué?
Lugo intentándolo otra vez, para al final conseguirlo y poder sacar por pantalla la password de la víctima que esta app mágica va a sacar para el atacante.
Figura 7: Se conecta a la segunda... y ¿obtiene una password? ¿De dónde?
Cuando sale la contraseña, se la saca de una variable que se llama Str. What? Str? ¿De dónde ha salido ese Str con una password? Había que encontrar ese Str, así que a buscar la variable por todo el programa. Y ahí está, es mágico.
Figura 8: Sacando la password como los magos de la tele
Como se puede ver, lo único que hace es tirar un dado y sacar una contraseña Random para mostrársela al usuario y listo. ¡Eso sí es magia! Alguno podrá pensar que esto es una locura, pero... ¿no hacen esto los magos todos los días en los programas de consultorio de magia en la tele y son legales y pagan sus impuestos? Eso sí, por pantalla tiran comandos SQL para que se vea el SQL Injection.
Figura 9: Ahí está el SQL Injection... ¡escéptico!
Lo cierto es que el ataque de Brute Force era similar, así que fui a capón en busca de la variable Str para ver cómo lo hacía en la otra rama del ataque, para ver que era exactamente el mismo juego de magia e imaginación.
Figura 10: El Str del Brute Force y las funciones de publicidad e Mobile Core
¿Y todo por qué? Pues para monetizar el uso de la app con publicidad de Mobile Core, que no olvidéis que en la descripción de esta app se puede ver que tenía ya más de 10.000 descargas de usuarios que buscaban robar passwords de otros.
Figura 11: El mismo truco en versión desktop para Windows
Por supuesto, el truco este de la app mágica para hackear Faceook existe también en versión escritorio, e incluso hay un vídeo demostrativo de FaceHacker 2014 que demuestra como se obtienen las passwords. Unos crack de los efectos especiales en vídeo.

domingo, 18 de enero de 2015

KeySweeper: Keylogger Arduino para teclados inalámbricos de Microsoft

KeySweeper es un dispositivo basado en una placa Arduino que, camuflado en la carcasa de un simple cargador USB, se encarga de espiar y capturar todas las pulsaciones que se realicen en un teclado inalámbrico de Microsoft cercano. El autor es Samy, creador también de de BadUSB con USBdriveby en Mac OS X




El equipo se basa en otros proyectos que conseguían vulnerar la transmisión inalámbrica de los teclados, aunque su peculiaridad es la capacidad de ocultarse en dicho cuerpo y la de poder seguir funcionando durante varios minutos sin estar enchufado gracias a la batería interna que dispone. Para ello cuenta también con un módulo de Adafruit que permite tener conexión de datos con una tarjeta SIM y así poder enviar por SMS los registros, aunque este tipo de conexión y componente es totalmente opcional, ya que los datos se guardarán en una memoria interna e incluso se podrán revisar en tiempo real a través de una web. Lo mejor es que el cargador USB en el que se aloja seguiría funcionando, por lo que podríamos mantener enchufado un dispositivo y no levantar ningún tipo de sospechas.




El código fuente de KeySweeper está disponible en github:


Existen múltiples partes a KeySweeper. El código principal está instalado en el microcontrolador, mientras que un motor basado en la web usando jQuery y PHP registra todas las pulsaciones de teclado y proporciona una interfaz web para el seguimiento en vivo de los teclados víctima.



Hardware

  • Arduino Pro Mini / Teensy
  • Nordic nRF24L01+
  • Adafruit FONA GSM board (Opcional)
  • AC USB 5v 1A charger
  • Winbond W25Q80BV SPI Flash chip
  • 3.7v Lithium Polymer/Ion (Lipo/Lion) battery


Vídeo - Demo




Fuente

viernes, 16 de enero de 2015

Fortificación SSL en servidores web Apache e IIS

 
Tener SSL activado en tu sitio web no es siempre sinónimo de seguridad. BEAST, CRIME y Heartbleed nos recuerdan la necesidad de fortificar estas configuraciones para que usar un protocolo cifrado realmente sea efectivo. 

En el blog 'Root is the Limit', el cual les recomiendo visitar, se especifican unos sencillos pasos para asegurar SSL tanto en Apache como en IIS, que aquí hemos querido también recopilar:
  1. APACHE

Eliminar el uso de cifrados obsoletos

En las directivas de configuración del servidor permitiremos el uso de todos los cifrados excepto SSLv2 y SSLv3 con la siguiente directiva:


SSLProtocol All -SSLv2 -SSLv3 

CRIME

El ataque CRIME gira en torno a la fuga de información cuando los datos se comprimen antes de ser cifrados. Puedes leer más sobre el ataque aquí.

La forma más sencilla de mitigar este ataque consiste en deshabilitar la compresión SSL:


SSLCompression off 

Cipher Suite

La configuración recomendada por Fundación Mozilla es la siguiente (ten en cuenta esta configuración no es compatible con los navegadores más antiguos, como Internet Explorer 8):


SSLCipherSuite AES256+EECDH:AES256+EDH:!aNULL:!eNULL 

Esto tiene la ventaja de permitir Perfect Forward Secrecy. La EFF detalla la importancia de PFS aquí.

HTTP Strict Transport Security

Esta configuración en el servidor instruye a los agentes de usuario (o navegadores) inyectándoles una cabecera para que sólo hagan conexiones HTTPS al servidor web. OWASP lo detalla aquí.

En primer lugar, tenemos que asegurarnos de que tenemos el módulo headers habilitado. Podemos editar los archivos de configuración del Apache o httpd y añadir:


LoadModule headers_module modules/mod_headers.so 

El último parámetro "modules/mod_headers.so" es la ruta real al archivo mod_headers.so en tu sistema y puede variar. Si lo hace, puedes encontrarlo con:


locate mod_headers.so

Después de esto, podemos volver al archivo conf SSL original que estábamos editando y añadimos:


Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"

El "max-age" es la cantidad de tiempo en segundos para que el agente de usuario continúe solicitando este recurso sólo en HTTPS.

Finalmente reiniciamos Apache y probamos: https://www.ssllabs.com/ssltest.

2. IIS

Eliminar el uso de cifrados obsoletos

En primer lugar, tenemos que desactivar el uso de los cifrados mas antiguos y permitir el uso de los más preferibles y seguros.

Desactivación de los desaprobados:

Desactivar PCT 1.0:


# Disable PCT 1.0
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Server' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Server' -name Enabled -value 0 -PropertyType 'DWord' -Force 

Desactivar SSLv2:


# Disable SSL 2.0 (PCI Compliance)
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server' -name Enabled -value 0 -PropertyType 'DWord' -Force 

Desactivar SSLv3:


# Disable SSL 3.0 (PCI Compliance)
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server' -name Enabled -value 0 -PropertyType 'DWord' -Force 

Desactivar cifrados inseguros:


 # Disable insecure ciphers
$insecureCiphers = 'NULL','RC2 40/128','RC2 56/128','RC2 128/128','RC4 40/128','RC4 56/128','RC4 64/128','DES 56/56'
Foreach ($insecureCipher in $insecureCiphers) {
  $key = (Get-Item HKLM:\).OpenSubKey('SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers', $true).CreateSubKey($insecureCipher)
  $key.SetValue('Enabled', 0, 'DWord')
  $key.close()
  Write-Host "$insecureCipher has been disabled"
}

Desactivar Multi-Protocol Unified Hello:


 # Disable Multi-Protocol Unified Hello
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\Multi-Protocol Unified Hello\Server' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\Multi-Protocol Unified 

Ahora vamos a activar los más nuevos y seguros:

Añadir y activar TLSv1.1:


# Add and Enable TLS 1.1 for client and server SCHANNEL communications
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server' -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client' -name 'Enabled' -value 1 -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force 

Añadir y activar TLSv1.2:


# Add and Enable TLS 1.2 for client and server SCHANNEL communications
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -name 'Enabled' -value 1 -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force 

Activar los cifrados más nuevos y seguros:


# Enable new secure ciphers
$secureCiphers = 'RC4 128/128','Triple DES 168/168','AES 128/128','AES 256/256'
Foreach ($secureCipher in $secureCiphers) {
  $key = (Get-Item HKLM:\).OpenSubKey('SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers', $true).CreateSubKey($secureCipher)
  New-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\$secureCipher" -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force
  $key.close()
  Write-Host "$secureCipher has been enabled"
} 

Fortificaciones adicionales:


# Set hashes configuration
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\MD5' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\MD5' -name Enabled -value '0xffffffff' -PropertyType 'DWord' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\SHA' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\SHA' -name Enabled -value '0xffffffff' -PropertyType 'DWord' -Force
# Set KeyExchangeAlgorithms configuration
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman' -name Enabled -value '0xffffffff' -PropertyType 'DWord' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\PKCS' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\PKCS' -name Enabled -value '0xffffffff' -PropertyType 'DWord' -Force 

Y, por último, cambiamos el orden de las suites de cifrado para permitir Perfect Forward Secrecy:


# Set cipher suites order as secure as possible (Enables Perfect Forward Secrecy)
New-ItemProperty -path 'HKLM:\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002' -name 'Functions' -value 'TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P521,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P521,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P521,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P521,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P521,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P521,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P521,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P521,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P521,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA' -PropertyType 'String' -Force 

Una vez realizados todos estos cambios es necesario reiniciar el servidor para que surtan efecto. Después, se recomienda volver a probar la configuración de SSL. Recuerda que la desactivación de SSLv3 elimina la compatibilidad con navegadores antiguos como IE8.

El último cambio es permitir HTTP Strict Transport Security. Dado que esta es sólo una cabecera, podemos editar el archivo web.config. Muchos afirman que este cambio a través de IIS no sigue exactamente la especificación pero, aún así, activa la función.

En el archivo web.config, añade estas líneas:


<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Strict-Transport-Security" value="max-age=31536000"/>
        </customHeaders>
    </httpProtocol>
</system.webServer>

* NOTA * Lo más probable es que tu web.config tenga ya las etiquetas system.webServer por lo que se pueden omitir esas etiquetas y colocar el resto entre las que ya están.

A continuación tienes el script completo. Tener en cuenta que ha sido probado para IIS8 y que las versiones anteriores podrían no soportar TLSv1.2 (por ej.  W2k3).


# Copyright 2014, Alexander Hass
# http://www.hass.de/content/setup-your-iis-ssl-perfect-forward-secrecy-and-tls-12

# Add and Enable SSL 3.0 for client and server SCHANNEL communications
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server' -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force

# Add and Enable TLS 1.0 for client and server SCHANNEL communications
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server' -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force

# Add and Enable TLS 1.1 for client and server SCHANNEL communications
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server' -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client' -name 'Enabled' -value 1 -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force

# Add and Enable TLS 1.2 for client and server SCHANNEL communications
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -name 'Enabled' -value 1 -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force

# Disable Multi-Protocol Unified Hello
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\Multi-Protocol Unified Hello\Server' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\Multi-Protocol Unified Hello\Server' -name Enabled -value 0 -PropertyType 'DWord' -Force

# Disable PCT 1.0
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Server' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Server' -name Enabled -value 0 -PropertyType 'DWord' -Force

# Disable SSL 2.0 (PCI Compliance)
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server' -name Enabled -value 0 -PropertyType 'DWord' -Force

# WARNING: If you disable SSL 3.0 the you may lock out some people still using
# Windows XP with IE6/7. Without SSL 3.0 enabled, there is no protocol available
# for these people to fall back. Safer shopping certifications may require that
# you disable SSLv3. I suspect in mid 2015 this can safely disabled.
#
# Disable SSL 3.0 (PCI Compliance)
#md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server' -Force
#New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server' -name Enabled -value 0 -PropertyType 'DWord' -Force

# Disable insecure ciphers
$insecureCiphers = 'NULL','RC2 40/128','RC2 56/128','RC2 128/128','RC4 40/128','RC4 56/128','RC4 64/128','DES 56/56'
Foreach ($insecureCipher in $insecureCiphers) {
  $key = (Get-Item HKLM:\).OpenSubKey('SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers', $true).CreateSubKey($insecureCipher)
  $key.SetValue('Enabled', 0, 'DWord')
  $key.close()
  Write-Host "$insecureCipher has been disabled"
}

# Enable new secure ciphers
$secureCiphers = 'RC4 128/128','Triple DES 168/168','AES 128/128','AES 256/256'
Foreach ($secureCipher in $secureCiphers) {
  $key = (Get-Item HKLM:\).OpenSubKey('SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers', $true).CreateSubKey($secureCipher)
  New-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\$secureCipher" -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force
  $key.close()
  Write-Host "$secureCipher has been enabled"
}

# Set hashes configuration
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\MD5' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\MD5' -name Enabled -value '0xffffffff' -PropertyType 'DWord' -Force

md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\SHA' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\SHA' -name Enabled -value '0xffffffff' -PropertyType 'DWord' -Force

# Set KeyExchangeAlgorithms configuration
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman' -name Enabled -value '0xffffffff' -PropertyType 'DWord' -Force

md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\PKCS' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\PKCS' -name Enabled -value '0xffffffff' -PropertyType 'DWord' -Force

# Set cipher suites order as secure as possible (Enables Perfect Forward Secrecy)
New-ItemProperty -path 'HKLM:\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002' -name 'Functions' -value 'TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P521,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P521,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P521,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P521,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P521,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P521,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P521,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P521,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P521,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA' -PropertyType 'String' -Force

Write-Host 'After the system has been rebooted you can verify your server configuration at https://www.ssllabs.com/ssltest/'
Write-Host -ForegroundColor Red 'A computer restart is required to apply settings. Restart computer now?'
Restart-Computer -Force -Confirm