Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
Harald — アジャイルなオンザフライプロトコル作成のためのインメモリ最小CPU | Kitploit
ツール/GitHubGitHub/gmh5225/harald
エクスプロイトIDS/IPS回避スクリプトと自動化ネットワークセキュリティペネトレーションテストコマンド&コントロールユーティリティとフレームワークレッドチーミングペイロード開発
GitHubgmh5225/harald

Harald

アジャイルなオンザフライプロトコル作成のためのインメモリ最小CPU

1年前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
リポジトリを見る
共有

Harald CPU

Haraldはインメモリの小型高水準CPUであり、一連の命令を処理して、特定のネットワークプロトコル(TCP/UDP)上で使用されるアプリケーション層プロトコルを生成することができます。

Haraldは_OPCODE_のストリームを消費し、ペイロードに対してさまざまな変換を適用して、定義されたアプリケーション層プロトコルに適合させます。

[!TIP] なぜ_Harald_なのか?デンマーク王ハーラル・ゴームソンは、そのあだ名_Blátǫnn_、あるいは現代の発音で言うところのBluetoothでご存じかもしれません。 この技術は、当時ハーラルがデンマーク王国とヴァイキングの王国を_接続_したことにちなんで、彼のあだ名から名付けられました。そこで、私は彼のファーストネームからこれを命名しました。

図

HaraldはCPUのように動作します。アクションを定義する一連のOPCODEに従います。それがPROTOCOLです。Haraldは、必要なプロトコルをオンザフライで生成するために必要な操作を処理します。

PROTOCOLが提供されると、Haraldは送信するPAYLOADを反復処理し、フラグメントごとにPROTOCOL全体を1回ずつ走査します。つまり、ペイロードを複数のフラグメントに分割する必要がある場合、Haraldはすべてのフラグメントに対して同じプロトコルを使用し、プロトコルで定義されたすべてのアクションを現在のペイロードフラグメントに対して実行します。

Haraldは、プロトコルが値を保存するために使用するいくつかのレジストリを保持しています。これらのレジストリは、加算、減算、エンコード、デコードなど、さまざまな操作を実行するために使用できます。

Haraldは、ペイロードフラグメントの送信時に行われた各リクエストへの応答をプロトコルが保存できるよう、結果の配列を動的に割り当てます。

Harald high-level diagram

オペコード

Haraldは、プロトコルとして提供されるさまざまなオペコードをサポートしています。Haraldは、特定のオペコードを受け取ると、一連の高水準操作を実行します。各オペコードは、定義済みの長さを持つ定義済みの引数セットを期待します。

OPCODE::Nº説明ARGS::Size
H_F_APPEND::0x01末尾のペイロードに続くNバイトを追加するSize::4, NBytes::N
H_F_PREPEND::0x02末尾のペイロードの先頭に続くNバイトを追加するSize::4, NBytes::N
H_F_SPLIT::0x03ペイロードを指定されたサイズのフラグメントに分割するSize::4
H_F_PAYLOAD_INJECT::0x04ペイロードフラグメントを最終ペイロードに注入する-
H_F_SOCK_INIT::0x05ソケット接続を初期化するIsIPAddress:1, SSL_Enabled::1, TCP/UDP::1, [(HostLen::4,HostName:N)/IPAddress::4], Port::2
H_F_SEND::0x06構築された最終ペイロードを送信する-
H_F_RECV::0x07最大Nバイトを受信するSize::4
H_F_CLOSE::0x08ソケットを閉じてクリーンアップする-
H_F_INJECT::0x09要求されたレジストリを最終ペイロードに注入するReg::1
H_F_ENCODE_STR::0x0Aペイロードフィールドをその文字列表現にエンコードするIsReg::1, [(Payload::1, Field::1)/Reg::1], Format::1
H_F_DECODE_STR::0xA0レジストリの内容をその数値表現にデコードするReg::1
H_F_ENCODE_STRB64::0x0BペイロードフィールドをそのB64文字列表現にエンコードするPayload::1, Field::1
H_F_COMPUTE_FRAG_LENGTH::0x0D次に送信するフラグメントの長さを計算する-
H_F_SEARCH::0x0E指定されたレジストリ内で、指定されたNサイズのバイトパターンを検索するReg::1, Size::4, NBytes::N
H_F_SEEK::0x0F指定されたペイロード内のカーソルを指定されたバイト数だけ移動するPayload::1, Offset::4
H_F_PUSH::0x10指定されたバイト数またはレジストリの内容を別のレジストリにプッシュするIsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2
H_F_ADD::0x122つのレジストリ、または数値をレジストリに加算するIsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2
H_F_SUBSTRACT::0x132つのレジストリ、または数値をレジストリから減算するIsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2
H_F_READ::0x14指定されたレジストリから、別のレジストリに格納された長さまで読み取るFromReg::1, SizeReg::1
H_F_STORE::0x15レジストリの値をHaraldのストレージに保存するReg::1

HTTPの例

以下のオペコードストリームは、通信がHTTPとして理解されるために送信する必要があるデータを生成します。SSL/TLS接続を開始し、ペイロードをHTTPトラフィックのように見えるように変更し、それを送信し、最後に接続を閉じます。

root@kitploit:~
H_F_SPLIT, 0x00, 0x00, 0x00, 0xFF,                         // Splits the Payload
H_F_APPEND, 0x00, 0x00, 0x00, 0x46,                           // Appends...
  'P', 'O', 'S', 'T', ' ', '/', ' ',                              // POST / 
  'H', 'T', 'T', 'P', '/', '1', '.', '1', '\r', '\n',             // HTTP/1.1
  'H', 'o', 's', 't', ':', ' ',                                   // Host: 
    'd', 'o', 'm', 'a', 'i', 'n', '.', 'c', 'o', 'm', '\r', '\n', // domain.com
  'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', ':', ' ',     // Connection: 
    'c', 'l', 'o', 's', 'e', '\r', '\n',                          // close
  'C', 'o', 'n', 't', 'e', 'n', 't', '-',                         // Content-
    'L', 'e', 'n', 'g', 't', 'h', ':', ' ',                       // Length: 
H_F_COMPUTE_FRAG_LENGTH,                                 // Next Fragment's size
H_F_ENCODE_STR, H_PAY_END_PAYLOAD, H_PAY_FRAGMENT_SIZE, 'u',  // FragSize encode
H_F_INJECT, H_REG_RET,                   // Inject the Fragment Size encoded str
H_F_APPEND, 0x00, 0x00, 0x00, 0x04, '\r', '\n', '\r', '\n', // Append Body begin
H_F_PAYLOAD_INJECT,                                        // Inject the Payload
H_F_SOCK_INIT, 0x01, 0x01, 0x7F, 0x00, 0x00, 0x01, 0x04, 0xD2,    // Init Socket
H_F_SEND,                                    // Send the Payload over the socket
H_F_CLOSE                                        // Close the socket and cleanup 
  1. ペイロードを最大0x000000FFバイトのブロックに分割する(0x03)。
  2. 続く0x00000046バイトを追加する(0x01)。(POST / HTTP/1.1\r\nHost: domain...)
  3. フラグメント長を計算する(0x0D)。
  4. ペイロードからのフラグメントサイズ情報(uint)を文字列としてエンコードする(0x0A)。
  5. その情報をリターン(H_REG_RET)レジストリに注入する(0x09)。
  6. 続く0x00000004バイトを追加する(0x01)。(\r\n\r\n)
  7. ペイロードを注入する(0x04)。
  8. SSL/TLSを使用してソケットを初期化し(0x05)、続く4バイト(0x7F000001)で定義されたIPアドレスと、続く2バイト(0x04D2)で定義されたポートへのTCPソケットに接続する。
  9. ペイロードを送信する(0x06)。
  10. 接続を閉じる(0x08)。

GitHub APIを使用したHTTPSの例

以下の例は、前の例と同じ手順に従います。ただし、ペイロードを単にボディとして送信する代わりに、プロトコルはHaraldにいくつかのヘッダーを設定し、ボディを構造化するよう指示し、プライベートリポジトリのissueにコメントを公開するためにGitHub APIと通信できるようにします。

この種の通信は、攻撃者が*.github.comのような信頼されたドメインを使用してC2サーバーとの通信チャネルを作成するのに役立つ可能性があります。この同じ例は、AWSリソース(sqs..amazonaws.com配下のSQSキューなど)、Azureリソース(<storage_account_name>.blob.core.windows.net配下のBLOBなど)を使用するように外挿することもできます。

この例は、STRUCTURED_FORMAT(JSON)+ APPLICATION-LAYER_PROTOL(HTTPS)+ PROTOCOL(TCP)を必要とする通信のための良いリファレンスです。

root@kitploit:~
H_F_SPLIT, 0x00, 0x00, 0x00, 0xFF,
H_F_APPEND, 0x00, 0x00, 0x01, 0x85, 'P','O','S','T',' ',
'/','r','e','p','o','s','/','YOUR_GH_USER','/','YOUR_GH_REPO',
'/','i','s','s','u','e','s','/','ISSUE_NUMBER',
'/','c','o','m','m','e','n','t','s',' ',
'H','T','T','P','/','1','.','1','\r','\n', 'H','o','s','t',':','
','a','p','i','.','g','i','t','h','u','b','.','c','o','m','\r','\n',
'A','u','t','h','o','r','i','z','a','t','i','o','n',':',' '
,'B','e','a','r','e','r',' ','g','i','t','h','u','b','_','p','a','t','_',
'YOUR_GH_PAT','\r','\n',
'X','-','G','i','t','H','u','b','-',
'A','p','i','-','V','e','r','s','i','o','n',':','
', '2','0','2','2','-','1','1','-','2','8','\r','\n',
'U','s','e','r','-','A','g','e','n','t',':','
','H','a','r','a','l','d','/','0','.','1','b','\r','\n',
'A','c','c','e','p','t',':','
','a','p','p','l','i','c','a','t','i','o','n','/',
'v','n','d','.','g','i','t','h','u','b','+','j','s','o','n','\r','\n',
'C','o','n','t','e','n','t','-','T','y','p','e',':',' ',
'a','p','p','l','i','c','a','t','i','o','n','/',
'x','-','w','w','w','-','f','o','r','m','-',
'u','r','l','e','n','c','o','d','e','d','\r','\n',
'C','o','n','n','e','c','t','i','o','n',':','
','c','l','o','s','e','\r','\n',
'C','o','n','t','e','n','t','-','L','e','n','g','t','h',':',' ',
H_F_COMPUTE_FRAG_LENGTH,
H_F_ADD, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0B, H_REG_RET,
H_F_ENCODE_STR, 0x01, H_REG_RET, 'u',
H_F_INJECT, H_REG_RET,
H_F_APPEND, 0x00, 0x00, 0x00, 0x0D, '\r', '\n', '\r', '\n', '{', '"', 'b',
'o', 'd', 'y', '"', ':', '"',
H_F_PAYLOAD_INJECT,
H_F_APPEND, 0x00, 0x00, 0x00, 0x02, '"', '}',
H_F_SOCK_INIT, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x0F, 
'a', 'p', 'i', '.',
'g', 'i', 't', 'h', 'u', 'b', '.', 'c', 'o', 'm', '\0', 0x01, 0xBB,
H_F_SEND,
H_F_CLOSE
  1. ペイロードを最大0x000000FFバイトのブロックに分割する(0x03)。
  2. 続く0x00000185バイトを追加する(0x01)。(POST /repos/... HTTP/1.1\r\n Host: domain...)これには、Authorization、X-GitHubApi-VersionなどのGH API用のヘッダーが含まれます。
  3. フラグメント長を計算する(0x0D)。結果はH_REG_RETレジストリに格納されます。
  4. 長さ0x00000001 0x0Bの値をH_REG_RETレジストリに加算する(0x12)。これは、Content-Lengthヘッダー内の'{"body":""}'文字を考慮に入れるものです。
  5. レジストリH_REG_RETを文字列としてエンコードする(0x0A)。
  6. リターン(H_REG_RET)レジストリ内の情報を最終ペイロードに注入する(0x09)。
  7. 続く0x0000000Dバイトを追加する(0x01)。(\r\n\r\n{"body":")
  8. ペイロードを注入する(0x04)。
  9. 続く0x00000002バイトを追加する(0x01)。("})
  10. ソケットを初期化し(0x05)、続く16バイト(0x0000000F)で定義されたドメインと、続く2バイト(0x01BB)で定義されたポートへのTCPソケット上でSSL/TLSを使用してドメインに接続する。
  11. ペイロードを送信する(0x06)。
  12. 接続を閉じる(0x08)。

要件

ビルドするにはコンパイラが必要です。GCC、Clang、MicrosoftのCLなどがあります。また、いくつかのライブラリ依存関係があります:

Linux

LibSSLとpkg-configをインストールします:

root@kitploit:~
sudo apt install libssl-dev pkg-config

OSX

brew経由でOpenSSLをインストールするか、自分でビルドして設定します。

root@kitploit:~
brew install openssl

Windows

リンクされたディストリビューターのいずれかからOpenSSLを入手するか、自分でビルドして設定します。

ビルド

リポジトリには、ライブラリといくつかのテストバイナリをビルドするためのMakefileが含まれています。

Haraldライブラリをビルドするには、次を実行します:

root@kitploit:~
make lib

これにより、プラットフォームに応じて共有ライブラリlibharald.so、libharald.dll、またはlibharald.dylibが作成されます。

テストバイナリをビルドするには、次を実行します:

root@kitploit:~
make test

これにより、2つのバイナリtest_haraldとtest_harald_ghが(プラットフォームに応じたそれぞれの拡張子とともに)作成されます。

テスト

Haraldの機能をテストするには、用意されたサーバーsocket_server_test.pyとhttps_server_test.pyを実行します。これらはそれぞれ、テストバイナリで使用されるソケットサーバーとHTTPSサーバーを作成します。

注:LD_LIBRARY_PATHを現在のフォルダに設定する必要があるかもしれません:LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. ./test_harald

HTTPS通信のためにSSL/TLS証明書を作成する必要があります(自己署名で問題ありません)。OpenSSLを使用して、次のコマンドで作成できます:

root@kitploit:~
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365

サーバーが起動して実行されたら、test_haraldバイナリを実行します:

root@kitploit:~
./test_harald

バイナリは、用意されたサーバーに接続し、プロトコルで指定された定義済みのデータペイロードを送信するはずです。

GitHub APIのテスト

GitHub APIの機能をテストするには、test_harald_ghバイナリを実行する前にいくつかの準備を行う必要があります。

リポジトリとissueを作成します。

test_harald_gh.cファイルには、Haraldを使用してGitHub APIと対話し、issueにコメントを作成する方法の簡単な例が含まれています。これにはGitHubのアクセストークンが必要で、GitHubアカウント設定のDeveloper settings -> Personal access tokens -> Fine-grained tokensから取得できます。トークンは、新しく作成されたリポジトリへのアクセスと、Read access to metadataおよびRead and Write access to issues and pull requests権限のみに細かく制限することをお勧めします。

適切に実行するには、以下のプレースホルダー値を変更する必要があります:

  • YOUR_GH_USER:GitHubのユーザー名。
  • ISSUE_NUMBER:対話したいリポジトリのissue番号(例:リポジトリの最初のissueなら"1")。
  • YOUR_GH_REPO:対話したいリポジトリの名前(例:"harald")。
  • YOUR_GH_PAT:GitHubのアクセストークン。

完了したら、送信するペイロードのサイズをニーズに合わせて更新してください!

test_harald_gh.c#L9では、H_F_APPENDオペコードの4番目のパラメータがペイロードのサイズを表します。ペイロード構造を変更する際には、この値を適宜更新する必要があります。

テストバイナリをビルドし、これを実行します:

root@kitploit:~
./test_harald_gh

これにより、指定されたissueにコメントが作成されます。

許容される使用に関する免責事項

このリポジトリに含まれるソースコードは、ネットワークフィルタリングを回避し、セキュリティアプライアンスによる検出リスクを低減するために使用できます。このソースコードを使用する前に、あなたの使用があなたの管轄区域のすべての適用法に準拠していることを確認してください。

ツールをダウンロード