TLDR :关于我如何辞去安全保卫人员的职务,并编写了自己的漏洞扫描程序。
以及如何赚钱。 最后是扫描器代码和规范。
谁和什么打破
在很久以前的1970年代,互联网就是这样。

对他的主要威胁是研究人员和爱好者,他们是最早接触大型公司文档和网络的人。
从那时起,互联网发生了很大变化。 对网络,服务和Web应用程序的攻击已日益普遍。 每天,开发人员和研究人员都会发现数十个漏洞。 同时,成千上万的站点被黑客入侵。
这在卡巴斯基实验室的攻击地图上清晰可见。 它显示IDS触发器,漏洞扫描和僵尸网络攻击。 该地图看起来像是一幅美丽的图画,仅在俄罗斯每天就有数百万的攻击。

网络犯罪不是由业余人员完成的,而是由数十人组成的有组织的团体进行的。 他们这样做是出于兴趣。 这是生意。 他们不是晚上在监视器前写着“ BLACK K0d”的黑帽家伙。 这些是在世界不同国家/地区的办公室里工作的积极参与社会的人。
我的职业生涯是几年,负责网络外围的安全性和Web应用程序的保护。 关于这段时期的经历,我将在本文中讲述。
如果您在电信,银行,提供商中工作/工作,或者您是大型公司的开发人员,尤其是如果您是安全人员,那么您就会知道,拥有超过10-15个站点的公司的安全性就是垃圾,地狱,死亡。
让我们尝试改善情况。 他们说安全是一个过程。
并且有很多过程。
简要列出它们:
- 威胁管理
- 漏洞管理
- 风险管理
- 补丁管理
- 身份和访问管理
- 安全预警
- 安全提供商管理
和其他。
我们不会考虑文章中列出的物种,欢呼。
其中有很多,收益取决于组织的规模,资产类型及其重要性。
我们将讨论一个将使小型企业受益的流程。
从拥有数十万卢布收入的在线商店,到拥有数十个数据中心的大型公司。
漏洞检测
为了了解有什么方法可以破解我们,让我们通过攻击者的眼神来看一下自己。
安全分析包括几个阶段。 对于每个阶段,我都会提供一组基本的实用程序供您使用。
- 收集有关哪些IP,域,子网的信息是我们的目标。 与其敲敲前门,不如寻找不安全的入口点。
dnsrecon, Fierce, Censys, reverse-PTR-lookup.
- 针对已知漏洞(CVE)的服务分析。 公共剥削对他们来说很普遍。
Vulners, exploit-DB, NIST, CVEdetails
- 分析弱密码服务。
potator, hydra
- Web应用程序的漏洞分析
Zap, Burp, w3af, Arachni
很酷
好酷 我们有一种方法和工具来检查1个站点。
检查+分析一项服务,以彻底弄清楚-一周或更长时间,将需要几天的时间。
不酷
问题是我们可能有多个服务。 例如/ 20子网。
4096个地址。 每个可以有65535个服务。 不酷
是的,有自动化的解决方案。 Qualys,Acunetix,Nessus都有国内供应商。 分析它们的优缺点后,我建议离开另一篇文章。
他们没有解决我的问题。 我决定需要修复它。 他辞去了工作,大约一年后他和我的同志们去了发展。
如何编写漏洞扫描器
让我们从我们想要获得的系统需求开始:
- 进行侦察并找到目标域和IP
- 监视网络外围。 他会看到新地址出现在范围内还是子域出现在受保护的站点上
- 不断检查地址,查看何时打开和关闭网络端口
- 查找漏洞和著名的标语/ CPE漏洞
- 领取弱密码
- 查找应用程序和操作系统配置错误
- 查找CMS及其插件中的漏洞
- 交互式地找到XSS,SQLi,XXE,RCE,LFI,RFI和OWASP的10个可以自动搜索的
- 他不止一次地这样做,但是会不断检查我的资源并在出现新漏洞时做出反应
用户是大型网络范围(即具有10个或更多Web应用程序的网络范围)的所有者。
有必要每天并行扫描Web漏洞,弱密码,配置错误,并显示数百个IP和网站的外发攻击。
为此,请使用水平可伸缩系统。 您可以动态添加新节点和新类型的扫描仪。 现在,扫描仪使用7个节点,并在德国和美国分为2个相互影响的位置。 如果有兴趣,我们将在另一篇文章中进行介绍。
我们考虑了如何编写这样的扫描仪。 我们意识到,从头开始编写这样的系统毫无意义。 它需要丰富的经验和对不同平台的理解,它自己的网络指纹数据库,它自己的CVE数据库以及针对它们的漏洞利用,以及一个专门用于分析Web应用程序安全性的庞大系统。
在产品许可证允许的地方,我们决定使用开源开发。 有些组件是封闭源,但可以免费用于商业用途。 有很多自写的和派生的开源项目。
因此,我们大约有20种不同的应用程序,它们是覆盖自动渗透测试的L3-L7水平所必需的组件。
扫描仪接口
每个脚本(PoC拆分或二进制)都接受不同的参数以开始扫描。 不太方便。 我想获得启动任何可能的扫描仪的统一格式。
我们考虑了任何可能的扫描仪需要知道什么才能识别目标。 编译一个表。
检查类型 | 输入数据 |
---|
与漏洞利用和CVE数据库集成 | 供应商:产品:版本(CPE) |
PoC利用服务 | IP,端口,CVE |
布鲁蒂卡 | IP,端口,应用层协议 |
CMS扫描仪 | 域端口 |
Web漏洞扫描程序 | 域或IP端口 |
PoC Web漏洞 | URI |
端口扫描器 | 知识产权 |
进行初步的nmap检查和访问每个主机的CVEdetails的插件后,我们得到了一组此类对象。 我们称它们为元数据。
JSON表示形式:
{ "cves": [], "service": "mysql", "protocol": "tcp", "target": "example.com", "time": "1513941789", "product": "mysql", "vendor": "mysql", "version": "5.1.63-community", "port": 3306, "uri": "" }
对于Target上的每个端口,我们都会获得一组此类元数据。 现在,您需要了解我们的哪些扫描仪要为此目的工作。
所有扫描仪都有一个父级-ScanManager,这使其优雅:
product(scanners, metadata_as_list)
它接受所有服务,并针对每个服务检查所有可能的扫描仪。
每个扫描仪均提供确定其是否要使用此类Target的功能。
让我们谈谈扫描仪是什么。
考虑了三个选项:
- 将每个扫描程序实现为支持我们的RPC的微服务
- 将每个扫描仪作为服务实施,并使用公共消息总线
- 第三选择
但是我们很懒惰,意识到在前两个选项的情况下,除了扫描程序本身之外,您还需要某种部署基础结构,编写RPC,并捕获该RPC的错误。 另外,我们想用Python编写所有内容。
我们尝试了几种解决方案。 我们研究了类似的扫描仪管理项目,例如Mozilla的Yandex Molly和Minion。 我们研究了Zap的w3af。 Burp有一个非常有趣的插件架构。
我们决定将每个扫描程序都实现为python中的可序列化函数。 这将使您可以将它们直接存储在rabbit-mq中,快速传递到不同的节点,自动执行。 我们可以添加新的扫描仪,而无需构建和共享应用程序。 实际上,我们获得了在python上分布式和异步执行功能的服务。
在我们的平台上启动的扫描程序应该是从Scanner基类继承的对象。
任何扫描程序都应接受元数据类型的对象作为输入,并返回漏洞类型的对象。
class Scanner(object): name = "scanner_base" vuln_type = "default_vuln_type" user_options = {} Vulnerability_body_fields_to_web_interface = [] def __init__(self, opts, target, metadata): self.metadata = metadata self.opts = opts self.target = target @staticmetod def circuit(Metadata): ''' . Metadata. CVE. ''' return [Vulnerability(), Vulnerability()] def check_start_condition(self): ''' , Target True, . False. ''' return True class ScannerError(Exception): def __init__(self, value): self.value = value def __str__(self): return repr(self.value)
我们面临的下一个任务是创建一个统一的格式,在其中我们可以存储任何扫描仪的输出。 无论是Web收割机,brutilka目录还是memcached PoC攻击。
我们决定不限制自己的格式,而是使用行业标准-CVE格式。 我们利用漏洞的元数据来丰富CVE,以便于存储和检索。 要存储特定于扫描仪的数据,请添加正文字段。 扫描仪确定应在Web界面中显示正文中的哪些键。
class Vulnerability(object): ''' body . ''' def __init__(self, target, port, scanner, text, VulnerabilityTypes, Score, protocol, UpdateDate=None, scan_date=None, Complexity=None, Access=None, CWEID=None, Authentication=None, Integ=None, PublishDate=None, Conf=None, ofExploits=0, Avail=None, CVEID=None, references=None, GainedAccessLevel=None, false_positive=False, fixed=None, body=None): scan_date = scan_date if scan_date is not None else calendar.timegm(gmtime()) references = references or [] body = body or {} self.name = self.construct_cve_name(VulnerabilityTypes, protocol, target, port, credentials, uri, params) self.data = { "target" : target, "port" : int(port), "Scanner": scanner, "Scan_date": scan_date, "Name": name, "UpdateDate": UpdateDate, "VulnerabilityTypes": VulnerabilityTypes, "Complexity": Complexity, "text": text, "Access": Access, "CWEID": CWEID, "Hash": sha1(self.name.encode('utf-8')).hexdigest(), "Authentication": Authentication, "Integ": Integ, "PublishDate": PublishDate, "Conf": Conf, "ofExploits": ofExploits, "Score": Score, "Avail": Avail, "CVEID": CVEID, "References": references, "GainedAccessLevel": GainedAccessLevel, "FalsePositive": false_positive, "Fixed": fixed, "Body": body } @staticmethod def construct_cve_name(VulnerabilityTypes, protocol, target, port, credentials, uri, params):
我们试图为扫描仪的作者提供最大的实施自由。
我们邀请您参与开发。
如何利用漏洞赚钱。
我们希望对安全性感兴趣的人,实用程序和脚本的作者,研究人员有机会绝对合法地将其工作成果货币化。
扫描仪称为METASCAN。 如果您有自己的脚本或1天的PoC漏洞利用程序,或者您自己是扫描仪的作者。 将扫描器格式的模块发送给我们david.ordyan@metascan.ru!
我们将按月向模块作者支付报酬,并宣布在11月30日之前接受模块。
我们将通过遍及2000多个站点的客户群并计算检测次数来对其进行测试。
根据发现的漏洞数量,前三名扫描程序的作者将获得:
- 第一名:31 337卢布。
- 第二名和第三名分别为13,370卢布。
同时,我们还将提供报价,以帮助他们签订合同并每月获得使用他们的扫描仪的奖励,直到他们发现漏洞为止。
11月之后,我们将扩大接收扫描仪的程序。
写信给david.ordyan@metascan.ru或TG https://t.me/METASCAN
BB8E 3D9B 04FF 70C9 A260 CD45 E0BF 4EB4 9838 A7EC
示例和代码将出现在这里