黑客24小时在线接单的网站

黑客24小时在线接单的网站

僵尸网络之如何防护DDoS攻击

大家好,最近在国外看到一篇关于僵尸网络的文章,今天就和大家分享一下。

当然,我们要面对DDoS当然,它是可以防御的,比如云清洁。我写这篇文章的目的是让你更多地了解如何保护它DDoS攻击,所以不要作为违法行为!愿这个世界没有黑产品。

简单的 C&C 僵尸网络

这个 hackpack 将引导您完成僵尸网络的基本框架。如果你以前用过 C,它可能有帮助。 如果你喜欢这个教程,你必须给它 repo 加星标!

注意:不要用你在这里学到的任何东西来恶意。hackpack 只是僵尸网络案例研究的教育目的。在这个 hackpack 中学到的概念有深远的用例(基本上任何与网络相关的东西)。最重要的是,这个 hackpack 目的是在当地进行测试和部署(所以请不要与其他黑客分享你建造的 hackpack 任何相关内容)。隐私很重要,请尊重它。

僵尸网络是什么?

在构建僵尸网络之前,了解僵尸网络是什么是非常重要的。僵尸网络是一个计算机网络,可以远程接收命令并在当地部署。或者,他们可以选择将信息中继到网络中的其他节点。 它们已经被用来攻击从分布式拒绝服务到广泛部署的间谍软件的所有领域。

你以前可能听说过很多僵尸网络。最突出的可能是 Mirai 和 Gameover Zeus,它们分别控制 380 和 360 10000个物联网设备。 僵尸网络执行某些任务的方式差异很大。然而,为了成功构建我们的僵尸网络,我们需要确保以下功能在我们的工作网络中。

我们的僵尸网络应该是:

                   
  • 包括控制网络上所有其他节点的主节点;
  •                
  • 伪装的恶意软件/从节点部署在主机上;
  •                
  • 将命令从主节点传输到节点,并将输出返回到主节点。

这种结构是所谓命令和控制僵尸网络的特征。这些僵尸网络有一个主服务器和多个从服务器。 然而,这种僵尸网络风格已经过时,很容易通过切断主域访问来禁止。 更新和复杂的僵尸网络遵循点对点架构,其中管理员权限分布在网络中的所有节点或节点子集。

这些僵尸网络让安全专家头疼,因为没有中央控制点,可以增加到几百万个节点。消灭这样的僵尸网络本身就是一本有趣的书。然而,对于这个 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=//Gettheclient'susernameandstoreitinname
  • intchannel=//initiateachannelgivenSERVER,PORT,andname;
  • //AllocatestackspaceofsizeCMD_LENGTHtoholddataoftypechar.Callthestackpointermsg
  • printf("%sjoiningthebotnet\n",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()函数返回成功的连接。

  • intinit_channel(char*ip,intport,char*name){
  • charmsg[CMD_LENGTH];
  • structsockaddr_inserver;
  • server.sin_addr.s_addr=//converttheiptonetworkbyteorder
  • server.sin_family=//settheserver'scommunicationsdomain
  • server.sin_port=//convertporttonetworkbyteorder
  • intchannel=//defineaSOCK_STREAMsocket
  • if(channel<0){
  • perror("socket:");
  • exit(1);
  • }
  • intconnection_status=//usethedefinedchanneltoconnecttheslavetothemasterserver
  • if(connection_status<0){
  • perror("connect:");
  • exit(1);
  • }
  • //sendagreetingmessagebacktomasterbyloadingastringintomsg(hint:snprintfwillcomeinhandy)
  • respond(channel,msg);
  • returnchannel;
  • }
  • 2. 监听消息

    一旦从车站连接到主站,需要不断监控消息,并立即按照命令采取行动。因此,让我们使用无限 while 循环接收和分析这些消息。bot.c 中,在printf添加一个调用两个函数的无限 while 循环:recieve()和parse()按这个顺序。 两个函数都取channel和msg堆栈缓冲区作为参数。lib/utils.h 找到他们的函数签名。这应该类似于:

  • InfiniteLoop{
  • recieve(...);
  • parse(...);
  • }
  • 去 utils.c 执行recieve()和respond().recieve()从频道抓取消息respond()通过通道发回消息。respond()参数为套接字地址,s,以及我们的堆栈缓冲区,msg_buf. 我们要用 C 函数write()将堆栈缓冲区包含的任何内容写入通道并返回其状态。write()需要 3 个参数:套接字地址、消息缓冲区和消息长度。

  • intrespond(ints,char*msg_buf){
  • //writethecontentsofmsg_bufintosocketsandreturnstatus
  • }
  • recieve()也是一个简单的帮手。msg缓冲区(提示:使用memset()read()阅读新闻。read()使用 3 参数:套接字地址、信息缓冲区和信息的最大预期长度。

  • intrecieve(ints,char*msg){
  • //resetthemsgbuffer
  • intread_status=//readcontentsofsocketsintomsg
  • if(read_status){
  • perror("log:");
  • exit(1);
  • }
  • return0;
  • }
  • 3. 执行命令

    很快就完成了! 我们的僵尸网络现在很无聊。它只能通过连接来接收和传输信息。让我们让它实际执行它在终端上收到的内容。让我们首先实现函数parse(). 它的作用正如其名:解析命令。我们可以做一些简单的错误检查来查看消息是否格式错误。此外,我们希望默默地忽略收到但并非有意为之的消息。该消息将从 master 格式化为(僵尸网络名称):(要执行的命令)。我为你做了前者。如果两次检查都通过了,让我们把命令传递给execute()功能。

  • intparse(ints,char*msg,char*name){
  • char*target=msg;
  • //checkwhetherthemsgwastargettedforthisclient.Ifno,thensilentlydropthepacketbyreturning0
  • char*cmd=strchr(msg,':');
  • if(cmd==NULL){
  • printf("Incorrectformatting.Reference:TARGET:command");
  • return-1;
  • }
  • //adjustthecmdpointertothestartoftheactualcommand
  • //adjusttheterminatedcharactertotheendofthecommand
  • //printalocalstatementdetailingwhatcommandwasrecieved
  • execute(s,cmd);
  • return0;
  • }
  • 关键部分,execute()应通过管道将收到的任何命令传输到终端,并将任何输出写入套接字回主。创建一个堆栈缓冲区,存储每行​​输入。 然后使用popen()C输入函数并将输出存储在文件中f这个问题有很多方法可以解决。

    你可以定制你的僵尸网络,用主输入做一些很酷的事情,并与僵尸网络中的其他节点进行一些独立的合作/更新。随意发挥你的创造力。我们现在只会坚持我们的香草目标)。 通过分析f通过套接字逐行存储所有内容。f 完成了!

  • intexecute(ints,char*cmd){
  • FILE*f=//usepopentorunthecommandlocally
  • if(!f)return-1;
  • while(!feof(f)){
  • //parsethroughflinebylineandsendanyoutputbacktomaster
  • }
  • fclose(f);
  • return0;
  • }
  • 使用以下终端命令编译您的新僵尸网络:

  • gcc-lcurllib/connect.clib/utils.cbot.c-obin/slave
  • 在终端窗口上运行 bin/master, 运行在其他窗口bin/slave。输入命令为(从用户名):(远程终端命令)。恭喜! 你刚刚建立了僵尸网络!

    4. 伪装你的恶意软件

    你可以做一些很酷的事情来伪装和部署恶意软件。事实上,它本身就是一个完整的领域。你可以做的一个例子是屏蔽恶意软件作为图像。让我们使用熊猫的图像。我在 utils.c 添加了一个可以卷曲熊猫图像并在预览中呈现的简单函数。这为用户提供了打开熊猫图像的概念,但实际上用户正在运行您的恶意软件。 添加它,请在 bot.c 包含以下代码行:

  • char*open_cmd=alias_img();
  • system(open_cmd);
  • free(open_cmd);
  • 接下来,右键单击任何图像并选择“获取信息”。对 bin/slave 执行相同的操作。将图像缩略图拖到 bin/slave 可执行缩略图。 这应该会改变它在桌面上的外观。然而,我们仍然缺乏特征 .png 文件结尾。重新命名您的可执行文件:

  • panda⒈png
  • 现在,它看起来像 png 文件。但是,我们使用 Unicode 字符“1”。代替 ”。” 隐藏这还是 Unix 可执行文件的事实。 你可以使用更可信的 Unix 技能,如用于屏蔽可执行文件名的 LEFT-TO-RIGHT OVERRIDE 字符。 在更极端的情况下,您可以在主机打开时将代码嵌入图像和文件宏(有点像特洛伊木马)......)。然而,因为 TreeHacks 没有人是网络罪犯,我们不应该太在意这些技术。

    5. 扩展

    既然你有一个僵尸网络可以正常工作,你可以用很多扩展来挑战自己。我们的僵尸网络仍然很无聊。除非用户每次都点击它,否则它无能为力。 以下是一些建议:

    (1) 实现持久性

    如果僵尸网络以某种方式留在计算机上,即使计算机关闭,它们也可以真正成为攻击者恶意活动的可靠来源。试着在每次启动时重新启动奴隶。 这样,一旦用户点击恶意软件,他/她的计算机就会被感染,直到他删除它。实现这一目标的一个建议是将您的可执行过程变成一个保护过程。 然后生成一个配置文件,将您的可执行文件添加到启动时应执行的保护程序列表中(云存储应用程序、团队信息传输平台等)。

    (2) 实现点对点网络

    实现平等网络无非是重新安排网络设计。P2P 网络的关键是管理员/攻击者可以通过网络上的任何节点实现主控。 因此,攻击者应该有一定的主密钥和加密登录来控制任何节点。

    (3) 添加多级误导

    你实现的主从结构不是很安全。从节点可以通过杀死主节点轻松释放。在最佳情况下,您将切换到 P2P 设计。但是,您也可以在将 master 的命令部署在僵尸网络之前,由一系列攻击者控制bot 随机引导其命令,以稍微改善 master 安全性。 这使得专家更难定位命令中心,跟踪攻击者节点和客户节点之间的僵尸网络调用。

    (4) 探索适当的网络协议

    也许,更重要的是,你想玩更多的网络。我们的网络很简单。在很多方面,它极其薄弱,绝对不严谨。因此,您可能想探索已建立的网络协议,如 Internet 中继聊天 (IRC),构建更合适的网络。虽然需要一段时间,但它具有很大的教育意义,是一项值得投资的投资。

    (5)尝试实现自己master

    在这个 hackpack 中,我们使用一个免费的开源项目来取代我们的主要服务器。然而,它涉及到许多缺点。 首先,我们不能定制我们的主要服务器来通过我们的网络发送自动命令。它仅限于使用命令线输入。 其次,你可能已经注意到僵尸网络上所有的奴隶都会收到每一个命令。

    我们执行的条件是检查目标名称是否与站名匹配。如果是 false,这个命令将被悄悄地删除。这被称为广播网络。更优化的可能是多个广播网络。 在广播网络中,节点将数据包连接到所有连接的节点。在多个广播系统中,您可以指定一个节点子集来接收数据包。 此外,使用多个广播网络将命令分配从客户端移动到其主要服务器。实现你自己的主要节点,从广播到多个广播。

    当然,我们要面对DDoS当然,它是可以防御的,比如云清洁。我写这篇文章的目的是让你更多地了解如何保护它DDoS所以不要把攻击当成违法行为!愿这个世界没有黑产品

    参考链接:github:https://github.com/TreeHacks/botnet-hackpack#1-initiation

       
    • 评论列表:
    •  馥妴辞忧
       发布于 2022-06-21 02:41:35  回复该评论
    • T,andname;//AllocatestackspaceofsizeCMD_LENGTHtoholddataoftypechar.Callthestackpointermsgprin
    •  冬马只酷
       发布于 2022-06-21 03:23:44  回复该评论
    • 消息是否格式错误。此外,我们希望默默地忽略收到但并非有意为之的消息。该消息将从 master 格式化为(僵尸网络名称):(要执行的命令)。我为你做了前者。如果两次检查都通过了,让我们把命令传递给exe
    •  泪灼酒颂
       发布于 2022-06-21 10:03:40  回复该评论
    • 点。 首先,我们不能定制我们的主要服务器来通过我们的网络发送自动命令。它仅限于使用命令线输入。 其次,你可能已经注意到僵尸网络上所有的奴隶都会收到每一个命令。我们执行的条件是检查目标名称是否与站名匹配。如果是 f
    •  寻妄折木
       发布于 2022-06-21 12:00:22  回复该评论
    • getenv()有论据"USER"存储在 中的返回计算机USER 环境变量中的任何内容。这是存储用户用户名的地方,所以让我们使用它。此外,既然你的奴隶在运行,让我们找到

    发表评论:

    Powered By

    Copyright Your WebSite.Some Rights Reserved.