La contraseña viajaba en Base64

Plataforma
LetsDefend
Categoría
Análisis de tráfico
Dificultad
Easy

HTTP Basic Auth

We receive a log indicating a possible attack, can you gather information from the .pcap file?

Nos llega una alerta de un posible ataque y lo único que tenemos es un .pcap con el tráfico de un servidor web. Toca abrirlo con Wireshark y responder siete preguntas: cuántas peticiones hay, qué servidor es, quién se conecta y con qué credenciales.

Spoiler: todas las respuestas están en las cabeceras HTTP, porque todo va sin cifrar.

Primer vistazo al pcap

Filtrando por http se ve la conversación entera en diez paquetes. El patrón se repite: el cliente pide /, el servidor contesta 401 Authorization Required, el cliente vuelve a pedirlo con credenciales y el servidor responde 200 OK.

Wireshark con el filtro "http" aplicado: diez paquetes entre 192.168.63.20, 192.168.63.50 y el servidor 1.1.1.5. Se alternan peticiones "GET / HTTP/1.0", respuestas "401 Authorization Required" y respuestas "200 OK", con una de estas últimas seleccionada.

Pedir, recibir un 401, volver a pedir con credenciales y entrar.

Preguntas

1. Peticiones GET

How many HTTP GET requests are in pcap?

Respuesta: 5

La más rápida: Statistics → HTTP → Packet Counter. Seguramente haya más formas, pero esta te lo da contado y separado por tipo.

Menú Statistics de Wireshark desplegado, con HTTP y después Packet Counter subrayados en rojo.

Ventana Packet Counter de Wireshark: 10 paquetes HTTP en total, 5 respuestas (3 "401 Unauthorized" y 2 "200 OK") y 5 peticiones, todas GET, con una flecha roja señalando el 5.

Cinco peticiones y las cinco son GET. De las respuestas, tres son 401 y dos 200.

2. Sistema operativo del servidor

What is the server operating system?

Respuesta: FreeBSD

Nos vamos a una respuesta del servidor (por ejemplo, el 200 OK) y abrimos sus cabeceras. En la cabecera Server, Apache suele indicar entre paréntesis el sistema operativo:

Cabeceras de la respuesta HTTP/1.1 200 OK en Wireshark. La línea Server dice "Apache/2.2.15 (FreeBSD) DAV/2 mod_ssl/2.2.15 OpenSSL/0.9.8n", con "(FreeBSD)" recuadrado en rojo.

Una sola cabecera responde a esta pregunta y a las dos siguientes.

3. Software y versión del servidor web

What is the name and version of the web server software?

Respuesta: Apache/2.2.15

4. Versión de OpenSSL

What is the version of OpenSSL running on the server?

Respuesta: 0.9.8n

Las tres salen de la misma línea. Desmontada:

Server: Apache/2.2.15 (FreeBSD) DAV/2 mod_ssl/2.2.15 OpenSSL/0.9.8n
        │             │         │     │              └─ versión de OpenSSL
        │             │         │     └─ módulo SSL de Apache
        │             │         └─ módulo WebDAV
        │             └─ sistema operativo
        └─ servidor web y versión

5. User-Agent del cliente

What is the client's user-agent information?

Respuesta: Lynx/2.8.7rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.8n

Ahora nos pregunta por el cliente, así que cambiamos de lado: en vez de una respuesta, abrimos una petición GET de 192.168.63.20 y miramos la cabecera User-Agent.

Cabeceras de la petición "GET / HTTP/1.0" en Wireshark, con Host 192.168.63.100 y la línea User-Agent "Lynx/2.8.7rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.8n" recuadrada en rojo.

Lynx es un navegador en modo texto, de terminal.

6 y 7. Usuario y contraseña

What is the username used for Basic Authentication?

What is the user password used for Basic Authentication?

Respuesta: webadmin y W3b4Dm1n

En la misma petición, justo debajo, está la cabecera Authorization. Es la petición que manda el cliente después de recibir el 401, y el servidor le contesta con un 200: las credenciales son buenas.

Cabeceras de la misma petición con la cabecera Authorization desplegada: "Basic d2ViYWRtaW46VzNiNERtMW4=" y debajo la línea que añade Wireshark, "Credentials: webadmin:W3b4Dm1n", recuadrada en rojo.

Wireshark ya lo decodifica solo en la línea Credentials.

Wireshark hace el trabajo, pero se puede comprobar a mano:

echo 'd2ViYWRtaW46VzNiNERtMW4=' | base64 -d
# webadmin:W3b4Dm1n

Aprendizajes

  1. Base64 no protege nada: Basic Auth sin HTTPS es mandar la contraseña en texto claro con un paso extra. Si ves Authorization: Basic en un pcap, tienes las credenciales.
  2. Las cabeceras hablan mucho: una sola línea Server dio el sistema operativo, el servidor web y la versión de OpenSSL. Es lo primero que hay que mirar.