第四周课上实验验收-网络嗅探账号密码
任务一 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
-
以管理员权限打开Visual Studio,新建一个Visual C++的Win32控制台应用程序,设置为空项目
-
打开项目属性,如图所示添加WPCAP和HAVE_REMOTE这两个宏定义
-
添加wpcap.lib和ws2_32.lib两个库。
-
添加包含路径(Include目录)和库路径(Lib目录)
-
完成以上步骤并点击确定保存设置以后,向项目添加需要的源文件即可。例如新建一个C++源文件(也可以添加现有的)不过不知道为啥编译出错,还好文件包中已经有.exe运行也可以试试它的功能。
2.3 WinPcap程序运行
-
点击 WinPcap下载
-
经过多次尝试尝试那个第三张是我的无线网卡。
3.在保存的data.txt文件中可以查找post内容,得到账号密码。
任务二:嗅探网站分析登陆账号和密码
-
嗅探软件用wireshark3.0.0版本,运行在windows10系统上,嗅探网址为http://www.tykd.com/
-
打开wireshark和cmd命令,先在cmd中ping 一下http://www.tykd.com/ ,确定其ip地址为17.56.157.205,再在wireshark中输入ip.addr == 47.56.157.205 ,筛选目的或源ip为这个IP地址的包,方便查找http链接形式。
- 查看http链接形式,可以确定登陆账号和密码。
- 还有一种筛选起来更为简单的方法。通常情况下,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会显示响应和传输数据的类型
步骤如下:
- 修改fidder设置
-
cmd中查看本机地址 192.168.0.119
-
打开手机连接到同一局域网的wifi,并修改该wifi网络详情(长按wifi选择->修改网络)->显示高级选项,选择手动代理设置,主机名填写Fiddler所在机器ip,端口填写Fiddler端口,默认8888,如下图:
4.手机登陆192.168.0.119:8888可以查询手机是否连接上fidder代理,并下载证书安装。
5.这时候在手机浏览器登陆新浪传输的数据包会被fidder嗅探。(例如加载图片也会显示出来)
6.手机登陆小木虫app试试能不能获取账号密码。(登陆信息虽然显示都是加密流量但是依旧可以查看登陆密码很奇怪)
- 电脑登陆天翼快递findder可以嗅探到密码。
8.手机登陆天翼快递看看能不能嗅探。(发现webforms可以查看到账户和密码)
感想收获
对网络嗅探的原理有了更近一步的了解,并扩展了新的抓包软件的使用,简单的winpcap和复杂的fidder等,实践确实挺耗费精力,但是收获也多。