如何编写漏洞扫描程序并利用漏洞获利

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):       # vuln_type:host:port:protocol:credentials:uri:params       return "{}:{}:{}:{}:{}:{}:{}".format(           VulnerabilityTypes,           target,           port,           protocol,           credentials,           uri,           params)   def __str__(self):       return self.data   def __repr__(self):       return self.name 

我们试图为扫描仪的作者提供最大的实施自由。
我们邀请您参与开发。


如何利用漏洞赚钱。


我们希望对安全性感兴趣的人,实用程序和脚本的作者,研究人员有机会绝对合法地将其工作成果货币化。


扫描仪称为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


示例和代码将出现在这里

Source: https://habr.com/ru/post/zh-CN427625/


All Articles