浏览器信息收集: 利用 PowerShell 无文件读取 Chrome Cookie

前言

BrowserGather现在支持提取Chrome Cookie数据。BrowserGather的第一篇文章描述了无文件方式提取Chrome凭据。在这篇文章中将讨论如何应用此技术来提取Chrome Cookie数据以及开发过程中出现的问题。项目请查看GitHub更新的代码。

开发

Chrome中的Cookie SQLite数据库比用于存储凭据的cookie更复杂。存在几个不同的字段,包括cookie的标识(如HTTPOnly)以及主机名,名称和路径等属性。此外,cookie数据库中包含数百个不寻常的条目。虽然能在开发涵盖测试期间使用相应的正则表达式解决部分问题,但数据库的大小依然造成了一个无法解决的问题。

首先,我们来说说用于提取加密blob的正则表达式。加密的blob包含了cookie的值,类似于密码存储在凭证数据库中。它使用Windows Data Protection API加密。以下正则表达式用于从数据库文件中提取blob:

(\x01\x00\x00\x00\xD0\x8C\x9D\xDF\x01\x15\xD1\x11\x8C\x7A\x00\xC0\x4F\xC2\x97\xEB\x01\x00\x00\x0
0)[\s\S]*?(?=[\s\S]{2}\x97[\s\S]{8}\x00[\s\S]{2}\x0D|\x0D[\s\S]{2}\x00[\s\S]{3}\x00\x02|\x00{20}|\Z)

lookbehind部分很简单,与所有DPAPI加密的Blob一致。某些方面比较复杂,涵盖了测试期间发现的四种不同情况:

  1. 为数据库中的下一个Cookie条目做准备,这与cookie属性提取中使用的lookbehind非常相似。
  2. 少数情况下可能导致正则表达式不匹配
  3. 一系列20个空字节在一行,表示blob的结束。
  4. 文件结束(EOF)检查。

方案3中该正则表达式创建了一种情况,其中可以从加密的Blob本身中删除尾随的空字节,导致解密失败。该功能将在继续之前自动附加一个空字节到任何解密失败,以便纠正这种情况。

现在我们来看看用来提取每个cookie的属性的正则表达式。当前形式中仅提取“名称”,“主机名”和“路径”值。正则表达式如下:

(?<=\x97[\s\S]{8}\x00[\s\S]{2}\x0D[\s\S]{11,12})
[\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x
79\x7a\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57
\x58\x59\x5a\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x2d\x21\x20\x22\x20\x23\x20\x24\x20\x25\x20\x
26\x20\x27\x20\x28\x20\x29\x20\x2a\x20\x2b\x2d\x20\x2e\x20\x2f\x3a\x3c\x20\x3d\x20\x3e\x20\x3f\x20\
x40\x5b\x20\x5c\x20\x5d\x20\x5e\x20\x5f\x20\x60\x7b\x20\x7c\x20\x7d\x20\x7e\x2c]{3,}?(?=
[\x00\x01\x02\x03])

所使用的lookbehind是个非常棘手的问题,并经历了许多更新,之后我发现我必须通过使用Netscape cookie允许的字符列表作为基准以及测试期间发现的其他字符来限制可能的ASCII值返回的字符。最后只是寻找收集数据后遇到的第一个终止字符。

返回的属性字符串是这样的:

.stackoverflow.com prov /

前面是主机名。它始终以顶级域名(TLD)结尾。后面是cookie的名称。最后是路径,始终以反斜杠字符开头。虽然在技术上可以编写正则表达式来分离这些值,但是您需要考虑到现有的每个TLD以及未来的TLD。

最后我们来谈谈数据库大小问题。一旦SQLite cookie数据库增长到一定大小(在我的测试中大约有400个cookie),加密的blob就是非连续存储的。该条目保持在相同的位置,但是数据可以移动到不同的位置,通常在不同的加密Blob中。这意味着原始条目以及数据移动到的条目都将被破坏。幸好这仅影响大型数据库中大约1%的Cookie,其他99%的Cookie不受影响。发生此错误时,加密的blob将替换为“无法解密blob”字符串!

我编写了一个简单的正则表达式不匹配检查来帮助排除故障。如果cookie属性匹配的数量与加密的blob匹配数不匹配,则会出现如下的非终止错误:

"The number of cookies is different than the number of encrypted blobs! This is most likely due to a regex mismatch."

根据不匹配的严重程度,这可能导致cookie属性与错误的解密匹配blob内容,甚至完全丢失。可以尝试调整正则表达式。Get-ChromeCreds功能中包含了这项检查。

使用

从SQLite数据库提取Cookie信息。可以指定一个可选路径:

Get-ChromeCookies "C:\Users\sekirkity\AppData\Local\Google\Chrome\User Data\Profile 1\Cookies"

返回到“format-list”cmdlet的对象:

Get-ChromeCookies | format-list *

项目主页

https://github.com/sekirkity/BrowserGather

 

*参考来源:sekirkity,MottoIN小编编译发布,转自请注明来自MottoIN

原创文章,作者:Moto,如若转载,请注明出处:http://www.mottoin.com/article/terminal/100495.html

发表评论

登录后才能评论

联系我们

021-62666911

在线咨询:点击这里给我发消息

邮件:root@mottoin.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code