1. sleepingshark
2022 Fall GoN Open Qual


2. Explanation
dump.pcap 파일을 Wireshark로 열어보면 아래와 같이 나타난다.

HTTP 통신이 많기에 server로의 요청 내역들만 모아본다.

위와 같이 Statistics > HTTP > Requests에서 확인할 수 있다.

URL의 Query string을 보았을 때 SELECT와 FROM 등 SQL 문법으로 보이는 문자열들을 확인할 수 있으며 SQL Injection 공격을 시도 중인 것으로 유추할 수 있다.

따라서, 명확히 판단하기 위하여 http 패킷을 분석 해본다. 위 사진과 같이 http로 필터링을 한 후에 무작위의 19번 패킷의 Info를 URL Decode한다.

SELECT IF(ASCII(SUBSTRING((SELECT flag FROM s3cr3t LIMIT 1),34,1))=45, SLEEP(3), 0)
위와 같은 Query String을 확인할 수 있다. 쿼리문을 분석해보면 다음과 같다.
- SELECT flag FROM s3cr3t LIMIT 1
- s3cr3t라는 테이블에서 flag라는 컬럼의 1번째 행의 데이터
- SUBSTRING((SELECT flag FROM s3cr3t LIMIT 1), 34, 1)
- flag 컬럼 데이터에서 34인덱스의 문자를 추출(0부터 시작)하여 반환
- 34는 start position 즉 추출을 시작할 문자의 위치를 의미
- 1은 length 추출할 문자의 길이를 의미
- IF(ASCII(...) = 45, SLEEP(3), 0)
- 추출한 문자의 ASCII 값이 45인지 확인(45는 -(하이픈)을 의미)
- 조건이 참(TRUE)이면 3초 동안 지연 후 응답(SLEEP(3)).
- 조건이 거짓(FALSE)이면 지연 시간 없이 즉시 응답을 반환(0).
쿼리문을 분석해보았을 때 처음 유추하였던 것과 같이 SQL Injection 공격이 맞으며 그 중에서도 정확히는 Time-Based Bllind SQL Injection 공격을 시도하고 있음을 알 수 있다. 3초 동안 지연 후 응답된다는 것은 웹 페이지가 3초 동안 로딩되며 3초 이후에 정상적으로 웹 페이지가 로딩 후 동작되는 것을 의미한다. 이를 통하여 조건의 논리를 알 수 있다.

http 패킷 중에서 3초 뒤에 응답이 온 패킷을 필터링하였을 때 위와 같이 조건이 true인 패킷들이 존재한다.
따라서 위와 같은 형태의 쿼리문이 포함된 http 패킷들을 요청하였을 때 3초 뒤에 응답이 온 패킷들 즉, 요청 값이 True인 패킷들만 모아서 Query String을 분석하면 flag를 획득할 수 있다.
Python의 pyshark 라이브러리를 사용하여 코드를 짜본다.
import pyshark
import urllib.parse
import re
def extractLongDelayTimeRequests(pcapFile, setTime):
cap = pyshark.FileCapture(pcapFile, display_filter='http')
requestTimes = {}
flag_parts = []
for packet in cap:
if 'HTTP' in packet:
try:
if hasattr(packet.http, 'request_full_uri'):
streamIndex = packet.tcp.stream
requestTime = float(packet.sniff_timestamp)
requestTimes[streamIndex] = (packet, requestTime)
elif hasattr(packet.http, 'response_code'):
streamIndex = packet.tcp.stream
responseTime = float(packet.sniff_timestamp)
if streamIndex in requestTimes:
requestPacket, requestTime = requestTimes[streamIndex]
delayTime = responseTime - requestTime
if delayTime > setTime:
fullUri = requestPacket.http.request_full_uri
decodedUri = urllib.parse.unquote(fullUri)
print(f"Request Info (Encoded URI): {fullUri}")
print(f"Request Info (Decoded URI): {decodedUri}")
print(f"Delay Time: {delayTime} seconds")
print("")
match = re.search(r'SUBSTRING.*?,(\d+),1\)\)=(\d+)', decodedUri)
if match:
position = int(match.group(1))
ascii_value = int(match.group(2))
if len(flag_parts) < position:
flag_parts.extend([None] * (position - len(flag_parts)))
flag_parts[position - 1] = chr(ascii_value)
except AttributeError:
continue
cap.close()
flag = ''.join([char for char in flag_parts if char])
print(f"Extracted Flag: {flag}")
pcapFile = 'dump.pcap'
setTime = 3
extractLongDelayTimeRequests(pcapFile, setTime)
우선 위와 같이 Delay Time, 지연 시간이 3초 이상인 패킷들을 식별하여 해당 패킷의 Info와 Decode한 값들을 출력되게 하였다. 조건이 참인 모든 패킷들이 출력된다. 이후 Decode한 Query String에서 문자의 위치에 해당하는 아스키 코드 값을 조합하여 flag를 출력한다(출력되는 패킷들은 모두 조건이 True인 패킷들).

코드를 동작시키면 위와 같이 flag를 획득할 수 있다.
3. Reference
https://blog.naver.com/stop2y/221033895075
'Digital_forensic > CTF' 카테고리의 다른 글
| [Dreamhack] BMP Recovery Write-up (1) | 2024.12.25 |
|---|---|
| [Dreamhack] lolololologfile Write-up (1) | 2024.12.19 |
| [Dreamhack] Windows Search Write-up (0) | 2024.11.25 |
| MSB와 LSB를 활용한 Bit Plane 방식 관련 문제 풀이 방안 (0) | 2024.11.23 |
| [Dreamhack] Grand Theft Auto Write-up (0) | 2024.11.22 |