효투의 세상 로딩중...
효투의 세상 로딩중...
반응형

1편에 이어서 JWT를 우회하는 다른 기법을 살펴볼거다

2022.07.14 - [웹] - [웹] JWT(JSON Web Token)에 대한 다양한 공격 기법 - 1

 

[웹] JWT(JSON Web Token)에 대한 다양한 공격 기법 - 1

JWT란 JSON 웹 토큰(Web Token)의 약자이며 암호화된 토큰값으로 JSON 데이터를 주고 받을 때 사용한다. 모든 JSON 데이터를 다 주고 받고 할 수 있지만, 일반적으로 JWT를 사용하는 웹 서버를 보면 보통

hyotwo.tistory.com

 

이번 공격을 위해서는 hashcat이라는 추가 도구가 필요하다.

hashcat은 hash암호에 대해서 Brute Force를 통해 값을 찾아준다. 리눅스의 passwd 파일을 복호화하는 데에도 사용하고 해킹뿐만 아니라 비밀번호 암호화의 강도를 체크하기위해서도 사용된다고 한다.

특이한 점은 CPU 자원을 사용하는 것이 아닌 그래픽카드 즉 GPU 자원을 사용해서 외장그래픽카드가 있ㄷㅏ면

엄청 빠르다.

https://hashcat.net/hashcat/

 

hashcat - advanced password recovery

Download Name Version Date Download Signature hashcat binaries v6.2.5 2021.11.21 Download PGP hashcat sources v6.2.5 2021.11.21 Download PGP Signing key on PGP keyservers: RSA, 2048-bit. Key ID: 2048R/8A16544F. Fingerprint: A708 3322 9D04 0B41 99CC 0052 3C

hashcat.net

 

윈도우에서 사용하고 싶다면 위 사이트에서 다운받을 수 있다.

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

 

GitHub - wallarm/jwt-secrets

Contribute to wallarm/jwt-secrets development by creating an account on GitHub.

github.com

 

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

 

[웹] JWT(JSON Web Token)에 대한 다양한 공격 기법 - 3

2편에 이어서 RS256 서명 알고리즘 우회 기법 2022.07.14 - [웹] - [웹] JWT(JSON Web Token)에 대한 다양한 공격 기법 - 2 (Feat. Hashcat) [웹] JWT(JSON Web Token)에 대한 다양한 공격 기법 - 2 (Feat. Hashca..

hyotwo.tistory.com

 

반응형
  • hyotwo7658@gmail.com

복사 완료 👍