• 第四周课上实验验收-网络嗅探账号密码


    任务一 WinPcap抓包工具使用和模块分析

    1.WinPcap 简介:

    Winpcap(windows packet capture)是在Win32平台上的强大的、有较好扩展性的底层网络分析体系结构,是Unix下的lipbcap移植到windows下的产物,是Win32环境下数据包捕获的开放代码函数库。
    WinPcap产生的目的,就是为Win32应用程序提供直接访问网络中的数据包(那些应用程序需要访问原始数据包,即没有被操作系统利用网络协议处理过的数据包); WinPcap提供了以下功能:/

    • 捕获原始数据包,无论它是发往某台机器的,还是在其他设备(共享媒介)上进行交换的
    • 在数据包发送给某应用程序前,根据用户指定的规则过滤数据包
    • 将原始数据包通过网络发送出去
    • 收集并统计网络流量信息

    2. WinPcap 模块结构:

    如图所示,Winpcap包含了一个内核级的数据包过滤器——NPF (Netgroup Packet Filter)、一个底层动态链接库(Packet.dll)和一个高层的独立于系统的库(Wpcap.dll)。这三个模块中,NPF属于内核级,其他两模块属于用户级。

    2.1 WinPcap 模块模块分析

    NPF模块过滤数据包,将数据包不做任何改动的传递给用户。
    Packet.dll模块提供了Win32平台下的捕获包的驱动接口,将应用程序和数据包监听设备驱动程序隔离开来,使得应用程序可以不加修改地在不同的WINDOWS系统上运行。基于Packet.dll编写的程序可以不经过重新编译就在各种Win32平台下实现捕获数据包。不过Packet.dll和NPF都依赖于操作系统。
    Wpcap.dll库不依赖于操作系统,并且它包含了一些其它高层的函数,比如:过滤器生成器、用户定义的缓冲区和高层特性(数据统计和构造数据包)。高级的静态链接库和应用程序编译在一起,它使用低级动态链接库提供的服务,向应用程序提供完善的监听接口。

    2.2 WinPcap 源码分析

    其数据格式主要包含以下7种,也表明winpcap只具备基础的数据存储和分析功能。

    • 以太网协议格式的定义
      typedef struct ether_header
    • 用户保存4字节的IP地址
      typedef struct ip_address
    • 用于保存IPV4的首部
      typedef struct ip_header
    • 用于保存TCP首部
      typedef struct tcp_header
    • 用于保存UDP的首部
      typedef struct udp_header
    • 用于保存ICMP的首部
      typedef struct icmp_header
    • 用于保存ARP的首部
      typedef struct arp_header

    主函数分析:

    int main()
    {
    pcap_if_t *alldevs;	//适配器列表,它是一个链表的数据结构
    pcap_if_t *d;		//保存某个适配器
    pcap_t *fp;
    int res;
    struct pcap_pkthdr *header;
    const u_char *pkt_data;
    time_t local_tv_sec;
    struct tm *ltime;
    char timestr[16];
    int count = 1;
    int i = 0, inum;
    char errbuf[PCAP_ERRBUF_SIZE];
    printf("===============Adapter List===============
    ");
    //获取本地设备列表
    if (pcap_findalldevs(&alldevs, errbuf) == -1)
    {
    	fprintf(stderr, "Error in pcap_findalldevs: %s
    ", errbuf);
    	exit(1);
    }
    //输出列表
    for (d = alldevs; d != NULL; d = d->next)
    {
    	printf("%d. %s", ++i, d->name);
    	if (d->description)
    		printf(" (%s)
    ", d->description);
    	else
    		printf(" (No description available)
    ");
    }
    if (i == 0)
    {
    	printf("
    No interfaces found! Make sure WinPcap is installed.
    ");
    	return -1;
    }
    //获取选择编号
    while (1)
    {
    	printf("
    Enter the interface number (1-%d): ", i);
    	scanf("%d", &inum);
    
    	if (inum > 0 && inum <= i)
    		break;
    }
    //跳到用户选择的适配器
    for (d = alldevs, i = 0; i < inum - 1; ++i, d = d->next);
    //打开适配器
    if ((fp = pcap_open_live(d->name, 65536, 1, 1000, errbuf)) == NULL)
    {
    	fprintf(stderr, "
    Error openning adapter: %s
    ", errbuf);
    	pcap_freealldevs(alldevs);
    	return -1;
    }
    //检查链路层的类型
    if (pcap_datalink(fp) != DLT_EN10MB)
    {
    	fprintf(stderr, "This program only run on Ethernet networks
    ");
    	pcap_close(fp);
    	pcap_freealldevs(alldevs);
    	return -1;
    }
    printf("The program is working......
    ");
    printf("The capture file is saving as 'data.txt'
    ");
    printf("You can input 'ctrl + C' to stop the program
    ");
    
    if ((file = freopen("data.txt", "w", stdout)) == 0)
    	printf("Cannot open the file.
    ");
    
    while ((res = pcap_next_ex(fp, &header, &pkt_data)) >= 0)
    {
    	//超时
    	if (res == 0)
    		continue;
    	//将时间戳转化为可识别格式
    	local_tv_sec = header->ts.tv_sec;
    	ltime = localtime(&local_tv_sec);
    	strftime(timestr, sizeof(timestr), "%H:%M:%S", ltime);
    
    	//输出编号、时间戳和包长度
    	printf("==============================================================================
    ");
    	printf("No.%d	time: %s	len: %ld
    ", count++, timestr, header->len);
    	printf("==============================================================================
    ");
    
    	char temp[LINE_LEN + 1];
    	//输出包
    	for (i = 0; i < header->caplen; ++i)
    	{
    		printf("%.2x ", pkt_data[i]);
    		if (isgraph(pkt_data[i]) || pkt_data[i] == ' ')
    			temp[i % LINE_LEN] = pkt_data[i];
    		else
    			temp[i % LINE_LEN] = '.';
    
    		if (i % LINE_LEN == 15)
    		{
    			temp[16] = '';
    			printf("        ");
    			printf("%s", temp);
    			printf("
    ");
    			memset(temp, 0, LINE_LEN);
    		}
    	}
    	printf("
    ");
    	//分析数据包
    	ethernet_protocol_packet_handle(NULL, header, pkt_data);
    }
    if (res == -1)
    {
    	printf("Error reading the packets: %s
    ", pcap_geterr(fp));
    	pcap_close(fp);
    	pcap_freealldevs(alldevs);
    	fclose(stdin);
    	if (file)
    		fclose(file);
    	return -1;
    }
    //释放
    pcap_close(fp);
    pcap_freealldevs(alldevs);
    fclose(stdin);
    if (file)
    	fclose(file);
    return 0;
    }
    

    2.3 WinPcap程序编译(未成功)

    WinPcap运行库为WinPcap_4_1_2.exe
    WinPcap开发包为 WinPcap 4.1.2 Developer's Pack

    所需软件及安装库已经上传到百度网盘链接:https://pan.baidu.com/s/1_wIj6YMsup6msNCKCD1e4w
    提取码:b2nz

    1. 以管理员权限打开Visual Studio,新建一个Visual C++的Win32控制台应用程序,设置为空项目

    2. 打开项目属性,如图所示添加WPCAP和HAVE_REMOTE这两个宏定义

    3. 添加wpcap.lib和ws2_32.lib两个库。

    4. 添加包含路径(Include目录)和库路径(Lib目录)

    5. 完成以上步骤并点击确定保存设置以后,向项目添加需要的源文件即可。例如新建一个C++源文件(也可以添加现有的)不过不知道为啥编译出错,还好文件包中已经有.exe运行也可以试试它的功能。

    2.3 WinPcap程序运行

    1. 点击 WinPcap下载

    2. 经过多次尝试尝试那个第三张是我的无线网卡。
      3.在保存的data.txt文件中可以查找post内容,得到账号密码。

    任务二:嗅探网站分析登陆账号和密码

    1. 嗅探软件用wireshark3.0.0版本,运行在windows10系统上,嗅探网址为http://www.tykd.com/

    2. 打开wireshark和cmd命令,先在cmd中ping 一下http://www.tykd.com/ ,确定其ip地址为17.56.157.205,再在wireshark中输入ip.addr == 47.56.157.205 ,筛选目的或源ip为这个IP地址的包,方便查找http链接形式。

    1. 查看http链接形式,可以确定登陆账号和密码。
    2. 还有一种筛选起来更为简单的方法。通常情况下,wireshark将会捕获很多流量数据,然而我们只需对POST数据感兴趣因为当你输入用户名和密码并点击登录按钮时,将会产生一个POST方法将你输入的数据发送到远程服务器上。直接在过滤器中输入正则表达式 http.request.method== "POST"。就可以筛选出用于登陆的post事件。查找起来方便很多。

    任务三 嗅探手机app登陆的数据包并进行分析

    参考这位大佬博客https://blog.csdn.net/weixin_34245169/article/details/94730936, 一共有三种方法
    (1).将tcpdump移植到Android平台,然后在命令行下启动tcpdump进行抓包。
    (2).使用fiddler,在windows系统上打开fiddler软件,该软件会将我们的电脑变成一个代理,然后在手机上设置wifi网络,将代理指定为开启fiddler的那台电脑,并且端口设置为fiddler侦听的8888端口,这时候使用手机访问的数据,就会通过该代理,在fiddler中就可以看到http的数据包。
    (3).通过各种方式在pc电脑上建立wifi热点,然后使用wireshark在pc电脑上监视该wifi热点,通过手机连接该热点访问网络。
    我是试了第二种方法,参考博客https://blog.csdn.net/jiangsanfeng1111/article/details/52448481 ,下载fidder,
    fidder会显示响应和传输数据的类型

    步骤如下:

    1. 修改fidder设置

    1. cmd中查看本机地址 192.168.0.119

    2. 打开手机连接到同一局域网的wifi,并修改该wifi网络详情(长按wifi选择->修改网络)->显示高级选项,选择手动代理设置,主机名填写Fiddler所在机器ip,端口填写Fiddler端口,默认8888,如下图:

    4.手机登陆192.168.0.119:8888可以查询手机是否连接上fidder代理,并下载证书安装。

    5.这时候在手机浏览器登陆新浪传输的数据包会被fidder嗅探。(例如加载图片也会显示出来)

    6.手机登陆小木虫app试试能不能获取账号密码。(登陆信息虽然显示都是加密流量但是依旧可以查看登陆密码很奇怪)

    1. 电脑登陆天翼快递findder可以嗅探到密码。

    8.手机登陆天翼快递看看能不能嗅探。(发现webforms可以查看到账户和密码)

    感想收获

    对网络嗅探的原理有了更近一步的了解,并扩展了新的抓包软件的使用,简单的winpcap和复杂的fidder等,实践确实挺耗费精力,但是收获也多。

  • 相关阅读:
    UISearchBar的常用代理
    iOS 上传图片压缩大小设置
    __weak typeof(self)weakSelf = self;的解释和使用
    运动事件(MotionEvent)
    iOS 获取当前window
    保留小数
    ios 转图片
    iOS提示弹窗
    iOS 获取ip地址
    微信小程序 watch监听数据变化 类似vue中的watch
  • 原文地址:https://www.cnblogs.com/morvalhe/p/12590150.html
Copyright © 2020-2023  润新知