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

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を取得。