hackthebox~魔法使いへの道~(その15)対称性JWTと非対称性JWT
はじめに
HTBでUnderConstructionをやっていたところ,JWTなる言葉がでてきましたので,JWTの勉強をしていきます.
前回は認証用のトークンの種類などを少し深堀りしていました
*1.
今回はJWTの構造について見ていきたいと思います.
JWTの構造
JWTは3つのパートに分かれており,それぞれbase64でエンコードされています.そして各々がピリオドで結合されており,実物は以下のようになっています.
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicGsiOiItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE5NW9UbTlETnpjSHI4Z0xoalphWVxua3RzYmoxS3h4VU9vencwdHJQOTNCZ0lwWHY2V2lwUVJCNWxxb2ZQbFU2RkI5OUpjNVFaMDQ1OXQ3M2dnVkRRaVxuWHVDTUkyaG9VZkoxVm1qTmVXQ3JTckRVaG9rSUZaRXVDdW1laHd3dFVOdUV2MGV6QzU0WlRkRUM1WVNUQU96Z1xuaklXYWxzSGovZ2E1WkVEeDNFeHQwTWg1QUV3YkFENzMrcVhTL3VDdmhmYWpncHpIR2Q5T2dOUVU2MExNZjJtSFxuK0Z5bk5zak5Od281blJlN3RSMTJXYjJZT0N4dzJ2ZGFtTzFuMWtmL1NNeXBTS0t2T2dqNXkwTEdpVTNqZVhNeFxuVjhXUytZaVlDVTVPQkFtVGN6Mncya3pCaFpGbEg2Uks0bXF1ZXhKSHJhMjNJR3Y1VUo1R1ZQRVhwZENxSzNUclxuMHdJREFRQUJcbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIiwiaWF0IjoxNjYwODM4Mzc2fQ.YZfGPNP16zXTvJ42CzjeeIm6p-RFpnELF4Vu1CyUeWHn6kCPOkCiGJXME99S1vJlrQQYzIgvkyiPhlbFqKqj2VIdB3Z-jgMkxyLnjkchFiKvJWWw1aE-kBFHms6TfiU7ly4EjkObCHWXnNnEIBlZb8kxzl0WGp9prVs539_lJTvMIOaYd9ikYkEgvoMyjSGxVbYXx12lJ8uQjWSFHkyFkqoX5dwqVsLkRa28tfVgAz61QbnqgzOvbDs0V4KUHcGp3G9hDx5B-hKUSlXELGMwcdoXf6dlAbpV7Ab5eb-NtfiLr_07D6mTldxc7agpVI7Hj1gmChXlwSsJIayTRCC5Yw
jwt.ioというサイト
*3で中身が下記のように可視化できます.
ヘッダーには電子署名がどのような方法で行われるかの情報が格納されます.
Payload
送りたい情報本体(Claim)が入る部分です.
同じくデータをbase64でエンコードしてピリオドで連結されています
###Signature
この部分は通常,base64でエンコードしピリオド(.)で繋いだヘッダーとペイロードを署名アルゴリズムでハッシュ化したものです
対称性JWT
JWTは,さまざまなアルゴリズムを使用して署名できます.HS256(HMAC+SHA-256)など,これらの一部は「対称鍵」を使用します.
対称鍵は,署名と検証の両方に使用されます.たとえば,JohnがJaneと秘密を共有したいとします.秘密が伝えられると,JohnはJaneに秘密が理解されるようにパスワード(対称鍵)も伝えます.このようにして,John(IDプロバイダーまたはサービス)は,指定されたパスワードを使用して秘密が適切に保持されるようにします
非対称性JWT
非対称暗号化を使用するには,2つのキーを生成する必要があります.これらの2つのキーは同じ場所から取得する必要があります.
まず初めに鍵のペアを作成します.次に,Header+Payloadを秘密鍵を使用して署名します.そして,送信した後に,受取手が公開鍵を使用して復号し検証し正しい情報かどうかを確認します.
実際のファイルで確認
Under Constructionのファイルで確認してみます.
RS256(公開鍵/秘密鍵のペアを使用する非対称アルゴリズム)を使用していることが分かります.
{
"alg": "RS256",
"typ": "JWT"
}
Payload
検証を行うための公開鍵が入ってしまっています.
これが脆弱性に繋がるポイントのような気がしますね.
{
"username": "admin",
"pk": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA95oTm9DNzcHr8gLhjZaY\nktsbj1KxxUOozw0trP93BgIpXv6WipQRB5lqofPlU6FB99Jc5QZ0459t73ggVDQi\nXuCMI2hoUfJ1VmjNeWCrSrDUhokIFZEuCumehwwtUNuEv0ezC54ZTdEC5YSTAOzg\njIWalsHj/ga5ZEDx3Ext0Mh5AEwbAD73+qXS/uCvhfajgpzHGd9OgNQU60LMf2mH\n+FynNsjNNwo5nRe7tR12Wb2YOCxw2vdamO1n1kf/SMypSKKvOgj5y0LGiU3jeXMx\nV8WS+YiYCU5OBAmTcz2w2kzBhZFlH6RK4mquexJHra23IGv5UJ5GVPEXpdCqK3Tr\n0wIDAQAB\n-----END PUBLIC KEY-----\n",
"iat": 1660838376
}
おわりに
今回はJWTの構造について見ていき,対称性JWTと非対称性JWTがあることを調査しまとめました.また,Under Constructionで使用されているファイルは非対称性JWTであることが分かり,公開鍵がPayloadに入ってしまっており,この辺りが脆弱性のヒントになりそうです.
次回は,JWTを騙す「Algorithm confusion attacks」について深堀していこうと思います.