ラベル 解説 の投稿を表示しています。 すべての投稿を表示
ラベル 解説 の投稿を表示しています。 すべての投稿を表示

2014年3月3日月曜日

SECCON2013 online writeup - Crossword Puzzle その他 300

SECCON2013 online の writeup です。
その他の300点問題、Encode meです。
クロスワードパズルが表示されてそれを答えよという問題。問題文は下記のように書いてあるため有名な日本人の名前が出てくるはず。

Answer is sha1sum of orange words. hint:orange cell words make famous japanese...

クロスワード自体は次のとおり。



これを必要なところだけ埋めると次ようになる。


出てくる単語は上から、N、I、E、A、N、K、T、E、M、H、A。これらを並べ替えて日本の有名人の名前にすれば答えがわかる。色々悩んでいるとチームメイトの一人が「HENTAIKAMEN・・・」とつぶやいて答えにたどり着く。あとはこれをSHA1するだけ。

それにしても日本の有名人なのか・・・?





SECCON2013 online writeup - calculate it / 計算せよ プログラミング・crypt 100

SECCON2013 online の writeup です。 プログラミング・cryptの100点問題、calculate it/計算せよ、です。
指定されたサーバにアクセスすると問題が表示されそれを答えていくというもの。
以下のようにサーバへアクセスするとランダムに問題文が表示されます。


nc calculateit.quals.seccon.jp 45105
1/224345516-1721549/6 = 
86
No good.

適当に答えを入れても正解しません。しばらくすると以下のようなヒントが出されてボーリングのスコアだと分かります。


Hint1: 四則演算ではありません / It is not a four arithmetic operations.
Hint2: 計算例 81 9- 16 6- 4/ 15 X  3- 72 45  = 82
Hint3: G- G- G- G- G- G- G- G- G- G-  = 0
Hint4: X  X  X  X  X  X  X  X  X  XXX = 300


いくつか手動で解こうとしますが制限時間があり自動で計算するプログラムにする必要があります。かつ、下記のように何回も問題が出てきます。


root@bt:~/Desktop/download/crypt100# python calc5.py 
['6', '1', '6', '/', '2', '4', '3', '1', '5', '3', '1', '-', '4', '/', '4', '5', 'X', '2', '3']
81

616/2431531-4/45X23
['7', '2', '4', '3', '6', '-', '8', '1', '7', '-', '8', '/', '4', '/', '5', '-', '6', '2', '1', '6']
87

72436-817-8/4/5-6216
['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', '4', '/', 'G']
264

XXXXXXXXX4/G
['G', '-', 'G', '-', 'G', '-', 'G', '-', 'G', '-', 'G', '-', 'G', '-', 'G', '-', 'G', '-', '1', '2']
3

G-G-G-G-G-G-G-G-G-12
['G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', '5']
105

かつ、100問近く解いて最後に「最高点は?」というような質問があり最終的には下記のような回答が得られます。
(適当に書いたスクリプトなので答えの出力が微妙ですが。。。)


['G', 'o', 'o', 'd', '!', '!', '\n', 'F', 'L', 'A', 'G', ':', ' ', 'B', 'o', 'w', 'l', 'i', 'n', 'g', ' ', 'i', 's', ' ', 'v', 'e', 'r', 'y', ' ', 'f', 'u', 'n', '!', '!', '\n']

Flagは Bowling is very fun!! でした。
適当にかつ必要な部分だけのスクリプトですが下記にさらしておきます。


import socket

def solve(data):
    bangou1 = 0
    bangou2 = 0
    score = 0
    char_list=list(data)
    print char_list
    i = len(char_list)
    n=1
    m=i
    for y in char_list:
        if(y =='-' or y == 'G'):
            char_list[bangou1]='0'
        bangou1=bangou1+1
    X_list=char_list
    X_count=0
    for x in X_list:
        if(x == 'X'):
           X_count=X_count+1
        X_count=X_count+1
    if(char_list[i-2] == '/'):
        if(char_list[i-1] == 'X'):
            char_list[i-1] == '10'
        m = i-1
    if(char_list[i-3] == 'X'):
        if(char_list[i-2] == 'X'):
            char_list[i-2] == '10'
        if(char_list[i-1] == 'X'):
            char_list[i-1] == '10'
        if(char_list[i-1] == '/'):
            char_list[i-2] == '10'
            char_list[i-1] == '0'
        if(X_count>20):
            m = i-2
    for x in char_list:
        if(x == '/'):
            if(char_list[bangou2+1] == 'X'):
                score = score + 10 - int(char_list[bangou2-1]) + 10
            else:
                score = score + 10 - int(char_list[bangou2-1]) + int(char_list[bangou2+1])
        elif(x =='X'):
            if(char_list[bangou2+1] == 'X' and char_list[bangou2+2] != 'X'):
                score = score + 10 + int(char_list[bangou2+2]) + 10
            elif(char_list[bangou2+2] == 'X' and char_list[bangou2+1] != 'X'):
                score = score + 10 + 10 + int(char_list[bangou2+2])
            elif(char_list[bangou2+2] == 'X' and char_list[bangou2+1] == 'X'):
                score = score + 10 + 10 + 10
            elif(char_list[bangou2+2] == '/'):
                score = score + 10 + 10
            else:
                score = score + 10 + int(char_list[bangou2+2]) + int(char_list[bangou2+1])
        else:
            score = score + int(x)
        bangou2 = bangou2 + 1
        if (n==m):
            break
        n=n+1
    score = str(score) + "\r\n"
    return score

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('calculateit.quals.seccon.jp', 45105))
total_score =0
hi_score=0
low_score=500
p_count=0

while True:
    p_count = p_count+1
    q = s.recv(1024)
    q = q.replace(' =', '').rstrip()
    if 'total' in q:
        total_score = str(total_score) + "\r\n"
        s.send(total_score)
        q = s.recv(1024)
    if 'hi' in q:
        hi_score = str(hi_score) + "\r\n"
        s.send(hi_score)
        q = s.recv(1024)
    a = solve(q)
    total_score=total_score+int(a)
    if(int(a)>hi_score):
        hi_score=int(a)
    if(int(a)










2014年1月28日火曜日

SECCON2013 online writeup - Find the key! ネットワーク・Web 200

SECCON2013 online の writeup です。
ネットワーク・Webの200点問題、Find the key! です。
問題は seccon_q1_pcap.pcap というキャプチャファイルを渡されてフラッグをゲットせよというもの。

pcap ファイルなのでまずは wireshark で開いてみる。すると ICMP のパケットのみが表示されている。上から順番に眺めているとパケットサイズが異なるパケットがあり、特に No.41 のパケットにはデータ部分に HTTP 、kagi.png の文字がある。



この時点で、ping tunnel を使って icmp パケットのデータ部分に http 通信を埋め込んでいることがわかる。また kagi.png という名前が示す通り、この画像ファイルに答えが記載されている可能性が高いので、画像ファイルを復元する。

該当するパケットのデータ部分から Export Selected Packert Bytes を実施する。



実際に詳しく見ると、No.41 は相手からの通信で、No.42 と No.43 はその応答で、実際の HTTP 通信は No.44 からになる。HTTP 1.1 200 OK とあるので実際の画像データはそのあとになる。
png ファイルのマジックナンバーは 89 50 4E 47 0D 0A 1A 0A なので、No44 で検索してみる。



また、同様にして png ファイルの終端は IEND という文字列になるので検索すると No.48 のパケットにその文字が現れる。

No.44 の HTTP ヘッダーを取り除いたものに、No.48 までのパケットを追加していき png ファイルを作成する。
なお、抜き出したデータの先頭部分は関係のない(たぶんトンネルに使用するデータ)が入っているので、そこは各データから削除して連結する必要がある(全部同じヘッダ情報が含まれている)。



完成した kagi.png を開くと答えが書いてある。














2014年1月27日月曜日

SECCON2013 online writeup - Encode me. その他 200

SECCON2013 online の writeup です。
その他の200点問題、Encode meです。
encode_me_91 というファイルが渡され、パスワードを答えよという問題。

まずはファイルの情報を調べてみる。

other200# file encode_me_91 
encode_me_91: AmigaOS bitmap font

AmigaOS bitmap font と書かれているので調査してみると AmigaOS というものがあり PworePC で動作するとか書いてある。
これはその他の問題で題名からして encode と書いてあるので違うのでは?ということになり、次にファイル名にある 91 を手掛かりにして探してみると basE91 というエンコード方法があることが分かった。

basE91 からページにエンコード/デコード用のソフトがダウンロードできるため、それを使ってデコードする。

other200/base91-0.6.0-linux-i386/bin# ./base91 ../../encode_me_91 
PASSWORD/IS/WHICH+ENCODING+DO+YOU+LIKE
other200/base91-0.6.0-linux-i386/bin# 

答えは上記の WHICH+ENCODING+DO+YOU+LIKE になる。

SECCON2013 online writeup - ここはどこ? フォレンジックス 100

SECCON2013 online の writeup です。
フォレンジックの100点問題、ここはどこ?です。
問題はForensicist.datというファイルを渡されて解答せよというもの。「ここはどこ?」と聞かれているので場所を特定して回答するものと仮定しフォレンジックを進めます。

まずは渡されたファイルの種類を調べるため file コマンドで調べます。

forensics100# file Forensicist.dat 
Forensicist.dat: RFC 822 mail text

中身は mail なのでテキストとして表示させます。


「答:○○○○○○ ○○○」とあり、panda.tif というファイルが添付されています。そこで、添付ファイルを取り出してみます。
まず base64 でエンコードされている部分をテキストファイルとして抜き出します(SUkから最後の=まで)
そのファイルをバイナリデータへデコードします。今回はこのサイトを使ってデコードしました。デコードされたファイルがダウンロードされるのでそのファイルを調べます。

forensics100# file base64.bin 
base64.bin: TIFF image data, little-endian

画像ファイルのようです。ファイルを確認します。


パンダでした。
このままではわからないので Google の画像検索か Exif だろうと見当をつけて調べると、Exif 情報にGPS情報がありました。画像 Viewer のプロパティか exiftool コマンドで確認できます。

forensics100# exiftool base64.tiff 
ExifTool Version Number         : 7.89
File Name                       : base64.tiff
Directory                       : .
File Size                       : 132 kB
File Modification Date/Time     : 2014:01:27 16:13:53+09:00
File Type                       : TIFF
MIME Type                       : image/tiff
Exif Byte Order                 : Little-endian (Intel, II)
Subfile Type                    : Full-resolution Image
Image Width                     : 229
Image Height                    : 172
Bits Per Sample                 : 8 8 8 8
Compression                     : LZW
Photometric Interpretation      : RGB
Make                            : Apple
Camera Model Name               : iPhone 4S
Strip Offsets                   : (Binary data 80 bytes, use -b option to extract)
Orientation                     : Horizontal (normal)
Samples Per Pixel               : 4
Rows Per Strip                  : 13
Strip Byte Counts               : (Binary data 69 bytes, use -b option to extract)
X Resolution                    : 96.012
Y Resolution                    : 96.012
Planar Configuration            : Chunky
Resolution Unit                 : inches
Software                        : 5.0.1
Modify Date                     : 2012:02:02 02:02:02
Predictor                       : Horizontal differencing
Extra Samples                   : 2
Y Cb Cr Positioning             : Centered
About                           : uuid:faf5bdd5-ba3d-11da-ad31-d33d75182f1b
Creator Tool                    : 5.0.1
Exposure Time                   : 1/120
F Number                        : 2.4
Sub Sec Time Original           : 00
Sub Sec Time Digitized          : 00
Exposure Program                : Program AE
GPS Latitude Ref                : North
GPS Longitude Ref               : East
GPS Altitude Ref                : Above Sea Level
GPS Img Direction Ref           : True North
GPS Img Direction               : 45.17590361
ISO                             : 64
Exif Version                    : 0221
Date/Time Original              : 2012:02:02 02:02:02
Create Date                     : 2012:02:02 02:02:02
Components Configuration        : Y, Cb, Cr, -
Shutter Speed Value             : 1/120
Aperture Value                  : 2.4
Brightness Value                : 5.861211392
Metering Mode                   : Multi-segment
Flash                           : Off, Did not fire
Focal Length                    : 4.3 mm
Subject Area                    : 1631 1223 881 881
Flashpix Version                : 0100
Color Space                     : sRGB
Exif Image Width                : 3264
Exif Image Height               : 2448
Sensing Method                  : One-chip color area
Exposure Mode                   : Auto
White Balance                   : Auto
Digital Zoom Ratio              : 4.366263794
Focal Length In 35mm Format     : 35 mm
Scene Capture Type              : Standard
Sharpness                       : Normal
Padding                         : (Binary data 2060 bytes, use -b option to extract)
Aperture                        : 2.4
GPS Altitude                    : 23 m Above Sea Level
GPS Latitude                    : 24 deg 59' 55.00" N
GPS Longitude                   : 121 deg 34' 52.00" E
GPS Position                    : 24 deg 59' 55.00" N, 121 deg 34' 52.00" E
Image Size                      : 229x172
Scale Factor To 35 mm Equivalent: 8.2
Shutter Speed                   : 1/120
Create Date                     : 2012:02:02 02:02:02.00
Date/Time Original              : 2012:02:02 02:02:02.00
Circle Of Confusion             : 0.004 mm
Field Of View                   : 54.4 deg
Focal Length                    : 4.3 mm (35 mm equivalent: 35.0 mm)
Hyperfocal Distance             : 2.08 m
Light Value                     : 10.1

これで緯度が 24 deg 59' 55 経度が 121 deg 34' 52 とわかりました。これを Google マップで調べればいいのですが、10進法表記しか対応しておらず度分秒のままでは使えません。そのため Google の提供しているヘルプサイトを使って変換してやります。


これで10進法表記の座標が 24.998611, 121.581111 とわかりました。ただ実際には百分率表記 = 度 + (分/60) + (秒/3600)という計算式を使ってもう少し正確にだしたほうがよさそうです。この場合は

緯度 24.99861111
経度 121.5811111

となります。これをもとに Google map で検索すると次のようになります。



答えはTaipei Zooでした。

2014年1月26日日曜日

SECCON2013 online writeup - repeat after me ネットワーク・Web 100

SECCON2013 online の writeup です。
ネットワーク・Webの100点問題、repeat after me です。
問題はfollowme.capというキャプチャファイルを渡されてフラッグをゲットせよというもの。

キャプチャファイルなので Wireshark で眺める。内容を追っていると、telnet で接続している事がわかる。そこで適当に TCP stream を見ていると、tcp.stream eq 1 の内容で外部サーバへ ssh 接続して flag.txt を表示しているのがわかる。



このサーバにアクセスして flag.txt の内容を確認すればよいとわかる。そこで、接続先サーバおよびユーザ名とパスワードを同じ TCP steam から抜き出す。


まず、接続先はfollowme@133.0xf2.010357となっている。0x 以降は16進の書き方で、変換方法がわからないので、まずは同じように ssh を試してみる。

ssh -p 31337 followme@133.0xf2.010357
The authenticity of host '[133.0xf2.010357]:31337 ([133.242.16.239]:31337)' can't be established.
RSA key fingerprint is 2d:cb:9b:98:70:f4:67:e7:02:03:15:ab:32:59:78:68.
Are you sure you want to continue connecting (yes/no)? yes

すると、アドレスが 133.242.16.239 、ユーザ名が followme とわかる。これは 0xf2 が16進で10進に変換すると 242、010357 は8進数になっており、16進数に直してから10EFとなり二桁ずつ10進数に変換すると16と239が得られる。

次にパスワード部分だが、wireshark に記載されているものを直接入力してもうまくいかない。Delete やバックスペースなどの制御文字があるため、それらを削除または同じように動作させる必要がある。

今回は ssh ツールを使用して同じような動作をさせてみる。まずは、パスワード部分の切り出し。

network100# hexdump -C pass.bin | more
00000000  6c 73 20 2d 6c 15 66 6f  6c 6c 6f 77 6d 65 24 20  |ls -l.followme$ |
00000010  77 68 6f 61 6d 69 17 6c  73 2d 6c 7f 7f 2e 20 2d  |whoami.ls-l... -|
00000020  6c 2e 02 7f 0d 00 6c 73  20 2d 6c                 |l.....ls -l|
0000002b

このファイルを sshpass で読み込んで接続させる。

network100# sshpass -f pass.bin ssh -p 31337 followme@133.242.16.239
Welcome to Ubuntu 12.04.3 LTS (GNU/Linux 3.8.0-29-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Sun Jan 26 15:13:58 JST 2014

  System load:  0.0               Processes:           83
  Usage of /:   1.1% of 96.47GB   Users logged in:     2
  Memory usage: 15%               IP address for eth0: 133.242.16.239
  Swap usage:   0%

  Graph this data and manage this system at https://landscape.canonical.com/

38 packages can be updated.
21 updates are security updates.


The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

Last login: Sun Jan 26 14:10:16 2014 from kd124212144186.ppp-bb.dion.ne.jp
followme$ ls -l
total 4
-r--r--r-- 1 0 0 25 Dec 24 10:55 flag.txt

あとは flag.txt を確認するだけ。

followme$ more flag.txt 
-sh: 2: more: not found
followme$ cat flag.txt
Interesting_IPv4_address
followme$ 


答えは上記のとおり。





2013年12月1日日曜日

SECCON2013 札幌予選 writeup

SECCON2013 札幌予選会の writeup(まだ途中)
会場では解けなかったのでボチボチ解いてアップします。

フォレンジック 500点問題

ddイメージファイルから指令文を読解せよ、という問題。
autopsy で解読しようとしたらハマって全然解けなかったので、別な方法でチャレンジする。
まずは Windows の FTK Imager で調査する。


二つの画像ファイルと一つのメッセージファイルが見える。
メッセージファイルの中身は次のようなもの。

指令部からのメッセージを送る。
VRZGNWSOHPMY
位置については、これまでと同様に写真を参照してくれ、
くれぐれも写真は忘れずに削除するように!!
VRZGNWSOHPMY を読解すればいい。
次に画像ファイルを調べる。とりあえずすぐに調べられる画像ファイルを見ると次のような感じ。



なにやら古めかしい画像だが、これを画像検索するとゼロ戦とか九五式戦車と出てくる。でここからは推測で、日本の写真なので第二次世界大戦時の日本軍の暗号「ニイタカヤマノボレ」的なものかといろいろ探したがそれらしいものはなかった。
第二次世界大戦で有名な暗号といえばエニグマなので、エニグマ暗号を扱えるこのサイトでチャレンジする。
予選中は画像が二つだと思い込みゼロ戦の0と95式の95を組み合わせて色々やっているうちに時間切れ。

会場でヒントをもらってバイナリエディタで見ると3つ目の画像ファイルがあるのがすぐに分かった。



00013000  43 54 46 20 20 20 20 20  20 20 20 08 00 00 00 00  |CTF        .....|
00013010  00 00 00 00 00 00 c4 3b  a1 40 00 00 00 00 00 00  |.......;.@......|
00013020  e5 41 4e 4b 20 20 20 20  4a 50 47 20 18 43 d5 3b  |.ANK    JPG .C.;|
00013030  a1 40 a1 40 00 00 84 38  a1 40 02 00 d4 58 00 00  |.@.@...8.@...X..|
00013040  e5 41 4d 41 54 4f 20 20  4a 50 47 20 18 44 d5 3b  |.AMATO  JPG .D.;|
00013050  a1 40 a1 40 00 00 b3 38  a1 40 00 00 bd f0 00 00  |.@.@...8.@......|
00013060  e5 45 52 4f 20 20 20 20  4a 50 47 20 18 44 d5 3b  |.ERO    JPG .D.;|
00013070  a1 40 a1 40 00 00 fc 38  a1 40 2d 00 ba 94 00 00  |.@.@...8.@-.....|
00013080  41 4d 00 65 00 73 00 73  00 61 00 0f 00 cb 67 00  |AM.e.s.s.a....g.|
00013090  65 00 2e 00 74 00 78 00  74 00 00 00 00 00 ff ff  |e...t.x.t.......|
000130a0  4d 45 53 53 41 47 45 20  54 58 54 20 00 44 d5 3b  |MESSAGE TXT .D.;|
000130b0  a1 40 a1 40 00 00 71 3a  a1 40 40 00 94 00 00 00  |.@.@..q:.@@.....|
000130c0  e5 4d 00 53 00 49 00 39  00 32 00 0f 00 0d 31 00  |.M.S.I.9.2....1.|
000130d0  35 00 66 00 2e 00 74 00  6d 00 00 00 70 00 00 00  |5.f...t.m...p...|
000130e0  e5 53 49 39 32 31 35 46  54 4d 50 10 00 47 51 3c  |.SI9215FTMP..GQ<|
000130f0  a1 40 a1 40 00 00 52 3c  a1 40 41 00 00 08 00 00  |.@.@..R<.@A.....|
00013100  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

さらに、バイナリエディタで画像ファイルのあたりをポチポチとみていくと「Rotor position 1:J」とかいうエニグマに使いそうなキーワードが出てきたので絞り込んでみる。

strings DiskImage.dd |grep posi
Rotor position 1:J
Rotor position 2:P
Rotor position 3:N

この情報をもとにエニグマ暗号を読解すると次のようになり、たぶんこれが答えになると思う。



デコードせよ その他 100点問題

QRコードの画像があるだけの問題。
(Blogger にアップロードするとなぜか別なレイヤーの画像になる・・・)

これは見た感じQRコードなのでまずはQRリーダーで読み込んでみると「VlZOQlIwa2d」という文字列になるが、これだけだと意味不明。
実はこれは GIF アニメーションになっており、GIMPに読み込ませると16枚のレイヤーになっているのがわかる。

それぞれが QR コードになっているので、ぽちぽち保存する。
次にそれぞれのQRコードをここを使ってテキストに直していく。全部つなげてみると次のような文字列になる。

VlZOQlIwa2dUazhnVlU1QlNra0tWVmRCUjBrZ1RrOGdWVkpCU2trS1ZVNUJSMGtnVGs4Z1ZVMUJUVWtLVlU1QlIwa2dUazhnUjBWT1Mwa0tWRWhGSUVaTVFVY2dTVk1nVlU1QlIwbE9UMHBWVFU5T1ZFRkpVMDlWQ2c9PQo=
なんとなく Base64 っぽいので、このサイトでデコード。
VVNBR0kgTk8gVU5BSkkKVVdBR0kgTk8gVVJBSkkKVU5BR0kgTk8gVU1BTUkKVU5BR0kgTk8gR0VOS0kKVEhFIEZMQUcgSVMgVU5BR0lOT0pVTU9OVEFJU09VCg==
また Base64 っぽいのでもう一度デコード。
USAGI NO UNAJI
UWAGI NO URAJI
UNAGI NO UMAMI
UNAGI NO GENKI
THE FLAG IS UNAGINOJUMONTAISOU
これでFLAGを取得。








2013年4月27日土曜日

Network Forensics #3 Puzzle 6 解説

1. Vick Timme が送った元の完全なURIはなんですか?(ポートも含めてください)


http.request.method でフィルタすると2つしかない。
  1. http://10.10.10.10:8080/index.php
  2. http://10.10.10.10:8080/index.phpmfKSxSANkeTeNrah.gif
1 を含むパケットの TCP stream を見ると、2 がリダイレクトされたものだとわかる。
よって、最初にクリックした URI は http://10.10.10.10:8080/index.php となる。

2.応答として悪意あるウェブサーバは難読化された Javascript を送りました。このコードが実行されるあたりで、攻撃者は COMMENT とラベルされた1300の要素を持つ配列を作成し、配列にはすべて文字が入力されました。その文字列はなんですか?


最初にクリックした index.php の応答を見るため TCP stream を確認する。



応答の中に、script 部分があり、UWnHADOfYHiHDDXj = "COMMENT" となっている部分があるので、このあたりのスクリプトを確認する。

var UWnHADOfYHiHDDXj = "COMMENT";
var qSNgVkOrdIjaiFpPTfDjbPHQppHSGtzpmOOyqEbLEFxNqAxicRyZKKWiRWmUaDHFOuzHPHqLrRFSzQuPusTnQyqpQwVpARdlR = new Array();
for (i = 0; i < 1300; i++)
{
  qSNgVkOrdIjaiFpPTfDjbPHQppHSGtzpmOOyqEbLEFxNqAxicRyZKKWiRWmUaDHFOuzHPHqLrRFSzQuPusTnQyqpQwVpARdlR[i] = document.createElement(UWnHADOfYHiHDDXj);
  qSNgVkOrdIjaiFpPTfDjbPHQppHSGtzpmOOyqEbLEFxNqAxicRyZKKWiRWmUaDHFOuzHPHqLrRFSzQuPusTnQyqpQwVpARdlR[i].data = "vEI";
}

このままだと見づらいので、変数名をわかりやすく変えてみる。

var UWnHADOfYHiHDDXj = "COMMENT";
var A = new Array();
for (i = 0; i < 1300; i++)
{
  A[i] = document.createElement(UWnHADOfYHiHDDXj);
  A[i].data = "vEI";
}


データとして入力されているのは、vEI となる。

余談として、このスクリプトを jsunpack に食わせると下記のような出力結果になる。
script malicious
[malicious:10] script
     info: [decodingLevel=0] found JavaScript
     malicious: Alert detected /alert CVE-2010-0249 MSIEUseAfterFree (CreateElement called 1299 times)
     info: [element] URL=127.0.0.1/undefined
     info: [1] no JavaScript
     info: file: saved script to (0a5cb514a88ef62f3881d5161de026e7ee3734c3)
     file: 0a5cb514a88ef62f3881d5161de026e7ee3734c3: 4165 bytes
     file: 8b96522be55eb7ad3dc89374eabaa05126543d1c: 98874 bytes

この CVE-2010-0249 をヒントに exploitdb で検索すると、このような PoC があった。たぶん、この問題で使用されているスクリプトはこれを参考にしていると考えれる。

3. Vickのコンピュータは2番目のHTTPリクエストを送信しました。

    a.そのリクエストされたオブジェクトのファイル名はなんですか?

    b.取得したオブジェクトの MD5 はなんですか?


問題1 の二つ目の URI が 10.10.10.10:8080/index.phpmfKSxSANkeTeNrah.gif となっているため、a の答えは、index.phpmfKSxSANkeTeNrah.gif となる。

このファイルを Wireshark の File -> Export Objects -> HTTP で取り出して MD5 のハッシュ計算を行う。
df3e567d6f16d040326c7a0ea29a4f41が答え。

4. いつ TCP 4444 のセッションは開始されましたか?(パケットキャプチャ開始時からの時間で、10分の1秒で丸めてください)


tcp.port == 4444 でフィルタを行う。



ポート 4444 のセッションが開始されたのは相対時間で 1.265 となっているので、10分の1秒で丸めて 1.3秒が答えとなる。

5. いつ TCP 4444 のセッションはクローズしましたか?


問題4でフィルタした状態で、セッションの最後のほうを確認すると答えがわかる。
十分の1秒で丸めて 87.6 が答え。

6. パケットの17で悪意のサーバはクライアントにファイルを送信しました。

   a. どんなタイプのファイルですか?下記から選んでください。

       ウィンドウズ実行ファイル

       GIFファイル

       PHPスクリプト

       ZIPファイル

      暗号データ

   b. そのファイルの MD5 ハッシュは?


パケット 17 と指定があるので TCP stream で中身を確認してみる。



文字列として MZ や This program cannot be run in DOS mode.とあるので、a の答えはウィンドウズ実行ファイルとなる。
次にファイルを取り出して MD5 のハッシュを計算したいが、Wireshark では対応していないプロトコルのため取り出すことができない。また Network Miner でも同様に取り出すことができない。

そこで、パケット 17 を含む tcp.stream eq 1 の raw データからPEファイル(ウィンドウズ実行ファイル)を別方法で取り出す。そのために Back Track で foremost コマンドを実行する(SIFT でも可)

root@bt:~/Desktop/forensiccontest/puzzle06# ls
17-stream
root@bt:~/Desktop/forensiccontest/puzzle06#  foremost -i 17-stream -o output_17
Processing: 17-stream
|*|
root@bt:~/Desktop/forensiccontest/puzzle06# cd output_17/
root@bt:~/Desktop/forensiccontest/puzzle06/output_17# ls
audit.txt  dll
root@bt:~/Desktop/forensiccontest/puzzle06/output_17# cd dll/
root@bt:~/Desktop/forensiccontest/puzzle06/output_17/dll# ls
00000000.dll

これで TCP stream のデータからファイルを取り出すことができたので、MD5 ハッシュを計算する。

root@bt:~/Desktop/forensiccontest/puzzle06/output_17/dll# md5sum 00000000.dll
b062cb8344cd3e296d8868fbef289c7c  00000000.dll

となり、b062cb8344cd3e296d8868fbef289c7c が答え。

7. Vick のコンピュータは 4444 ポートでの接続をクローズした後、悪意あるサーバへ何度も 4445 ポートで通信を試みました。この複数の失敗について:

        a. どのぐらいの頻度でTCPのISNは変わりましたか?

            Every packet

            Every third packet

            Every 10-15 seconds

            Every 30-35 seconds

            Every 60 seconds


ISN はデフォルトの Wireshark のサマリ状態では相対的に表示される。そのため、今回のように一方的におくっている場合は常に Seq=0 になる。
これを変更するには Edit -> Preferences -> TCP で Relative sequence numbers のチェックを外す。



これで Length info に Seq がそのまま表示される。この状態で tcp.dstport == 4445 でフィルタすると、どれぐらいの頻度でISNが変わっているかわかる。



答えはは3つ毎に変わる。

        b. どのぐらいの頻度で IP ID は変わりましたか?

            Every packet

            Every third packet

            Every 10-15 seconds

            Every 30-35 seconds

            Every 60 seconds


これは、フィルタした状態でパケットの中身を表示させながらみるとわかる。



パケットごとに変更されている。

        c. どのぐらいの頻度で送信元ポートは変わりましたか?

            Every packet

            Every third packet

            Every 10-15 seconds

            Every 30-35 seconds

            Every 60 seconds


これは Statistics の conversations の tcp タブで見るとわかりやすい。見やすいように Name Resolution のチェックするのを外す。



送信元ポートは5パケットごとに変わっており、10秒から15秒程度で変わるのがわかる。

8. 最終的に、悪意あるサーバは応答を返して新しい接続を開始しました。4445 ポートの通信が最初に正常に完了したのはいつですか?


TCP のセッションが正常に開始されれば ACK が現れるため tcp.dstport == 4445 and tcp.ack でフィルタする。



10分の1秒で丸めて 123.7 秒が答え。

9. その後、悪意あるサーバは 4445 ポートで実行ファイルをクライアントへ送信しました。この実行ファイルの MD5 はなんですか?


基本的には問題6と同じ手法で解ける。先ほどと同じく、4445 の Tcp stream をとって Back Track の foremost コマンドでファイルを取り出す。

root@bt:~/Desktop/forensiccontest/puzzle06# foremost -i port4445-stream -o out_4445
Processing: port4445-stream
|*|
root@bt:~/Desktop/forensiccontest/puzzle06# cd out_4445/
root@bt:~/Desktop/forensiccontest/puzzle06/out_4445# ls
audit.txt  dll
root@bt:~/Desktop/forensiccontest/puzzle06/out_4445# cd dll
root@bt:~/Desktop/forensiccontest/puzzle06/out_4445/dll# ls
00000000.dll

このファイルのハッシュ値を計算する。

root@bt:~/Desktop/forensiccontest/puzzle06/out_4445/dll# md5sum 00000000.dll 
b062cb8344cd3e296d8868fbef289c7c  00000000.dll

b062cb8344cd3e296d8868fbef289c7c が答えとなる。
 

10. いつ、4445 ポートはクローズされましたか?


問題9で使用した TCP stream が終了する時間なので、tcp.stream eq 41 でフィルタすればわかる。
答えは、198.4 となる。

Network Forensics #3 Puzzle 5 解説

1. 感染のプロセスとして、彼女のブラウザは2つの Java アプレットをダウンロードしました。その2つのアプレットの名前はなんですか?


「ブラウザ」がダウンロードしたファイルなので、WireShark  の File から Export Objects -> HTTP を選択するとブラウザ経由で保存されたファイルが一覧で出てくる。



この中で、Java アプレットは sdfg.jar と q.jar のみなので、これが答え。
そのほかの方法としては http.request.method でフィルタしても同じようにわかる。
(図は問題2に掲載)

2. 感染した Moneymany さんの Windows システムのユーザ名はなんですか?

Windows システムのユーザ名がパケットデータに表示されるのは netbios などが考えられるが、フィルタを実施してもそれらしい通信は見当たらない。
そこで、いったんプロトコルの割合を眺めてみる。


すると、ほとんどは HTTP の通信だとわかる。
そこで、「Windows のユーザ名は攻撃者によって、HTTP通信で送信された」と仮説を立てて調べてみる。外部への情報送信なので、http.request.method でフィルタしてみる。


すると 293 番目のパケットで「guid=」という文字が見える。たぶん、この引数として情報を送信していると考えられる。

http://freeways.in/11111/gate.php?guid=ADMINISTRATOR!TICKLABS-LZ!1C7AE7C1&ver=10084&stat=ONLINE&ie=8.0.6001.18702&os=5.1.2600&ut=Admin&cpu=92&ccrc=5A4F4DF7&md5=5942ba36cf732097479c51986eee91ed
ADMINISTRATOR がユーザ名だと推測できるが、TICKLABS-LZ と 1C7AE7C1 という文字列もあり断定できない。
そこで、fireeways.in というサイトを、MalwareDomainList などで検索してみる。なお、MalwareDomainList で検索する場合、freeways.in はすでに廃止されたサイトなので Include inactive sites  にチェックを入れておく必要がある。



すると、このサイトは SpyEyeの C&C サーバとして動いていたことがわかる。かつ、Domain の説明からユーザ名とコンピュータ名を渡していることがわかる。

freeways.in/11111/gate.php?guid=USER!COMPUTERNAME!D06F0742

答えは、ADMINISTRATOR となる。

3. この事件の始まりの URL、Moneymany さんがたぶんクリックした URL はなんですか?


クリックした URL なので、http.request.method でフィルタする。
一番、最初に出てくる GET は nrtjo.eu/true.php、これが答えになる。
Tcp Stream でこのGETを含むパケットを確認すると、xxx.xxx へ飛ばされていることがわかる。


ここで、function ararata(reem, aanpry) とあるので、検索してみる。
Wepawet というページでマルウェア判定されており、xxx.xxx は nrtjo.eu/true.php からのリダイレクトされるサイトであり、nrtjo.eu/true.php がこの問題の最初のリンクだと判断できる。



4. 感染の一部として悪意あるウィンドウズ実行ファイルが Moneymany さんのシステムへダウンロードされました。そのファイルの MD5 ハッシュはなんですか?ヒントは、MD5 ハッシュは 91ed で終わります。


http.request.method でフィルタして、まだ調べていない105番と115番から始まるパケットの Tcp stream を確認すると両方とも、filename=file.exe と This program cannot be run in DOS mode. という文字列がみれる。そのためこのパケットを含むファイルが実行ファイルとなるとわかる。




しかし、Wireshark の File -> Export Objects -> HTTP で確認するとファイルが分割されており、そのまま取り出すことができない(問題1の図を参照)

そこで、Network Miner で開いてみる。



file.exe.octet-stream と file.exe[1].octet-stream というファイルが出あがっている。この二つの MD5 ハッシュを計算してみる。



同じファイルのようで両方とも 5942BA36CF732097479C51986EEE91ED となり、これが答え。

5. その悪意あるウィンドウズ実行ファイルが使用していたパッカーの名前はなんですか?ヒントは、主なマルウェアで見られるもっともポピュラーなフリーで手に入るパッカーです。


問題4の TCP stream 5 または 6 を確認すると、文字列の中に UPX0 や UPX1 とある。そのため、UPX でパッキングされているとわかる。
念のため、パッカーチェックソフトの PEiD で確認する。



答えは UPX となる。

6.アンパックした悪意あるウィンドウズ実行ファイルの MD5 ハッシュはなんですか?


file.exe をアンパックしてハッシュを計算する。
UPX から paker/unpaker ソフトがダウンロードできる。アンパックは -d オプションで実行可能。なお、ファイルがそのまま上書きされるので元のファイルを保存しておきたいときは注意が必要。

C:\upx309w>upx -d file.exe.octet-st

アンパックされたファイルのハッシュを計算すると、0F37839F48F7FC77E6D50E14657FB96E となる。
これが答え。

7. そのマルウェアはハードコートされたIPアドレスに対して接続しに行こうとします。そのIPアドレスはなんですか?


ハードコートされた IP アドレスなので DNS 解決されていないアドレスと仮説を立てて調べる。
まず、今回使用されている IP アドレスを Wireshark の Statistics -> IP address で一覧表示させる。

 
DNS でフィルタをする。


まず、IP アドレスでプライベートアドレスは除外できる。次に 59.53.91.102はnrtjo.eu のアドレスのためこれも除外。212.252.32.20 は freeways.in のアドレスのため除外。残るのは 65.55.195.250 と 213.155.29.144 のみ。

65.55.195.250 は感染前に使用されたアドレスであり、感染後の通信に使われているもので、名前解決していないのは 213.155.29.144 のみ。これが、答え。
マルウェアを動的解析する方法や静的解析する方法もあるが、ここでは扱わない。



2013年3月23日土曜日

Network Forensics #2 Puzzle 4 解説

手早く問題を解く場合は、 NetworkMiner を使う。ただし、2 については NetworkMiner で解くのは難しい。

1. X 氏のスキャナーのIPアドレスはなんですか?

予想として、キャプチャしたデータの中で一番出現率が高いのがスキャナーの IP アドレスのはずと仮説を立てて、Wireshark の機能を使って推測する。
Wireshark のツールバーから statistics -> IP address を選択。


IP を指定するポップアップが出てくるが、何も指定せずに Create start を押すと下記のように統計データを出してくれる。


通信の約半分に 10.42.42.253 が関係しているため、これがスキャナーの送信元と推測できる。
答えも 10.42.42.253 となる。

2. X 氏が行った最初のポートスキャンはどのタイプですか?

まず問題文に示されているポートスキャンタイプの復習。nmap の解説サイトが詳しい。

  • TCP SYN
    • SYN だけ送って、open していたらすぐに RST を返す。ハーフオープンスキャンとも呼ばれる。 セッションを確立しないためログに残りづらく比較的秘匿性がある。
  • TCP ACK
    •  ファイアウォールのルールを確認するために使用される。いきなり ACK を送ると通常のサーバは RST を返すが、ファイアウォールがある場合は何も返さない。そのため応答がないポートはファイアウォールでフィルタされていると判断できる。
  • UDP
    • UDP パケットを使ったスキャン
  • TCP Connect
    •  connect() を使用してスキャンする。セッションが確立するのでログには残るが、通信自体は正常なものなので、SYN スキャンなどを防御するIPSでも通過する可能性が高い。
  • TCP XMAS
    • FIN、PSH、URG のフラグをすべて設定したパケットを送信する、クリスマスツリースキャン。 最大の利点は、特定のステートレスなファイアウォールやパケットフィルタリング・ルータをすり抜けることができる点であるが最近のものだと特定される場合がある。
  • TCP RST
    • RST フラグを使用したスキャン。
これらのフラグの状態は wireshark の tcp.flags でフィルタができる。主なフラグは下記のとおり。

  • SYN flags : tcp.flags == 0x02
  • RST flags : tcp.flags == 0x04
  • ACK flags : tcp.flags == 0x10
  • FIN/ACK flags : tcp.flags == 0x11
  • SYN/ACK flags : tcp.flags == 0x12
  • RST/ACK flags : tcp.flags == 0x14
  • PSH/ACK flags : tcp.flags == 0x18
  • XMAS flags : tcp.flags == 0x31 (間違い)
  • XMAS flags : tcp.flags == 0x29

まずはSYNスキャンを見てみる。フィルタは tcp.flags == 0x02 で指定できる。

tshark -R "ip.src == 10.42.42.253 && tcp.flags == 0x02" -T fields -e frame -e ip.src -e ip.dst -e tcp.dstport -e tcp.flags -r evidence04.pcap | more

Frame 1: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)      10.42.42.253    10.42.42.50     80      0x0002
Frame 3: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)      10.42.42.253    10.42.42.56     80      0x0002
Frame 4: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)      10.42.42.253    10.42.42.25     80      0x0002
Frame 7: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)      10.42.42.253    10.42.42.50     554     0x0002
Frame 8: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)      10.42.42.253    10.42.42.56     554     0x0002
Frame 10: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)     10.42.42.253    10.42.42.25     554     0x0002

wc -l で確認すると7414行あったため、SYNスキャンの可能性はある。ただし、スキャン対象のポートが閉じていてもこの状態になるためこの時点ではまだ確定できない。

次に ACK スキャンを確認する。フィルタは tcp.flags == 0x10 で指定できる。

tshark -R "ip.src == 10.42.42.253 && tcp.flags == 0x10" -T fields -e frame -e ip.src -e ip.dst -e tcp.dstport -e tcp.flags -r evidence04.pcap | more

Frame 791: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)    10.42.42.253    10.42.42.50     139     0x0010
Frame 4389: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)   10.42.42.253    10.42.42.50     135     0x0010
Frame 13531: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)  10.42.42.253    10.42.42.50     135     0x0010
Frame 13532: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)  10.42.42.253    10.42.42.50     139     0x0010
Frame 13543: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)  10.42.42.253    10.42.42.50     135     0x0010
Frame 13547: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)  10.42.42.253    10.42.42.50     135     0x0010
Frame 13593: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.56     1       0x0010
Frame 13594: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.25     1       0x0010
Frame 13606: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.50     135     0x0010
Frame 13610: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.50     1       0x0010
Frame 13622: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.56     1       0x0010

全部でこれだけ。11行のみ。
ポートスキャンにしてはログが少なすぎるため、可能性が非常に低いと考えられる。

続いて、UDPをカウントしてみる。フィルタは単純に udp を指定するだけ。

tshark -R "ip.src == 10.42.42.253 && udp" -T fields -e frame -e ip.src -e ip.dst -e tcp.dstport -e tcp.flags -r evidence04.pcap 

Frame 13580: 342 bytes on wire (2736 bits), 342 bytes captured (2736 bits)      10.42.42.253    10.42.42.56
Frame 13581: 342 bytes on wire (2736 bits), 342 bytes captured (2736 bits)      10.42.42.253    10.42.42.25
Frame 13582: 370 bytes on wire (2960 bits), 370 bytes captured (2960 bits)      10.42.42.56,10.42.42.253        10.42.42.253,10.42.42.56
Frame 13583: 70 bytes on wire (560 bits), 70 bytes captured (560 bits)  10.42.42.25,10.42.42.253        10.42.42.253,10.42.42.25
Frame 13584: 342 bytes on wire (2736 bits), 342 bytes captured (2736 bits)      10.42.42.253    10.42.42.50
Frame 13585: 190 bytes on wire (1520 bits), 190 bytes captured (1520 bits)      10.42.42.50,10.42.42.253        10.42.42.253,10.42.42.50
Frame 13618: 342 bytes on wire (2736 bits), 342 bytes captured (2736 bits)      10.42.42.253    10.42.42.56
Frame 13619: 370 bytes on wire (2960 bits), 370 bytes captured (2960 bits)      10.42.42.56,10.42.42.253        10.42.42.253,10.42.42.56

上記8行のみのため、こちらも可能性は低いと考えられる。

次は TCP connect で tcp.flags == 0x10 と -e tcp.stream でフィルタする。0x10 は ACK のため単体では ACK スキャンの結果と同じになる。tcp.stream をつけることで 3way handshake が行われたかを確認できる。

tshark -R "ip.src == 10.42.42.253 && tcp.flags == 0x10" -T fields -e frame -e ip.src -e ip.dst -e tcp.dstport -e tcp.flags -e tcp.stream -r evidence04.pcap | more

Frame 791: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)    10.42.42.253    10.42.42.50     139     0x0010  390
Frame 4389: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)   10.42.42.253    10.42.42.50     135     0x0010  2235
Frame 13531: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)  10.42.42.253    10.42.42.50     135     0x0010  7413
Frame 13532: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)  10.42.42.253    10.42.42.50     139     0x0010  7414
Frame 13543: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)  10.42.42.253    10.42.42.50     135     0x0010  7415
Frame 13547: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)  10.42.42.253    10.42.42.50     135     0x0010  7415
Frame 13593: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.56     1       0x0010  7425
Frame 13594: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.25     1       0x0010  7426
Frame 13606: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.50     135     0x0010  7431
Frame 13610: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.50     1       0x0010  7433
Frame 13622: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.56     1       0x0010  7425

結果は上記11行となる。この結果は ACK スキャンと同じ。ということは ACK スキャンのパケットはすべて connect していることになり、この時点で ACK スキャンは行われていなかったという結論になる。
上記の結果を眺めると、ポート139と135に対して connect できているように見える。また通常はスキャンを実行した後にオープンしているポートを調査するため、最初のストリーム番号 390 と 2235 あたりがスキャンの実行ログと考えられる。その二つを詳しく確認する。

for i in 390 2235; do tshark -R "tcp.stream eq $i" -T fields -e frame -e ip.src -e ip.dst -e tcp.dstport -e tcp.flags -e tcp.stream -r evidence04.pcap; done

Frame 779: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)    10.42.42.253    10.42.42.50     139     0x0002  390
Frame 786: 78 bytes on wire (624 bits), 78 bytes captured (624 bits)    10.42.42.50     10.42.42.253    56257   0x0012  390
Frame 791: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)    10.42.42.253    10.42.42.50     139     0x0010  390
Frame 821: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)    10.42.42.253    10.42.42.50     139     0x0014  390

Frame 4381: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)   10.42.42.253    10.42.42.50     135     0x0002  2235
Frame 4383: 78 bytes on wire (624 bits), 78 bytes captured (624 bits)   10.42.42.50     10.42.42.253    42214   0x0012  2235
Frame 4389: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)   10.42.42.253    10.42.42.50     135     0x0010  2235
Frame 4394: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)   10.42.42.253    10.42.42.50     135     0x0014  2235

二つの通信ともに syn -> syn/ack -> ack と 3way になっており、普通ならここからデータ通信が始まるが、この二つはいきなり 0x14 RSR/ACK で終わっている。この状況から connect スキャンの可能性がかなり高くなる。

次に XMAS を調べる。こちらは tcp.flags ==0x29 でフィルタできる。

tshark -R "ip.src == 10.42.42.253 && tcp.flags == 0x29" -Tfields -e frame -e ip.src -e ip.dst -e tcp.dstport -e tcp.flags -r evidence04.pcap                                           
                                      
Frame 13599: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.56     1    0x0029
Frame 13600: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.25     1    0x0029
Frame 13612: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.50     1    0x0029
Frame 13624: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.56     1    0x0029


結果は4件となる。スキャンとして使った可能性は高いが、パケット数が少ないため最初に実施する広範囲のスキャンとは考えづらい。

最後に RST スキャンを調べてみる。RST フラグは 0x04 でフィルタできる。

tshark -R "ip.src == 10.42.42.253 && tcp.flags == 0x04" -Tfields -e frame -e ip.src -e ip.dst -e tcp.dstport -e tcp.flags -r evidence04.pcap

Frame 6978: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)   10.42.42.253    10.42.42.50     139     0x0004
Frame 8763: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)   10.42.42.253    10.42.42.50     135     0x0004
Frame 13552: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)  10.42.42.253    10.42.42.50     135     0x0004
Frame 13555: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)  10.42.42.253    10.42.42.50     135     0x0004
Frame 13558: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)  10.42.42.253    10.42.42.50     135     0x0004
Frame 13561: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)  10.42.42.253    10.42.42.50     135     0x0004
Frame 13564: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)  10.42.42.253    10.42.42.50     135     0x0004
Frame 13567: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)  10.42.42.253    10.42.42.50     135     0x0004
Frame 13592: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)  10.42.42.253    10.42.42.50     135     0x0004
Frame 13605: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)  10.42.42.253    10.42.42.50     135     0x0004

11個のパケットが出てきたが、スキャンとしてはホストが固定されている、ポートも固定されていることからスキャン後の調査の可能性が高いと考えられる。

結論として、TCP connect スキャンが実施され、クローズているポートへのスキャンが syn パケットとして大量に検知され、135 と 139 を検出したと推測できる。
答えは TCP connect となる。

3. X 氏はどんなIPアドレスを見つけましたか?

1 の結果から下記のアドレスを発見している。
  • 10.42.42.50
  • 10.42.42.56
  • 10.42.42.25

4. 彼が見つけたApple製品の MAC アドレスはなんですか?

3のアドレスを送信元とするパケットを検索して MAC アドレスを確認する。
  • 10.42.42.50 Address: CompalIn_51:d7:b2 (70:5a:b6:51:d7:b2)
  • 10.42.42.56 Address: CompalIn_cb:1e:79 (00:26:22:cb:1e:79)
  • 10.42.42.25 Address: AppleCom_92:6e:dc (00:16:cb:92:6e:dc)

5. 彼が見つけたWindowsのIPアドレスはなんですか?

スキャンの結果見つかった IP アドレスで OS が不明なのは
  • 10.42.42.50
  • 10.42.42.56
の二つ。
これらの OS を特定するために p0f の -A オプションと -R オプションを使う。 -A は SYN + ACK の OS による特性を調べるオプションで、-R は RST の特性を調べるが若干不安定とのこと。そのため複数のオプションを使い OS を推測する。

まずは -A オプションの結果。

p0f -A -l -s evidence04.pcap | grep "10.42.42.50:" | more
p0f - passive os fingerprinting utility, version 2.0.8
(C) M. Zalewski , W. Stearns 
p0f: listening (SYN+ACK) on 'evidence04.pcap', 61 sigs (1 generic, cksum B253FA88), rule: 'all'.
[+] End of input file.
10.42.42.50:139 - Windows 2000 SP4 -> 10.42.42.253:56257 (distance 0, link: ethernet/modem)
10.42.42.50:135 - Windows 2000 SP4 -> 10.42.42.253:42214 (distance 0, link: ethernet/modem)
10.42.42.50:139 - Windows 2000 SP4 -> 10.42.42.25:49260 (distance 0, link: ethernet/modem)
10.42.42.50:139 - Windows 2000 SP4 -> 10.42.42.25:49261 (distance 0, link: ethernet/modem)
10.42.42.50:139 - Windows 2000 SP4 -> 10.42.42.25:49262 (distance 0, link: ethernet/modem)
10.42.42.50:139 - Windows 2000 SP4 -> 10.42.42.25:49263 (distance 0, link: ethernet/modem)
10.42.42.50:139 - Windows 2000 SP4 -> 10.42.42.25:49264 (distance 0, link: ethernet/modem)
10.42.42.50:139 - Windows 2000 SP4 -> 10.42.42.25:49265 (distance 0, link: ethernet/modem)
10.42.42.50:139 - Windows 2000 (1) -> 10.42.42.253:36020 (distance 0, link: ethernet/modem)
10.42.42.50:135 - Windows 2000 (1) -> 10.42.42.253:36020 (distance 0, link: ethernet/modem)

p0f -A -l -s evidence04.pcap | grep "10.42.42.56:" | more
p0f - passive os fingerprinting utility, version 2.0.8
(C) M. Zalewski , W. Stearns 
p0f: listening (SYN+ACK) on 'evidence04.pcap', 61 sigs (1 generic, cksum B253FA88), rule: 'all'.
[+] End of input file.

次は -R の結果。

p0f -R -l -s evidence04.pcap | grep "10.42.42.50:" | more
p0f - passive os fingerprinting utility, version 2.0.8
(C) M. Zalewski , W. Stearns 
p0f: listening (RST+) on 'evidence04.pcap', 46 sigs (3 generic, cksum 1AE3081F), rule: 'all'.
10.42.42.50:80 - Windows XP/2000 (refused) -> 10.42.42.253:46104 (distance 0, link: unspecified)
10.42.42.50:554 - Windows XP/2000 (refused) -> 10.42.42.253:38232 (distance 0, link: unspecified)
10.42.42.50:389 - Windows XP/2000 (refused) -> 10.42.42.253:35168 (distance 0, link: unspecified)
10.42.42.50:256 - Windows XP/2000 (refused) -> 10.42.42.253:37066 (distance 0, link: unspecified)
10.42.42.50:23 - Windows XP/2000 (refused) -> 10.42.42.253:39682 (distance 0, link: unspecified)

p0f -R -l -s evidence04.pcap | grep "10.42.42.56:" | more
p0f - passive os fingerprinting utility, version 2.0.8
(C) M. Zalewski , W. Stearns 
p0f: listening (RST+) on 'evidence04.pcap', 46 sigs (3 generic, cksum 1AE3081F), rule: 'all'.
10.42.42.56:80 - Linux recent 2.4 (refused) -> 10.42.42.253:59856 (distance 0, link: unspecified)
10.42.42.56:554 - Linux recent 2.4 (refused) -> 10.42.42.253:43771 (distance 0, link: unspecified)
10.42.42.56:389 - Linux recent 2.4 (refused) -> 10.42.42.253:43514 (distance 0, link: unspecified)
10.42.42.56:256 - Linux recent 2.4 (refused) -> 10.42.42.253:33239 (distance 0, link: unspecified)
10.42.42.56:23 - Linux recent 2.4 (refused) -> 10.42.42.253:60559 (distance 0, link: unspecified)
10.42.42.56:80 - Linux recent 2.4 (refused) -> 10.42.42.253:59941 (distance 0, link: unspecified)
10.42.42.56:22 - Linux recent 2.4 (refused) -> 10.42.42.253:50953 (distance 0, link: unspecified)

上記の結果から 10.42.42.50 が Windows と推測できる。
また 10.42.42.50 はポートスキャンの結果から 135 と 139 のポートがオープンになっているため、Windows と考えられる。
また、TTL の値が Windows なら 128 で Linux なら 64 が一般的。今回は同一サブネットなので、TTL も判断材料として使える。

答えは 10.42.42.50 となる。

6. Windows システムで使用可能なTCPポートはなんですか?

10.42.42.50 のポートスキャンで TCP connect となっているものが答え。

tshark -R "ip.src == 10.42.42.253 && tcp.flags == 0x10" -T fields -e frame -e ip.src -e ip.dst -e tcp.dstport -e tcp.flags -e tcp.stream -r evidence04.pcap

Frame 791: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)    10.42.42.253    10.42.42.50     139     0x0010  390
Frame 4389: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)   10.42.42.253    10.42.42.50     135     0x0010  2235
Frame 13531: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)  10.42.42.253    10.42.42.50     135     0x0010  7413
Frame 13532: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)  10.42.42.253    10.42.42.50     139     0x0010  7414
Frame 13543: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)  10.42.42.253    10.42.42.50     135     0x0010  7415
Frame 13547: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)  10.42.42.253    10.42.42.50     135     0x0010  7415
Frame 13593: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.56     1       0x0010  7425
Frame 13594: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.25     1       0x0010  7426
Frame 13606: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.50     135     0x0010  7431
Frame 13610: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.50     1       0x0010  7433
Frame 13622: 74 bytes on wire (592 bits), 74 bytes captured (592 bits)  10.42.42.253    10.42.42.56     1       0x0010  7425

答えは 135 と 139 となる。

Network Forensics #2 Puzzle 3 解説

1. Ann の Apple TV の MAC アドレスは何?


与えられたファイルを Wireshark で開く。
問題文の中に「192.168.1.10 の Static IP で設定した」と書いてあるので、192.168.1.10 が送信元のパケットを選んで詳細を確認すれば答えがわかる。


答えは「00:25:00:fe:07:c4」

他の回答方法としては tshark コマンドを使う。
特定フィールドのみ抜き出して、sort -u コマンドで重複したものを排除して列挙するため、tshark の下記オプションを使う。

  • -T fields 
    • 特定のフィールドだけ切り出す、-e でそのフィールドを指定
  • -e eth.src
    • 送信元のMACのみ表示させる、-T fields がないとエラーになる
  • -r evidence03.pcap
    • キャプチャデータの読み込み

実行結果は次の通り。

tshark -T fields -e eth.src -r evidence03.pcap | sort -u 
00:23:69:ad:57:7b
00:25:00:fe:07:c4

この情報からベンダーコードと突き合わせれば答えがでる。
結局 AppleTV とルータだけのネットワークだった模様。

もう一つ Wireshark を使った方法として、ツールバーの Statistics -> Conversations でも確認可能。



左下の Name resolution のチェックボックスを外せば MAC アドレスがそのまま確認できる。

2. Ann のAppleTVがHTTP通信で使用した User-Agent は何?

192.168.1.10 からの http の通信を適当に選択して、Follow TCP Stream を選択する。



すると通信内容を復元してくれる。User-Agent には「AppleTV/2.4」とあるのでこれが答え。
そのほかに User-Agent がないか調べるには tshark で下記のように実行する。

tshark -T fields -e http.user_agent -r evidence03.pcap | sort -u 
AppleTV/2.4

結局一つしか使っていなかった。

3. Ann が AppleTV で検索したキーワードの最初の4つは?

tshark で送信元を 192.168.1.10 、検索だから http method は GET だろうと予想して絞り込んで、http.request.uri のフィールドだけ眺めてみる。

tshark -R "ip.src == 192.168.1.10 && http.request.method == GET" -T fields -e http.request.uri -r evidence03.pcap | more

/WebObjects/MZStore.woa/wa/viewGrouping?id=39
/b/ss/applesuperglobal/1/G.6--NS?pageName=US-Movies-Movies-33&pccr=true&h5=appleitmsnatv%2Cappleitmsustv&ch=Movies%20main&g=http%3A%2F%2Fax.itun
es.apple.com%2FWebObjects%2FMZStore.woa%2Fwa%2FviewGrouping%3Fid%3D39
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=h
/b/ss/applesuperglobal/1/G.6--NS?pccr=true&ch=Movies-Search&g=http%3A%2F%2Fax.search.itunes.apple.com%2FWebObjects%2FMZSearch.woa%2Fwa%2Fincreme
ntalSearch%3Fmedia%3Dmovie%26q%3Dh&pageName=Movies-Search%20Hints-US&v2=h&h5=appleitmsnatv%2Cappleitmsustv&c2=h
/us/r1000/038/Video/57/e5/af/mzi.hnmcsmdp.170x170-75.jpg
/us/r1000/051/Features/a8/de/6e/dj.nofulnci.170x170-75.jpg
/us/r1000/009/Video/f0/1e/ec/mzl.hhpbkslu.170x170-75.jpg
/us/r1000/037/Features/71/b1/8c/dj.orlnvciu.170x170-75.jpg
/us/r1000/032/Features/8e/dc/ca/dj.dzbaqgpw.170x170-75.jpg
/us/r1000/015/Video/88/d3/62/mzi.xtsujktt.170x170-75.jpg
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=ha
/b/ss/applesuperglobal/1/G.6--NS?pccr=true&ch=Movies-Search&g=http%3A%2F%2Fax.search.itunes.apple.com%2FWebObjects%2FMZSearch.woa%2Fwa%2Fincreme
ntalSearch%3Fmedia%3Dmovie%26q%3Dha&pageName=Movies-Search%20Hints-US&v2=ha&h5=appleitmsnatv%2Cappleitmsustv&c2=ha
/us/r1000/032/Music/f1/33/e0/mzi.kvyqgmsa.170x170-75.jpg
/us/r1000/032/Music/5c/86/a2/mzi.dutwwfyg.170x170-75.jpg

抽出したパケットを眺めていると Search と末尾のほうに q = となっているパケットがあることに気付く。
下記のように検索する。

tshark -R "http.request.method == GET && http.request.uri contains Search" -T fields -e http.request.uri -r evidence03.pcap | grep "q="
Running as user "root" and group "root". This could be dangerous.
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=h
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=ha
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=hac
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=hack
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=s
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=sn
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=sne
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=sneb
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=snea
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=sneak
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=i
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=ik
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=ikn
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=ikno
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=iknow
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=iknowy
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=iknowyo
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=iknowyou
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=iknowyour
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=iknowyoure
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=iknowyourew
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=iknowyourewa
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=iknowyourewat
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=iknowyourewatc
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=iknowyourewatch
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=iknowyourewatchi
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=iknowyourewatchin
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=iknowyourewatching
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=iknowyourewatchingm
/WebObjects/MZSearch.woa/wa/incrementalSearch?media=movie&q=iknowyourewatchingme

q = の部分をたどると、最初の検索が h 次は ha、3回目が hac で最後が hack となる。
これが答え。

4. Ann が 最初にクリックした映画のタイトルは?

先ほどの解答で hack と検索していたのがわかったので、method == GET でフィルタして uri に hack が指定されていたあたりを眺める。


すると「viewMovie?id=333441649&s=143441」という文字列があるので、たぶんこの id がクリックした文字列だろうと推測。次にこの id を含むパケットを探す。uri に含まれるか不明なので packet details で検索。




検索結果のパケットを見ていくと、plist のデータに kye=title という文字列があり、その string として Hackers が指定されている。これが答え。


5. 映画の予告編のフル URL は?(preview-url で定義されています)

この問題は単純に preview-url を詳細検索すれば見つかる。


string で指定されている「http://a227.v.phobos.apple.com/us/r1000/008/Video/62/bd/1b/mzm.plqacyqb..640x278.h264lc.d2.p.m4v」が答え。

6. Ann が2番目にクリックした映画のタイトルは?

先ほど解いた4を参考に uri に viewMovie を含む文字列で検索する。



すると「GET /WebObjects/MZStore.woa/wa/viewMovie?id=283963264&s=143441 HTTP/1.1\r\n」と出てきたので、同じように id を詳細検索してタイトルを探す。検索するときは viewMovie より後で行う。それ以前のパケットにも同じ id が含まれるため。
答えは Sneakers 。

7. その値段は?(price-display で定義されています)

6で見つけたパケットを眺めていくと price-display の文字が見える。

$9.99 が答え。

8. Ann が最後に検索したフルキーワードは?

3で実施した結果に答えがある。「iknowyourewatchingme」が答え。
実際に調査しているときに、この文字列を見たらビビるね。。。

参考:
http://network-forensics.blogspot.jp/2010/02/sans-forensics-puzzle-3-anns-appletv.html
http://www.aldeid.com/wiki/Network-forensics/Puzzle3