セキュリティ系の勉強、その他開発メモとか雑談. GithubはUnity触っていた頃ものがメイン Twitterフォローもよろしくです

【Hack The Box】クライアント証明書を作成してごにょごにょ[LaCasaDePapel]

//

クライアント証明書作る当たりが曖昧だったので、簡単に残しておきます。

hacktheboxLaCasaDePapelというリタイアboxがあるのですが、そこのページがクライアント証明書を要求してくる。ので、クライアント証明書を作りたい。別脆弱性を使って認証局(CA)の秘密鍵を入手している状態です。

やること・手順

webページがクライアント証明書を要求してくるのでなんとか発行してページを閲覧したい。

  1. CAの秘密鍵が手に入ったのでこれを使う
  2. 自分用の鍵と証明書申請を生成
  3. webページから証明書内の公開鍵を入手
  4. CA秘密鍵, CA公開鍵, 自分の申請書より、自分のための公開証明書を作成(本来はCAで発行してもらう)
  5. ブラウザに設定しページにアクセス

用語・ファイルの説明

ファイル名には決まりはないのでこれに限らない。

用語・ファイル名 説明
CSR(.csr) 証明書署名要求。証明書の申請時に提出するファイル。このファイルに含まれる情報を元に証明書を発行
.crt 認証局が署名した証明書(公開鍵を含む) 
pkcs12 秘密鍵と証明書を 1つのファイルに格納する形式。firefox.crtじゃダメらしいのでこの.p12形式に変換する
ca.key 脆弱性をついて入手したCAの秘密鍵。本来は外から入手できてはいけない
caca.key 自分の秘密鍵。登録用に今回生成した
caca.csr 上で生成した鍵を登録申請するために使う。(公開鍵、所有者情報、秘密鍵を持っていることを示す申請者の署名が記載)
casadepapel.crt webページに登録されているCAの公開鍵(証明書)
pipi.crt 手元で生成した、クライアント証明書。CAの発行と同じ方法で作られる

手順

$ls
ca.key

CAの秘密鍵が入手されている状態

$openssl req -new -newkey rsa:2048 -nodes -keyout caca.key -out caca.csr 

自分の秘密鍵caca.keyと証明書署名要求caca.csrを生成

$openssl s_client -connect 10.10.10.131:443 -showcerts

対象ページの証明書を表示. その中から公開鍵(.crt)にあたる部分を抽出しcasadepapel.crtとして保存する。(手動) ブラウザから証明書をエクスポートしても良い。 *10.10.10.131は今回のboxの対象サーバ

$ openssl pkey -in ca.key -pubout| md5sum;openssl x509 -in casadepapel.crt -pubkey -noout| md5sum
71e2b2ca7b610c24d132e3e4c06daf0c  -
71e2b2ca7b610c24d132e3e4c06daf0c  -

入手した秘密鍵の対の公開鍵と証明書内の公開鍵が本当に一致するか確認。

$openssl x509 -req -in caca.csr -CA casadepapel.crt -CAkey ca.key -CAcreateserial -out pipi.crt -sha256

申請書、CAの公開鍵と秘密鍵から、自分のための公開証明書pip.crtを作成。(CAの秘密鍵で証明書署名要求に署名する。(認証局による公開鍵への署名)本来は認証局がやる作業。で、サーバ側からCAに使われたと思われる秘密鍵を入手できたので、自分の鍵(caca)がCAに認証された様にできるはず)。これがおそらくクライアント証明書。

しかし、firefoxに証明書を登録するにはpkcs12形式でないとダメらしいので、変換。

$openssl pkcs12 -export -in pipi.crt -inkey caca.key -out pipi.p12

pipi.crtPreferencesより登録して、対象ページにアクセスすれば自分をサーバ側が認証してくれる様になるはず。

参考

LaCasaDePapel - Hipotermia

【用語明解】証明書の申請で登場する各種ファイルの見分け方 | 大手正規SSL証明書が定価よりMAX66%OFFから 【 SSLコンシェル 】

OpenSSLによるオレオレ認証局が署名した証明書の作成 - Qiita

クライアント認証利用ガイド | スパイラル サポートサイト