WireShark网络抓包实验
姓名:***
班级:网络工程
学号:*********
一.实验目的
學會使用snmpb分析mib tree,使用wireshark抓包以及分析該包。根據snmp協定,分析抓包軟體抓出的結果。
二.实验内容
1. 使用Snmp
1)安装snmpb
2)实验步骤
3)点击mib tree分析各结点
2.使用wireshark抓包
1)安装WireShark,中间会提示安装WinPcap,一切都是默认。
2)实验前先关掉联网的软件,防止产生一些不必要的流量,以利于实验分析。
3)打开WireShark,选择\"Capture>>Interfaces\选择自己的网卡。选择\"Start\"开始监控流量。
UDP协议分析,选择一个包单击,结果如下
抓包过程中发现TCP组播、HTTP组播等。
A.组播分析.
Ethernet II帧,
Src: RealtekS_46:f2:4f (00:e0:4c:46:f2:4f), Dst:IPv4mcast_66:74:6e
(01:00:5e:66:74:6e)。
源地址RealtekS,目的地址IPv4mcast_66:74:6e。
Internet Protocol(IP数据包),
User Datagram Protocol(UDP数据包), Src Port: irisa (11000), Dst Port: irisa (11000)。
B.ARP广播。
Ethernet II帧,
Src: FujianSt_f8:ec:eb (00:d0:f8:f8:ec:eb)[锐捷网络的交换机,这里显示\"福建实达网络\"], Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Address Resolution Protocol (request)(ARP数据包)
Sender MAC address: FujianSt_f8:ec:eb (00:d0:f8:f8:ec:eb)
Sender IP address: 10.1.10.254 (10.1.10.254)
Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00)
Target IP address: 10.1.10.135 (10.1.10.135)
ARP是一个三层的协议,直接跑在Frame之上
4)再次启动WireShark,打开网页[url]www.google.cn[/url],抓包。
C.HTTP数据包分析。
Ethernet II Frame,
Src: Elitegro_59:a7:88 (00:16:ec:59:a7:88)【VIA的网卡,这里显示Elitegro】,
Dst: FujianSt_f8:ec:eb (00:d0:f8:f8:ec:eb)
Internet Protocol,
Src: 10.1.10.157 (10.1.10.157), Dst: 203.208.33.100 (203.208.33.100)
【Google.cn的IP地址】
Transmission Control Protocol,
Src Port: hppronetman (3908), Dst Port: http (80), Seq: 0, Len: 0
从抓的包中可以看到Handshake).[syn][syn,ack][ack]
TCP的连接建立过程(Three-way
3.报文构造代码
void BindSequenceOf_TLV(unsigned char *return_tlv_bind,int
&return_tlv_bind_len,message MSG)//name value name value
{ for(int i=0;i<6;i++)//
{ //get return_tlv_bind
unsigned char return_tlv[50];int return_tlv_len=0;
unsigned char tlv_name[10]; int tlv_name_len=0;
unsigned char tlv_value[10]; int tlv_value_len=0;//for
if(MSG.pdu.variable_bindings[i].name.length()==0) continue;
else
{
Objectidentifier_TLV(tlv_name,tlv_name_len,MSG.pdu.variable_bindings[i].name);
Sequence_TLV(return_tlv,return_tlv_len,tlv_name,tlv_name_len);
if(MSG.pdu.pdutype==2)//SET_REQUEST
{ Null_TLV(tlv_value,tlv_value_len,25);
} else
{ Null_TLV(tlv_value,tlv_value_len,-1);
}//((*(MSG.pdu.variable_bindings+i)).name);
Sequence_TLV(return_tlv,return_tlv_len,tlv_value,tlv_value_len);
SequenceOf_TLV(return_tlv_bind,return_tlv_bind_len,return_tlv,return_tlv_len);
} } }
void PduSequence_TLV(unsigned char *return_tlv_Pdu,int
&return_tlv_Pdu_len,message MSG)//pdutype id 0 0 bind //,TLV &return_tlv_bind
{ switch (MSG.pdu.pdutype)
{ case 0: return_tlv_Pdu[0]=160;break;//A0H \"10100000\" request
case 1: return_tlv_Pdu[0]=161;break;//A1H \"10100001\" next_request
case 2: return_tlv_Pdu[0]=163;break;//A3H \"10100011\" set_request
case 3: return_tlv_Pdu[0]=162;break;//A2H \"10100010\" response
case 4: return_tlv_Pdu[0]=164;break;//A4H \"10100100\"
default: break;
}
unsigned char TLV_request_id[5];int TLV_request_id_len=0;
unsigned char TLV_error_status[5];int TLV_error_status_len=0;
unsigned char TLV_error_index[5];int TLV_error_index_len=0;
Integer_TLV(TLV_request_id,TLV_request_id_len,MSG.pdu.request_id); Pdu_Sequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,TLV_request_id,TLV_request_id_len);
Integer_TLV(TLV_error_status,TLV_error_status_len,MSG.pdu.error_status);//error_status;
Pdu_Sequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,TLV_error_status,TLV_error_status_len);
Integer_TLV(TLV_error_index,TLV_error_index_len,MSG.pdu.error_index);//error_index;
Pdu_Sequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,TLV_error_index,TLV_error_index_len);
unsigned char return_tlv_bind[50];int return_tlv_bind_len=0;//
BindSequenceOf_TLV(return_tlv_bind,return_tlv_bind_len,MSG);//varBind* variable_bindings;
Pdu_Sequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,return_tlv_bind,return_tlv_bind_len);
}void MessSequence_TLV(unsigned char *return_tlv_message,int
&return_tlv_message_len,message MSG)//version community snmppdu ,TLV &return_tlv_Pdu
{ unsigned char TLV_version[10];int TLV_version_len=0;
unsigned char TLV_community[10];int TLV_community_len=0;
Integer_TLV(TLV_version,TLV_version_len,MSG.version);//version
Sequence_TLV(return_tlv_message,return_tlv_message_len,TLV_version,TLV_version_len);
OctetString_TLV(TLV_community,TLV_community_len,MSG.community);//community
Sequence_TLV(return_tlv_message,return_tlv_message_len,TLV_community,TLV_community_len); unsigned char return_tlv_Pdu[150];int return_tlv_Pdu_len=0;
PduSequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,MSG);//PDUs pdu;
Sequence_TLV(return_tlv_message,return_tlv_message_len,return_tlv_Pdu,return_tlv_Pdu_len);
}void createmessage(char *Buffer,char *pdutype,int &leng_buffer)
{ using std::cout;
using std::cin;
using std::endl;
unsigned char return_tlv_message[300];
int return_tlv_message_len=0;
message MSG;
int i=0;
MSG.pdu.pdutype=atoi(pdutype);
cout<<\"choose input the community\"< cout<<\"choose input the name ,maxsize: 6\"< string input;//for input cin>>input; while(input!=\"send\") { MSG.pdu.variable_bindings[i++].name=input; cin>>input; } MSG.version=0; //MSG.community=\"public\"; MSG.pdu.error_index=0; MSG.pdu.error_status=0; MSG.pdu.request_id=abs(rand());//90 ...32767 MessSequence_TLV(return_tlv_message,return_tlv_message_len,MSG); leng_buffer=return_tlv_message_len; for(int l=0;l Buffer[l]=return_tlv_message[l];//(int) //cout<<(int)Buffer[l]<<\" \"; } cout< void strcpyTLV( char temp_INTEGER[], char get_pdu[],int k,int len)//字符串拷贝,拷贝value 部分 { int begin=k; for(int p=0;p }temp_INTEGER[len]=0; }void prinout( char temp_INTEGER[],bool change_line)//输出整数value部分 { if(change_line) { std::cout<<(int)temp_INTEGER[0]< void printout_OBJE( char temp_name[],int len)//输出标识符 { std::cout<<\"1.3.\";int i=1; while(i } std::cout< { std::cout<<\"version: \"< void Dcode_OCTETSTRING( char temp_OCTETSTRING[],int len)//community解析 { std::cout<<\"community: \"< { std::cout<<\"pdutype: \"< { for(int g=0;g for(int h=1;h }std::cout<<\"requestid: \"< { std::cout<<\"errorstatus: \"< switch (temp_INTEGER[0]) { case 0:std::cout<<\" NoError\"< { std::cout<<\"errorindex: \"< if(temp_INTEGER[0]!=0) { std::cout<<\" The\"<<(int)temp_INTEGER[0]<<\"name is wrong\"< { std::cout<<\"name: \"< void Dcode_value_INTEGER( char temp_INTEGER[],int total_name,int len)//value解析 { std::cout<<\"value: \"< void Dcode_Null(int len)//Null类型解析 { std::cout<<\"value: \"< { std::cout<<\"Ipaddress: \"< { std::cout<<\"parasing \"<<\"type\"<<\" \"<<\"len\"<<\" \"<<\"value\"<<\" \"< int len=0;int len1=0;int len2=0;int len3=0;int len4=0;//定义各length值 int len7=0;int len6=0;int len5=0;int len8=0; int i=2; while(i switch (Tlv_T) { case INTEGER :// 2 ++total_INTEGER; if(total_INTEGER==1)//vertion {len=(int)get_pdu[i+1]; char temp_INTEGER[10];// strcpyTLV(temp_INTEGER,get_pdu,i+2,len); Dcode_version(temp_INTEGER,len); i=i+len+1;//i=i+len+1+1; } else if(total_INTEGER==2)//requestId { len1=(int)get_pdu[i+1]; char temp_INTEGER[100];// strcpyTLV(temp_INTEGER,get_pdu,i+2,len1); Dcode_resid(temp_INTEGER,len1); } i=i+len1+1; else if(total_INTEGER==3)//errorstatus { len2=(int)get_pdu[i+1]; char temp_INTEGER[5];// strcpyTLV(temp_INTEGER,get_pdu,i+2,len2); Dcode_errorstatus(temp_INTEGER,len2); i=i+len2+1; } else if(total_INTEGER==4)//errorIndex { len3=(int)get_pdu[i+1]; char temp_INTEGER[5];// strcpyTLV(temp_INTEGER,get_pdu,i+2,len3); Dcode_errorindex(temp_INTEGER,len3); i=i+len3+1; } else //其他 { len4=(int)get_pdu[i+1]; char temp_INTEGER[100];// strcpyTLV(temp_INTEGER,get_pdu,i+2,len4); Dcode_value_INTEGER(temp_INTEGER,total_name,len4); i=i+len4+1;// } break; case OCTETSTRING:// 4 字符 len5=(int)get_pdu[i+1]; char temp_OCTETSTRING[50];// strcpyTLV(temp_OCTETSTRING,get_pdu,i+2,len5); Dcode_OCTETSTRING(temp_OCTETSTRING,len5); i=i+len5+1;break; case GetResponse://pdutype //int len=get_pdu[i+1]; Dcode_PDUTYPE(Tlv_T); case Trap: i=i+2-1;break; //int len=get_pdu[i+1]; Dcode_PDUTYPE(Tlv_T); i=i+2-1;break; case SEQ://seq 型 if(total_name==0) { i=i+2-1; } else { i=i+2-1; } ++total_name;break; case OBER://标识符 len6=(int)get_pdu[i+1]; char temp_name[100];// strcpyTLV(temp_name,get_pdu,i+2,len6); Dcode_name(temp_name,total_name,len6); i=i+len6+1;break; case Null://空类型 len7=(int)get_pdu[i+1]; temp_namek[10];//[len]; //strcpyTLV(temp_namek,get_pdu,i+2,len7); Dcode_Null(temp_namek,total_name,len7); i=i+1;break; // Dcode_Null(len7); case IpAddress://ip地址 len8=(int)get_pdu[i+1]; char temp_ipaddress[50];// strcpyTLV(temp_ipaddress,get_pdu,i+2,len8); Dcode_IpAddress(temp_ipaddress,len8); i=i+len8+1;break; default: break; } i++;}} 程序运行结果如下图: 我们实现了可以一次输入多个变量名,然后返回多个value的值。并对其解析。 我们把构造的报文发向网关172.30.15.1,然后还可以自己自定义访问权限。Public ,private 等。 抓包截图如下: 我们实现了,getRequest,getnextRequest,setRequest 及manager收到的报文,trap报文很遗憾没有实现。以下抓包抓的是set报文,为了方便起见,因为只是调试,我们把value字段的值定为25。 三.实验总结 通过本次实验,使用snmpb和使用wireshark抓包的过程基本掌握,分析分析方法也明白了。 因篇幅问题不能全部显示,请点此查看更多更全内容