Codegate 2014 WeirdShark Wireup

closeこれは 3 年 6 ヶ月 25 日 前に投稿されたものです。最新のものではありませんので、間違っているかも知れません。

「春休みになったし、SECCONに向けて練習するぞ!@akiym氏が言ってたCodegateをやるぞ!」と思ったら1問しか歯が立たなかった。チーン。

WeirdShark

"weird_shark.pcap_f5f1e42dd398f18c43af89ba972b3ee7"という名前のpcapngファイルが渡される。

さっそくWiresharkで開こうとするも、下記メッセージが出て開けない。
error

ダウンロードに失敗したのかな?と思うも、

$ md5sum weird_shark.pcap_f5f1e42dd398f18c43af89ba972b3ee7
f5f1e42dd398f18c43af89ba972b3ee7 *weird_shark.pcap_f5f1e42dd398f18c43af89ba972b3ee7

ヒェー。

その後、pcapファイルに変換してみたり、CloudSharkやtcpdumpで開いてみたりしたけど、どれも失敗。
ただ、バイナリエディタで開くと、HTTPの通信っぽいことは分かった。

これを、Wiresharkなどで開くには、長さがおかしいとか言われてるようなので、それを直せば良さそう。
いろいろ方法はあると思うけど、ここではパケットを再構成することにした。
元ファイルから、1パケットずつ取り出して、新たな(pcap)ファイルを作成しようとする。

しかし、パースしようにも、libpcapでパースできない(上記エラー)と言われているので、自力でパースするしかない。

そこで、以下のようなpcapngの仕様を見た。
PCAP Next Generation Dump File Format

正直、何やっているか分からない。
「Block Type」がいろいろあり、本当はそれを見てから、それぞれに応じた処理を行うべきだけど、大変面倒くさい。

さらに、実際にキャプチャしてみると、記載されていないBlock Typeがあるような気がする。気がする程度。
しかし、

[Packet Length](4Byte) + [Packet(L2 Frame) Data](Packet Length Byte)

という形式はだいたい共通しているっぽい。

そこで、通信の状況に着目する。
先ほど、辛うじてバイナリエディタで見えた通信では、クライアントとWebサーバの通信(IPv4)だった。

さらに、「0x080045(上位がIPv4 + Version4,Length20)」などで検索すると、常に同じMACアドレス(ホスト)が使われているようだった。であれば、

  • クライアントとWebサーバのMACアドレスの組み合わせの文字列(バイナリ)を検索
  • その前4Byteを読む
  • 1.で見つけた位置から2.のサイズのデータを抜き出し

を全データに行えば良さそう。

pcapファイルへの保存は、
Pythonのdpktモジュールでpcapファイル解析 - Tahoo!!
python + dpkt で pcap解析 – 2.パケット生成と保存 | 迷い庭
を参考にした。

そして、こうなった。

# -*- coding: utf-8 -*-
#!/usr/bin/env python

from socket import *
from struct import *
import dpkt
import re

# File
f = open('weird.pcapng', 'rb')
pcapng = f.read()
f.close()

pcap = dpkt.pcap.Writer(open('weird.pcap','wb'))


# Key => MAC Address
key = ''
key += '\x00\x1C\x42\xD9\x7A\x1F\x00\x1C\x42\x00\x00\x18' + '|'
key += '\x00\x1C\x42\x00\x00\x18\x00\x1C\x42\xD9\x7A\x1F' + '|'
key += '\xFF\xFF\xFF\xFF\xFF\xFF\x00\x1C\x42\xD9\x7A\x1F' + '|'
key += '\xFF\xFF\xFF\xFF\xFF\xFF\x00\x1C\x42\x00\x00\x18'
word = re.compile(key)


# Parse
start = 0
count = 0
while True :
	idx = word.search(pcapng, start)
	if not idx :
		break;

	size = unpack('<L', pcapng[idx.start() - 4 : idx.start()])[0]
	packet = pcapng[idx.start() : idx.start() + size]

	pcap.writepkt(packet, count)
	count += 1
	start = idx.start() + size

私もPython弱者なので、MACアドレスを見つける場所など、もっと上手い方法がありそうで気に食わないのだが、これを実行すれば、良さ気なpcapファイルが作成された。
(というかPythoh、「while idx = word.search(pcapng, start) :」とか「pcap.writepkt(packet, count++)」が出来ないの初めて知った。これ出来なくて嬉しいものなの?「unpack('<L', pcapng[idx.start() - 4 : idx.start()])[0]」は出来て嬉しいけど…)

これで、Wiresharkで開くことができた(いくつかパケットが消えている気配はある)ので、あとは普通に解析する。
いくつかファイルをダウンロードしているようなので、NetworkMinerでファイルを取り出す。Wiresharkよりも賢く取り出してくれる。

すると、「矛盾系AAみたいなmario.pngとかいうヨッシーの画像」「codegate.jpgと書かれた(懇親会か何かの?)外国人が赤目で怖い画像」などに混じって、「multiple.pdf」というPDFファイルがある。

それを開くと、
flag
ということでした。

なお、この方法では、pcapngの仕様を調べるのに6時間もかかった。
しかも、150点(全問題中最低点)なので、コスパ悪い。

Codegate 2014 Quals Forensics 150 WeirdShark writeup | Euphoria Reload3d
というWriteupも見つけたので、いろいろ方法はありそう。

以上です。

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>