6月第4周网络安全报告:应用程序漏洞居首 占61.5%

6月第4周网络安全报告:应用程序漏洞居首 占61.5% IDC评述网(idcps.com)07月06日报道:根据CNCERT抽样监测结果和国家信息安全漏洞共享平台(CNVD)发布的数据得悉,在6月第4周(2015-06-22至2015-06-28)期间,我国互联网网络安全指数整体评价为良。

下面,请与IDC评述网一同关注在06月22日至06月28日期间,我国互联网网络安全状况:

(图1)6月第4周网络安全基本态势图

观察图1,可知在6月第4周,我国互联网网络安全指数整体评价为良。其中,境内感染病毒的主机数量为92.9万个,较上周上升67.7%;境内被篡改网站总数则降至4386个,环比上周减少16.4%,其中政府网站数量132个;

另外,境内被植入后门网站总数有1615个,环比上升4.5%,其中政府网站数量环比增加18.2%;针对境内网站的仿冒页面数量亦实现上涨,增至3881个,涨幅12.0%。

此外,新增信息安全漏洞数量达到143个,环比上涨30.0%。其中,高危漏洞数量增至39个,环比上升39.3%。

一、 网络病毒活动情况

(图2)网络病毒活动情况图

6月第4周网络安全报告应用程序漏洞居首占615

6月第4周网络安全报告应用程序漏洞居首占615

由图2可了解到,本周境内感染网络病毒的主机数量约为92.9万个,与上周对比,上升了67.7%,涨幅增大。其中,境内被木马或僵尸程序控制的主机为84.0万,环比增加79.8%;感染飞客(conficker)蠕虫的主机8.9万,环比增加2.8%。

(图3)网络病毒活动情况图

根据图3,本周新增网络病毒名称23个,较上周增加19个,变化幅度明显;而新增网络病毒家族仍为3个。

(图4)放马站点域名注册所属境内外分布

细看图4,IDC评述网注意到,本周放马站点域名注册所属境内外分布中,境内占比较上周有所增加,升至59.4%;而境外占比与未知属地占比均小幅下降,依次跌至40.0%、0.6%。

(图5)160个放马站点所属顶级域名

6月第4周网络安全报告应用程序漏洞居首占615

6月第4周网络安全报告应用程序漏洞居首占615

6月第4周网络安全报告应用程序漏洞居首占615

本周,发现放马站点共涉及域名160个。具体分布情况如图5所示:.COM占80.6%,.CN占7.5%,.NET占6.9%,.CC、.RU与.INFO各占1.3%,.ORG与.HK各占0.6%。环比上周,排名发生变化。

二、 网站安全情况

(图6)我国境内被篡改网站按类型分布

纵观图6,本周我国境内最容易遭到篡改的网站类型依然是.COM,其占比为74.2%,环比上周,下降了0.9%。接下来依次是.NET、.GOV、.ORG、.BIZ等等。其中,.BIZ跻身五强,成功取代.EDU。

(图7)我国境内被植入后门的网站按类型分布

通过图7,IDC评述网获悉,我国境内被植入后门的网站按类型分布,排在前5位的分别是.COM、.GOV、.EDU、.NET、.ORG。其中,.COM比重最大,占比达到51.1%。另外,.EDU占比由4.7%涨至5.5%,而.NET的占比则由5.5%减至4.8%,两者排名因此互换,.EDU升至第3,.NET降至第4。

三、重要漏洞情况

6月第4周网络安全报告应用程序漏洞居首占615

6月第4周网络安全报告应用程序漏洞居首占615

(图8)信息安全漏洞情况图

根据图8数据显示,本周新增的信息安全漏洞中,中危漏洞数量最大,为96个,约占总数的67.1%,环比上周,增加31.5%;另外,高危漏洞数量达到39个,环比增加39.3%;而低危漏洞数量则减至8个,环比下降11.1%。

(图9)本周收录漏洞按影响对象类型分布

观察图9,IDC评述网可清楚了解到,本周收录漏洞按影响对象类型分布情况:应用程序漏洞仍居首位,占比61.5%;WEB应用漏洞排名第2,占比18.9%;网络设备漏洞排名第3,占比12.6%;安全产品漏洞与操作系统漏洞并列第4,占比均为3.5%。环比上周,排名发生变化,操作系统漏洞排名上升1位。

综上,在6月第4周期间,我国互联网网络安全指数整体评价为良。未发现危害较为严重的网络安全事件。

6月第4周网络安全报告应用程序漏洞居首占615

6月第4周网络安全报告应用程序漏洞居首占615

 

第二篇:网络安全程序设计报告

基于原始Socket的网络嗅探器

1. 概述

本程序使用原始Socket来捕获网络内的数据包,通过将本机的网卡设置为混杂

模式,来使得网卡接收网络内的所有数据包,从而将其捕获。然后,将捕获到的数据包进行拆解,得到数据包内部的信息。

本系统目前支持TCP、UDP、ICMP包的解析。

1.1 程序的开发环境

使用的编程语言: C++

使用的开发工具: Visual C++ 6.0

1.2 小组成员及分工

2.背景知识

2.1 网卡的混杂模式

网卡的工作模式有正常模式和混杂模式两种。在正常模式下,网卡只接收目的地址是本机的数据包,其他的数据包全部丢弃。而网卡在混杂模式下,则接收所有经过网卡是数据包。

也就是说,混杂模式时网卡接收所有通过它的数据流,不论是什么格式,什么地址。具体的地址转发则是在接收到数据后由MAC层来进行。

通常在设计捕获数据包的程序时,均需要将网卡设置为混杂模式。

1

2.2 常用数据报的格式

2.2.1 IP数据报

IP数据报是分布于网络层的数据包,提高对网络中主机的地址定位操作。其中包含了重要的数据信息,包括发送数据包的主机,即源IP地址,接收数据包的主机,即目的IP地址。以及其他一些IP地址相关的的附加信息。

IP数据报的格式如下:

网络安全程序设计报告

网络安全程序设计报告

2.2.2 TCP数据报

TCP向应用程序提供可靠的数据传输服务。TCP数据报由TCP首部和TCP数据部分组成。其TCP首部的格式如下:

2.2.3 UDP数据报

UDP向应用程式提供无连接的数据传输。虽然UDP是数据传输可靠性不如TCP,但其资源占用少,传输速度快,使得其在某些场合使用十分适合。例如,传输零星数据,简单的文本传输等。

2

UDP数据报的首部仅仅有4个16位的字段,它们分别是UDP源端口,UDP目的端口,UDP数据报长度及校验和。

UDP头部格式:

2.2.4 ICMP数据报

ICMP是传输控制信息的报文,例如差错信息控制,目的地是否可达的信息等。标准的ICMP报文只有4个字节,但是在其多种控制报文中又有4个字节的控制信息,因此在ICMP的报文头部中应该加入该字段。

ICMP头部的格式

3.程序流程图

3.1 程序总体流程图

网络安全程序设计报告

网络安全程序设计报告

网络安全程序设计报告

3.1 程序主体流程图

4 图

3.2 程序创建套接字部分流程图

网络安全程序设计报告

图 3.2 创建套接字流程图

5

3.3 程序拆包部分流程图

网络安全程序设计报告

图 3.3 拆包部分流程图

6

4. 程序实现

4.1 程序中的重要函数

4.1.1 创建原始套接字

m_Sock = socket(AF_INET,SOCK_RAW, IPPROTO_IP );

socket()函数用于创建原始套接字,其中相关的参数说明如下:

AF_INET:设置套接字地址家族为TCP/IP地址家族

SOCK_RAW:设置套接字为原始套接字

IPPROTP_IP:设置套接字接收数据包,为IP层的数据包

4.1.2 设置套接字的工作方式,为混杂模式

WSAIoctl(m_Sock,SIO_RCVALL,&inBuffer,sizeof(inBuffer),&outBuffer,sizeof(outBuffer),&reValue,NULL,NULL)

WSAIoctl()函数用于设置网卡的工作模式位混杂模式,在此模式下网卡可以接

受所经过网卡的数据包。

WSAIoctl()函数的相关参数说明如下:

m_Sock:传入参数,标识一个套接字

SIO_RCVALL: 网卡的工作模式,混杂模式

&inBuffer: 设置输入的缓冲区

Sizeof(inBuffer):输入缓冲区的大小

&outBuffer:设置输出缓冲区

Sizeof(outBuffer):输出缓冲区的大小

&revalue:传出参数,指向函数实际返回的字节数的地址

NULL:传入参数,WSAOVERLAPPED结构的地址

NULL:传入参数,一个指向操作结束调用的例程指针。

4.1.3 接收数据包

ret = recv(pDlg->m_Sock,buffer,1000,0)

7

recv()函数用于接收经过网卡的数据包。其相关参数说明如下:

pDlg->m_Sock:接收使用的特定套接字

buffer:缓冲区

1000:缓冲区的大小

0: 其接收模式为正常接收

4.2 程序中的重要数据结构

4.2.1 IP头部结构

typedef struct HeadIP {

unsigned char headerlen:4;

unsigned char version:4;

unsigned char servertype;

unsigned short totallen;

unsigned short id;

unsigned short idoff;

unsigned char ttl;

unsigned char proto;

unsigned short checksum;

unsigned int sourceIP;

unsigned int destIP;

}HEADIP;

相关参数说明如下:

headerlen:首部长度,占4位

version:版本号,占4位

severtype:服务类型,占8位

totallen:总长度,占16位

id:标识

idoff:与上面的id共同构成标识,共占16位

ttl:生存时间,占8位

proto:协议,占8位

checksum:首部校验和,占16位

sourceIP:源IP地址,占32位

destIP:目的IP地址,占32位

8

4.2.2 TCP头部结构

typedef struct HeadTCP {

WORD SourcePort;

WORD DePort; DWORD SequenceNo;

DWORD ConfirmNo; BYTE HeadLen;

BYTE Flag;

WORD WndSize; WORD CheckSum; WORD UrgPtr;

} HEADTCP;

相关参数说明如下:

SourcePort:源端口号,占16位

DePort:目的端口号,占16位

SequenceNO:序号,占32位

ConfirmNO:确认序号,32位

HeadLen:首部长度

Flag:与HeadLen组成一个部分,占16位 WndSize:窗口大小,占16位

Checksum:校验和,占16位

UrgPtr:紧急指针,占16位

4.2.3 UDP头部结构

typedef struct HeadUDP {

WORD SourcePort;

WORD DePort;

WORD Len;

WORD ChkSum;

} HEADUDP;

相关参数说明如下:

SourcePort:源端口号,占16位

DePort:目的端口号,占16位

Len:UDP长度,占16位

Chksum:UDP校验和,占16位

9

4.2.4 ICMP头部结构 typedef struct HeadICMP { BYTE Type; BYTE Code; WORD ChkSum; Int Control; } HEADICMP;

相关参数说明:

Type:类型,占8位 Code:代码,占8位 Chksum:校验和,占16位 Control:控制信息,占32位

4.2.5 协议封装结构 struct PROTONAME{ int value;

char* protoname; };

相关参数说明如下:

Value:协议对于的常量值 Protoname:协议的名称 10

5. 程序界面

5.1 程序主界面

网络安全程序设计报告

图5.1 程序主界面

程序主界面上显示了如下信息:

一个列表框,显示了如下内容:

协议名称,源IP地址,目的IP地址,源端口,目的端口,数据包大小,以及数据。

两个按钮:

开始监听按钮:单击按钮开始监听网卡上的数据包

取消按钮:单击按钮停止监听,并推出程序

11

5.2 程序运行界面

网络安全程序设计报告

图5.2 程序运行界面 12

6.程序功能结构图

网络安全程序设计报告

图6.1 程序功能结构图 7. 程序主体函数

7.1 初始化套接字AfxSocketInit()

WSADATA data;

AfxSocketInit(&data);

AfxSocketInit()函数加载套接字,可以在程序推出时,自动关闭套接字。

13

7.2 监听函数OnBeginlisten()

void CSniffAppDlg::OnBeginlisten()

{

//创建套接字,原始套接字

m_Sock = socket(AF_INET,SOCK_RAW, IPPROTO_IP );

char name[128];

memset(name,0,128);

hostent* phostent;//hostent标识主机信息的结构体,gethostbyname的返回值类型

phostent = gethostbyname(name);

DWORD ip;

ip = inet_addr(inet_ntoa(*(in_addr*)phostent->h_addr_list[0]));//inet_addr将点分十进制的IP转换为网络字节序

//inet_ntoa将网络字节序的IP转换为点分十进制的IP,

int timeout = 4000; //超时4秒

//设置接收数据的超时时间

setsockopt(m_Sock,SOL_SOCKET,SO_RCVTIMEO,(const

char*)&timeout,sizeof(timeout));

sockaddr_in skaddr;

skaddr.sin_family = AF_INET;

skaddr.sin_port = htons(700);

skaddr.sin_addr.S_un.S_addr = ip;

//绑定地址

if ( bind(m_Sock,(sockaddr*)&skaddr,sizeof(skaddr))==SOCKET_ERROR)

{

MessageBox("地址绑定错误");

return;

}

DWORD inBuffer=1;

DWORD outBuffer[10];

DWORD reValue = 0;

//WSAIoctl设置套接口的工作方式,SIO_RCVALL为混杂模式

if

14

(WSAIoctl(m_Sock,SIO_RCVALL,&inBuffer,sizeof(inBuffer),&outBuffer,sizeof(outBuffer),&reValue,NULL,NULL)==SOCKET_ERROR)

{

MessageBox("设置缓冲区错误.");

closesocket(m_Sock);

return;

}

else

m_pThread = AfxBeginThread(ThreadFun,(void*)this);//启动接收线程

}

OnBeginListen()函数响应“开始监听”按钮的消息,执行监听功能。

7.3 拆包线程函数ThreadFun()

UINT ThreadFun( LPVOID pParam )

{

CSniffAppDlg* pDlg = static_cast<CSniffAppDlg*>(pParam);

MSG msg;//PeekMessage消息的参数

char buffer[1000],sourceip[32] ,*tempbuf;//设置缓冲区和源iP

char *ptemp;

BYTE* pData = NULL; //实际数据报中的数据

UINT sourceport ;

UINT deport;//增加的目的端口

CString str;//向列表中增加数据时,格式化非法数据

HEADIP* pHeadIP;

HEADICMP* pHeadICMP;

HEADUDP* pHeadUDP;

HEADTCP* pHeadTCP;

in_addr addr;//该结构体表示一个32位的IP地址

int ret;//错误检测函数的返回值

while (TRUE)

{

pData = NULL;

//接收主窗体发来的消息,来退出死循环

15

if

(PeekMessage(&msg,pDlg->m_hWnd,WM_CLOSE,WM_CLOSE,PM_NOREMOVE ))

{

closesocket(pDlg->m_Sock);

break;

}

memset(buffer,0,1000);

ret = recv(pDlg->m_Sock,buffer,1000,0);//recv为有连接的接收数据函数,0为接收模式,正常接收

if (ret == SOCKET_ERROR)

{

continue;

}

else //接收到数据

{

tempbuf = buffer;

pHeadIP = (HEADIP*)tempbuf;//提取IP头信息

//获取数据报总长度

//WORD len = ntohs(pHeadIP->totallen);//2字节网络字节序转化为主机字节序

//获取源IP

pDlg->m_List.InsertItem(pDlg->m_List.GetItemCount(),"");

addr.S_un.S_addr = pHeadIP->sourceIP;

ptemp = inet_ntoa(addr);

pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,1,ptemp);

//获取目的IP

addr.S_un.S_addr = pHeadIP->destIP;

ptemp = inet_ntoa(addr);

pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,2,ptemp);

//获取协议名称

ptemp = get_protoname(pHeadIP->proto);

strcpy(sourceip,ptemp);

pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,0,sourceip);

16

//获取IP数据报总长度 WORD ipSumLen = ntohs(pHeadIP->totallen); //IP数据报头总长度 int ipHeadLen = 20;//IP头定义为20字节 //获得去除IP层数据的长度 WORD netlen = ipSumLen - ipHeadLen; //根据不同大协议获得不同协议的数据 switch (pHeadIP->proto) { case IPPROTO_ICMP: { pHeadICMP = (HEADICMP*)(tempbuf+20); //Ip头为20字节 pData = (BYTE*)(pHeadICMP)+4; //ICMP数据报头共4个字节 //获取数据的长度 netlen -= 4; break; } case IPPROTO_UDP: { pHeadUDP = (HEADUDP*)(tempbuf+20); pData = (BYTE*)pHeadUDP+8; //UDP数据报头共8个字节 sourceport = ntohs(pHeadUDP->SourcePort); str.Format("%d",sourceport); //设置源端口 pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,3,str);

str.Empty();

deport=ntohs(pHeadUDP->DePort);

str.Format("%d",deport);

//设置目的端口

pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,4,str);

17

str.Empty(); netlen -= 8; break; } case IPPROTO_TCP: { pHeadTCP = (HEADTCP*)(tempbuf+20); sourceport = ntohs(pHeadTCP->SourcePort); pData = (BYTE*)pHeadTCP+20; //TCP数据报头共20个字节 str.Format("%d",sourceport); //设置源端口 pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,3,str);str.Empty(); str.Format("%d",deport); //设置目的端口 pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,4,str);str.Empty(); netlen-= 20; break; } } //设置数据大小 str.Format("%d",netlen); pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,5,str); str.Empty(); //设置数据 if (pData != NULL) { str.Format(" %s",pData); pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,6,str); } str.Empty(); pDlg->ShowInfo(); }

18

}

return 0;

ThreadFun()函数用于接收网卡上的数据包,并进行拆包,将其中的消息提取出来。以显示在列表框中。

7.4 获取协议函数get_protoname()

PROTONAME protos[11] = {

{IPPROTO_IP ,"IP"},

{IPPROTO_ICMP,"ICMP"},

{IPPROTO_IGMP,"IGMP"},

{IPPROTO_GGP,"GGP"},

{IPPROTO_TCP,"TCP"},

{IPPROTO_PUP,"PUP"},

{IPPROTO_UDP,"UDP"},

{IPPROTO_IDP,"IDP"},

{IPPROTO_ND,"ND"},

{IPPROTO_RAW,"RAW"},

{IPPROTO_MAX,"MAX"}

};

char* get_protoname(int protoID)

{

for (int i= 0; i<11; i++)

if (protoID == protos[i].value)

{

return protos[i].protoname;

}

return "";

}

get_protoname()函数用于获取数据包协议的名称,从而按照特定的方式解析协议。 而protos[]数组则是封装了常见的网络协议。包括IP、TCP、UDP、ICMP等。

19

8. 程序设计心得

本次程序设计是一个简单的网络嗅探器。

这个嗅探器是基于原始套接字的。其能捕获网络层的数据包,并且通过拆包来获取其中的包内容信息。

程序设计的过程中,遇到了一下困难,其中一个就是拆包部分的问题。数据指针如何提取数据包中的数据,又如何从控制数据指针的移动,找到相应的数据包的其他部分的信息。后来,通过对该部分进行一下合理的算法设计,得到了一个好的拆包方法。这样这个问题才得到解决。此外,还遇到了其他许多问题,在小组成员的共同努力下,问题都最终得到了解决。

当然,程序中还是存在很多不足,例如,执行拆包功能的线程不能随时终止,要停线程,必须退出程序。可能,其中还存在有未知的bug和问题,这些待进一步的完善。

另外,程序的功能上还是不够。可以进一步的扩充,例如增加对其他数据包解析的支持,增加解析数据的保持功能,增加对数据的分析功能等。

总之,程序还是完成了基本的功能,其中的不足待在进一步的学习中来提高和完善。

20

相关推荐