WeSeong ログイン
← 記事一覧に戻る
フッキング

API Hooking, パケット分析

API Hooking, パケット分析

Ⅰ. 概要

API Hooking(API フッキング)さっそく見てみましょう。 Windows APIそれでは、それが何であるかと、その中身について見てみましょう。 API フッキングそれに関連するプラットフォーム Windowsこのセクションでは、が提供するプロセス監視プログラムと機能情報について説明します。 API フッキングこの可能な例のコードとともに Pythonで Windows APIその仕組みを簡単に見てみましょう。 Packet(パケットの構造を分析しましょう。パケットファイルを作成すると、デフォルトでは Global Headerそして、そこには Packet Headerと Dataこれを繰り返します。データリンク層、ネットワーク層、およびトランスポート層のプロトコルの構造を分析し、必要な情報だけを抽出します。



Ⅱ. API ホッキング

API Hooking(API フッキング)は 逆転の花これを「改ざん」と言います。これは、情報を傍受したり、実行フローを変更したり、元のものとは異なる機能を提供したりすることです。これが可能なのは、 プロセスを徹底的に分析そのせいです。 Windowsこの場合 APIを通じて Windows Bluetoothのオン/オフ、ファイルシステムへのアクセス、日付の変更など、さまざまな機能と能力を使用します。 Windows APIカーネルとは、これらの機能を使用できるようにする関数の集合です。ハードウェアにアクセスするために、カーネルは各デバイスのインタフェースに接続し、シェルはカーネルにコマンドを発行します。シェルがカーネルにコマンドを発行するのと同じように、シェルはカーネルにコマンドを発行します。 Windows多くのプロセスがあります。特定のユーザープログラム(MPlayer、ブラウザなど) Windowsこれが、スムーズに運用できる理由でもあります。 Windows なぜなら、プロセスを利用できるからです。 Windows これは、API がこれらの Windows プロセスに接続するためです。


さらに詳しく言えば、Windows のメイン親プロセスであるexplorer は、CreateProcessA 関数を使用して、ユーザーのプログラム用に プロセスを作成します。 プロセスが作成された後、メインスレッドが実行を開始し、メインスレッドは各子スレッドを呼び出します。

CreateProcessA 機能(processthreadsapi.h) - Win32 apps

API フッキング特定のプロセスが実行されていることを示します API プロセスを呼び出しを通じて実行すると 中間で阻止し、コントロールを奪う持っています。 API渡されたパラメータや戻り値を操作し、呼び出し自体をキャンセルするか、プロセスフローを自分の希望に合わせて変更します。


API フッキングこれを可能にするプラットフォームの最も有名な例の一つは Fridaあります。

運用モード

Frida はほぼすべてのオペレーティングシステムで利用でき、JavaScript 言語で動作します。利用方法や機能に関する詳細は、上記のウェブサイトをご覧ください。


役立つヒントとして、JavaScriptは、V8 エンジンがあらゆるウェブ上で JavaScript を使用できるようにしたことで、Web の急速な発展につながりました。


※ プロセスの追跡のための MicrosoftMicrosoft)提供しているプログラムを紹介します。 Windowsすべてのプロセスを追跡しますが、 API フッキング特に複数のシェルの侵入を防止または検出することは不可能です。 ファイル名を変更してプロセス名を通常のものとして表示し、その後実行するマルウェアかなり多くあります。役に立たないわけではありませんが、プロセスの実際のパスや作成日などの追加情報を見て学ぶことができる側面もあります。詳しくは、後日別の研究で紹介します。

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 機能と WriteFile 機能 Windows APIを通じて これは、各関数が呼び出せるからです。各関数はファイルシステムの一部です。 MFTアクセスやってみろ。 MFTは、そのパーティションに格納されるランダムな(空の、安全な)領域です セクターを指定しますそして、そのセクターに配置されます。 データの保存やってみろ。 MFT対応するファイルの時間、ファイル名、ファイルの場所、またはその他の情報 さまざまな情報が記録(保存)されますそして、この操作のシーケンスを操作する関数を返します。 Handleを また、Handle はこれらの関数を操作するインターフェースとして考えることができる「戻り値」とも言えます。戻り値が必要な理由は明らかです。メモリを占有し続けることはできません。



Ⅲ. パケット

ここまで、PE、ZIP、およびDISK(FAT、NTFS)の構造について学び、HxDを使って構造を分析し、値を変更する方法について調べました。次に、ネットワークのパケット構造について詳しく見ていきましょう。


※ 知っているのは良いことです TIPで IPv6開発されたとはいえ、今でも存在しています。 IPv4使用する。その理由は NATこれは、公共IPとプライベートIPに分けることができるため、ポートフォワーディングを通じたセキュリティにも優れているからです。



ソース https://boanhack.tistory.com/172

PCAP ファイル署名

パケット構造を詳しく調べるには、上記のブログを参照してください。最初の 24 バイトは Global Headerデフォルトでは pcap ファイルに付けられているヘッダーがあります。次に、 Packet Headerそして彼はやって来ます。 Packet Headerと Packet Dataこのパターンはペアで続きます。 Global Headerもし彼らを分離したとしたら、 Packet Headerと Dataそれらを区別することが必要です。 Packet Header16 バイトで構成され、以下を含んでいます Data長さは 12 バイトから 15 バイトと報告されています。 つまり、 Header長さが 16 バイト Data長さの合計が次の値になります Packet意味があります。 もちろん、最初は Global Header値は合計して計算する必要があります。


では、実際にデータリンク層、ネットワーク層、およびトランスポート層からパケットデータを取得してみましょう。

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

[SK Shillers SeSAC Phase 1] 2. ネットワークの種類、OSI の 7 層、およびプロトコル(データリンク層、ネットワーク層、およびトランスポート層)

データリンク層、ネットワーク層、およびトランスポート層におけるプロトコル、ヘッダ、およびデータ構造については、上記の投稿を参照してください。 Packet Data最初に見つけた情報は Ethernet それは情報です。データリンク層にあり、 MAC アドレスそれは私たちに教えてくれます。 MAC アドレスの最初の 3 バイトはメーカーを表し、最後の 3 バイトはメーカーが割り当てた一意の識別子(シリアル番号)です。デフォルトでは、 MAC アドレスは 6 バイト長であり、パケットデータに含まれています。 Destination Address君が先だ。 Source Address彼は後でここに来るだろう。 Source Addressもしあなたが先に来るなら Destination Addressそれを見つけるには、6バイト飛ばす必要があります。これは不要な作業を増やすだけです。

[Network] Ethernet/TCP/IP Header 構造体

前回の投稿やこのブログでは、Ethernetのヘッダ構造について詳しく説明しました。しかし、ダンプされたパケットファイルにはすべてのHeader構造が含まれていないため、抽出する必要があるのはDestination Address、Source Address、およびTypeだけです。つまり、6バイト、6バイト、および2バイトだけを抽出する必要があります。


※ MAC 住所は IP アドレスとマッピングそれは機能します。 IP アドレスについては MAC アドレスを検索したときにブロードキャストします。同じネットワークサブネット内で応答します IP それが住所である場合は、自分の住所を返信します MAC 個別に記載 認証値が必要なことなく、すぐにレポートを作成します。 まさにこれです ARP プロトコルの役割 IP 住所を通じて MAC 住所を見つけたら、 ARP, それどころか MAC 住所を通じて IP 住所を見つけたら、 RARP彼は言う。


※ 私が言っていたことです。 ARP関連 ARP Spoofingイランからの攻撃があります。追加の認証なしですぐにアクセスできます。 MAC これは、アドレスがネットワーク通信中にパケットで通信されるという事実を利用しています。 スニフォリング (Sniffing)そして、それを通してそれを見ることができます。そして ARP ご要望に応じて MAC ユーザーが要求したときにこのアドレスを使用します MAC 住所を伝え、サーバーにあなたの MAC アドレスを提供することで、データを途中で任意に操作することが可能になります。カフェやルーターなどの場所では、を通じて 同じネットワーク帯域幅が共有されている場所では、このようなことが頻繁に起こります。 防御する方法同じネットワーク帯域 MAC アドレスに不自然なものがある(重複) MAC アドレスが存在するかどうか - arp コマンドを通じて)そこにあるかどうか確認してください IP 住所と MAC アドレスを動的にマッピングしたり変更したりすることはできません。 それを静的にマッピングして変更できなくすることができます。


ダンプされたパケットファイルでは、ネットワーク層 IP プロトコルに関して得られる有用な情報には、次のものがあります。 Time to Live, Protocol, IP 住所 他にもあります。

pcap 形式、Header

より詳細な情報については、上記のブログをご覧ください。実際、WireShark'パケットファイルに保存します IP プロトコル関連の部分だけを計算すると、 Time to Live 目の前 Version, Servies, Total Length, Identification, Flags, Frag Offset情報があります。それを確認したい場合は、計算に入れなくても、各ものが何バイトなのかだけを見ればよいのです。 Time to Live 値を知りたいので、以前の情報を確認します Byte計算すると、8 バイトの後に来ていることがわかります。そして Protocol次の9バイトから始めます IP 住所 Source Address12バイト~15バイト Destination Address16 バイトから 19 バイトになります。


Ethernet プロトコルは IP プロトコルの直後に来るため、計算を正確に開始するには、14バイト(イーサネットプロトコル情報の長さ)を追加する必要があります。


※ IP 住所 Source Addressと Destination AddressIP アドレスがプライベート IP かパブリック IP かは、C クラスのプライベートネットワークが通常 192.168.~ で始まるため、容易に判別できます。 IP それが住所であるなら、それはプライベートです。 IPそうでなければ、公共 IP として考えることができます。


トランスポート層は TCPと UDPこれは、TCPとUDPに分けられています。そのため、計算を行う際には、ネットワーク層であるTCPかUDPかを判断する必要があります。 IP 上記のプロトコルを抽出している間 Protocol この情報は以前に見たことがあるかもしれません。十六進数の値を十進数に変換すると、17 と 6 が得られます。これは TCP か UDP かを示す値です。 TCP6です UDP17ですそのため、構造をこれらの値に分割して分析することができます。


TCP最初のものを見てみましょう。ここで知る必要がある情報は、 Source/Destination Portと Sequence/Acknowledgment Number, Flags, Payload(純粋なデータ)です。 IP プロトコルデータ(合計 20 バイト)を取得した後 各 2 バイト Source/Destination Portそれを知ることができますし、それから 各 4 バイト Sequence/Acknowledgment Numberです。 Flags少しの計算が必要です Acknowledgment Number 次の2バイトから最後の1バイトだけを抽出します & 計算をしてみれば分かります。 0b00100000 & 計算を行う場合 Urgent Flag 値が 0 の場合は存在しなかったことを示し、1 の場合はリクエストが行われたことを示します。0b00010000 Acknowledgment 値 0b00001000 は Push 値 0b00000100 は Reset 値 0b00000010 は Syn 値であり、0b00000001 は 最終価格6 人います。 Flags 値が得られたら、ようやく Payloadただ、頼むだけです。 TCP Header20バイト以降から始まりますが、空白の可能性があるため、フィルタリングが必要です。空白でない場合、 次のパケット Headerと Data(つまり、次のパケットが到着するまで 抽出してください。


※ TCP 状態情報を提供します Flags値は 3 ですWay-Handshake これは、コース中に有用な情報を提供してくれます。 Urgentは 緊急要請意味 Ackは 完了意味 Pushは 受信したデータを即座にアプリケーション層に転送します意味があります。 Resetは 強制的に接続を切断した後に要求された残りのデータは無視します。 Synは 接続要求そして最後に、 Finこれは、正常な接続の終了を示しています。 Syn 要求に対するパケットを監視およびブロックすると、セキュリティを強化できます。


接続プロセス Synと Ack, Seq 数値を見ると、最初にクライアントは特定のサーバーに接続します。 Syn リクエストを作成するとランダムに Seq 番号を送信します。サーバは受信します Seq 数に 1 を加えた値 Ack 番号それを送り返します。クライアント 再び受け取りました Ack 数に 1 を加えた値 Seq 番号で送信し、新しいランダム番号を取得します Ack 番号最終的に送信によって接続されます Syn, Ackコンセプトを理解すると、攻撃の対象を特定できます。 ポートスキャン攻撃する前にそれを行うことができるだろう。 TCP ログを残さないようにする サーバが開いているかどうかを確認しますそれはプロセスです。最初は、 Syn リクエストを送信する Ack 要求に応答されたとき、接続は即座に終了します 最終接続が完了しました Ack リクエストを送信しない方法厳密に言えば、このプロセスは TCP Half-Open Scan(ステルススキャン)それが「The TCP 情報のもう一つの重要な理由は、これらのステルススキャンをファイアウォールと組み合わせることで、ポートをブロックできることです。 Flags事前にリクエストをブロックできるからです。


※ TCPの Payload データは Web通信パケット(HTTPの Get, Post Methodコンテンツ部分、つまり実際に送信されるデータデータが含まれています。


UDP続行するには、 UDPでは Source/Destination Portと UDP Payloadそれを抽出するだけです。 TCPそれはそれ以上にずっとシンプルです。同様に、ネットワーク層も IP プロトコルから計算を開始できます Source/Destination Portそれぞれ 2 バイトです計算をするだけです。その後、 UDP Headerと Data(Payload)含む全長を示す Length彼は来る。 UDP Payloadあなたがしなければならないのは、この長さ値から -8 を引くことです。理由は、 UDP Payload 以前は、ポート番号と長さが二つありましたLength), Checksum 情報はすべて 2 バイトです 合計 8 バイトなぜなら彼らはここに来るからです。つまり、 Source/Destination Port最初から各々 2 バイトです。 UDP Payloadは Length値から 8 バイトを引くここまで抽出すれば、目的の情報を取り出すことができます。


※ UDPで Query送信時に使用します Port53です。通常 DNS(Domain Name Server)どこに行きたいですか IP 住所を知る UDPこれは、前方向と逆方向の両方で送信されます。前方向は www.google.comと 同じホスト名を持っています IP それは住所を探すことであり、その逆も同じです IP 住所 (ex. 192.168.0.10)それは、IP アドレスを知り、ホスト名を見つけることです。



レビュー

今週は、パケットファイルを分析するPythonスクリプトをコーディングして、週の最終日金曜日に授業を終えました。Pythonでコーディングしながら、抽出方法を確認していくうちに、構造の理解が少しずつ容易になってきそうです。来週からはおそらくモバイルデバイスを使った作業になるので、今週学んださまざまなデータ構造について理解しておく必要があると思います。