【Linux技术】linux黑客之网络嗅探底层原理

1.mystery引入
  1)网络嗅探属于网络攻防类的安全软件,其基于原始套接字技术开发的
  2)原始套接字是一种套接字底层技术,它工作在网络层
  3)谈到网络安全,刚好本学期学过这门课程,这里mystery总结下基于原始套接字技术开发的网络安全软件类型
   木马中的通信模块:为了躲避杀毒软件的检测,有一些木马程序采用原始套接字技术进行通信,例如,开启本地嗅探,对特定格式的ICMP报文进行响应触发。对外传输数据时采用自定义的报文格式,比如伪造成80端口中的请求或响应数据以逃过防火墙的阻断。
   伪造IP地址:生成自定义格式的IP报文,填充任意的IP源地址,以达到伪装自己的目的。在局域网上的ARP病毒就是基于这种原理
   拒绝服务攻击:类似于伪造IP地址,通过自定义特定格式的IP报文,向目标机器以送大量的同类型信息,以达到淹没对方处理能力的目的。由于这种非法报文会占据大量的目标机器的资源,造成服务不能正常运行,从而实现拒绝服务的目的。
   数据包嗅探:数据包嗅探是原始套接字技术最广泛的一项应用,通过设置网卡的工作模式,采集所有流经本网卡的网络数据包,通过分析数据包,以达到既定的目的

   4)在原始套接字中,执行数据发送要调用setsocketopt函数进行套接字的首部设定。设定套接字的首部选项IP_HDRINCL,不然系统会自动填充套接字的首部


2.实例操作
   1)实现一个简单的网络数据包嗅程序
   2)基本原理是:将网卡设为混杂模式,然后采集网络数据包,针对到来的数据包,按相应的协议字段进行反向解析,并输出到终端
   3)基本流程
   1)创建一个原始套接字,设置属性为SOCK_RAW,协议号htons(ETH_P_IP)
   2)循环调用recvfrom()函数,采集到来的网络数据包,并进行如下解析
   3)解析源MAC地址
   4)解析目的MAC地址
   5)解析源IP地址
   6)解析目的IP地址
   7)解析协议号
   8)若协议号为TCP或UDP,则解析数据包中的源端口与目的端口

   4)源代码

//rawsocket.c
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <linux/if_ether.h>
#include <linux/in.h>
#include <stdlib.h>
#define BUFFER_MAX 2048
int main(int argc, char *argv[])
{
    int rawsock;
    char buffer[BUFFER_MAX];
    char *ethhead;
    char *iphead;
    char *tcphead;
    char *udphead;
    char *icmphead;
    char *pHead;
    if((rawsock = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP))) < 0)
    {
        printf("error: create raw socket!!!\n");
        exit(0);
    }
    long framecount = 0;
    while(1)
    {
        int readnum = recvfrom(rawsock, buffer,2048,0, NULL, NULL);
        if(readnum < 42)
        {
            printf("error: Header is incomplete!!!\n");
            continue;
        }
        ethhead = (char *)buffer;
        pHead = ethhead;
        int ethernetmask = 0XFF;
        framecount++;
        printf("------------------Analysis   Packet [%d]---------------------\n",framecount);
        printf("MAC:");
        int i = 6;
        for(; i <=11; i++)
        {
            printf("%.2X:",pHead[i]&ethernetmask);
        }
        printf("---->");
        for(i = 0; i <=5; i++)
        {
            printf("%.2X:",pHead[i]&ethernetmask);
        }
        printf("\n");
        iphead = ethhead + 14;
        pHead = iphead + 12;
        printf("IP:");
        for(i = 0; i <=3; i++)
        {
            printf("%d",pHead[i]&ethernetmask);
            if(i != 3)
            printf(".");
        }
        printf("---->");
        for(i = 4; i <=7; i++)
        {
            printf("%d",pHead[i]&ethernetmask);
            if(i != 7)
            printf(".");
        }
        printf("\n");
        int prototype = (iphead + 9)[0];
        pHead = iphead + 20;
        printf("Protocol: ");
        switch(prototype)
        {
            case IPPROTO_ICMP:
                printf("ICMP\n");
                break;
            case IPPROTO_IGMP:
                printf("IGMP\n");
                break;
            case IPPROTO_IPIP:
                printf("IP\n");
                break;
            case IPPROTO_TCP :
                printf("TCP | source port: %u | ",(pHead[0]<<8)&0XFF00 | pHead[1]&0XFF);
                printf("dest port: %u\n", (pHead[2]<<8)&0XFF00 | pHead[3]&0XFF);
                break;
            case IPPROTO_UDP :
                printf("UDP | source port: %u | ",(pHead[0]<<8)&0XFF00 | pHead[1]&0XFF);
                printf("dest port: %u\n", (pHead[2]<<8)&0XFF00 | pHead[3]&0XFF);
                break;
            case IPPROTO_RAW :
                printf("RAW\n");
                break;
            default:
                printf("Unkown\n");
        }
        printf("-------------------------end-----------------------\n");
    }
}




3.mystery注解
   1)运行效果


   2)如图所示,运行此程序需要root权限
    原因:原始套接字提供管理下层传输的能力,他们可能会被恶意利用。因此,仅root组的成员能够窗口SOCK_RAW类型的套接字

   3)本程序是采用的PF_PACKET来创建的SOCK_RAW,即工作在数据链路层,另外也可以指定在网络层使用



4.mystery说明

   对于徐老师说的内容过少,我想说的是,这只是我在学习计算机网络时一个小小的知识点验证实验,记录了一些知识总结和心得体会,这只是学习,无关任何作业或者开发之说。

   本次活动的主题是"技术·分享·成长",个人觉得技术,也许能从一篇文章中看得出点端倪,但是分享和成长,应该是纵观整个博客吧。学生浅见,各位看官见笑了。

   开始我也想做成一个系列收录的文章,就像我整理数据结构与算法时一样,但是参赛的时候分开了,所以就只用了这一小部分,更多精彩,见博主的更多文章。


算法的艺术:http://infohacker.blog.51cto.com/6751239/1171388

算法之美,解剖艺术:http://infohacker.blog.51cto.com/6751239/1194158


   在此附上我学习计算机网络时的一系列心得体会此系列才是参赛的全部文章,我相信不管是对自己,还是对别人,总会有一定的帮助。


linux无连接编程技术:http://infohacker.blog.51cto.com/6751239/1155102

linux套接字技术之tcp:http://infohacker.blog.51cto.com/6751239/1155096

linux多路复用IO技术:http://infohacker.blog.51cto.com/6751239/1155107

linux网络嗅探底层原理:http://infohacker.blog.51cto.com/6751239/1155113

linux广播技术:http://infohacker.blog.51cto.com/6751239/1155115

linux组播技术:http://infohacker.blog.51cto.com/6751239/1155123

linux高性能网络服务:http://infohacker.blog.51cto.com/6751239/1155167

linux网络扫描程序开发:http://infohacker.blog.51cto.com/6751239/1155170

linux下http服务器开发:http://infohacker.blog.51cto.com/6751239/1155176


   我一直比较认同一句话:其实我们一直都不是很优秀,是别人的赞赏和鼓励,让我们有机会成为别人期待的样子!所以,我也一直用我希望被对待的方式去对待别人,在此感谢各们同行以及老师们的认可和支持,谢谢!我会努力做得更好!


本文出自 “成鹏致远” 博客,请务必保留此出处http://infohacker.blog.51cto.com/6751239/1155113

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值