TamuCTF2020] WEB - TOO_MANY_CREDITS_1

노션으로 옮김·2020년 3월 28일
1

wargame

목록 보기
26/59
post-thumbnail

문제

  1. credit을 1개씩 획득할 수 있는 버튼이 있다.
  2. credit이 오를 때마다 쿠키값이 변한다.
  3. 크레딧을 한 번에 많이 올리는 것이 목표이다.

풀이

추측

counter 쿠키값을 보면 base64로 인코딩 되었다는 것을 알 수 있다.

"H4sIAAAAAAAAAFvzloG1uIhBNzk/Vy+5KDUls6QYg87NT0nN0XMG85zzS/NKjDhvC4lwqrgzMTB6MbCWJeaUplYUMEAAIwCwY0JiUgAAAA=="

일단 디코딩 시켜보자.

[󖁵A79?W/(5%OIsKJ8op310z1%V0@#cBbR

알 수 없는 값이 출력되었다.

이것만으로는 게싱할 수 없다.
쿠키값을 임의로 바꿔보며 반응을 확인해보자.

1. 값 전체를 삭제하면, 쿠키값이 복구되고
2. 값을 임의로 변경하면, gzip 포맷이 아니라고 나왔다.

이것만으로 충분히 예측이 가능했다.

쿠키값은 서버로 전달된 후 디코딩되어 gzip 형식의 바이너리로 사용된다.

확인

로컬에서 쿠키값을 디코딩한 후 바이너리로 저장하여 파일의 종류를 확인해보자.

root@kali:/work/myspace/TAMUCTF/web/TOOMANYCREDIT1# file check
check: gzip compressed data, was "check", last modified: Mon Mar 23 12:26:48 2020, from Unix, original size modulo 2^32 82

gzip 파일이다.
파일 확장자를 바꾸어 압축을 해제한 뒤 파일을 확인해보자.

root@kali:/work/myspace/TAMUCTF/web/TOOMANYCREDIT1# hexdump -C check2
00000000  ac ed 00 05 73 72 00 2d  63 6f 6d 2e 63 72 65 64  |....sr.-com.cred|
00000010  69 74 73 2e 63 72 65 64  69 74 73 2e 63 72 65 64  |its.credits.cred|
00000020  69 74 73 2e 6d 6f 64 65  6c 2e 43 72 65 64 69 74  |its.model.Credit|
00000030  43 6f 75 6e 74 32 09 db  12 14 09 24 47 02 00 01  |Count2.....$G...|
00000040  4a 00 05 76 61 6c 75 65  78 70 00 00 00 00 00 00  |J..valuexp......|
00000050  00 0a                                             |..|
00000052

credit값이 10인 쿠키값을 복호화한 값이며

root@kali:/work/myspace/TAMUCTF/web/TOOMANYCREDIT1# hexdump -C check2
00000000  ac ed 00 05 73 72 00 2d  63 6f 6d 2e 63 72 65 64  |....sr.-com.cred|
00000010  69 74 73 2e 63 72 65 64  69 74 73 2e 63 72 65 64  |its.credits.cred|
00000020  69 74 73 2e 6d 6f 64 65  6c 2e 43 72 65 64 69 74  |its.model.Credit|
00000030  43 6f 75 6e 74 32 09 db  12 14 09 24 47 02 00 01  |Count2.....$G...|
00000040  4a 00 05 76 61 6c 75 65  78 70 00 00 00 00 00 00  |J..valuexp......|
00000050  00 10                                             |..|
00000052

위는 credit값이 16일 때 쿠키값을 복호화한 것이다.

마지막에 위치한 헥스값이 바뀌고 있다.

그리고 추측할 수 있었다.

마지막에 위치한 값을 큰 숫자로 바꿔주면 credit 값을 증가시킬 수 있다.

검증

파이썬 스크립트를 이용해 바이너리 뒷부분의 숫자값을 변경시켜주었다.

import os

f = open('check', 'r')

r = ''.join(f.readlines())
pt = r[-6:]

r = r.replace(pt, '\xff\xff\xff\xff\xff\xff')

fw = open('payload', 'wb')
fw.write(r)
fw.close()

그리고 출력된 바이너리를 base64 디코딩 시킨 후 쿠키값에 넣는다.
그리고 페이지를 리로드시키면

플래그값을 확인할 수 있다.

0개의 댓글