browserutils / kooky

Go code to read cookies from browser cookie stores.
MIT License
204 stars 41 forks source link

Chrome: Cannot read cookies from Chrome 96 #49

Closed nlowe closed 2 years ago

nlowe commented 2 years ago

On windows, it seems Chrome 96+ has moved the cookie store to %LOCALAPPDATA%\Google\Chrome\User Data\Default\Network\Cookies, which is a SQLite database that seems to contain cookie metadata and encrypted cookie values. However, when I point kooky at this database file, it can't seem to decrypt the cookies stored here (I first noticed this a few days ago when my template generator for Advent of Code stopped being able to download input files):

package main

import (
    "fmt"
    "net/http"
    "os"
    "path/filepath"
    "runtime"

    "github.com/zellyn/kooky"
    "github.com/zellyn/kooky/chrome"
)

func chromeCookiePath() (string, error) {
    if p, set := os.LookupEnv("CHROME_PROFILE_PATH"); set {
        return filepath.Join(p, "Cookies"), nil
    }

    if runtime.GOOS == "windows" {
        localAppData, err := os.UserCacheDir()
        return filepath.Join(localAppData, "Google", "Chrome", "User Data", "Default", "Network", "Cookies"), err
    }

    return "", fmt.Errorf("chrome cookie path for GOOS %s not implemented, set CHROME_PROFILE_PATH instead", runtime.GOOS)
}
func main() {
    cookiePath, err := chromeCookiePath()
    if err != nil {
        panic(err)
    }

    cookies, err := chrome.ReadCookies(cookiePath, kooky.Valid, kooky.Name("session"), kooky.Domain(".adventofcode.com"))
    if err != nil {
        panic(err)
    }

    req, err := http.NewRequest(http.MethodHead, "https://adventofcode.com/2021/leaderboard/self", nil)
    if err != nil {
        panic(err)
    }

    sessionToken := cookies[0].HTTPCookie()
    req.AddCookie(&sessionToken)

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        panic(err)
    }

    fmt.Println(resp.Status)
}

This panics with:

C:\Users\Nathan\projects\kooky-test> go run main.go
panic: crypto/cipher: input not full blocks

goroutine 1 [running]:
crypto/cipher.(*cbcDecrypter).CryptBlocks(0x92cd20, {0xc00000c680, 0xc000018f30, 0xc000018f20}, {0xc00000c543, 0x9, 0x3eb})
        C:/Program Files/Go/src/crypto/cipher/cbc.go:119 +0x478
github.com/zellyn/kooky/internal/chrome.decryptAESCBC({0xc00000c540, 0x3f, 0x3f}, {0xa79798, 0xd, 0xd}, 0xb)
        C:/Users/Nathan/go/pkg/mod/github.com/zellyn/kooky@v0.0.0-20210408152652-87b89e95f98f/internal/chrome/chrome.go:306 +0x182
github.com/zellyn/kooky/internal/chrome.(*CookieStore).decrypt.func2({0xc00000c540, 0x1, 0x3f}, {0xa79798, 0x65676f, 0xaf6380})
        C:/Users/Nathan/go/pkg/mod/github.com/zellyn/kooky@v0.0.0-20210408152652-87b89e95f98f/internal/chrome/chrome.go:223 +0x29
github.com/zellyn/kooky/internal/chrome.(*CookieStore).decrypt(0xc00011bc50, {0xc00000c540, 0x8c8ecf, 0xf})
        C:/Users/Nathan/go/pkg/mod/github.com/zellyn/kooky@v0.0.0-20210408152652-87b89e95f98f/internal/chrome/chrome.go:261 +0x924
github.com/zellyn/kooky/internal/chrome.(*CookieStore).ReadCookies.func1(0x20, {0xc00014cf30, 0xc00006a140})
        C:/Users/Nathan/go/pkg/mod/github.com/zellyn/kooky@v0.0.0-20210408152652-87b89e95f98f/internal/chrome/chrome.go:104 +0x43c
github.com/zellyn/kooky/internal/utils.VisitTableRows.func1(0xc000068240, {{0x13, {0xc000000600, 0x12, 0x20}}, {0xc00015a014, 0x6d, 0x6d}, {0xc00015e000
, 0x12, ...}})
        C:/Users/Nathan/go/pkg/mod/github.com/zellyn/kooky@v0.0.0-20210408152652-87b89e95f98f/internal/utils/visittablerows.go:25 +0x97
github.com/go-sqlite/sqlite3.(*btreeTable).visitRecordsInorder.func1({0x0, 0xc000018e68, {0xc00015a000, 0x81, 0x81}, 0x0})
        C:/Users/Nathan/go/pkg/mod/github.com/go-sqlite/sqlite3@v0.0.0-20180313105335-53dd8e640ee7/btree.go:431 +0x135
github.com/go-sqlite/sqlite3.(*btreeTable).visitRawInorder(0xc0000682a0, 0xc00011b7f8)
        C:/Users/Nathan/go/pkg/mod/github.com/go-sqlite/sqlite3@v0.0.0-20180313105335-53dd8e640ee7/btree.go:395 +0x232
github.com/go-sqlite/sqlite3.(*btreeTable).visitRawInorder(0xc000068240, 0xc00011b7f8)
        C:/Users/Nathan/go/pkg/mod/github.com/go-sqlite/sqlite3@v0.0.0-20180313105335-53dd8e640ee7/btree.go:387 +0x1dc
github.com/go-sqlite/sqlite3.(*btreeTable).visitRecordsInorder(0x5, 0x8)
        C:/Users/Nathan/go/pkg/mod/github.com/go-sqlite/sqlite3@v0.0.0-20180313105335-53dd8e640ee7/btree.go:424 +0x45
github.com/go-sqlite/sqlite3.(*DbFile).VisitTableRecords(0xc00001f110, {0x8c6630, 0xc000156711}, 0xd)
        C:/Users/Nathan/go/pkg/mod/github.com/go-sqlite/sqlite3@v0.0.0-20180313105335-53dd8e640ee7/file.go:313 +0x20d
github.com/zellyn/kooky/internal/utils.VisitTableRows(0xc00001f110, {0x8c6630, 0x7}, 0x8, 0xc00011baa0)
        C:/Users/Nathan/go/pkg/mod/github.com/zellyn/kooky@v0.0.0-20210408152652-87b89e95f98f/internal/utils/visittablerows.go:24 +0x1ef
github.com/zellyn/kooky/internal/chrome.(*CookieStore).ReadCookies(0xc00011bc50, {0xc00011bd90, 0x3, 0x3})
        C:/Users/Nathan/go/pkg/mod/github.com/zellyn/kooky@v0.0.0-20210408152652-87b89e95f98f/internal/chrome/chrome.go:37 +0x20e
github.com/zellyn/kooky/chrome.ReadCookies({0xc000016280, 0xc00011be38}, {0xc00011bd90, 0xa7d1c0, 0xc000053d30})
        C:/Users/Nathan/go/pkg/mod/github.com/zellyn/kooky@v0.0.0-20210408152652-87b89e95f98f/chrome/chrome.go:24 +0xdc
main.main()
        C:/Users/Nathan/projects/kooky-test/main.go:32 +0x106
exit status 2
ghost commented 2 years ago

As far as I know, for some reason kooky cannot decrypt the default profile cookie (google chrome). However, it decrypts other profiles fine.

srlehn commented 3 months ago

duplicate of #50