2020년에 진행되었던 국정원 주최 사이버공격방어대회
묵혀놨던 Write Up을 이제야 포스팅 해 본다.
이번에 풀이할 문제는 Web Log 이다.
문제 제목처럼 정직하게 Web Access Log를 분석하는 문제이다.
문제파일로 access.log 파일이 주어진다.
파일 크기가 63.1MB로 꽤 크다..
실제로 Subline Text를 이용해 파일을 열어보면
305,077개의 로그가 있는것을 볼 수 있다.
여기저기 스크롤 옮겨가며 둘러보다가
265,847번째 줄에서 특이한 로그를 발견했다.
/image_view.php?idx=1 and if(ascii(substr((select flag from flag),1,1))=32, (select 1 union select 2), 0)
URL로 이렇게 요청을 하는데,
누가봐도 Blind SQL Injection 공격이다.
flag 테이블에서 flag 컬럼을 가져와 substr 로 맨 앞글자를 잘라내고,
잘라낸 글자를 ascii 코드로 바꿔서 그 값이 32와 같은지 비교하고있다.
Blind SQL Injection 은 이렇게 쿼리의 참/거짓 결과만을 이용해 데이터를 추출하는 공격이다.
조금만 내려보면 어떤 페이로드가 참이고 거짓인지 금방 알 수 있다.
select flag from flag의 첫번째 글자가 아스키 코드로 99일때,
다른 패킷의 응답코드가 200인 것과 다르게 응답코드가 500 으로 나오는 것일 볼 수 있다.
그리고나서 첫번째 글자에 대한 비교를 더이상 수행하지 않고,
substr((select flag from flag),2,1) 로 두번째 글자로 넘어가는 모습이 보인다.
그럼 간단하게 500 응답코드가 난 패킷의 아스키 코드값을 다 모아주면
플래그를 완성할 수 있을 것이다.
f = open('access.log', 'r')
flag = ''
while True:
line = f.readline()
if 'flag' in line:
if 'HTTP/1.1" 500' in line:
tmp = line.split('=')[2]
flag += chr(int(tmp[:3].replace(',','')))
print(flag)
플래그가 34글자 밖에 안돼서 그냥 일일이 세도 되지만
파이썬 연습할 겸 코드로 한번 작성해봤다.
access.log 파일을 한줄씩 읽어들여서
해당 line에 flag 와 HTTP/1.1" 500 이라든 단어가 포함되어 있으면
URL에서 ASCII 코드 부분을 추출해오는 코드이다.
코드를 실행시키면 이렇게 플래그를 찾을 수 있다.
'CTF > 포렌식' 카테고리의 다른 글
[2020CCE] Document Malware Analysis #1~3 - 포렌식 / SSView / HWP (54) | 2022.11.14 |
---|---|
[2020CCE] Webpacket - 포렌식 / Wireshark / XOR (62) | 2022.10.30 |
[2020CCE] Simple Packet - 포렌식 / Wireshark / XOR (76) | 2022.10.26 |
[2020CCE] Simple Memory - 포렌식 / Volatility (60) | 2022.10.22 |
[2020CCE] Keyboord - 포렌식 / Wireshark / Python (56) | 2022.10.20 |