View

[Dreamhack] sleeping shark 문제 풀이

wrwrwrwr97 2023. 9. 21. 20:28

https://dreamhack.io/wargame/challenges/605

 

sleepingshark

Do shark sleep?

dreamhack.io

 

네트워크 패킷 파일을 분석하여 FLAG를 획득하는 문제이다. 문제 파일을 받으면 dump.pcap 파일 하나를 받을 수 있다.

 Wireshark를 통해서 dump.pcap을 열어보면 POST 메소드로 SQL 쿼리를 여러 번 보낸 것을 확인할 수 있다.

 

Wireshark로 dump.pcap 파일 확인

 

해당 쿼리문들이 URL 인코딩 되어있어 어떤 쿼리인지 확인하기 위해서는 URL 디코딩을 해야할 것 같다.

더보기

URL 인코딩, URP Encoding

- URL에서 URL로 사용할 수 없는 문자 혹은 URL로 사용할 수 있지만 의미가 왜곡될 수 있는 문자들을 %XX 형태의 16진수 값으로 변환하는 것
- URL 디코딩 (URL Decoding)은 변환된 URL을 다시 원래 형태로 되돌리는 것

 

URL 인코딩/ 디코딩이 필요한 이유

- 인터넷을 통해 전송할 수 있는 문자는 오로지 ASCII 문자이기 때문에 ASCII 문자가 아닌 문자는 인터넷 통해 전송할 수 있는 형태로 변환 해줘야 함 (ex. 한글의 경우 ASCII 문자가 아니므로 변환 필요, 변환 규칙은 UTF-8을 따른다.)

 

- ASCII 문자여도 예약된 의미 가지고 있는 문자의 경우, 그 문자 자체의 의미를 전달하고 싶은 경우에는 이스케이프 처리가 필요하다.

  대표적으로 /, &, = 등의 문자가 있다. 

 

/ : URL 각 레벨 구분

& : 쿼리 파라미터들 구분

= : 쿼리 파라미터 값 지정 

위 문자들은 ASCII 문자이지만 URL 내에서 예약된 의미를 가지고 있음

 

이러한 문자들을 문자 자체의 의미로 전달하고 싶으면 이스케이프 처리가 필요하다.

ex) & 문자를 보낼 때 이스케이프 해주지 않으면 쿼리 파라미터 구분자로 인식, 때문에 & 문자 그대로 보내고 싶으면 %26으로 인코딩하여 전달해야 &문자가 전달 (예약된 의미 X)

 

※ URL에서는 공백 문자 허용되지 않음, 공백 문자는 %20 또는 + 로 인코딩

 

Cyberchef 에서 인코딩된 문자열 두 개를 디코딩 해보면 SQL문 쿼리를 확인할 수 있다.

URL 디코딩 (Cyberchef)

SELECT IF(ASCII(SUBSTRING((SELECT flag FROM s3cr3t LIMIT 1),36,1))=15, SLEEP(3), 0)

해당 SQL문을 해석해보면 아래와 같다.

  • ASCII(SUBSTRING((SELECT flag FROM s3cr3t LIMIT 1),36,1)
    • s3cr3t 테이블에 있는 flag 열의 첫 번째 레코드를 가져오고 가져온 flag 값에서 36번째 값을 추출 후 ASCII 코드 반환한다.
  • SELECT IF(ASCII(...))=15, SLEEP(3), 0)
    • 36번째 값의 ASCII 코드 값과 15가 일치하는지 확인
    • 일치하면 3초 쉬고 (SLEEP) 일치하지 않으면 0을 반환

이를 봤을 때 네트워크 패킷 파일에서 보내진 쿼리들은 FLAG 값의 문자들을 ASCII 값으로 비교하여 일치하는 ASCII 값을 찾아 데이터베이스에 있는 FLAG 값을 알아내기 위한 쿼리문으로 보인다.

 

때문에 해당 쿼리문들 중 일치하는 쿼리를 모두 분석하여 값들을 찾으면 FLAG를 얻을 수 있을 것으로 보인다.

 

 

Zui 를 사용하여 패킷 파일을 보면 _path 가 conn - http - files 순으로 통신이 이뤄진 것을 확인할 수 있다.

Zui로 패킷 분석

 

위에서 디코드 한 쿼리를 봤을 때 일치하는 값이면 3초를 SLEEP 하기 때문에 . _path 가 conn인 패킷에 있는 duration 부분이 3초 이상인 패킷만 필터링하여 검색하였다.

duration 3초 이상 필터링

검색된 _path 가 conn인 패킷의 uid 값과 _path 가 http 인 패킷의 uid값이 일치하는 것들을 찾아 쿼리들을 분석하면 FLAG를 얻을 수 있을 것이다.

일치하는 쿼리들을 보면 문자열의 길이는 총 39이고 ASCII 코드 값을 문자로 바꾸면 FLAG를 얻을 수 있다.

 

더보기

GoN{T1mE_B4s3d_5QL_Inj3c7i0n_wI7h_Pc4p}

 

duration이 3초 이상인 conn 패킷 필터링 이후에는 노가다를 해서 쿼리문 분석을 했다. 

가능하다면 Python 코드를 짜서 해보는 것도 좋을 것 같다.

 

Share Link
reply
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31