LoginSignup
11
12

More than 5 years have passed since last update.

ChromeのCookieから値を取得する

Posted at

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)

11
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12