原创 Paper | AiPy 辅助开发内核版 knockknock

admin 2025年6月9日21:46:19评论10 views字数 4141阅读13分48秒阅读模式
者:Hcamael@知道创宇404实验室
时间:2025年6月9日
最近在尝试AiPy[1]的应用场景,再加上最近得知了一个项目:knockknock[2]。所以我准备尝试一下,能否使用AiPy来开发一个自己的knockknock项目。
1. knockknock

参考资料

首先,什么是knockknock?这个项目有什么用?

假设这么一个场景,有一台外网的 VPS,为了安全考虑,需要开启防火墙,设置白名单访问。但是呢,你可能需要在家访问 VPS,而家庭宽带的 IP 是会时常变动的,现在 Linux 常见的防火墙只有两种:iptables 和nftables。

但不论是哪种防火墙,都无法设置域名白名单,只能设置 IP 白名单。这个时候我能想到两种方案:

  1. 自己实现脚本,通过 DDNS 域名,来更新防火墙配置。
  2. (iptables + ipset)/(nftables 自带 set) 可以和 dnsmasq 配合,当 dnsmasq 进行域名解析时,会更新 set 中的 IP。

上面两种方案都有各自的缺点,方案 1 会遇到 dns 解析缓存的问题,导致更新不及时,如果有多个用户需要使用这台 VPS,那么每个用户都需要配置 DDNS,过程稍微有点繁琐。方案二,本质上是dnsmasq 来更新 set 中的 IP,所以只有在解析域名时才会进行更新,并且只有在 openwrt 上才能比较方便的配置,如果是 ubuntu 系统的 VPS,配置就过于麻烦了。

但是在得知 knockknock 后,我们就有第三种方案:

  • 监听 VPS 的所有 TCP SYN 包(防火墙只能防止 TCP 链接建立,但是无法防止接收 TCP SYN 请求),当一个目标在规定时间(比如 5s 内),访问端口的顺序符合你的预期,那么就把该 IP 加入到白名单列表中。

Github 上的knockknock 使用 Python 实现了这一过程的服务端和客户端。客户端使用hping3来发起自定义 TCP SYN 包。

2. 使用AiPy开发自己的knockknock

参考资料

为什么要重复造轮子呢?因为监听网卡的 TCP SYN 包我认为是内核的工作,使用 python 来实现效率可能会更低,开销会更大,因此我想实现一个内核驱动版本的 knockknock 服务端。

另外,AiPy 是一个比较擅长使用 Python 来完成用户任务的 AI 助手,那如果让它开发一个 C 语言编写的内核驱动,效果如何呢?

2.1 构思

在使用 AiPy开发前,我们首先需要构思一下,该如何实现 knockknock,我们需要哪些功能。

首先,我们需要一个生成随机端口号的随机函数,但是又不能完全随机,因为我们需要在客户端能生成相同的随机端口号。我想到的一个方案是使用 TOTP,使用 TOTP 的值作为种子,生成随机数。

之前使用 Python 实现过 TOTP 的代码,如下所示:

DIGIT=10# 长度INTERVAL=60# 有效时间TOTP="xxxxx"# base32格式的密钥defgenerate_totp():timestamp=int(time.time())print("time: %d"%timestamp)timestamp=int(timestamp//INTERVAL)key=base64.b32decode(TOTP, True)msg=struct.pack(">Q", timestamp)h=hmac.new(key, msg, hashlib.sha1).digest()offset=h[-1] &0xFcode= (        (  h[offset] &0x7F) <<24| (h[offset+1] &0xFF) <<16| (h[offset+2] &0xFF) <<8| (h[offset+3] &0xFF)    )str_code=str(10_000_000_000+ (code%10**DIGIT))[-DIGIT:]returnstr_code

接下来,在认证成功后,还需要把 IP 添加到白名单列表中,所以需要执行用户空间的 Linux命令。最后,要确定 knockknock 主逻辑:

  1. 选择一个开始敲门的端口,比如 1。
  2. 当接收到 port=1 的 TCP SYN 包,则表示该 IP 接下来需要进入到敲门流程。
  3. 进入到敲门流程的 IP,需要在 60s 内完成 N 次敲门。
  4. 通过随机数函数,获取 N 个随机端口,进行敲门判定。
  5. 如果在规定时间内,敲门成功,则执行 xx 命令。

那么我们可以构造如下的提示词:

请帮我开发一个 Linux Netfilter内核驱动。该驱动的功能是一个 knockknock 服务。细节如下所示:

  1. 开发一个exec.c代码,实现一个执行 Linux 用户空间 shell 命令的函数。
  2. 开发一个otp.c代码,实现一个TOTP 算法,提供 Python 版本的 TOTP 算法参考:
DIGIT=10INTERVAL=60TOTP="XQUDRVF5P23K"defgenerate_totp():timestamp=int(time.time())print("time: %d"%timestamp)timestamp=int(timestamp//INTERVAL)key=base64.b32decode(TOTP, True)msg=struct.pack(">Q", timestamp)h=hmac.new(key, msg, hashlib.sha1).digest()offset=h[-1] &0xFcode= (        (  h[offset] &0x7F) <<24| (h[offset+1] &0xFF) <<16| (h[offset+2] &0xFF) <<8| (h[offset+3] &0xFF)    )str_code=str(10_000_000_000+ (code%10**DIGIT))[-DIGIT:]returnstr_code

3.开发一个random.c代码,实现一个一个函数,使用 TOTP 的值作为随机数种子,生成指定 n 个随机数序列,方位在20000-60000之间。

4.开发knockkncok_main.c主代码,实现一个 knockknock 驱动服务,监听 TCP SYN包,当收到一个port = 1的 TCP SYN包,表示该 IP 接下来需要进入敲门流程。进入敲门流程的 IP,需要在 60s内完成 8 次敲门,使用 random.c中的函数,获取 8 个随机数序列,进行敲门判定。敲门成功后,执行:ipset add whitelist %s timeout 3600s。

其他要求如下:

请一次性完整的开发代码,不要分多次编写代码。

由于 AiPy 最近几个版本新增了保存文件的功能,如果AI 编写一个文件中的代码,分成多次写入,执行的都是覆盖写,最终该文件中只有最后生成的部分代码。因此在提示词中需要添加:请一次性完整的开发代码,不要分多次编写代码。

2.2 防火墙配置

这里先讲解如何配置防火墙,使用的环境是:Ubuntu 22.04

在该系统中,不用直接配置 iptables 命令,因为有 ufw,使用起来更方便。(虽然 ufw 底层还是使用 iptables)

1.在/etc/ufw/before.rules中添加配置:

$ cat /etc/ufw/before.rules......-A ufw-before-input -mset--match-set whitelist src -j ACCEPTCOMMIT

2.通过 systemctl 开机自动创建 ipset 集合:

$ cat /etc/ipset.confcreate whitelist hash:ip timeout 3600$ cat /etc/systemd/system/ipset-restore.service[Unit]Description=Restore ipset sets at bootBefore=network-pre.targetWants=network-pre.targetDefaultDependencies=no[Service]Type=oneshotExecStart=/bin/sh -c'cat /etc/ipset.conf | /sbin/ipset restore'ExecReload=/bin/sh -c'cat /etc/ipset.conf | /sbin/ipset restore'RemainAfterExit=yes[Install]WantedBy=multi-user.target

了解了防火墙的配置后,就知道为啥 knockknock 敲门成功后执行的命令是:ipset add whitelist %s timeout 3600s。把指定 IP 添加到whitelist 集合中,并且设置了超时时间,我这里设置的是 1h,这个可以根据自己需求随意设置。

2.3 最终成果

不同的 LLM 能力不同,所以相同的提示词开发的情况也会有一定的区别,我这里记录一下我使用DeepSeek-V3开发的过程。

在使用初始的提示词询问后,AiPy 给我生成了5个文件:

  • otp.c
  • random.c
  • exec.c
  • knockknock_main.c
  • Makefile

除了 Makefile,其他都是我提示词中要求生成的文件,简单看了下,代码写的还不错。不过缺少了头文件。接下来,我通过提示词让其补充了:exec.hrandom.h代码。

尝试编译后,发现IP 转换使用了inet_ntoa函数,该函数没法在内核驱动中使用,因此通过提示词让其修改成:使用"%pI4"格式化字符串

再次尝试编译,发现TOTP 算法中需要使用hmac sha1算法,使用到了crypto_free_shash函数,经过研究发现,该函数需要在内核驱动的 init 函数中调用,组织一下语言,让 AiPy 帮我们修改一下,然后在编译一下代码,编译成功。

整个过程的历史记录如下所示:

原创 Paper | AiPy 辅助开发内核版 knockknock

最后,我自己手动加了一点日志,能更好的查看 knockknock 的工作情况,如下所示:

原创 Paper | AiPy 辅助开发内核版 knockknock

3. 参考链接

参考资料

[1] https://www.aipyaipy.com/

[2] https://github.com/moxie0/knockknock

原创 Paper | AiPy 辅助开发内核版 knockknock

原文始发于微信公众号(知道创宇404实验室):原创 Paper | AiPy 辅助开发内核版 knockknock

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月9日21:46:19
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   原创 Paper | AiPy 辅助开发内核版 knockknockhttps://cn-sec.com/archives/4150737.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息