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

任务一 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===============\n");
//获取本地设备列表
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
	fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
	exit(1);
}
//输出列表
for (d = alldevs; d != NULL; d = d->next)
{
	printf("%d. %s", ++i, d->name);
	if (d->description)
		printf(" (%s)\n", d->description);
	else
		printf(" (No description available)\n");
}
if (i == 0)
{
	printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
	return -1;
}
//获取选择编号
while (1)
{
	printf("\nEnter 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, "\nError openning adapter: %s\n", errbuf);
	pcap_freealldevs(alldevs);
	return -1;
}
//检查链路层的类型
if (pcap_datalink(fp) != DLT_EN10MB)
{
	fprintf(stderr, "This program only run on Ethernet networks\n");
	pcap_close(fp);
	pcap_freealldevs(alldevs);
	return -1;
}
printf("The program is working......\n");
printf("The capture file is saving as 'data.txt'\n");
printf("You can input 'ctrl + C' to stop the program\n");

if ((file = freopen("data.txt", "w", stdout)) == 0)
	printf("Cannot open the file.\n");

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("==============================================================================\n");
	printf("No.%d\ttime: %s\tlen: %ld\n", count++, timestr, header->len);
	printf("==============================================================================\n");

	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] = '\0';
			printf("        ");
			printf("%s", temp);
			printf("\n");
			memset(temp, 0, LINE_LEN);
		}
	}
	printf("\n");
	//分析数据包
	ethernet_protocol_packet_handle(NULL, header, pkt_data);
}
if (res == -1)
{
	printf("Error reading the packets: %s\n", 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等,实践确实挺耗费精力,但是收获也多。

posted @ 2020-03-28 23:14  20199314贺泽华  阅读(580)  评论(0编辑  收藏  举报