Ir al contenido


Foto

Descifrar el fichero de contraseñas Mysql Workbench


  • Por favor identifícate para responder
9 respuestas en este tema

#1 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 27 febrero 2018 - 10:42

Yo soy bastante despistado, y cuando estoy intentando resolver un problema y me pasan la contraseña de una base de datos me olvido de anotarla, y simplemente la dejo guardada en el "vault" del Mysql Workbench. Cuando la necesito en otro equipo tengo que volver a pedirlas con el engorro que eso supone.

 

Para eso hice este pequeño trozo de codigo que descifra el fichero de contraseñas del workbench y muestra el contenido por consola


delphi
  1. program workbenchpass;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils,
  7. Windows,
  8. Classes;
  9.  
  10. type
  11. TDATA_BLOB = record
  12. cbData: DWORD;
  13. pbData: PByte;
  14. end;
  15. PDATA_BLOB = ^TDATA_BLOB;
  16.  
  17. TCRYPTPROTECT_PROMPTSTRUCT = record
  18. cbSize: DWORD;
  19. dwPromptFlags: DWORD;
  20. hwndApp: HWND;
  21. szPrompt: PWChar;
  22. end;
  23. PCRYPTPROTECT_PROMPTSTRUCT = ^TCRYPTPROTECT_PROMPTSTRUCT;
  24.  
  25. const
  26. CRYPTPROTECT_UI_FORBIDDEN = 1;
  27.  
  28. function CryptProtectData(pDataIn: PDATA_BLOB; szDataDescr: PWChar;
  29. pOptionalEntropy: PDATA_BLOB; pvReserved: Pointer;
  30. pPromptStruct: PCRYPTPROTECT_PROMPTSTRUCT; dwFlags: DWORD; pDataOut: PDATA_BLOB
  31. ): BOOL; stdcall; external 'Crypt32.dll';
  32.  
  33. function CryptUnprotectData(pDataIn: PDATA_BLOB; szDataDescr: PWChar;
  34. pOptionalEntropy: PDATA_BLOB; pvReserved: Pointer;
  35. pPromptStruct: PCRYPTPROTECT_PROMPTSTRUCT; dwFlags: DWORD; pDataOut: PDATA_BLOB
  36. ): BOOL; stdcall; external 'Crypt32.dll';
  37.  
  38. function Min(i,j: Integer): Integer;
  39. begin
  40. if i < j then
  41. Result:= i
  42. else
  43. Result:= j;
  44. end;
  45.  
  46. procedure WriteHex(Buffer: PAnsiChar; Count: Integer);
  47. var
  48. i,j: Integer;
  49. begin
  50. j:= 0;
  51. while Count > 0 do
  52. begin
  53. Write(IntToHex(j,8) + ':' + #32#32);
  54. for i:= 0 to Min(Count,8) - 1 do
  55. Write(IntToHex(Byte(Buffer[i]),2) + #32);
  56. Write(#32);
  57. for i:= 8 to Min(Count,16) - 1 do
  58. Write(IntToHex(Byte(Buffer[i]),2) + #32);
  59. for i:= Min(Count,16) to 15 do
  60. Write(#32#32#32);
  61. Write(#32 + '|');
  62. for i:= 0 to Min(Count,16) - 1 do
  63. if Char(Buffer[i]) in ['A'..'Z','a'..'z','0'..'9'] then
  64. Write(Buffer[i])
  65. else
  66. Write('.');
  67. Writeln('|');
  68. Dec(Count,16);
  69. inc(Buffer,16);
  70. inc(j,16);
  71. end;
  72. end;
  73.  
  74. var
  75. Src, Dst: TDATA_BLOB;
  76.  
  77. begin
  78. try
  79. with TMemoryStream.Create do
  80. try
  81. if ParamStr(1) <> EmptyStr then
  82. LoadFromFile(ParamStr(1))
  83. else
  84. LoadFromFile(IncludeTrailingPathDelimiter(GetEnvironmentVariable('APPDATA')) + 'MySQL\Workbench\workbench_user_data.dat');
  85. Src.cbData:= Size;
  86. Src.pbData:= Memory;
  87. FillChar(Dst,Sizeof(Dst),#0);
  88. if CryptUnProtectData(@Src,nil,nil,nil,nil,CRYPTPROTECT_UI_FORBIDDEN,@Dst) then
  89. try
  90. WriteHex(PAnsiChar(Dst.pbData), Dst.cbData);
  91. finally
  92. LocalFree(Cardinal(Dst.pbData));
  93. end;
  94. finally
  95. Free;
  96. end;
  97. except
  98. on E: Exception do
  99. Writeln(E.ClassName, ': ', E.Message);
  100. end;
  101. Writeln;
  102. Writeln('Pulsa enter para salir ...');
  103. Readln;
  104. end.

Saludos


  • 1

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 27 febrero 2018 - 10:35

Como siempre un gusto leerte amigo Domingo, y bueno ni que decir del código que nos compartes, muy útil e interesante.

 

Cuando sea grande quiero ser como usted :)

 

Saludos (y)


  • 0

#3 ELKurgan

ELKurgan

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 566 mensajes
  • LocationEspaña

Escrito 28 febrero 2018 - 12:03

Muchas gracias por compartir tu solución. Muy interesante

 

Saludos


  • 0

#4 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 01 marzo 2018 - 04:57

La necesidad es la madre de la invención :)

 

Saludos


  • 1

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 01 marzo 2018 - 07:30

Yo no dudo de tus grandes habilidades maestro.

Lo que me asombra es, como diste (y en cuanto tiempo) para romper el cifrado. ¿O es que está documentado eso?

 

Saludos,


  • 0

#6 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 02 marzo 2018 - 10:04

Yo no dudo de tus grandes habilidades maestro.

Lo que me asombra es, como diste (y en cuanto tiempo) para romper el cifrado. ¿O es que está documentado eso?

 

Saludos,

 

No esta cifrado con una contraseña, hace uso de las conocidas y bien documentadas funciones de windows CryptProtectData y CryptUnProtectData  que permiten cifrar informacion que luego solo puede ser descifrada en el mismo ordenador y por el mismo usuario. Es una forma bastante común de almacenar contraseñas

 

Lo mas complicado fue encontrar la ruta del fichero donde se guardaban, pero para eso siempre esta google ;)

 

Saludos


  • 2

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 02 marzo 2018 - 11:55

No esta cifrado con una contraseña, hace uso de las conocidas y bien documentadas funciones de windows CryptProtectData y CryptUnProtectData  que permiten cifrar informacion que luego solo puede ser descifrada en el mismo ordenador y por el mismo usuario. Es una forma bastante común de almacenar contraseñas

 

Lo mas complicado fue encontrar la ruta del fichero donde se guardaban, pero para eso siempre esta google ;)

 

Saludos

 

Ah... Menos mal que que esta documentado que usan la API de Windows, tramposo. *-)  :D

No se ustedes, pero a mi me resultaría un arma de doble filo el de publicar que tecnica de cifrado usa uno. Como que de esa forma se está tentando a que terceros se pongan a hacer tools que te snifeen claves y después romperte todo.

 

Saludos,


  • 0

#8 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 02 marzo 2018 - 05:14

No se ustedes, pero a mi me resultaría un arma de doble filo el de publicar que tecnica de cifrado usa uno. Como que de esa forma se está tentando a que terceros se pongan a hacer tools que te snifeen claves y después romperte todo.

 

La "oscuridad" no es seguridad. Ocultar como se hacen las cosas solo nos da una falsa sensacion de seguridad, lo mejor es ser competamente transparentes y hacer las cosas bien.

 

Y volviendo a este caso, si alguien puede ejecutar un programa en tu equipo y con tu usuario, lo que menos nos debe de preocupar es el workbench  :s 


  • 2

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 02 marzo 2018 - 05:48

La "oscuridad" no es seguridad. Ocultar como se hacen las cosas solo nos da una falsa sensacion de seguridad, lo mejor es ser competamente transparentes y hacer las cosas bien.


Eso es verdad sin duda alguna. :)
 

Y volviendo a este caso, si alguien puede ejecutar un programa en tu equipo y con tu usuario, lo que menos nos debe de preocupar es el workbench  :s


Ciertamente, :D

Saludos
  • 0

#10 flinsy

flinsy

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 07 junio 2019 - 07:54

Yo soy bastante despistado, y cuando estoy intentando resolver un problema y me pasan la contraseña de una base de datos me olvido de anotarla, y simplemente la dejo guardada en el "vault" del Mysql Workbench. Cuando la necesito en otro equipo tengo que volver a pedirlas con el engorro que eso supone.

 

Para eso hice este pequeño trozo de codigo que descifra el fichero de contraseñas del workbench y muestra el contenido por consola


delphi
  1. program workbenchpass;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils,
  7. Windows,
  8. Classes;
  9.  
  10. type
  11. TDATA_BLOB = record
  12. cbData: DWORD;
  13. pbData: PByte;
  14. end;
  15. PDATA_BLOB = ^TDATA_BLOB;
  16.  
  17. TCRYPTPROTECT_PROMPTSTRUCT = record
  18. cbSize: DWORD;
  19. dwPromptFlags: DWORD;
  20. hwndApp: HWND;
  21. szPrompt: PWChar;
  22. end;
  23. PCRYPTPROTECT_PROMPTSTRUCT = ^TCRYPTPROTECT_PROMPTSTRUCT;
  24.  
  25. const
  26. CRYPTPROTECT_UI_FORBIDDEN = 1;
  27.  
  28. function CryptProtectData(pDataIn: PDATA_BLOB; szDataDescr: PWChar;
  29. pOptionalEntropy: PDATA_BLOB; pvReserved: Pointer;
  30. pPromptStruct: PCRYPTPROTECT_PROMPTSTRUCT; dwFlags: DWORD; pDataOut: PDATA_BLOB
  31. ): BOOL; stdcall; external 'Crypt32.dll';
  32.  
  33. function CryptUnprotectData(pDataIn: PDATA_BLOB; szDataDescr: PWChar;
  34. pOptionalEntropy: PDATA_BLOB; pvReserved: Pointer;
  35. pPromptStruct: PCRYPTPROTECT_PROMPTSTRUCT; dwFlags: DWORD; pDataOut: PDATA_BLOB
  36. ): BOOL; stdcall; external 'Crypt32.dll';
  37.  
  38. function Min(i,j: Integer): Integer;
  39. begin
  40. if i < j then
  41. Result:= i
  42. else
  43. Result:= j;
  44. end;
  45.  
  46. procedure WriteHex(Buffer: PAnsiChar; Count: Integer);
  47. var
  48. i,j: Integer;
  49. begin
  50. j:= 0;
  51. while Count > 0 do
  52. begin
  53. Write(IntToHex(j,8) + ':' + #32#32);
  54. for i:= 0 to Min(Count,8) - 1 do
  55. Write(IntToHex(Byte(Buffer[i]),2) + #32);
  56. Write(#32);
  57. for i:= 8 to Min(Count,16) - 1 do
  58. Write(IntToHex(Byte(Buffer[i]),2) + #32);
  59. for i:= Min(Count,16) to 15 do
  60. Write(#32#32#32);
  61. Write(#32 + '|');
  62. for i:= 0 to Min(Count,16) - 1 do
  63. if Char(Buffer[i]) in ['A'..'Z','a'..'z','0'..'9'] then
  64. Write(Buffer[i])
  65. else
  66. Write('.');
  67. Writeln('|');
  68. Dec(Count,16);
  69. inc(Buffer,16);
  70. inc(j,16);
  71. end;
  72. end;
  73.  
  74. var
  75. Src, Dst: TDATA_BLOB;
  76.  
  77. begin
  78. try
  79. with TMemoryStream.Create do
  80. try
  81. if ParamStr(1) <> EmptyStr then
  82. LoadFromFile(ParamStr(1))
  83. else
  84. LoadFromFile(IncludeTrailingPathDelimiter(GetEnvironmentVariable('APPDATA')) + 'MySQL\Workbench\workbench_user_data.dat');
  85. Src.cbData:= Size;
  86. Src.pbData:= Memory;
  87. FillChar(Dst,Sizeof(Dst),#0);
  88. if CryptUnProtectData(@Src,nil,nil,nil,nil,CRYPTPROTECT_UI_FORBIDDEN,@Dst) then
  89. try
  90. WriteHex(PAnsiChar(Dst.pbData), Dst.cbData);
  91. finally
  92. LocalFree(Cardinal(Dst.pbData));
  93. end;
  94. finally
  95. Free;
  96. end;
  97. except
  98. on E: Exception do
  99. Writeln(E.ClassName, ': ', E.Message);
  100. end;
  101. Writeln;
  102. Writeln('Pulsa enter para salir ...');
  103. Readln;
  104. end.

Saludos

Hola Seoane!

Genial tu aporte.
Yo tengo el problema que mudo mis datos de una compu a otra y justamente moví el contenido de C:\Users\Flinsy\AppData\Roaming a mi nueva ubicación y resulta que las pass no pasaron, entonces buscando llegué hasta acá.

Necesito saber con que compilar tu script porque nunca compilé en Delphi, bajé algunas apps pero las dos que ejecuté acusan error, una es Lazarus y la otra es PX, pero a lo mejor yo estoy haciendo algo mal.
Mi problema es que no recuerdo la pass que incluí en la base de datos y se que las guardé en MySQL Workbench y hace años de esto, de modo que busqué y busqué sin recordar las pass y hay una que ni el hosting me la puede brindar ya que me ofrecieron  una base de datos en VPS sin costo adicional por un problema en mi hosting (habían deshabilitado procedimientos almacenados).
Cualquier aporte me servirá para poder mudar a la otra compu esos datos.

Gracias.


  • 0




IP.Board spam blocked by CleanTalk.