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 패킷을 목적지만 수정하여 다시 실시간으로 전송하여 내용을 확인하는 방식이다.
필요한 환경은 패킷을 보낼 리눅스 환경과 내용을 확인할 리눅스/윈도우 환경 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 -n -r "s/.* src (\S*).*/\1/p")
REPLAY_SRC_DEV=$(ip route get "${REPLAY_DST_IP}" | sed -n -r "s/.* dev (\S*).*/\1/p")
REPLAY_SRC_MAC=$(ip link show "${REPLAY_SRC_DEV}" | sed -n -r "s/.*\/ether (\S*).*/\1/p")
if [ -z "${REPLAY_SRC_MAC}" ]
then
echo "Error reading source MAC address. Make sure that the destination IP does not belong to this machine".
fi
ping -q -c 1 -- "${REPLAY_DST_IP}" > /dev/null
ARP_PATH=$(which arp)
if [ -x "${ARP_PATH}" ]
then
ARP_CMD="${ARP_PATH}"
else
ARP_CMD="sudo ${ARP_PATH}"
fi
REPLAY_DST_MAC=$(${ARP_CMD} -an -- "${REPLAY_DST_IP}" | sed -n -r "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 -c 1 -r "${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 |
#!/usr/bin/env bash
# blog.itekako.com/technical/2017/03/07/rtp-stream-replay/ 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 |