您的当前位置:首页正文

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\"<cin>>MSG.community;

cout<<\"choose input the name ,maxsize: 6\"<MSG.pdu.variable_bindings=new struct varBind[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{ cout<<(int)return_tlv_message[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[p]=get_pdu[begin++];

}temp_INTEGER[len]=0;

}void prinout( char temp_INTEGER[],bool change_line)//输出整数value部分

{ if(change_line)

{ std::cout<<(int)temp_INTEGER[0]<} else 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<<(int)temp_name[i++]<<\".\";

} std::cout<void Dcode_version( char temp_INTEGER[],int len)//version解析

{ std::cout<<\"version: \"<prinout(temp_INTEGER,true); }

void Dcode_OCTETSTRING( char temp_OCTETSTRING[],int len)//community解析

{ std::cout<<\"community: \"<\"<void Dcode_PDUTYPE(int Tlv_T)//pdutype解析

{ std::cout<<\"pdutype: \"<void Dcode_resid( char temp_INTEGER[],int len)//requestid解析

{ for(int g=0;g{ temp_INTEGER[g]<<=(len-1-g)*8; }int sum=temp_INTEGER[0];

for(int h=1;h{ sum|=temp_INTEGER[h];

}std::cout<<\"requestid: \"<void Dcode_errorstatus(char temp_INTEGER[],int len)//errorstatus解析

{ std::cout<<\"errorstatus: \"<prinout(temp_INTEGER,false);

switch (temp_INTEGER[0])

{ case 0:std::cout<<\" NoError\"<TooBig\"<case 3:std::cout<<\" BadValue\"<case 4:std::cout<<\" ReadOnly\"<void Dcode_errorindex( char temp_INTEGER[],int len)//errorindex解析

{ std::cout<<\"errorindex: \"<prinout(temp_INTEGER,false);

if(temp_INTEGER[0]!=0)

{ std::cout<<\" The\"<<(int)temp_INTEGER[0]<<\"name is wrong\"<} else std::cout<}void Dcode_name( char temp_name[],int total_name,int len)//标识符解析

{ std::cout<<\"name: \"<printout_OBJE(temp_name,len); }

void Dcode_value_INTEGER( char temp_INTEGER[],int total_name,int

len)//value解析

{ std::cout<<\"value: \"<prinout(temp_INTEGER,true); }

void Dcode_Null(int len)//Null类型解析

{ std::cout<<\"value: \"<void Dcode_IpAddress( char temp_ipaddress[],int len)//ipaddress解析

{ std::cout<<\"Ipaddress: \"<for(int mm=0;mm{ std::cout<void Decode_pdu(char get_pdu[])//主函数

{ std::cout<<\"parasing \"<<\"type\"<<\" \"<<\"len\"<<\" \"<<\"value\"<<\" \"<int total_INTEGER=0; int total_name=0;

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{ int Tlv_T=0;Tlv_T=(int)get_pdu[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抓包的过程基本掌握,分析分析方法也明白了。

因篇幅问题不能全部显示,请点此查看更多更全内容