WeSeong ログイン
← 記事一覧に戻る
誘い

APIフック、パケット分析

APIフック、パケット分析

Ⅰ. 概要

API 誘引API 「フッキング」について、簡単に解説します。Windows環境APIまず、そのものが何であるか、どのようなものなのかを調べてみます。API フッキングに関連するプラットフォームや、Windowsで提供されているプロセス監視プログラム、および関数の情報を紹介します。API PythonでWindowsで動作する、フック可能なコードの例APIここでは、基本的な仕組みについて簡単に説明します。まず、パケットの構造を分析します。パケットファイルを作成することで、基本的にはグローバルヘッダーと、パケットヘッダーとデータが繰り返される構造であることがわかります。その後、データリンク層、ネットワーク層、トランスポート層のプロトコルの構造を分析し、必要な情報のみを抽出する方法を紹介します。



Ⅱ. APIフック

API 誘引API (釣り)これは リバースの魅力これは「マルウェア」と呼ばれる。これは、情報を盗み取ったり、プログラムの実行順序を変更したり、本来とは異なる機能を提供するもので、それが可能な理由は… プロセスへの侵入なぜなら、Windowsの場合、API(アプリケーションプログラミングインターフェース)を通じて、Windows内部の様々な関数や機能を利用できるからです。例えば、Bluetoothをオンにする、ファイルシステムにアクセスする、日付を変更するなどの操作が可能です。 Windows APIこれは、これらの機能(関数)を利用できるようにする集合体です。ハードウェアにアクセスするためには、カーネルが各デバイスのインターフェースと接続され、シェルがカーネルに対してコマンドを実行するように、各シェルはWindows上で複数のプロセスとして機能します。特定のユーザープログラム(メロン、ブラウザなど)がWindows上でスムーズに動作できるのは、これらのプロセスを利用できるからです。 このWindowsプロセスとWindows APIとの連携そのためです。


※ 具体的には、Windowsでは、主要なプロセスである「explorer」が「CreateProcessA」関数を使用して、ユーザーが使用するプログラムの起動を行います。 プロセスを生成する。 プロセスが生成されると、メインスレッドが動作し、メインスレッドが各子スレッドを呼び出す。

CreateProcessA関数 (processthreadsapi.h) - Windowsアプリケーション

APIフックとは、特定のプロセスがAPI呼び出しを通じて、そのプロセスを実行する際に、その動作を改ざんする技術です。 途中で奪い、支配権を握るそれらを持っている。APIこれにより、関数の引数や戻り値を操作したり、関数の実行自体を停止させたり、自分の意のプロセスフローに置き換えたりすることができます。


APIの改ざんを可能にする、ある種のプラットフォームのようなものとして、有名なFridaというものが挙げられます。

運用方法

このFridaは、ほとんどのオペレーティングシステムで利用可能で、JavaScriptで動作します。詳細な使用方法や関数については、上記のウェブサイトを参照してください。


※ JavaScriptは、V8エンジンが開発されたことで、あらゆるウェブ環境で利用できるようになり、ウェブの飛躍的な発展を牽引した重要な技術です。


※ マイクロソフトが提供する、プロセス追跡プログラムを紹介します。Windowsのすべてのプロセスを追跡できますが、APIの改ざんによる複数のシェルへの侵入を阻止または検出することはできません。特に、 ファイル名を変更し、プロセス名を正常なものにすることで動作するマルウェアなぜなら、関連する情報が非常に多いからです。しかし、この情報が必ずしも役に立つとは限りません。ただし、このプロセスが実際にどのような経路を辿り、いつ生成されたのかといった詳細な情報を確認することで、より深く理解することができます。さらに詳しい情報は、後日改めて記事で解説する予定です。

Sysinternals - Sysinternals

簡単なサンプルコードを添付します。

var hook_createprocess = Module.getExportByName("kernel32.dll", "CreateProcessW");
Interceptor.attach(hook_createprocess, {
    onEnter(args) {
        var lpApplicationName = args[0];
        console.log(Memory.readByteArray(lpApplicationName, 4096));
        var applicationName = Memory.readUtf16String(lpApplicationName);
        console.log(applicationName);
        var lpCommandLine = args[1];
        console.log(Memory.readUtf16String(lpCommandLine));
    },
    onLeave(result) {
        //console.log(result);
    }
});

このコードは、プロセス生成を行う関数に組み込まれており、リアルタイムでどのようなプロセスが生成されているかを把握することができます。


さらに、Windows API をどのように活用するかについて、Python (Python) のファイル書き込み関数を通じて、もう少し詳しく見ていきましょう。

fd = open('경로\\aaaa.txt', 'w')
fd.writelines("12345abcde")
fd.close()

このコードを使用することで、.txtファイルを作成できるのは、Windowsの CreateFileA関数 関数と ファイルを作成 なぜなら、これらの関数は Windows API を通じて呼び出せるからです。これらの関数は、ファイルシステムの… MFTへのアクセス設定します。MFTが保存される場所として、空いている場所や安全な場所など、任意の場所を指定します。 セクターを特定するそして、その分野に関連して データを保存関連する情報(ファイルの作成日時、ファイル名、ファイルパスなど) 様々な情報が記録(保存)されるそして、この一連の処理を制御する関数を返します。Handleという言葉も使われますが、ここでは単にこれらの関数を操作するためのインターフェースと考えることができます。これらの関数を返す理由は、メモリを占有し続けることができないからです。



Ⅲ. パケット

これまでに、PE、ZIP、DISK(FAT、NTFS)の構造について学び、HxDを使って構造を理解したり、値を変更したりしてきました。今後は、ネットワークのパケット構造を分析することを目的としています。


※ IPv6が開発されたにも関わらず、現在もIPv4を使用している理由として、 NATそのため、公認IPとプライベートIPを区別することが可能になり、また、ポートフォワーディングを利用することでセキュリティ面でも有利です。



出典 https://boanhack.tistory.com/172

PCAPファイルのシグネチャ

パケットの構造について詳しく見ていく場合、より詳細な情報は、上記のブログを参照することをお勧めします。パケットの先頭には24バイトが... グローバルヘッダーこれは、pcapファイルに通常含まれるヘッダーです。 次に パケットヘッダー彼らが来るにあたり、パケットヘッダーについて パケットデータこのパターンが繰り返し発生します。グローバルヘッダーを分離した場合、パケットヘッダーとデータの内容を区別できるようにする必要があります。パケットヘッダーは16バイトで構成されており、その後に続くデータの長さは12~15バイトで示されています。 つまり、ヘッダーの長さ16バイトとデータ長の合計が、次のパケットを表します。 もちろん、初期のグローバルヘッダーの値は、すべてを合計する必要がある。


それでは、データリンク層、ネットワーク層、トランスポート層のパケットデータを実際に取得して分析していきます。

[SK쉴ダーズ SeSAC、ソウル1期] 1. ネットワークの種類、OSI 7層、プロトコル(データリンク層、ネットワーク層、トランスポート層)

[SK Telecom SeSAC、ソウル1期] 2. ネットワークの種類、OSI 7層、プロトコル(データリンク層、ネットワーク層、トランスポート層)

データリンク層、ネットワーク層、トランスポート層のプロトコル、ヘッダー、およびデータ構造については、上記の記事を参照してください。Packet Dataで最初に確認すべき情報は イーサネット これは情報です。データリンク層に位置しています。 MACアドレスこれについて説明します。MACアドレスの最初の3バイトは製造メーカーを示し、最後の3バイトは製造メーカーが割り当てた固有の識別子(シリアル番号)です。通常、MACアドレスは6バイトで構成されており、パケットデータにおいては 宛先まず、 送信元アドレス後から来る場合、送信先のアドレスが先に到達した場合、宛先のアドレスを特定するために6バイトをスキップする必要があります。これにより、不要な処理が増えることになります。

[ネットワーク] イーサネット/TCP/IP ヘッダーの構造

過去の投稿やこのブログには、イーサネットのヘッダー構造について詳しく説明されています。しかし、実際に取得したパケットファイルには、すべてのヘッダー構造が含まれているわけではないため、宛先アドレス、送信元アドレス、タイプのみを抽出すれば十分です。つまり、6バイト、6バイト、2バイトを取得すれば良いのです。


MACアドレスは、IPアドレスと対応付けられているIPアドレスのMACアドレスを特定する際、ブロードキャストを行います。受信した同じネットワーク内のIPアドレスであれば、そのIPアドレスに対する応答として、自身のMACアドレスを返します。 認証コードがなくても、すぐに通知されます。 これは、ARPプロトコルがIPアドレスを使ってMACアドレスを特定する役割を果たすことによるものです。 ARP逆に、MACアドレスからIPアドレスを特定することも可能です。 RARP (Reverse Address Resolution Protocol)~と申します。


※ 刚才話したARPに関連して ARP(アドレス解析プロトコル)の偽装イランからの攻撃が存在します。これは、特別な認証なしに、自分のMACアドレスを直接開示することを利用したものです。具体的には、ネットワーク通信の過程で送受信されるパケットを 嗅ぎ嗅ぎそして、この仕組みを通じて、MACアドレスをユーザーが要求するARPリクエストに応答し、自身のMACアドレスをユーザーとサーバーの両方に伝えることで、中間でデータを自由に操作できるようになります。例えば、カフェなどで共有ネットワークを利用している場所で、この手法が使われることがあります。 防御するための方法例えば、同じネットワーク帯域のMACアドレスに不自然な点(重複しているかどうか - ARPコマンドで確認)がないかを確認したり、IPアドレスとMACアドレスを動的にマッピングし、変更できるようにするのではなく、 固定された状態に設定し、変更できないようにする。


ダンプされたパケットファイルから、ネットワーク層のIPプロトコルに関する有用な情報を取得できるのは 生存時間、プロトコル、IPアドレス 背中がある。

pcap形式、ヘッダー

関連する詳細な情報は、上記のブログを参照してください。実際に、「Wireshark」でパケットファイルのIPプロトコルに関連する部分だけを計算してみると、「Time to Live」の前に バージョン、サービス、総長、識別子、フラグ、オフセットその情報があります。もし確認したい場合は、別途計算せずに、それぞれのサイズを確認すれば良いでしょう。特に「Time to Live」の値を知りたいので、上記の情報を基に計算すると、8バイト以降にその値が記載されていることがわかります。 プロトコルは、その後の9バイトから開始され、IPアドレスの送信元アドレスは12バイトから15バイト、宛先アドレスは16バイトから19バイトです。


※ イーサネットプロトコルとIPプロトコルが連続して記述されているため、正確な計算を行うには、まずイーサネットプロトコルの情報部分の長さ(14バイト)を加算してから計算を開始する必要があります。


※ IPアドレスの 送信元アドレスわあ 宛先IPアドレスを見て、プライベートIPアドレスかパブリックIPアドレスかを区別できます。一般的には、CクラスのプライベートIPアドレスを使用しているため、192.168.~で始まるIPアドレスはプライベートIPアドレスであると考えられます。それ以外のIPアドレスは、パブリックIPアドレスであると判断できます。


トランスポート層は TCPわあ UDPこれらはそれぞれ異なるため、計算を行う際には、TCPなのかUDPなのかを区別する必要があります。ネットワーク層のIPプロトコルを抽出する際に、上記で プロトコル おそらく、あなたは情報を取得したことがあるでしょう。16進数で表現された値を10進数に変換すると、17と6という値が得られます。この値が、それがTCPなのかUDPなのかを特定するためのものです。 TCPは6、UDPは17そのため、この値を基準に構造を分割して分析するのが適切です。


まず、TCPについてですが、ここで知っておくべき情報は… 送信元/宛先ポート、シーケンス/応答番号、フラグ、ペイロード(純粋データ)IPプロトコルデータ(合計20バイト)を取得した後、 ソース/宛先ポート:それぞれ2バイトその情報を得ることができ、その後 各4バイトずつ、シーケンス番号/応答番号これは、フラグの処理に関するものです。フラグは、ある程度の計算が必要ですが、Acknowledgment Numberの次の2バイトのうち、最後の1バイトだけを抽出します。 & 計算を行うことで、そのことが分かります。 0b00100000 & 計算結果として、緊急フラグの値が表示され、0の場合は存在しないことを示し、1の場合はリクエストがあったことを示します。0b00010000は確認のフラグ、0b00001000はプッシュのフラグ、0b00000100はリセットのフラグ、0b00000010は同期のフラグ、0b00000001は完了のフラグこれによって、6つのフラグの値が特定でき、その後でペイロードを特定します。TCPヘッダーの20バイト以降から開始されますが、空欄である可能性もあるため、フィルタリングが必要です。もし空欄でない場合は、 次のパケットのヘッダーとデータ(つまり、これまでのパケットまで)が送信される前に 抽出すればよい。


※ TCPの状態に関する情報を表示これらの値は、3ウェイハンドシェイクの過程で、私たちにとって重要な情報を提供します。 緊急緊急の要請これは~を意味します ああ完了これは、~を意味する 推進受信したデータを、すぐにアプリケーション層に転送する。これは~を意味します。 リセットこれは 強制的に接続を終了した後、受信した残りのデータを無視する。 関連これは 接続リクエストこれは~を意味し、最後に~ これは、正常な接続の終了を意味します。このSYNリクエストに対するパケットを監視し、ブロックすることで、セキュリティを強化することができます。


クライアントが特定のサーバーに接続する際、SYNとACK、シーケンス番号を用いたプロセスを考えると、まずクライアントがSYNパケットを送信し、サーバーがACKパケットで応答する、という流れになります。 SYN要求時に、ランダムなシーケンス番号を指定これをお送りします。サーバーはこれを受信しました。 シーケンス番号に1を加えた値と、ACK番号再度送信します。クライアントは 受信したACK番号に1を加えた値を、Seq番号として送信し、新しいランダムなACK番号を生成する。最終的に接続が確立されます。SYN、ACKの概念を理解することで、攻撃対象に ポートスキャンこれにより、攻撃を行う前に、TCPログに記録を残さずに攻撃を実行できるようになります。 まず、サーバーが起動しているかどうかを確認してください。これは、最初にSYNパケットを送信し、ACKパケットで応答を受け取った後、すぐに接続を終了する処理です。 最終的な接続完了の確認応答(ACK)を送信しない方法これらは組み合わさって構成されます。このプロセスは、厳密には TCP の半開ポートスキャン(ステルススキャン)これらは「ステルススキャン」と呼ばれています。このTCP情報が重要な理由の一つは、ファイアウォールを使用して、ポートやフラグの要求を事前に遮断し、ステルススキャンを阻止できるからです。


※ TCPのペイロードデータは ウェブ通信のパケット(HTTPのGET、POSTメソッドのデータ部分)つまり、実際に送受信されるデータそれらすべてを包み込む。


UDPに移行する場合、UDPでは 送信元/宛先ポートとUDPペイロード必要な情報は抽出するだけで、TCPと比較して大幅に簡略化されます。同様に、ネットワーク層のIPプロトコル以降の計算を行うことで、 送信元/宛先ポートはそれぞれ2バイト計算すれば、UDPヘッダーとデータ(ペイロード)を含む全体の長さを把握できます。 長さUDPのペイロードの長さを、この値から8バイト減らす必要があります。その理由は、UDPのペイロードの前に、2つのポート番号と長さ、チェックサムの情報がそれぞれ2バイト分存在するためです。 合計8バイトそのため、Source/Destination Portは、それぞれ最初に2バイトずつ割り当てられる。 UDPのペイロードは、Lengthフィールドから8バイトを引いた部分これらから必要な情報を抽出することで、目的の情報が得られるでしょう。


※ UDPでクエリを送信する際に使用されるポート番号は53です。通常DNS(ドメイン名サーバーにアクセスしたい場所のIPアドレスを知るためにUDPパケットを送信しますが、これには前方参照と逆参照の2種類があります。前方参照は www.google.com と これは、同じホスト名を持つIPアドレスを特定すること、または、IPアドレス(例:192.168.0.10)のみがわかっている場合に、そのホスト名を特定することです。



おまけ

今週の最終金曜日に行われた授業の復習として、Pythonを使ってパケットファイルを分析するコードを作成しました。Pythonで構造を記述し、どのように抽出できるかを検討することで、理解が深まったと感じています。来週からはモバイル環境での分析も行う予定ですので、今週学んだ様々な構造を理解しておくことが重要です。