ChromeのCookieから値を取得する

  • 5
    Like
  • 0
    Comment
More than 1 year has 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)