Obtenemos la contrase├▒a maestra del administrador de contrase├▒as bloqueadas 1 Contrase├▒a 4

Nuevas herramientas, viejos m├ętodos. Realizamos ingenier├şa inversa y encontramos el defecto fatal de 1Password.

Todos aman los administradores de contrase├▒as. Son geniales por muchas razones. Personalmente, tengo m├ís de 200 entradas en el administrador. Con tantos datos confidenciales en un solo lugar, es importante comprender el alcance del da├▒o si su registro se ve comprometido, ya sea malware, exploits o simplemente una computadora que no se atiende durante varios minutos. El Washington Post public├│ recientemente un art├şculo basado en nuestro estudio . Este art├şculo ayuda a las personas a darse cuenta de que no todos los administradores de contrase├▒as son iguales.

Cre├şa firmemente que un administrador de contrase├▒as bloqueadas estaba bien protegido. Si alguien tiene acceso a mi computadora, entonces el m├íximo puede contar con un mont├│n de bytes aleatorios, ya que la informaci├│n se borra de forma confiable de la memoria.

Esto es cierto para 1Password 4 (Tenga en cuenta que la ├║ltima versi├│n es la s├ęptima hoy). Antes de cambiarlo hace unos a├▒os, verifiqu├ę que realmente no hay contrase├▒as claras cuando el administrador est├í en un estado bloqueado. Entonces, en caso de compromiso, el atacante tendr├í que lidiar con el almacenamiento encriptado.


¡La bóveda está cerrada!

En este estado, no hay entradas de contrase├▒a o una contrase├▒a maestra. Muy razonable y correcto, y 1Password 4 pas├│ esta prueba. O no?

Para deshacerme de los detalles aburridos, dir├ę de inmediato: pudimos restaurar la contrase├▒a maestra de una instancia bloqueada en 1Password 4, como se muestra a continuaci├│n.


Desbloquee 1Password 4 y recupere su contrase├▒a maestra

La animaci├│n muestra que 1Password 4 se desbloquea primero de la manera normal y luego se bloquea. Despu├ęs de eso, ejecutamos nuestra utilidad multipass , que recupera con ├ęxito la contrase├▒a. La utilidad explota el procesamiento incorrecto del campo de entrada de contrase├▒a en 1Password 4 para restaurar el b├║fer de contrase├▒a maestra ofuscado, desobuscarlo, desbloquear autom├íticamente 1Password 4 y finalmente mostrar la contrase├▒a maestra en la consola.

Detalles aburridos


El primer paso para evaluar un administrador de contraseñas es verificar si hay una contraseña maestra clara en la memoria. Esto es posible en cualquier editor hexadecimal que pueda interactuar con el espacio de memoria del proceso. Por ejemplo, el editor gratuito de HxD . Úselo para abrir el espacio de memoria 1Password 4.



Inmediatamente caemos en el primer área legible del espacio de memoria 1Password 4.


Ejemplo de representaci├│n de memoria HxD

Nada especial todav├şa. Pero puedes hacer una b├║squeda. Por ejemplo, c├│mo se ve la situaci├│n si escribe la contrase├▒a en la ventana de desbloqueo de 1Password 4, pero no hace clic en el bot├│n "Desbloquear":


B├│veda bloqueada 1 Contrase├▒a 4 con la contrase├▒a maestra ingresada en el campo

¿Seguramente la contraseña está en algún lugar de la memoria?

Abrimos HxD, pero la b├║squeda de una l├şnea con nuestra contrase├▒a maestra ("Z3Superpass #") no produce resultados.



Parece que 1Password de alguna manera cifra u ofusca el formulario a medida que se ingresa. Si el procedimiento funciona correctamente, entonces todo está bien.

Bucear más profundo


Para averiguar por qu├ę la contrase├▒a maestra no se puede encontrar en la memoria cuando est├í claramente presente en el cuadro de di├ílogo de desbloqueo, debe encontrar el c├│digo que interact├║a con ella. Hay varias formas Puede rastrear el procesamiento de eventos de teclado y mouse localizando 'GetMessage', 'PeekMessage', 'GetWindowText' u otras API de Windows que generalmente manejan la entrada del usuario. Entonces encontramos el b├║fer donde se graban las pulsaciones de teclas, y a trav├ęs de ellas salimos a la rutina de cifrado / ofuscaci├│n. Pero este es un proceso largo y propenso a errores, especialmente con marcos grandes que a veces manejan la memoria de manera muy extra├▒a, por lo que debe hacer muchas copias y conversiones para rastrear el b├║fer.

En cambio, utilizamos nuestra propia herramienta Thread Imager, dise├▒ada para realizar ingenier├şa inversa de protocolos propietarios "extra├▒os" a nivel de aplicaci├│n. Le ayudar├í a determinar d├│nde en la memoria 1Password 4 interact├║a con nuestra contrase├▒a maestra. La herramienta "autom├íticamente" identifica ├íreas de c├│digo en 1Password 4 que interact├║an con una contrase├▒a ofuscada (simplemente resalta las instrucciones que interact├║an con los datos de inter├ęs para su posterior an├ílisis). El resultado se parece a esto:


Thread Imager encuentra el c├│digo 1Password 4 que interact├║a con una contrase├▒a maestra desenfocada

Dado que la contrase├▒a maestra se almacena en la memoria en forma ofuscada, la herramienta primero debe mostrar d├│nde ocurre la ofuscaci├│n.

Un fragmento del primer resultado muestra que la primera aparici├│n de la contrase├▒a maestra se acompa├▒a de una transici├│n de c├│digo desde la direcci├│n 0x7707A75D a 0x701CFA10.


Una entrada detallada en Thread Imager resalta la transici├│n del c├│digo de 0x7707A75D a 0x701CFA10, mientras que los registros EAX y ECX se refieren al b├║fer con la contrase├▒a maestra

Examinar este lugar 0x7707A75D en el depurador (x64dbg) confirma nuestra teor├şa. De hecho, por primera vez, la cadena 'Z3superpass #' ocurre cuando finaliza la funci├│n de decodificaci├│n 'RtlRunDecodeUnicodeString' de la biblioteca ntdll.dll.



Despu├ęs de un peque├▒o an├ílisis, est├í claro que estas dos funciones se utilizan para ofuscar la contrase├▒a: 'RtlRunEncodeUnicodeString' y 'RtlRunDecodeUnicodeString'. Entonces, la contrase├▒a maestra est├í oculta de la copia primitiva de la memoria, por lo que anteriormente no pudimos encontrarla en el editor hexadecimal.

Si estudia el b├║fer codificado al final de la funci├│n RtlRunEncodeUnicodeString, la l├şnea cifrada con la contrase├▒a maestra se ve as├ş:


Contrase├▒a maestra cifrada

Despu├ęs de RtlRunDecodeUnicodeString 'se decodifica:


Contrase├▒a maestra descifrada

Curiosamente, esta área se guarda en la misma dirección 0x00DFA790 y podemos observar literalmente su cambio al ingresar una contraseña en la ventana de desbloqueo de 1Password 4:



Vulnerabilidad


'RtlRunEncodeUnicodeString' y 'RtlRunDecodeUnicodeString' son funciones simples que modifican una cadena con una operaci├│n XOR simple. Esto no es tan malo: parece ser el m├ętodo est├índar para enmascarar todos los controles de edici├│n nativos de Windows con el conjunto de indicadores 'ES_PASSWORD'.

El problema es que despu├ęs de desbloquear 1Password 4, la contrase├▒a maestra cifrada no se borra de la memoria.

Peor a├║n, permanece en la memoria incluso despu├ęs de que 1Password 4. est├í bloqueado, es decir, tenemos un almac├ęn de contrase├▒as bloqueadas, pero con una contrase├▒a maestra cifrada en la memoria.

Y lo que es peor, dado que interactuamos con el cuadro de diálogo de entrada de contraseña maestra, la misma área de memoria se reutiliza con el mismo valor XOR, lo que nos da fácil acceso al búfer codificado para crear un exploit.

Desaf├şo


Para crear un exploit confiable para 1Password 4, debe obtener una imagen más clara de cómo los flujos de trabajo del programa procesan la contraseña maestra. Usando las herramientas antes mencionadas, creamos un diagrama de datos de salida (ver figura a continuación).



Este diagrama facilita la comprensi├│n de d├│nde y qu├ę bibliotecas est├ín involucradas para identificar de manera confiable las ├íreas en la memoria donde puede recuperar la contrase├▒a maestra.

Explotar


┬┐Qu├ę tenemos en este momento? Tenemos un almacenamiento bloqueado, y en alg├║n lugar de la memoria se almacena una contrase├▒a ofuscada, porque el programa no limpi├│ la memoria correctamente.



Para recuperarlo, debe llamar al procedimiento en 1Password 4, que inicia 'RtlRunEncodeUnicodeString' y 'RtlRunDecodeUnicodeString'. Por lo tanto, mostrará la ubicación del búfer de memoria con la contraseña maestra codificada.


Área de memoria con una contraseña maestra ofuscada

Sin este b├║fer, habr├şa que sumergirse en el abismo de los procedimientos internos y los controles de Windows y los mecanismos de gesti├│n de memoria relacionados. Tal vez este an├ílisis facilita la b├║squeda de un b├║fer, pero no fuimos por este camino.

Parece que la única forma de llamar a 'RtlRunEncodeUnicodeString' y 'RtlRunDecodeUnicodeString' es ingresar la contraseña maestra en el carácter en el cuadro de diálogo. Entonces obtenemos el búfer deseado. Pero no sabemos la longitud de la contraseña.

Resolvimos este problema interceptando código que accede al primer carácter de nuestro búfer, bloqueando un intento de cambio. Esta rutina está en el bucle de mensajes de control en comctl32, que maneja el control del búfer de los elementos correspondientes. Llamar a 'memmove' con desplazamiento 0x70191731 sobrescribe el búfer con el carácter ingresado:


(Efecto secundario: la l├şnea resaltada (amarilla) actualiza la l├şnea de contrase├▒a completa)

Ahora finalmente tenemos todo lo que necesitamos para crear un exploit. Los siguientes pasos nos permitirán extraer la contraseña maestra:

  1. Enganche 'memmove' para evitar sobrescribir el primer byte de la contrase├▒a maestra.
  2. Enganche 'RtlRunEncodeUnicodeString' para obtener la ubicaci├│n del b├║fer de contrase├▒a maestra ofuscado.
  3. Enganche 'RtlRunDecodeUnicodeString' para acceder al b├║fer ofuscado obtenido en el paso anterior.
  4. Ingresando un carácter en el campo de ingreso de contraseña y rechazando el paso 1 (guardar la contraseña maestra completa), redirigiendo el paso 2 al paso 3 para decodificar la contraseña maestra ofuscada.

Para realizar todas estas acciones, cree una DLL con el c├│digo del controlador para todos estos enlaces. La biblioteca est├í incrustada en el proceso 1Password 4, env├şa un car├ícter al cuadro de di├ílogo de contrase├▒a maestra, iniciando los pasos memmove, RtlRunEncodeUnicodeString y RtlRunDecodeUnicodeString que podemos interceptar, y haciendo nuestra magia para recuperar la contrase├▒a maestra ofuscada. La mayor parte de la magia ocurre en DetourRtlRunEncodeUnicodeString, este es el gancho para la funci├│n 'RtlRunEncodeUnicodeString', que se muestra a continuaci├│n:



Lo que nos lleva al resultado final: desbloquear el repositorio bloqueado 1Password 4 de cualquier versi├│n utilizando el procedimiento con errores utilizado por la API de Windows:



Resumen


Cuando profundizamos en el interior de 1Password 4, esper├íbamos encontrar alg├║n tipo de sistema de seguridad complejo y que toda la informaci├│n confidencial se borre de la memoria, como sucede en los procedimientos PBKDF2 y otras ├íreas donde se usa la contrase├▒a maestra. Las entradas correspondientes tambi├ęn se borran. Sin embargo, debido a la supervisi├│n, el campo de entrada de contrase├▒a se considera un control est├índar de la API de Windows con una contrase├▒a oculta, lo que socava la seguridad de 1Password 4.

Source: https://habr.com/ru/post/441166/


All Articles