ChromeのCookieから値を取得する

More than 3 years have passed since last update.

ChromeのCookieからニコニコのsessionの値を読み出そうと思った時に,暗号化されてたみたいなので,その時調べたことをメモ

参考にしたページはここ

ほぼ参考にしたページをrubyで書いただけですね

それと,面倒くさかったのでmacでしか動かないです.


1. Cookieから目的のものを探す

ActiveRecord::Base.establish_connection(

adapter: 'sqlite3',
database: File.expand_path('~/Library/Application Support/Google/Chrome/Default/Cookies')
)

class Cookie < ActiveRecord::Base
self.table_name = 'cookies'
end

val = Cookie.where(host_key: '.nicovideo.jp', name: 'user_session').first.encrypted_value


2. Keychainからpasswordを取得

復号するときのkeyを作成するためのパスワードが,KeychainのChrome Safe Storageに保存されてるのでそれを取得

def chrome_pass

Keychain.generic_passwords.where(account: 'Chrome').first.password
end


3. passwordからkeyを作成

def generate_key(pass)

salt = 'saltysalt'
iter = 1003
length = 16

OpenSSL::PKCS5.pbkdf2_hmac_sha1(pass, salt, iter, length)
end

どうしてこの値を使ってるのかは分かりません.誰か知ってたら教えて下さい


4. Cookieの値をkeyで復号

def chrome_decrypt(encrypted_value, key)

iv = (' ' * 16)

encrypted_value.slice!(0, 3)

chiper = OpenSSL::Cipher::AES.new(128, :CBC)

chiper.decrypt
chiper.key = key
chiper.iv = iv

chiper.update(encrypted_value) << chiper.final
end

puts chrome_decrypt(val, generate_key(chrome_pass))

なんで復号の時にこれやってるのとかわからずにrubyで書きなおしただけなので質問されてもわからないです.

最後にプログラム全体を書いときます

require 'active_record'

require 'sqlite3'
require 'keychain'

# Chrome Safe Storageのpasswordを取得
def chrome_pass
Keychain.generic_passwords.where(account: 'Chrome').first.password
end

# 複号化の鍵を作成
def generate_key(pass)
salt = 'saltysalt'
iter = 1003
length = 16

ret = OpenSSL::PKCS5.pbkdf2_hmac_sha1(pass, salt, iter, length)
end

def chrome_decrypt(encrypted_value, key)
iv = (' ' * 16)

encrypted_value.slice!(0, 3)

chiper = OpenSSL::Cipher::AES.new(128, :CBC)

chiper.decrypt
chiper.key = key
chiper.iv = iv

chiper.update(encrypted_value) << chiper.final
end

ActiveRecord::Base.establish_connection(
adapter: 'sqlite3',
database: File.expand_path('~/Library/Application Support/Google/Chrome/Default/Cookies')
)

class Cookie < ActiveRecord::Base
self.table_name = 'cookies'
end

val = Cookie.where(host_key: '.nicovideo.jp', name: 'user_session').first.encrypted_value
key = generate_key(chrome_pass)

puts chrome_decrypt(val, key)