12.02 ~ 12.04
1차 대회 참여한 기록 있다고 해서, 술마시고 있는데 대회 시작 30분전에 갑자기 이메일왔다.
그냥 개인적으로 이 대회, 처음 CTF 공부할때 참여했던 기억나서 좋아.
response 헤더 확인하는 문제
소스보기 하면 나온다.
처음에는 이런 문제가 보안과 무슨 관련이 있나 궁금했었는데,
개발자들이 중요한 내용을 주석으로 작성해놓는 경우가 꽤 많다고 들었다.
Web 클라이언트 사이드 검사 문제
form에 Usernam, Password 입력해보면 네트워크 찌르지 않고, client-side에서 validiation check 한다.
다시 확인해보니, 처음 렌더링하면서 login.js를 받았다.
login.js 로 들어가보면 flag가 있다.
들어가보면 아래처럼 되어있다. 암호화 과정 같다.
같이 import 된 js.js에 들어가보면 암호화 방식이 적혀있다.
콘솔창에 직접 해보면 다음과 같다.
그래 프론트에서 암호화하지 말자.
소켓 통신하면서 인코딩 200개를 수행하면 된다.
pwntools, python3 로 했다. 뭔가 문자열 처리 좀 그래.
중간에 랜덤으로 '' 빈 값이 들어오는데 어떻게 처리해야하할지 모르겠다. 이거 이후로는 인코딩 결과가 잘 안맞는다.
그리고, 자바나 다른 언어로 해보려고했는데, base 라이브러리 임포트하는것부터 짜증난다.
파이썬쓰자
from base64 import *
from pwn import *
p = remote('encoderbase.ctf.cert.unlp.edu.ar', 5001)
en_list = "16", "32", "64", "85"
cnt = 0
while True:
message = p.recvuntil("encode:").decode("utf-8")
print("message {0}".format(message))
word = p.recv()
word = word[1:len(word) - 1]
print(len(word))
print("word!!! {0}".format(word))
result = ""
for en in en_list:
if en in message:
if en == "16":
result = b16encode(word)
elif en == "32":
result = b32encode(word)
elif en == "64":
result = b64encode(word)
else:
result = b85encode(word)
print("result!!!", result)
p.sendline(result)
message = p.recvline()
print("message", message)
cnt += 1
print("cnt ", cnt)
if cnt == 200:
message = p.recvline()
print("message", message)
코드를 보면 md5 해쉬 결과가 434d0c349e0e35ee9ed740e83a23fee5와 같으면 flag를 보여준다.ㅏ
해쉬는 비복원이다. 다만, 온라인에는 해쉬값을 저장해놓는 사이트들이 있다. 이러한 것들을 레인보우 테이블이라고한다.
몇개 뒤지면 나오는데 암호화 전이 chinitalenda 이다.
chinitalenda을 input 에 넣어주고 submit 하면된다. 사실 이 자체가 플레그다.
같이 import 된 js 파일이 있다.
submit 누르면 실행되지만 false여서 실행되지 않는다.
필요한 부분만 console에서 실행시키자.