
アジャイルなオンザフライプロトコル作成のためのインメモリ最小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は、プロトコルとして提供されるさまざまなオペコードをサポートしています。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::0x12 | 2つのレジストリ、または数値をレジストリに加算する | IsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2 |
| H_F_SUBSTRACT::0x13 | 2つのレジストリ、または数値をレジストリから減算する | 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として理解されるために送信する必要があるデータを生成します。SSL/TLS接続を開始し、ペイロードをHTTPトラフィックのように見えるように変更し、それを送信し、最後に接続を閉じます。
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
以下の例は、前の例と同じ手順に従います。ただし、ペイロードを単にボディとして送信する代わりに、プロトコルは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)を必要とする通信のための良いリファレンスです。