チェックポイントでサイバーテストに合格する方法

みなさん、こんにちは。イスラエル高等学校ITおよびセキュリティHackerUのキュレーター、 ニキータ・カーティンです

イスラエルの大手情報セキュリティ企業であるチェックポイントは、今年の夏に一連のサイバーテストを公開しました。

タスクは6つのカテゴリに分けられました。

•ロジック
•Web
•プログラミング
•ネットワーキング
•逆転
•サプライズ

各方向に2つのタスク。 この投稿では、次の3つのテストで4つのテストだけを行った方法を説明します。

チェックポイントはすでに私の側から尊敬と関心を集めていたため、これらの課題を受け入れることにしました。 しかし、雇用のために、12のタスクのうち8つだけを(4つの異なるカテゴリーから)取る余裕がありました。 そして、そのうちの7つを解決できました。

チャレンジは2018年9月末までに公式に終了しました。

画像

それで、今、明確な良心をもって、私が次の問題を解決するためにどのように突破したかについて、一歩ずつ説明できます。

•論理的なチャレンジ「PNG ++」
•Webチャレンジ「ロボットが帰ってきた」
•Webチャレンジ「ディエゴギャラリー」
•プログラミングタスク「注意深い手順」
•「パズル」のプログラミングのタスク
•ネットワークチャレンジ「ピンポン」
•ネットワークチャレンジ「プロトコル」

チャレンジ:PNG ++

説明:

この(暗号化されたPNGファイルへのリンク) 画像は、カスタム暗号を使用してエンコードされました。

ここでこのコードの大部分を読むことができました(Pythonコードへのリンク)。
残念ながら、誰かがkey_transformator.py全体にゆっくりとコーヒーをこぼしました。
この画像の解読を手伝ってもらえますか?

Pythonコード:

画像

暗号化ロジックは次のとおりです。

1.キーの長さ(キーサイズ)を4バイトに設定します

2.変数「img」のファイル「flag.png」のバイトを読み取ります

3.ファイルに、最初の最も近い4の倍数にパディングを追加します。 パディングは、欠落しているバイト数と同じです。 たとえば、ファイルの長さが29バイト(3つの欠落)である場合、10進値3(ASCII 0x03)の3バイトを追加します。 または、言い換えると、10進値がゼロであるため、埋め込みバイトは空にできません(ASCII 0x00)。これは埋め込みを意味しません。

4. 4つのランダム化された大文字([AZ])で開始キーを設定します。

5.ファイル内のすべてのバイトに対して同じ操作を行い、一度に4バイトのチェーンを暗号化します

a。 ファイル内の各バイトは、キーからのバイトによってけんかされます
b。 キーは常に別のキーに変換され、key_transformator.transform(キー)がこれを担当します
c。 暗号化されたバイトがenc_dataに追加されます

6. encrypted.pngにenc_data(暗号化されたバイト)を入力します

はじめに、PNG形式のヘッダーを確認したところ、最初の8バイトは次のようになっています。

[137、80、78、71、13、10、26、10]

暗号化されたファイルの最初の8バイトを取得し、これらの8バイトでねじりました。

画像

最初のブロックのキーは次のようになりました。
[85、80、82、81]

そして2番目のブロック-このように:
[86、81、83、82]

後続の各キーは前のキー(key = key_transformator.transform(key))を使用して動的に生成されるため、アルゴリズムを理解しました:前のキーの各バイトに1を追加します。
85-> 86
80-> 81
82-> 83
81-> 82

それから、チャレンジの名前がひどいヒントを隠していることに気付きました。

2つの「ヘルパー関数」を作成しました。

•「nextKey」、最後に基づいて次のキーを復元します
•次の文字を復元する「nextChar」。ほとんどの場合、バイト境界内に収まる場合は1ずつ増加します(255)

画像

元の4バイト[85、80、82、81]を文字「UPRQ」に変換し、アルゴリズムを実行しました

画像

復号化されたファイルでフラグが指定されました:

画像

課題:ロボットの帰還


説明:

ロボットはクールですが、信じてください:アクセスは制限されるべきです! チェックアウト(リンク)

リンクをたどると、ロボット専用の特定のページが表示されます。 基本的に、すべてが「robots.txt」ファイルの存在を確認する必要があることを示唆しています。

画像

./robots.txtをURLに追加すると、次のようになります。

画像

./secret_login.htmlを確認し、登録ページに出会いました

画像

次に、フォームのソースコードを確認してパスワードの確認を見つけ、次のJavascriptを確認しました。

画像

値が確認されると、承認関数に送信され、btoa関数(Javascriptのbase64デコード関数)を使用して渡された値をデコードし、文字列「SzMzcFQjM1IwYjB0JDB1dA ==」と比較します。

この行をデコードしました

画像

結果の値をパスワード文字列に挿入しました。 ビンゴ!

画像


課題:ディエゴギャラリー

説明:

最近、猫の写真を管理し、flag.txtを保護するプラットフォームの開発を始めました。 システムを確認してください(登録フォームへのリンク)。

SQLコードを埋め込む機能など、セキュリティシステムの妨害を回避するために、私は独自のスキームを考え出しました。

簡単な説明はこちら(図へのリンク)

登録フォーム:

画像

プリセット回路:

画像

テストのユーザー名とパスワードを設定した後、猫「Diego」の公開ギャラリーにアクセスできました。

私は通常のユーザーとして登録したので、PE(特権エスカレーション)特権のエスカレーションへの道を見つける必要があるかもしれないことがわかりました。 登録ユーザー向けのスキームを見ると、通常のユーザーと管理者の違いは、3つのダッシュで区切られたスキームの3番目のセクションにあることがわかりました。

最初の値(ユーザー名)が最初のセクションを参照し、2番目(パスワード)が2番目を参照すると、現在の権限を持つユーザーが入力した直後にシステムによってロールが割り当てられると推定しました。

例:

START |||最初の値||| 2番目の値|||ユーザー(Webサービスによって追加)||| END

私のペイロードは次のとおりです。

•最初の値:「niki ||| niki ||| admin ||| END \ nSTART ||| other」
•2番目の値:「その他」

これにより、おそらく次のログ行が生成されました。

START ||| niki ||| niki ||| admin ||| END
START ||| other ||| other ||| user ||| END

その後、管理者としてログインし、完全な権限を取得できました。

画像

ボタンを押すと、フラグが安全であるという警告のみがアクティブになります。
ただし、URL内では次の内容を読み取ることができます。

35.194.63.219/csa_2018/diegos_gallery/_nwryqcttstvs/admin-panel/index.php ? ビュー= log.txt

URLを介しLFI(ローカルファイルインクルージョン)を明示的に暗示する

私が試した:

35.194.63.219/csa_2018/diegos_gallery/_nwryqcttstvs/admin-panel/index.php?view=flag.txt

そして、旗は私のものでした。

画像

課題:注意深い手順

説明:

これ(ファイルリンク)は、私たちが見つけた一連のアーカイブです。 秘密の旗はその中のどこかに隠されていると確信しています。
探しているデータが各ファイルのコメントセクションに隠れていることは間違いありません。
ファイル間を注意深く歩いて、フラグを見つけることができますか?
頑張って

ファイルを抽出すると、「unzipme。[Number]」というタイトルの2000個のファイルが含まれる「archives」というディレクトリが得られます。

画像

binwalkプログラムを使用して、最初のファイルをチェックしました。 そして、プログラムが私に与えたものは次のとおりです。

画像

ええ、それは、コメントセクションに文字と数字があることを意味します。 もう一度ヒント?

最初に、このzipファイルから指定されたインデックスに文字を接続し、インデックス245で既に次のファイルをチェックする必要があるかどうかを考えました。

しかし、ここで驚きました。2番目のファイルはzip形式ではなく、rar形式でした。

画像

したがって、コメントを取得するために「警告」する必要がありました。

画像

私のロジックは、binwalkを介してファイルを実行することであり、RARに遭遇した場合は、コメントを取得するために解凍します。 それ以外の場合は、コメントセクションを直接表示して、さらにアクションを理解します。

私の最初の推測:番号はファイルインデックスです(それぞれ0〜1999の番号が付けられています)。 しかし、いくつかの数値は負であることがわかりました。つまり、インデックスにすることはできません。

2番目の推測:数値は飛躍であり、負の値になる可能性があります。 各番号について、次のファイルにジャンプする必要がありました。 コードが次の計算されたファイルに絶えずジャンプすると、サイクルの形で小さなトラップが作成され、コードが無限ループに陥る可能性があることを知っていました。 それで、アカウント制限付きのpythonコードを書きました。 そして、いくつかのテストの後、120という数字で十分であることがわかりました。

画像

そして、旗は私のものでした:

画像

私が次の投稿で説明した他の3つは、読んで、試してください、あなたのコメントに喜んでいます

Source: https://habr.com/ru/post/J429112/


All Articles