1. 문제
작년 크리스마스 CTF에 나온 포렌식 문제이다. 제공된 pcap 파일을 분석하면서 RTP 프로토콜이 나오는 것으로 보아 비대면 회의 영상을 뽑아내는 것까지는 파악했으나 결국 영상복구는 하지 못한채 끝나버렸다.
다시 풀어야지.. 하다가 까먹고 이제서야 분석을 해보았다. 참고로 문제는 올라온 롸업들을 참고하여 다시 풀었다
2. 접근방법
드림핵에 올라온 해당 문제의 롸업을 보면 이 문제의 목표는 다음과 같다
RTP 프로토콜이란 Real Time Tranport Protocol 의 약자로서 말 그대로 실시간으로 음성이나 영상 데이터를 전송하는 표준 프로토콜이다. 와이어샤크에서 RTP 스트림을 우선 덤프를 뜨자
- Telephony → export rtpdump
추가적으로 RTP 패킷 이외에 RTSP 패킷도 볼 수 가 있다.
- RTP : UDP/IP로 패킷을 전송하며 Payload 부분에 실 데이터가 담김(오디오 또는 영상)
- RTSP : 실시간 스트리밍 프로토콜로서 RTSP를 사용하여 RTP를 통한 미디어 전송을 제어한다
우리가 실시간 스트리밍에 접속할때 http://localhost/test.wmv 같이 접속한다. 그러면 세션을 맺는 과정을 거쳐야 하는데 이 과정이 sdp를 통해서 이뤄진다. 따라서 replay attack을 진행하기 위해 sdp 파일을 만들어주고 FFmpeg 도구를 이용하여 만든 sdp 파일 내용을 기반으로 영상을 만든다.
우리는 저 영상을 결국 뽑아내면 된다. 우선 그러기 위해서 sdp 파일 내용을 뽑아보자
rtsp 패킷을 잘 찾아보면 세션과 관련된 내용이 들어있는 패킷을 찾을 수 있다. 저 내용을 sdp에 써야한다.
sdp
v=0 o=- 0 0 IN IP4 127.0.0.1 s=No Name c=IN IP4 165.22.54.114 t=0 0 a=tool:libavformat 57.83.100 m=video 0 RTP/AVP 96 b=AS:200 a=rtpmap:96 MP4V-ES/90000 a=fmtp:96 profile-level-id=1; config=000001B001000001B58913000001000000012000C48D8DC43D3C04871443000001B24C61766335372E3130372E313030 a=control:streamid=0
각 라인의 의미는 다음과 같다
- v=0
SDP 프로토콜의 버전.
- o=- 0 0 IN IP4 127.0.0.1
SDP 메시지를 생성한 소유자 표시.
- - : Username(표시안함)
- 0 : Session-ID(0)
- 0 : Session Version(0)
- IN : Network Type
- IP4 : Address Type
- 127.0.0.1 : 소유자 IP
- s=No Name
세션 이름
- c=IN IP4 165.22.54.114
- IN : Network Type
- IP4 : Address Type
- 165.22.54.114 : Connection-Address
- t=0 0
start time - stop time. 0 0 은 고정 세션을 의미
- a=tool:libavformat 57.83.100
- m=video 0 RTP/AVP 96
미디어 설명
- video : 해당 페이로드는 영상이다
- 0 : port
- RTP/AVP 96 : 프로토콜 표시
- b=AS:200
- a=rtpmap:96 MP4V-ES/90000
미디어 속성 정의
- a=fmtp:96 profile-level-id=1; config=000001B001000001B58913000001000000012000C48D8DC43D3C04871443000001B24C61766335372E3130372E313030
DTMF 협상 진행
- a=control:streamid=0
여기서 실시간 스트리밍 서비스를 제공하는 서버 역할을 윈도우 호스트로 세팅하고 접속하고자 하는 클라이언트를 리눅스로 세팅하고 진행하였다. 따라서 sdp의 소유자 ip와 포트번호를 수정하였다
v=0
o=- 0 0 IN IP4 192.168.152.1
s=No Name
c=IN IP4 165.22.54.114
t=0 0
a=tool:libavformat 57.83.100
m=video 8888 RTP/AVP 96
b=AS:200
a=rtpmap:96 MP4V-ES/90000
a=fmtp:96 profile-level-id=1; config=000001B001000001B58913000001000000012000C48D8DC43D3C04871443000001B24C61766335372E3130372E313030
a=control:streamid=0
이제 만든 FFmpeg 툴을 이용해서 sdp 내용에 따른 영상을 만들면 된다.
3. 풀이
FFmpeg를 이용해서 영상을 뽑아낼때 인자로준 sdp 파일을 참조하게 되는데, 이때 replay attack을 이용해야한다. 내부에 적혀진 owner의 ip/port에 클라(우분투)가 접속을 해야지만 세션이 맺어지면서 정상적인 영상이 추출된다. 클라에서 아무런 패킷을 보내지 않으면 영상은 재생되지 않는다.
- Window(서버)
ffmpeg.exe -v warning -protocol_whitelist file,udp,rtp -f sdp -i .\test.sdp -copyts -c copy -y flag.mkv
해당 명령을 cmd에서 실행시키면 ffmpeg가 sdp을 참조하여 영상을 만드는데, 이때 sdp 세션과 관련한 정보를 replay attack을 통해 클라(우분투)가 보내줘야한다. 이는 rtpplay 툴을 이용하면 된다
- Ubuntu(클라)
rtpplay -T -f [추출했던 rtp dump] 192.168.152.1/8888
정상적으로 동작했다면 flag.mkv가 생성되고 플래그를 확인할 수 있다
4. 몰랐던 개념
- RTP, RTSP 프로토콜
- FFmpeg 프로그램
- SDP 프로토콜
5. 참고
'워게임 > CTF 문제들' 카테고리의 다른 글
[Christmas CTF 2020] angrforge (0) | 2021.01.16 |
---|---|
[Christmas CTF 2020] phantom (0) | 2021.01.15 |
[star CTF 2019] hack me (0) | 2020.12.17 |
[0ctf 2019] babykernel2 (0) | 2020.12.08 |
[cicsn2017] babydriver (0) | 2020.12.04 |
Uploaded by Notion2Tistory v1.1.0