大家好,最近看到国外有一篇和僵尸网络有关的文章,今天分享给各位。 当然,我们面对DDoS当然是可以防御的,就比如云清洗。我写这篇文章的目的是为了让大家更多的去了解如何防护DDoS攻击,所以请勿用作违法行为!愿这个世界再无黑产。 简单的 C&C 僵尸网络 这个 hackpack 将引导您完成一个基本框架,该框架从根本上表征了僵尸网络。 如果您以前使用过 C,它可能会有所帮助。 如果你喜欢这个教程,一定要给这个 repo 加星标! 注意:请勿将您在此处学到的任何内容用于恶意目的。 这个 hackpack 只是一个用于教育目的的僵尸网络案例研究。 在这个 hackpack 中学到的概念具有深远的用例(基本上与网络有关的任何事情)。 最重要的是,此 hackpack 旨在在本地进行测试和部署(因此请不要与其他黑客共享您构建的与此 hackpack 相关的任何内容)。 隐私很重要,所以请尊重它。 什么是僵尸网络? 在构建僵尸网络之前,了解什么是僵尸网络很重要。僵尸网络是能够远程接收命令并在本地部署它们的计算机网络。 或者,他们可以选择将信息中继回网络中的其他节点。 它们已被用于从分布式拒绝服务攻击到广泛部署的间谍软件的所有领域。 您过去可能听说过许多僵尸网络。 最突出的可能是 Mirai 和 Gameover Zeus,它们分别控制了 380 和 360 万台物联网设备。 僵尸网络执行某些任务的方式存在很大差异。 但是为了成功构建我们的僵尸网络,我们需要在我们的工作网络中确保以下功能。 我们的僵尸网络应该: 包括一个控制网络上所有其他节点的主节点; 在服务器上部署伪装的恶意软件/从节点; 将命令从主节点传输到从节点,执行并将输出返回给主节点。 这种结构是所谓的命令与控制僵尸网络的特征。 这些僵尸网络有一台主服务器和多台从服务器。 然而,这种僵尸网络风格已经过时,可以通过切断对主域的访问来轻松取缔。 更新和复杂的僵尸网络遵循点对点架构,其中管理员权限分布在网络中的所有节点或节点子集。 这些僵尸网络让安全专家非常头疼,因为没有中央控制点,并且可以增长到数百万个节点。 消灭此类僵尸网络本身就是一个有趣的读物。 然而,为了这个 hackpack 的目的,让我们保持简单。 我们将为 C&C 僵尸网络实现一个简单的从节点。 执行 这个 hackpack 将主要处理实现客户端恶意软件。 对于主服务器,我们可以使用开源 TCP 服务器调用 Netcat。 Netcat 与僵尸网络无关。 它只是一个方便的、既定的工具,我们可以重新使用它来向来自客户端的发送文本数据包(这才是真正的主人)。 我稍微调整了 netcat 服务器并将其编译为名为“master”的二进制文件。 这里不再需要工作了! 我们的主人已经准备好使用了。 奴隶 让我们继续讨论更有趣的部分:接收和执行远程命令(我们稍后会担心伪装我们的恶意软件)。 这里的目标是使我们的从节点尽可能简单并遵守上面详述的要求。 请注意,在 lib/macros.h 中定义了许多常量,因此可以随意使用它们。 所有实现的函数签名都可以在 lib/connect.h 或 lib/utils.h 中找到。 1. 启动 打开 bot.c 文件。 在我们的服务器中启动一个新节点时,我们可能应该命名它,以便 master 知道将命令部署到哪些客户端。 可以使用许多命名约定。 使用 IP 地址可能是最好的,因为它是每个客户端的唯一标识符。 然而,为了让普通人更容易阅读,让我们使用计算机的用户名。 使用 C 函数getenv()有论据"USER"返回计算机存储在 USER 环境变量中的任何内容。 这是存储用户用户名的一个地方,所以让我们使用它。 另外,既然你的奴隶正在运行,让我们找到主人。 为此,我们必须知道主人的 IP 地址。 每个网络设备都有一个 IP 地址。 它负责识别其他节点和位置寻址。 此外,master 可以有许多服务器在不同的端口上运行。 所以,我们不仅要连接到master,还要指定正确的端口。 此端口由主设备选择,但可以更改。 在这个 hackpack 中,我们想在本地进行测试。 因此,我们将使用您的计算机作为我们的网络。 每台计算机的本地 IP 地址(“localhost”也解析为)是"127.0.0.1". 在 master 中,我指定它在端口上运行9999. 有了这三样东西(主 IP 地址、主端口和从名称),我们就可以在服务器和客户端之间启动一个称为套接字的通信管道。 将这三个参数传递给函数init_socket()创建一个套接字。 init_function()不是内置的 C 命令。 相反,我们需要实施它。 然后,我们需要在堆栈上分配一些空间来保存传入的消息。 我们使用大约 10KB 的堆栈空间调用这个堆栈指针msg. 最后,有一个printf声明表示一切进展顺利。 char* name = //Get the client's username and store it in name int channel = //initiate a channel given SERVER, PORT, and name; //Allocate stack space of size CMD_LENGTH to hold data of type char. Call the stack pointer msg printf("%s joining the botnetn", name); 现在切换到 lib/connect.c。 让我们实施init_channel(). 首先,我定义了一个名为的堆栈字符缓冲区msg长度CMD_LENGTH和一个特殊的 C 网络结构称为server保存有关我们与 master 连接的信息。 首先将传入的 ip 地址从人类可读的格式(带有数字和点)转换为网络字节顺序的二进制格式。 这是使用一个名为的特殊 C 函数完成的inet_addr()来自套接字库。 它只是接收一个 ip 地址并将其以网络可用的二进制文件形式输出。 在 C 中,我们可以通过填写一个名为的结构体的字段来轻松地指定一个网络sockaddr_in.我们那个结构体的实例被称为server. 我们需要填写该结构体的 3 个字段:server.sin_addr.s_addr(主 IP 地址)、server.sin_family(指定通信域的 1 字节值)和 server.sin_port(我们将在主服务器上连接的端口) )。 sin_family 可以给出套接字库提供的 C 宏。 通常,在这种情况下,我们将此字段设置为AF_INET. 这意味着我们的连接通过 IP 地址识别网络节点,这正是我们想要的。 但是,也可以使用PF_INET这类似于AF_INET但指定网络可以使用协议中的任何内容来识别特定节点。 两者存在的原因还有很多假设的历史原因,但这是我真正不知道或真正关心的事情。 只需使用AF_INET. 最后,在设置服务器端口时,我们必须通过port通过一个特殊的函数调用htons()(服务器到网络短)。 这会将数据从服务器字节顺序转换为网络字节顺序。 这种字节顺序混乱与称为 Endianness 的东西有关。 最后,我们需要定义主从之间的实际连接! 为此,定义一个网络套接字,通过它可以发送数据。 将 master 视为有许多“电源插座”。 现在,我们需要在 slave 上构建一个适合 master 的“墙上插座”的“插头”。 我们可以使用套接字库的socket()功能。 多么方便!socket()包含 3 个参数:通信域、套接字类型和协议。 对于通信领域,您可能已经猜到了:AF_INET. 对于套接字类型,我们希望我们的套接字能够简单地双向传输数据。 因此,使用给定的宏SOCK_STREAM. 让我们不用担心套接字协议。 这是一个相当基本的网络,所以让我们使用一个值0表示默认协议。 该函数返回一个int代表套接字。 将此值存储在频道中。 接下来,我们要启动我们的插座(将奴隶插入主人的墙上插座)。 调用 C 函数connect(). 这需要三个参数:通道、sockaddr 结构和结构的大小(以字节为单位)。 如果connect()返回一个正整数,你与master的连接成功! 为了测试我们新发现的连接,让我们向 master 发送问候! 填充我们的消息缓冲区并使用respond()(尚未实施)发送msg通过通道回到主人。 最后,我们希望init_channel()函数返回这个成功的连接。 int init_channel (char *ip, int port, char *name) { char msg[CMD_LENGTH]; struct sockaddr_in server; server.sin_addr.s_addr = //convert the ip to network byte order server.sin_family = //set the server's communications domain server.sin_port = //convert port to network byte order int channel = //define a SOCK_STREAM socket if(channel 参考链接:github:https://github.com/TreeHacks/botnet-hackpack#1-initiation
版权声明:xxxxxxxxx;
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态