반응형

show me the pcap

forensic

 

코로나사태로 인해 루돌프들 끼리 산타우체국에서 비밀리로 비대면 회의를 진행했다!
해당 회의 내용을 중간자 공격으로 PCAP형태로 가져왔으니 분석해보자!

 

 

pcap 파일 한 개가 주어진다.

 

Wireshark로 해당 파일을 열어보면 SSH, TLS 패킷들이 보이는데, 아래로 내려보면 756번부터 많은 RTP패킷들이 캡쳐된 것을 확인할 수 있다.

RTP는 실시간 전송 프로토콜로, 오디오와 비디오 정보의 실시간 전송을 하기위해 사용된다. 문제 지문에서 비대면 회의를 진행하였다고 했으므로, 해당 회의 내용이 RTP를 통해 진행된 것으로 볼 수 있다.

 

 

 

 

 

 

 

 

RTP 패킷의 담긴 내용을 확인해야 하는데, 해당 내용이 오디오형식이고 Wireshark에서 지원하는 코덱인 경우, Wireshark로 바로 확인할 수 있는 방법이 있다.

 

아무 RTP 패킷을 클릭하고 상단 메뉴에서 Telephony > RTP > Stream Analysis 를 클릭하고

Play Streams 버튼을 클릭하고 소스 선택 후 재생버튼을 누르면 된다.

 

그러나 여기에서는 비어있거나 지원하지 않는 코덱이라고 나온다.

 

따라서 해당 내용은 비디오인 것으로 추측해볼 수 있고, 다른 방법을 찾아보아야 했다.

 

 

 

 

 

 

 

 

 

여러가지를 검색하던 중에 블로그 글 하나를 찾을 수 있었다.

blog.itekako.com/technical/2017/03/07/rtp-stream-replay/

 

RTP stream replay

Company news, knowledge sharing, technology, best practices and more.

blog.itekako.com

캡쳐한 rtp 패킷을 목적지만 수정하여 다시 실시간으로 전송하여 내용을 확인하는 방식이다.

 

 

 

 

 

필요한 환경은 패킷을 보낼 리눅스 환경과 내용을 확인할 리눅스/윈도우 환경 2개이다.

 

 

먼저, 주어진 pcap파일에서 (이하 origin.pcap) rtp패킷만 추출한 pcap파일을 만들어야 한다.

1. Wireshark로 origin.pcap를 연다.

2. 상단 메뉴에서 Telephony > RTP > RTP Streams

3. 스트림 선택

4. Prepare Filter 클릭 후 창 닫기

5. 상단 메뉴에서 File > Export Specified Packets… > Export as > pcap

6. rtpstream.pcap로 저장

7. rtpstream.pcap를 패킷을 보낼 리눅스 환경으로 이동

 

 

 

 

 

rtpstream.pcap를 replay하기 위해서는 패킷의 목적지 ip와 mac 주소를 수정해 주어야 한다.

해당 과정은 아래 modify-pcap.sh로 수행한다.

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env bash
# http://blog.itekako.com/technical/2017/03/07/rtp-stream-replay/
set -o errexit
set -o nounset
set -o errtrace
set -o pipefail
 
REPLAY_DST_IP="${1}"
IN_PCAP_FILE="${2}"
OUT_PCAP_FILE="${3:-rtp-for-replay.pcap}"
OUT_SDP_FILE="${4:-sdp}"
 
REPLAY_SRC_IP=$(ip route get "${REPLAY_DST_IP}" | sed --"s/.* src (\S*).*/\1/p")
REPLAY_SRC_DEV=$(ip route get "${REPLAY_DST_IP}" | sed --"s/.* dev (\S*).*/\1/p")
REPLAY_SRC_MAC=$(ip link show "${REPLAY_SRC_DEV}" | sed --"s/.*\/ether (\S*).*/\1/p")
if [ -"${REPLAY_SRC_MAC}" ]
then
  echo "Error reading source MAC address. Make sure that the destination IP does not belong to this machine".
fi
ping --1 -- "${REPLAY_DST_IP}" > /dev/null
ARP_PATH=$(which arp)
 
if [ -"${ARP_PATH}" ]
then
  ARP_CMD="${ARP_PATH}"
else
  ARP_CMD="sudo ${ARP_PATH}"
fi
REPLAY_DST_MAC=$(${ARP_CMD} -an -- "${REPLAY_DST_IP}" | sed --"s/.* at (\S*).*/\1/p")
 
read ORIG_SRC_IP ORIG_SRC_MAC ORIG_DST_IP ORIG_DST_MAC RTP_DST_PORT <<<$(\
    tshark -T fields -e ip.src -e eth.src -e ip.dst -e eth.dst -e udp.dstport -1 -"${IN_PCAP_FILE}")
 
tcprewrite \
    --fixcsum \
    --srcipmap=${ORIG_SRC_IP}/32:${REPLAY_SRC_IP}/32 \
    --enet-smac=${REPLAY_SRC_MAC} \
    --dstipmap=${ORIG_DST_IP}/32:${REPLAY_DST_IP}/32 \
    --enet-dmac=${REPLAY_DST_MAC} \
    --infile="${IN_PCAP_FILE}" \
    --outfile="${OUT_PCAP_FILE}"
 
echo "c=IN IP4 ${REPLAY_SRC_IP}
m=video ${RTP_DST_PORT} RTP/AVP 96
a=rtpmap:96 H264/90000" > "${OUT_SDP_FILE}"
 
echo "Copy file \"$(readlink -e ${OUT_SDP_FILE})\" to player machine, open it in player, then execute:"
echo "  sudo tcpreplay --intf1=${REPLAY_SRC_DEV} '${OUT_PCAP_FILE}'"
cs

 

위 스크립트 실행에 필요한 패키지를 설치해야 한다.

$ sudo apt-get install tcpreplay tshark net-tools

 

그리고 스크립트를 실행해 준다.

$ bash modify-pcap.sh <player machine ip> <input pcap file> [<output pcap file>] [<output sdp file>]
$ bash modify-pcap.sh 192.168.0.2 rtpstream.pcap

 

 

그러면 패킷을 받기 위한 정보가 담긴 sdp파일이 생성되고, 패킷을 replay하기 위한 명령어가 출력된다.

 

sdp파일은 패킷을 받을 환경으로 이동한다.

 

 

 

 

 

 

 

 

패킷을 받아 영상으로 보기 위해서는 아래 명령어를 사용하면 된다.

$ ffplay sdp

나는 윈도우 환경에서 진행하였기 때문에 ffplay.exe를 사용하였다. ffplay.exe는 ffmpeg.org/download.html에서 다운받을 수 있다.

 

ffplay sdp로 대기 중인 상태에서, 리눅스 환경에서

 

sudo tcpreplay --intf1=enp0s3 'rtp-for-replay.pcap'

(modify-pcap.sh을 실행하고 출력된 명령어)을 실행하면, 패킷이 전송되어 받을 수 있다.

 

 

 

 

 

 

 

 

 

ffplay.exe sdp를 실행하였을 때 나는 

 

 

이러한 오류가 발생하였다. 해당 오류는 -protocol_whitelist file,udp,rtp,crypto,data 옵션을 추가해주어 해결할 수 있었다.

 

 

 

 

 

 

첫 번째 시도에서 오류가 발생하였다.

blog.itekako.com/technical/2017/03/07/rtp-stream-replay/에서는 문제가 있을 때, sdp 파일에 추가적인 정보를 추가해주라고 되어 있다. 

 

 

 

sdp-fmtp-data.sh

1
2
3
4
5
6
set -o errexit
set -o nounset
IN_FILE="${1}"
echo "a=fmtp:96 $(tshark -E aggregator=';' -Y sdp.fmtp.parameter -T fields -e sdp.fmtp.parameter -r "${IN_FILE}")"
cs
$ bash sdp-fmtp-data.sh origin.pcap

 

 

출력 결과

a=fmtp:96 profile-level-id=1;config=000001B001000001B58913000001000000012000C48D8DC43D3C04871443000001B24C61766335372E3130372E313030

 

해당 내용을 sdp 다음 행에 추가해주었다.

 

그러나 여전히 오류가 발생하였다.

 

sdp

c=IN IP4 10.0.2.15
m=video 58898 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=1;config=000001B001000001B58913000001000000012000C48D8DC43D3C04871443000001B24C61766335372E3130372E313030

 

sdp에 내용이 부족하거나 잘 못 설정된 것 같아, origin.pcap 파일을 다시 살펴보았다.

 

rtp 패킷들이 전송되기 전 부분인 749번 패킷에서 메타데이터를 확인할 수 있었다.

해당 내용에 따라 코덱 정보를 H264에서 MP4V-ES로 수정하고 시도하였더니 플래그를 얻을 수 있었다.

 

 

반응형

'CTF Write Up' 카테고리의 다른 글

The Cyber Grabs CTF 0x02 write up  (0) 2021.01.17
0xL4ugh CTF write up  (0) 2021.01.16
CyberTalents Digital Forensics CTF write up  (0) 2020.11.29
제 2회 TeamH4C CTF 2020 Write-up  (0) 2020.10.13
CCE2020 Quals Write-up  (0) 2020.09.26

+ Recent posts