주제
JWT(JSON Web Token) 취약점 악용(2) - Brute Force, jwk/jku/kid injection
JWT 개념에 대한 내용은 아래 포스팅에서 확인 가능합니다.
https://so106037.tistory.com/421
JWT(JSON Web Token) 개념
주제JWT 개념내용1. JWT 개념JWT(JSON Web Token)는 웹 애플리케이션에서 클라이언트와 서버 간에 정보를 안전하게 전송하기 위해 사용되는 토큰 기반의 인증 메커니즘입니다. 일반적으로 인증, 세션
so106037.tistory.com
내용
1. HS256 취약한 비밀 키
JWT HS256 알고리즘은 비밀 키를 사용하여 검증 및 서명을 진행합니다. 공격자는 토큰의 signature를 검증하기 위해 다양한 키 값을 대입하여 올바른 비밀 키를 찾아내는 공격을 시도할 수 있습니다.
거의 비슷한 방법으로 진행되나, 다양한 툴을 사용하여 진행해보겠습니다.
1. Dictionary Attack :: JTR/jwt-hack
2. Brute Force :: c-jwt-cracker
1.1. Dictionary Attack :: JTR/jwt-hack
Step 1) 유효한 토큰 획득
- wiener 계정으로 /admin 경로에 접근 불가능
- 헤더: {"kid":"2d1ac68e-18f4-4af9-.......","alg":"HS256"}
Step 2) JTR 툴을 사용하여 JWT 크래킹, 이후 획득한 비밀 키 값을 사용하여 유효한 토큰 생성
- 혹은 jwt-hack으로 비밀키 획득 가능
Step 3) 생성한 administrator 토큰을 사용하여 /admin 경로에 HTTP 요청
- 토큰이 유효하다고 판단되어, Admin Panel 확인 가능
1.2. Brute Force :: c-jwt-cracker
Step 1) 유효한 토큰 획득
Step 2) c-jwt-cracker 툴을 사용하여 JWT 크래킹, 이후 획득한 비밀 키 값을 사용하여 유효한 토큰 생성 가능
2. JWT header parameter injections
일반적으로 JWT의 헤더에는 `alg` 만 필수적이지만, 실제로는 여러 파라미터들이 포함될 수 있습니다.
1. jwk (JSON Web Key)
{
"alg": "RS256",
"jwk": {
"kty": "RSA", //Key Type
"kid": "key-1", //Key ID
"n": "공개키-모듈러스-값", // 모듈러스 값
"e": "AQAB" // 지수 값
}
}
- 키를 나타내는 JSON 객체가 직접 내장되어 있음
- JWK 유효성 미검증 시, 공격자가 자신의 키를 주입하여 서명에 사용할 수 있음
2. jku (JSON Web Key Set URL)
{
"alg": "RS256",
"jku": "https://example.com/.well-known/jwks.json",
"kid": "key-1"
}
// https://example.com/.well-known/jwks.json 응답 예시. JWK Set을 나타냄
{
"keys": [
{
"kty": "RSA",
"kid": "key-1",
"use": "sig", //키의 용도
"n": "공개키-모듈러스-값 1",
"e": "AQAB"
},
{
"kty": "RSA",
"kid": "key-2",
"use": "sig",
"n": "공개키-모듈러스-값 2",
"e": "AQAB"
}
]
}
- 서버가 올바른 키를 가져올 수 있는 URL을 제공
- JKU 유효성 미검증 시, 공격자가 자신이 통제하는 URL로 변경하여 키를 조작할 위험이 있음
3. kid (Key ID)
{
"alg": "RS256",
"kid": "key-2023-12"
}
- 여러 개의 키 중에서 서버가 올바른 키를 식별하는데 사용하는 ID
- 키의 형식에 따라 일치하는 kid 매개변수가 있을 수 있음
- 공격자가 이 값을 조작하여 다른 키를 참조하게 만들 수 있음
2.1. jwk Injection
Step 1) Burp Suite 확장 앱 JWT Editor 으로 RSA 키 생성
Step 2) 일반 사용자 계정(’wiener’)으로 로그인 후, /admin 경로에 접근하여 응답 값 확인
Step 3) HTTP Request의 `JSON Web Token` 탭
- 페이로드 변조(wiener → administrator)
- [Attack] → [Embedded JWK]에서 생성한 RSA 키 선택
- 헤더에 jwk 키-값이 추가됨을 확인
Step 3) HTTP 요청 시 administrator 토큰이 유효하다고 판단되어 Admin Panel 접근 가능함을 확인
2.2. jku Injection
Step 1) Burp Suite 확장 앱 `JWT Editor` 으로 RSA 키 생성
Step 2) 일반 사용자 계정(’wiener’)으로 로그인 후, /admin 경로에 접근하여 응답 값 확인
Step 3) exploit 서버의 /exploit 응답 값을 JWK Set 형식으로 변경
- JWK Set 작성 시, Burp Suite의 `JWT Editor` 에서 생성한 키 참고
Step 4) HTTP Request의 `JSON Web Token` 탭
- 헤더의 kid를 JWK Set에 있는 kid 값으로 변경
- jku 키-값 추가
- 페이로드 변경(wiener → administrator)
Step 5) HTTP Reuqest 의 JSON Web Token 탭 하단의 [Sign] 버튼 클릭
Step 6) HTTP 요청 시 administrator 토큰이 유효하다고 판단되어 Admin Panel 접근 가능함을 확인
2.3. kid Injection
Step 1) Burp Suite 확장 앱 `JWT Editor` 으로 비대칭 키 생성
- 실제 키 값을 의미하는 “k”에 null 값 입력(base64)
Step 2) 일반 사용자 계정(’wiener’)으로 로그인 후, /admin 경로에 접근하여 응답 값 확인
Step 3) HTTP Request의 `JSON Web Token` 탭
- JWT 토큰 페이로드 변경(wiener → administrator)
- 헤더의 kid 키 값 ../../../../../../dev/null 입력, 이후 [Sign] 버튼 클릭
Step 4) HTTP 요청 시 administrator 토큰이 유효하다고 판단되어 Admin Panel 접근 가능함을 확인
레퍼런스
'보안 > 웹·모바일' 카테고리의 다른 글
CVE-2020-1938: Tomcat-AJP 프로토콜 취약점 (0) | 2025.03.07 |
---|---|
JWT(JSON Web Token) 취약점 악용 (1) - None Algorithm, Algorithm Confusion (0) | 2025.01.18 |
JWT(JSON Web Token) 개념 (0) | 2025.01.05 |
CVE-2024-4577:PHP-CGI 원격 코드 실행 (0) | 2024.12.23 |
Burp Suite로 패킷이 잘 안잡힘 해결 (0) | 2024.02.16 |