Linux C/C++ 入侵检测系统(IDS绕过技巧)

入侵检测系统(IDS)是一种网络安全设备,其主要功能是对网络传输进行即时监视,并在入侵检测系统(IDS)是一种网络安全设备,其主要功能是对网络传输进行即时监视,并在发现可疑传输时发出警报或者采取主动反应措施。相较于其他网络安全设备,IDS的主要特性在于其积极主动的安全防护技术。它不会跨越多个物理网段,通常只监听一个端口,不需要转发任何流量,只需在网络上被动、无声地收集所关心的报文。

在具体实现上,IDS首先提取收集到的流量统计特征值,并利用内置的入侵知识库对这些流量特征进行智能分析比较匹配。如果某个报文流量与预设阀值的匹配度较高,则该报文将被认为可能是攻击行为,此时,IDS将根据相应的配置进行报警或进行有限度的反击。

IDS实现原理及作用

IDS实现原理:

  - 网络流量分析:IDS监视网络上的数据流量,分析数据包的内容、来源、目标等信息,以寻找异常迹象。
  - 特征检测:IDS使用特定的规则或特征签名来检测已知的攻击模式或恶意行为。这些规则可以基于数字签名、统计学、行为分析等技术实现。
  - 异常检测:IDS还可以通过建模正常的系统和网络活动情况,然后检测出与正常行为明显不同的异常情况。

IDS作用:

 - 攻击检测:IDS可以检测到诸如网络扫描、拒绝服务攻击、恶意软件传播等各种类型的攻击行为。
 - 恶意行为分析:IDS能够发现系统内的恶意活动,如非法访问、异常登录行为等。
 - 事后审计:IDS记录异常事件和攻击行为,便于事后审计和安全调查。

总的来说,IDS的作用是帮助组织监控和保护其网络和系统,及时发现潜在的安全问题,并采取相应的措施来应对。IDS通常与其他安全解决方案如防火墙、入侵预防系统(IPS)等配合使用,形成全面的安全防护体系。

IDS 和iptables 配合使用

iptables 是一个 Linux 系统中用于配置和管理防火墙规则的工具,而入侵检测系统(IDS)则用于监测网络攻击行为并做出相应反应。在使用 iptables 时,可以与 IDS 配合使用,以提高系统的安全性和防护能力。
以下是一些使用 iptables 配合 IDS:

  • 启用 iptables 日志:iptables 可以记录防火墙的日志信息,包括拒绝的连接、异常流量等。将这些日志信息发送给 IDS,可以帮助 IDS 检测和分析攻击行为。在 iptables 规则中,使用 LOG 目标记录日志信息,然后通过 syslog
    或其他方式将日志发送给 IDS。
  • 定义自定义的 iptables 规则:使用 iptables 可以定义自定义的规则,以针对特定的攻击行为或异常流量进行过滤和阻断。可以将这些规则与 IDS 集成,以便在检测到攻击时自动应用相应的规则。
  • 与 IDS 进行联动:iptables 和 IDS 可以进行联动,以实现自动化的防御和响应。例如,当 IDS 检测到攻击行为时,可以触发
    iptables 规则的自动应用,以快速阻断攻击流量或隔离攻击者。同样,当 iptables 规则触发时,也可以通知 IDS
    进行进一步的分析和处理。
  • 管理和维护:在使用 iptables 和 IDS
    的过程中,需要定期管理和维护这些工具。例如,更新规则库、检查日志文件、修复配置错误等。确保定期进行安全审计和漏洞扫描,以确保系统的安全性。

总之,iptables 和 IDS 是 Linux 系统安全性的重要组成部分。通过合理的配置和管理这些工具,可以增强系统的防护能力,并提高对攻击行为的响应速度。

检测网络中的异常行为及代码实现

  • 入侵检测系统(IDS)可以通过在TCP三次握手时注入服务器来检测网络中的异常行为。具体来说,当客户端向服务器发起TCP连接请求时,IDS可以在中间插入自己的IP地址和端口号,与服务器进行通信。这样,IDS就可以截获并分析TCP连接过程中的所有数据包,以检测是否存在恶意攻击或异常行为。

    在TCP三次握手的过程中,客户端首先发送一个SYN包给服务器,表示请求建立连接。服务器收到SYN包后,会回复一个SYN-ACK包,表示同意建立连接。最后,客户端再回复一个ACK包,表示确认建立连接。在这个过程中,IDS可以截获并分析这些数据包,以检测是否存在恶意攻击或异常行为。

iptables -A OUTPUT -p tcp --sport 80 --tcp-flags RST RST -j DROP

这个命令的作用是在iptables防火墙规则中添加一条规则,用于阻止所有从本地主机(源IP地址)发出的TCP连接请求,这些请求的目标端口是80,并且具有RST标志。当满足这些条件时,该规则将丢弃这些连接请求。

...

#define DATA "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 21\r\n\r\nyou have been hacked!"

...
pcap_t* open_pcap_socket(char* device, const char* bpfstr)
{
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_t* pd;
    uint32_t  srcip, netmask;
    struct bpf_program  bpf;

    // 如果没有指定网络接口(设备),请获取第一个
    if (!*device && !(device = pcap_lookupdev(errbuf)))
    {
        printf("pcap_lookupdev(): %s\n", errbuf);
        return NULL;
    }
    
    // 打开设备进行实时捕获,而不是读取数据包捕获文件
    if ((pd = pcap_open_live(device, BUFSIZ, 1, 0, errbuf)) == NULL)
    {
        printf("pcap_open_live(): %s\n", errbuf);
        return NULL;
    }

    // 获取网络设备源IP地址和网络掩码
    if (pcap_lookupnet(device, &srcip, &netmask, errbuf) < 0)
    {
        printf("pcap_lookupnet: %s\n", errbuf);
        return NULL;
    }

    if (pcap_compile(pd, &bpf, (char*)bpfstr, 0, netmask))
    {
        printf("pcap_compile(): %s\n", pcap_geterr(pd));
        return NULL;
    }

    // 将数据包筛选器分配给给定的libpcap套接字
    if (pcap_setfilter(pd, &bpf) < 0)
    {
        printf("pcap_setfilter(): %s\n", pcap_geterr(pd));
        return NULL;
    }

    return pd;
}

void capture_loop(pcap_t* pd, int packets, pcap_handler func)
{
    int linktype;
 
    // 确定数据链路层类型。
    if ((linktype = pcap_datalink(pd)) < 0)
    {
        printf("pcap_datalink(): %s\n", pcap_geterr(pd));
        return;
    }
 
    //设置数据链路层标头大小
    switch (linktype)
    {
    case DLT_NULL:
        linkhdrlen = 4;
        break;
 
    case DLT_EN10MB:
        linkhdrlen = 14;
        break;
 
    case DLT_SLIP:
    case DLT_PPP:
        linkhdrlen = 24;
        break;
 
    default:
        printf("Unsupported datalink (%d)\n", linktype);
        return;
    }
 
    // 开始捕获数据包
    if (pcap_loop(pd, packets, func, 0) < 0)
        printf("pcap_loop failed: %s\n", pcap_geterr(pd));
}
...
void parse_packet(u_char *user, struct pcap_pkthdr *packethdr, 
                  u_char *packetptr)
{
...
    // 跳过数据链路层标头并获取IP标头字段
    packetptr += linkhdrlen;
    iphdr = (struct ip*)packetptr;
    strcpy(srcip, inet_ntoa(iphdr->ip_src));
    strcpy(dstip, inet_ntoa(iphdr->ip_dst));
    sprintf(iphdrInfo, "ID:%d TOS:0x%x, TTL:%d IpLen:%d DgLen:%d",
            ntohs(iphdr->ip_id), iphdr->ip_tos, iphdr->ip_ttl,
            4*iphdr->ip_hl, ntohs(iphdr->ip_len));
 

    packetptr += 4*iphdr->ip_hl;
    if (iphdr->ip_p == IPPROTO_TCP )
    {
        tcphdr = (struct tcphdr*)packetptr;
            
        addr_in.sin_family = AF_INET;
        addr_in.sin_port = tcphdr->source;
        addr_in.sin_addr.s_addr = iphdr->ip_src.s_addr;
        
        if (debug_output)
        {
            printf("[*] TCP  %s:%d -> %s:%d\t", srcip, ntohs(tcphdr->source), dstip, ntohs(tcphdr->dest));
            printf( "%c%c%c%c%c%c Seq: 0x%x Ack: 0x%x Win: 0x%x TcpLen: %d\n",
                (tcphdr->urg ? 'U' : '*'), (tcphdr->ack ? 'A' : '*'),
                (tcphdr->psh ? 'P' : '*'), (tcphdr->rst ? 'R' : '*'),
                (tcphdr->syn ? 'S' : '*'), (tcphdr->fin ? 'F' : '*'),
                ntohl(tcphdr->seq), ntohl(tcphdr->ack_seq), ntohs(tcphdr->window), 4*tcphdr->doff
            );
        }
        
        sender_port = ntohs(tcphdr->source);
        seq_number = rand();

        memset(synack_packet, 0, sizeof(synack_packet));
        memset(pshack_packet, 0, sizeof(pshack_packet));
        memset(finack_packet, 0, sizeof(finack_packet));
        memset(ack_packet, 0, sizeof(ack_packet));
        
        // 正在准备SYN-ACK数据包
        ipHdr = (struct iphdr *) synack_packet;
        tcpHdr = (struct tcphdr *) (synack_packet + sizeof(struct iphdr));

        ipHdr->ihl = 5;
        ipHdr->version = 4;
        ipHdr->tos = 0;
        ipHdr->tot_len = sizeof(struct iphdr) + sizeof(struct tcphdr);
        ipHdr->id = htons(rand());
        ipHdr->frag_off = 0x00; 
        ipHdr->ttl = 0xFF;
        ipHdr->protocol = IPPROTO_TCP;
        ipHdr->check = 0;
        ipHdr->saddr = iphdr->ip_dst.s_addr;
        ipHdr->daddr = iphdr->ip_src.s_addr;

        ipHdr->check = csum((unsigned short *) synack_packet, ipHdr->tot_len); 

        tcpHdr->source = tcphdr->dest; 
        tcpHdr->dest = tcphdr->source;
        tcpHdr->seq = htonl(seq_number);
        seq_number += 1; // 递增序列号
        tcpHdr->ack_seq = htonl(ntohl(tcphdr->seq) + 1);
        tcpHdr->doff = 5;
        tcpHdr->res1 = 0;
        tcpHdr->cwr = 0; 
        tcpHdr->ece = 0;
        tcpHdr->urg = 0;
        tcpHdr->ack = 1; 
        tcpHdr->psh = 0;
        tcpHdr->rst = 0;
        tcpHdr->syn = 1;
        tcpHdr->fin = 0; 
        tcpHdr->window = htons(15500);
        tcpHdr->check = 0; 
        tcpHdr->urg_ptr = 0;
        tcpHdr->check = tcp_checksum(tcpHdr, sizeof(struct tcphdr), iphdr->ip_dst.s_addr, iphdr->ip_src.s_addr);
            
        // 准备DATA数据包
        memcpy(pshack_packet, synack_packet, sizeof(struct iphdr) + sizeof(struct tcphdr));
        ipHdr = (struct iphdr *) pshack_packet;
        tcpHdr = (struct tcphdr *) (pshack_packet + sizeof(struct iphdr));
        data = (char *) (pshack_packet + sizeof(struct iphdr) + sizeof(struct tcphdr));
        strcpy(data, DATA);
        ipHdr->tot_len = sizeof(struct iphdr) + sizeof(struct tcphdr) + strlen(data);
        tcpHdr->seq = htonl(seq_number);
        seq_number += strlen(data);// Increment seq number
        tcpHdr->syn = 0;
        tcpHdr->psh = 1;
        tcpHdr->check = 0x0;
        tcpHdr->check = tcp_checksum(tcpHdr, sizeof(struct tcphdr) + strlen(data), iphdr->ip_dst.s_addr, iphdr->ip_src.s_addr);
            
        // 准备FIN数据包
        memcpy(finack_packet, pshack_packet, sizeof(struct iphdr) + sizeof(struct tcphdr) + strlen(data));
        ipHdr = (struct iphdr *) finack_packet;
        tcpHdr = (struct tcphdr *) (finack_packet + sizeof(struct iphdr));
        tcpHdr->seq = htonl(seq_number);
        seq_number += 1; // Increment seq number
        ipHdr->tot_len = sizeof(struct iphdr) + sizeof(struct tcphdr);
        tcpHdr->fin = 1;
        tcpHdr->psh = 0;
        tcpHdr->check = 0x0;
        tcpHdr->check = tcp_checksum(tcpHdr, sizeof(struct tcphdr), iphdr->ip_dst.s_addr, iphdr->ip_src.s_addr);
        
        // 正在准备ACK数据包
        memcpy(ack_packet, synack_packet, sizeof(struct iphdr) + sizeof(struct tcphdr));
        ipHdr = (struct iphdr *) ack_packet;
        tcpHdr = (struct tcphdr *) (ack_packet + sizeof(struct iphdr));
        tcpHdr->seq = tcphdr->ack_seq;
        tcpHdr->ack_seq = htonl(ntohl(tcphdr->seq) + 1);
        if (strlen((char*) tcphdr + 4*tcphdr->doff) > 0)
            tcpHdr->ack_seq = htonl(ntohl(tcpHdr->ack_seq) - 1 + strlen((char*) tcphdr + 4*tcphdr->doff));
        ipHdr->tot_len = sizeof(struct iphdr) + sizeof(struct tcphdr);
        tcpHdr->ack = 1; 
        tcpHdr->psh = 0;
        tcpHdr->rst = 0;
        tcpHdr->syn = 0;
        tcpHdr->fin = 0; 
        tcpHdr->check = 0x0;
        tcpHdr->check = tcp_checksum(tcpHdr, sizeof(struct tcphdr), iphdr->ip_dst.s_addr, iphdr->ip_src.s_addr);
        
        if (tcphdr->syn && !tcphdr->ack )
        {
...
            ipHdr = (struct iphdr *) pshack_packet;            
            if((bytes = sendto(sock, pshack_packet, ipHdr->tot_len, 0, (struct sockaddr *) &addr_in, sizeof(addr_in))) < 0)
                perror("Error on sendto()");
            else {
                printf("\t[+] [%s:%d] Sending HTTP response data\n", srcip, ntohs(tcphdr->source));
            }
            ipHdr = (struct iphdr *) finack_packet;            
            if((bytes = sendto(sock, finack_packet, ipHdr->tot_len, 0, (struct sockaddr *) &addr_in, sizeof(addr_in))) < 0)
                perror("Error on sendto()");
            else {
                printf("\t[+] [%s:%d] Closing connection. Sending FIN-ACK\n", srcip, ntohs(tcphdr->source));
            }
        }
        else if (tcphdr->ack && (tcphdr->psh || tcphdr->fin) && send_ack)
        {            
            ipHdr = (struct iphdr *) ack_packet;
            if((bytes = sendto(sock, ack_packet, ipHdr->tot_len, 0, (struct sockaddr *) &addr_in, sizeof(addr_in))) < 0)
                perror("Error on sendto()");
            else
                printf("[+] ACKing to [%s:%d]\n", srcip, ntohs(tcphdr->source));
        }
    }
    ...
}


int main(int argc, char **argv)
{
...
    
    sprintf(help, "usage: %s -i  -p  [-d] [-a]\n\t-d\tenable debug output\n\t-a\tsend ACK packet to every incoming data packet\n\n", argv[0]);
    
    if((sock = socket(PF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
        perror("Error while creating socket");
        exit(-1);
    }

    if(setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&one, sizeof(one)) < 0) {
        perror("Error while setting socket options");
        exit(-1);
    }
    
    while ((c = getopt (argc, argv, "hadi:p:")) != -1)
    {
        switch (c)
        {
        case 'i':
            strcpy(interface, optarg);
            break;
        case 'p':
            strcpy(port, optarg);
            break;
        case 'd':
            debug_output = 1;
            break;
        case 'a':
            send_ack = 1;
            break;
        case 'h':
        default:
            printf("%s", help);
            exit(0);
            break;
        }
    }
    
    if (atoi(port) < 1 || atoi(port) > 65535 || interface[0] == 0x0)
    {
        printf("%s", help);
        exit(0);
    }
    
    strcat(bpfstr, "tcp and dst port ");
    strcat(bpfstr, port);
    
    if ((pd = open_pcap_socket(interface, bpfstr)))
    {
        capture_loop(pd, 0, (pcap_handler)parse_packet);
    }
...
}

运行效果:
Linux C/C++ 入侵检测系统(IDS绕过技巧)_第1张图片If you need the complete source code, please add the WeChat number (c17865354792)

抓包效果:
Linux C/C++ 入侵检测系统(IDS绕过技巧)_第2张图片
IDS(入侵检测系统)绕过技巧

IDS(入侵检测系统)绕过技巧是指利用各种方法来规避或欺骗入侵检测系统的技术手段。IDS是一种网络安全设备,用于监测和检测网络中的入侵行为。它可以根据定义的规则识别可能的攻击行为并提供相应的警报。然而,攻击者可能会尝试绕过IDS以隐藏其攻击活动并规避被检测的风险。

以下是一些可能的IDS绕过技巧的原理和作用:

  1. 基于流量特征的绕过:攻击者可以利用特定协议或传输方式的特征来规避IDS的检测。例如,攻击者可以使用分片或隧道技术来分割或隐藏攻击流量,使其不容易被IDS检测到。

  2. 加密和隐蔽通信:攻击者可以使用加密通信方式或隐蔽通道来隐藏其攻击流量。这可以防止IDS对传输的内容进行检测和分析。

  3. 基于缺陷的攻击:攻击者可以利用IDS本身的漏洞或缺陷来绕过其检测机制。例如,攻击者可能发现IDS的规则规则不完善或配置错误,从而在不被检测到的情况下执行攻击。

  4. 欺骗:攻击者可能试图欺骗IDS来规避被检测。例如,攻击者可以发送特制的数据包以模拟合法流量,从而使IDS无法发现其中的恶意行为。

这些绕过技巧的目的是使攻击者的行为隐蔽,使其能够成功地进行攻击而不被检测或阻止。对抗这些绕过技巧的关键在于不断更新和改进IDS的检测规则和技术,以及加强网络安全防御的整体能力。

总结

入侵检测系统(IDS)是一种用于检测和识别网络攻击的网络安全工具。IDS可以监视网络流量,检测各种攻击行为,并发出警报或采取相应的防御措施。

Welcome to follow WeChat official account【程序猿编码

你可能感兴趣的:(C/C++,linux,c语言,c++,IDS,http,网络)