Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
Harald — 一种用于无关的即时协议创建的内存内最小 CPU | Kitploit
工具/GitHubGitHub/gmh5225/harald
漏洞利用IDS/IPS规避脚本与自动化网络安全渗透测试命令与控制实用工具与框架红队Payload 开发
GitHubgmh5225/harald

Harald

一种用于无关的即时协议创建的内存内最小 CPU

1年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
查看仓库

Harald CPU

Harald 是一个内存中的微型高级 CPU,能够处理一组指令,以生成用于在给定网络协议(TCP/UDP)上使用的应用层协议。

Harald 将消费一个 OPCODES 流,并对载荷应用不同的转换,使其适用于所定义的应用层协议。

[!TIP] 为什么叫 Harald?你可能知道丹麦国王 Harald Gormsson, 因为他的绰号:Blátǫnn,或者用我们现在的说法,Bluetooth。 这项技术以 Harald 的绰号命名,因为他当时_连接_了丹麦 和维京王国。所以我用他的名字来命名这个项目。

图示

Harald 的行为类似于一个 CPU。它遵循一组定义动作的 OPCODES。 一个 PROTOCOL。Harald 将处理所需的操作,以动态创建所需的 协议。

一旦提供了 PROTOCOL,Harald 将遍历要发送的 PAYLOAD, 对每个片段完整执行一次 PROTOCOL。也就是说:如果载荷 必须被拆分成多个片段,Harald 将对每个片段使用相同的协议, 针对当前载荷片段执行协议中定义的每一个动作。

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将两个寄存器相加,或将一个数字加到寄存器中IsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2
H_F_SUBSTRACT::0x13将两个寄存器相减,或从寄存器中减去一个数字IsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2
H_F_READ::0x14从给定寄存器读取,最多读取到另一个寄存器中存储的长度FromReg::1, SizeReg::1
H_F_STORE::0x15将寄存器值存储到 Harald 的 Storage 中Reg::1

HTTP 示例

以下操作码流将生成发送所需的数据,使通信 被理解为 HTTP。它将发起连接、修改载荷使其 看起来像 HTTP 流量、通过 SSL/TLS 连接发送它,并在最后 关闭连接。

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. 将载荷拆分(0x03)为最大 0x000000FF 字节的块。
  2. 追加(0x01)接下来的 0x00000046 字节。(POST / HTTP/1.1\r\nHost: domain...)
  3. 计算片段长度(0x0D)。
  4. 将载荷中的片段大小信息(uint)编码(0x0A)为 字符串。
  5. 将信息注入(0x09)返回(H_REG_RET)寄存器。
  6. 追加(0x01)接下来的 0x00000004 字节。(\r\n\r\n)
  7. 注入载荷(0x04)
  8. 初始化套接字(0x05),使用 SSL/TLS,连接到 TCP 套接字, 目标为接下来 4 个字节中定义的 IP 地址(0x7F000001),以及 接下来 2 个字节中定义的端口(0x04D2)。
  9. 发送(0x06)载荷。
  10. 关闭(0x08)连接。

使用 GitHub API 的 HTTPS 示例

以下示例遵循与上一个示例相同的流程。然而, 它不是仅仅将载荷作为正文发送,而是让协议指示 Harald 设置一些头部并构造正文,以便它能够与 GitHub API 通信,在私有仓库的 issue 中发布评论。

这种通信方式可能帮助攻击者使用受信任的域名(如 *.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. 将载荷拆分(0x03)为最大 0x000000FF 字节的块。
  2. 追加(0x01)接下来的 0x00000185 字节。(POST /repos/... HTTP/1.1\r\n Host: domain...)这将包括 GH API 的头部,例如 Authorization、X-GitHubApi-Version 等等。
  3. 计算片段长度(0x0D)。结果存储在 H_REG_RET 寄存器中。
  4. 将长度为 0x00000001 0x0B 的值加(0x12)到 H_REG_RET 寄存器。 这将计入 Content-Length 头部中的 '{"body":""}' 字符。
  5. 将寄存器 H_REG_RET 编码(0x0A)为字符串。
  6. 将返回(H_REG_RET)寄存器中的信息注入(0x09)到 末尾载荷中。
  7. 追加(0x01)接下来的 0x0000000D 字节。(\r\n\r\n{"body":")
  8. 注入载荷(0x04)。
  9. 追加(0x01)接下来的 0x00000002 字节。("})
  10. 初始化套接字(0x05),使用 SSL/TLS 通过 TCP 套接字连接到接下来 16 个字节中定义的域名(0x0000000F) 以及接下来 2 个字节中定义的端口(0x01BB)。
  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

这将创建两个二进制文件: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 中创建一条评论。

可接受使用免责声明

本仓库中包含的源代码可用于规避网络 过滤并降低被安全设备检测的风险。在使用 此源代码之前,请确保你的使用符合你所在司法管辖区所有适用的 法律。

下载工具