1편에 이어서 JWT를 우회하는 다른 기법을 살펴볼거다
2022.07.14 - [웹] - [웹] JWT(JSON Web Token)에 대한 다양한 공격 기법 - 1
이번 공격을 위해서는 hashcat이라는 추가 도구가 필요하다.
hashcat은 hash암호에 대해서 Brute Force를 통해 값을 찾아준다. 리눅스의 passwd 파일을 복호화하는 데에도 사용하고 해킹뿐만 아니라 비밀번호 암호화의 강도를 체크하기위해서도 사용된다고 한다.
특이한 점은 CPU 자원을 사용하는 것이 아닌 그래픽카드 즉 GPU 자원을 사용해서 외장그래픽카드가 있ㄷㅏ면
엄청 빠르다.
윈도우에서 사용하고 싶다면 위 사이트에서 다운받을 수 있다.
Kali 에는 당연히 기본적으로 내장되어 있음
해시캣을 설치하고 사용준비가 됐다면 HS256 알고리즘으로 서명된 JWT를 우회해보자
여전히 같은 전제조건 admin 페이지에 접근을 해야한다.
1편 포스팅에서 다뤘던것 처럼
Alg Attack 이나 사용자 헤더를 변경하는 것만으로는 우회가 되지않는다.
그럼 원래의 JSON을 살펴보게되면
JSON 토큰을 서명하기위해 사용된 알고리즘이 HS256 이라는것을 확인할 수 있다.
HS256은 HMAC+SHA-256 을 이용한 서명 알고리즘 중 하나인데
RSA 알고리즘 기반의 서명도 실제 웹서버에 많이 사용하지만
이 HS256 알고리즘도 모의해킹을 하다보면 자주 만난다.
HS256 알고리즘은 임의의 문자열을 비밀키로 사용하는 암호화 알고리즘이다.
간단히 말해서 'ABC' 라는 특정 문자열을 비밀키로 사용하여 'ABC'라는 비밀키를 가지고 서명을 하는 것이다.
문제는 이 문자열을 비밀키로 사용한다는 점에서 나온다.
복잡한 문자열을 비밀키로 사용한다면 쉽게 복호화할 수 없지만 위의 예시처럼 'ABC'와 같은 단순한 문자열을 비밀키로 사용하는 서버들이 분명 있을 것이다.
이러한 단순 문자열을 Hashcat을 사용해서 무작위 대입 공격을 통하여 추출하는 공격 방식이다.
먼저 온전한 JWT를 확인한다.
무작위 대입공격을 위한 리스트가 필요하다.
아래 깃허브에서 다운 받을 수 있다.
https://github.com/wallarm/jwt-secrets
hashcat을 이용하여 명령어를 입력
hashcat -a 0 -m 16500 [JWT값] [경로]\jwt.secrets.list
기다리면 결과가 나오는데
JWT 제일 끝에 붙은 secret1 이라는 문자열이 결국 비밀키로 확인되었다.
만약 다시한번 출력 결과를 보고싶다면 명령어뒤에 --show 옵션을 추가해주면된다.
여기서 Hashcat의 옵션을 조금 살펴보자면 아래와 같다
-m 옵션이 Hash-Type을 정해주는 옵션이며, JWT는 16500값을 인자로 받아 -m 옵션뒤에 들어간다.
-a 어택은 attack의 약자로 역시 몇가지 정수로 옵션값이 주어진다.
필요할 때 구글링
3910 | md5(md5($pass).md5($salt)) | Raw Hash, Salted and/or Iterated
21200 | md5(sha1($salt).md5($pass)) | Raw Hash, Salted and/or Iterated
19300 | sha1($salt1.$pass.$salt2) | Raw Hash, Salted and/or Iterated
19500 | Ruby on Rails Restful-Authentication | Raw Hash, Salted and/or Iterated
11400 | SIP digest authentication (MD5) | Network Protocols
2500 | WPA-EAPOL-PBKDF2 | Network Protocols
2501 | WPA-EAPOL-PMK | Network Protocols
22000 | WPA-PBKDF2-PMKID+EAPOL | Network Protocols
22001 | WPA-PMK-PMKID+EAPOL | Network Protocols
16800 | WPA-PMKID-PBKDF2 | Network Protocols
16801 | WPA-PMKID-PMK | Network Protocols
16500 | JWT (JSON Web Token) | Network Protocols
5500 | NetNTLMv1 / NetNTLMv1+ESS | Network Protocols
5600 | NetNTLMv2 | Network Protocols
501 | Juniper IVE | Operating System
12600 | ColdFusion 10+ | FTP, HTTP, SMTP, LDAP Server
13500 | PeopleSoft PS_TOKEN | Enterprise Application Software (EAS)
10500 | PDF 1.4 - 1.6 (Acrobat 5 - 8) | Documents
11600 | 7-Zip | Archives
2811 | MyBB 1.2+, IPB2+ (Invision Power Board) | Forums, CMS, E-Commerce
99999 | Plaintext | Plaintext
900 | MD4 | Raw Hash
0 | MD5 | Raw Hash
5100 | Half MD5 | Raw Hash
100 | SHA1 | Raw Hash
1300 | SHA-224 | Raw Hash
1400 | SHA-256 | Raw Hash
10800 | SHA-384 | Raw Hash
1700 | SHA-512 | Raw Hash
어쨋든 secret1 이라는 비밀키값을 추출했으면
JSON Web Tokens 익스텐더를 이용해서 서명을 다시 계산해준다.
오른쪽에 비밀키값을 넣어준 후
공격자가 얻고자하는 권한으로 변조해주면 아래
ovHsh3M6BXVpzHox8Dbv56BMGRn3heMN_VCC6l6uqvE 와 같은 새로운 Hash 서명값이 추출된다.
이 서명값을 복사 하여 보관 후 다시 변조가 안된 순수 요청 패킷을 리피터로 가져와서 JWT 값 끝 부분
그러니까 헤더 - 페이로드 - 서명
3개의 영역의 서명 영역 부분에 ovHsh3M6BXVpzHox8Dbv56BMGRn3heMN_VCC6l6uqvE 값을 넣어준다.
그리고 다시 sub 헤더를 administrator로 바꿔서 보내주면
새로운 서명이 administrator역할과 secret1 비밀키로 서명이된 값이기 때문에
서버에서는 전혀 이상할 것없이 변조된 JWT를 받아들이게 되며 접근이 가능해진다.
그래서 HS256 알고리즘을 사용한다면 서명키 또한 복잡하게 설정하는 것이 중요하다.
Burp 익스텐더 기능을 이용하여 이 보다 조금더 간단하게 하는 방법도 있다.
JWT Editor 를 설치 후
새로운 Symmetric Key를 생성하는 방법이다
Key Size는 굳이 만질 필요없이 공격할 때 알아서 맞춰진다.
이 JWT Editro Keys (JEK)를 이용한 공개키(RSA) 기반 서명 알고리즘인 RS256
JWT를 우회하는 방법이 있다.
3편에서 포스팅
2022.07.14 - [웹] - [웹] JWT(JSON Web Token)에 대한 다양한 공격 기법 - 3
'웹' 카테고리의 다른 글
[웹] SQL Injection을 이용한 다양한 공격 기법 (Feat. sqlmap) - 1 (0) | 2022.07.25 |
---|---|
[웹] JWT(JSON Web Token)에 대한 다양한 공격 기법 - 3 (0) | 2022.07.14 |
[웹] JWT(JSON Web Token)에 대한 다양한 공격 기법 - 1 (0) | 2022.07.14 |
[Web] 불충분한 인증 및 인가(파라미터 변조 취약점)에 대해 (0) | 2022.07.13 |