漏洞扫描器概要

Published: 2021年07月25日

In Auto.

甲方的扫描器与乙方安全公司的扫描器是不同的,比如甲方可以针对自己的业务开发IAST,在功能上也可以仅关注和自己业务相关的部分,一般能方便拿到流量可以做好被动扫描,还不比太在意速度与资源消耗等,而安全公司拿来卖钱的产品考虑的东西就多很多,为了投标要符合标准,要有必须的功能,为了竞标还要扫的足够快足够全,准确率足够高,实际场景中还要面对各种复杂的环境,需要处理好日志,报表,升级等功能,因此它们一般都是功能间与功能内模块话设计,甚至使用微服务独立功能,再使用任务调度中心连接彼此。

注:本文只是慢慢慢漫谈,基本不会涉及到实际内容,以免泄漏老东家信息,写完发现太单调了网上随便找了两张图放进去,之后再慢慢自己画吧。

测试

在开发之前,必须必须重中之重的先谈谈测试,漏扫两个点:误报与漏报,在面对厂商极度内卷的情况下,一出任何一个问题就会被客户diao,而扫描器肯定会不断迭代,这里面每次升级都必须进行部分或全部的扫描测试,毕竟经验很难看出某处改动会对哪一个漏洞扫描产生影响的,因此优质的测试环境至关重要。

CI/CD

这些测试每次手动完成特别耗时,一般一个开发流程是:开发->自测->审核入库->打包升级->测试->发布。一个没设计好的系统会在这里面经受无数的折磨,而把自动化脚本写完善一点会珍惜很多生命,写这个一般就涉及到三方,扫描器宿主机(如vsphere/hci)控制,扫描器控制,Git控制等。

这里是针对代码的路径进行测试,框架代码必须有单测且每次改动都要跑单测(回归测试),特别是fuzz的底层代码,否则就是修东墙补西墙。另外对于每一个插件也可以模拟响应测每个分支。

靶场

网上公开了很多靶场,下面列举了部分,这些靶场在测试一些fuzz功能时特别有用,可以把它们用于做自动测试或与友商竞品做对比测试:

  1. WPVWA
  2. juice-shop:OWASP Juice Shop: Probably the most modern and sophisticated insecure web application
  3. firing-range:Firing Range is a test bed for web application security scanners, providing synthetic, wide coverage for an array of vulnerabilities.  :
  4. 公共实例:
  5. Vulnerable-Web-Application:
  6. dvwa: 很多web安全入门练习的靶场吧,不过在用于做测试时可能需要修改,例如关闭登录,锁定安全等级等
  7. upload-labs: 一些上传漏洞场景
  8. baidu-security/app-env-docker: 类似与vulhub
  9. vulnweb:类似于vulhub
  10. vulhub: p神开源的漏洞环境,写Active插件也经常用到它 ...

公网环境

对于active漏洞,在某些情况下可以尝试公网的环境(郑重申明,该行为涉嫌违法):

  1. shodan,首先注册账号,免费版的账户可以多注册一些,因为免费版有限额。使用时一般直接搜索,搜索的关键词可以在网上查找指纹,根据应用的中文 英文常用名搜索,搜索后可以在旁边可以再根据服务类型等进行筛选,并根据已知的正确的页面提取关键字(或者版本格式)进一步搜索,高级语法可见 Complete Guide to Shodan.pdf

  2. zoomeye使用方法同shodan,可以先输入简单关键词搜索,再点击右侧的筛选条件获得准确的结果,也可见使用手册,有个小技巧就是它的免费版不支持翻页,只能查询很少的数据,可以不断地点击右侧的查询条件(如地理等来获取更多的数据)

3.fofa 使用方法同上,同样高级语法可见使用手册

自建环境

自建环境分两种,自己写的符合请求所期待响应的环境与自己搭建的有漏洞的环境,有时对某功能做单元测试时只能手写一个符合要求的测试样例,有时写插件想偷懒也会自己伪造一个漏洞,但这并不保险,实际环境可能很复杂因此写重要的active插件必须搭建真实环境,如对Weblogic漏洞必须搭建相关版本或所有版本的环境再挨个测试。

注:本文的Active插件是指针对已知漏洞发送特定数据包来进行检测的插件,如已知Windows SMB某版本存在某个漏洞,则可以开发一个对应的检测插件,将其称之为Active插件,与之对立的是Fuzz插件,它是用来检测未知漏洞的。

资产扫描引擎

这部分特别重要,用来识别有哪些资产(应用指纹粒度),它直接决定了后续扫描质量,一般是使用修改版的nmap(mascan的速度可通过nmap调参实现):

  1. 主机存活扫描,操作系统识别,端口开放情况,服务识别,及更进一步的web指纹识别,需要好好调参,并针对性调参(如在某些含防火墙的环境),扫描的数据需好好处理,如提取版本号等

  2. web是特殊情况,里面涉及更多道道需要单独再实现一套,详见web fuzz部分

  3. 某些系统会存在端口复用路由,有些nmap无法正确识别http/https或者说xx on ssl,各种特殊情况需要处理

资产扫描引擎在扫描器里一般是主动式的,若被动扫描器的话也可以实现为被动形式(某些AF/AC等也集成该引擎用),主动扫描会发送大量数据包,这部分就要熟悉下网络协议与nmap扫描原理了,引擎开发的好不好直接关系着扫描速度,例如一些大客户一来就是一个B段,给我扫,引擎不能打你就等几个月吧,还有一些神奇的情况一扫环境就崩了,一些防火墙撤不掉的扫出65535个端口的,一些偏门协议的(如摄像头的ONVIF等物联网相关内容),反正就是框架好好设计吧,目标就是杜绝重复扫描,充分分析扫描流量,尽可能多的提取信息,还要把一些举证信息和日志保留好!

然而,引擎是个你努努力就能够得着的,指纹数据才是真的需要精力积累,像fofa/zoomeye/quake这些都有很丰富的指纹库了,作为后来者咋整?网上搜一遍先集成进来,再批量扫网络提取产品名,再就不可说了,反正就是各种途径把指纹库集全!

弱密码引擎

就是实现各种协议的登陆部分,再写写调度,判断登陆成功/被ban等情况,可以参考海德拉美杜莎

image-20210725115039983

Active引擎

上面已经说啦就是已知漏洞扫描,可看看知道创宇的pocsuite,它会对已知漏洞写针对性的插件,它依赖资产扫描获取到的指纹信息,并针对该指纹调度相应插件进行扫描,这个东西是重中之中,之前见过一个叫爱冬夏(打码)的厂商骗不懂事的学生,说什么安全研究员,工作内容是复现漏洞写插件,就是写这个插件,可能还会附带提防火墙规则。

如下是pocsuite的某插件,用于扫描Redis的未授权访问,调度引擎根据资产引擎识别结果发现目标是Redis时就会调用该插件,它发送针对性的payload并检查返回判断是否存在漏洞。

class DemoPOC(POCBase):
    vulID = '89339'
    version = '3'
    author = ['seebug']
    vulDate = '2015-10-26'
    createDate = '2015-10-26'
    updateDate = '2015-12-09'
    references = ['http://sebug.net/vuldb/ssvid-89339']
    name = 'Redis 未授权访问'
    appPowerLink = 'http://redis.io/'
    appName = 'Redis'
    appVersion = 'All'
    vulType = VUL_TYPE.UNAUTHORIZED_ACCESS
    desc = '''
        redis 默认不需要密码即可访问,黑客直接访问即可获取数据库中所有信息,造成严重的信息泄露。
        说明:“此版本通过生成公钥写入redis文件后直接运行此脚本可在服务器上/root/.ssh文件下生成公钥”
    '''
    samples = ['']
    category = POC_CATEGORY.EXPLOITS.REMOTE
    protocol = POC_CATEGORY.PROTOCOL.REDIS

    def _verify(self):
        result = {}
        payload = b'\x2a\x31\x0d\x0a\x24\x34\x0d\x0a\x69\x6e\x66\x6f\x0d\x0a'
        s = socket.socket()
        socket.setdefaulttimeout(10)
        try:
            host = self.getg_option("rhost")
            port = self.getg_option("rport") or 6379
            s.connect((host, port))
            s.send(payload)
            recvdata = s.recv(1024)
            if recvdata and b'redis_version' in recvdata:
                result['VerifyInfo'] = {}
                result['VerifyInfo']['Info'] = "Redis未授权访问"
                result['VerifyInfo']['URL'] = host
                result['VerifyInfo']['Port'] = port
        except Exception as ex:
            logger.error(str(ex))
        finally:
            s.close()
        return self.parse_verify(result)

pocsuite还支持攻击代码,但是企业扫描器是不会实现该功能的,因为这个扫描器太复杂了,企业环境也太复杂了!active型插件扫描速度很快,结果也极具价值,由于是是直接触发漏洞,在企业中也需要特别注意不能影响业务,比如有的扫描方法是通过能不能对目标造成DoS来判断是否存在漏洞,这种要么放在危险插件分类中并给客户多次警告,要么就别写了,出问题赔不起。还有些漏洞也可能影响客户,如文件上传,文件修改(如配置文件),循环执行命令,数据库写入(如注册账号,日志信息。。),这些东西都要小心评估,尽量把副作用降到最低。

这里多提一嘴,你要去写这种插件,先问清楚是给多长时间,涉及哪些插件,什么一天一个插件,只写有Poc/Exp的漏洞插件就别去了,如果很弱很卑微算我没说,因为写这种漏洞可能一个环境就会搭个半天一天(奇葩情况时不时遇到),再写插件测试,你觉得有时间分析漏洞?分析个屁!哪有时间分析,把别人的poc改改完事了...

WEB FUZZ引擎

这玩意儿嘛也是不怎么好用但必须有,我觉得做的最好的就是awvs了,在他那学到了很多,下面也会涉及到它:

image-20210725115921917

爬虫模块

该模块和资产模块紧密相连甚至是它的一部分,在webfuzz中至关重要,研究它需要把MDN好好康康,在传统上会使用 requests + xpath + bs4 + re架构,现在基本使用Selenium+PhantomJS(webkit) / Puppyteer+Chrome了,使用时需要针对性的进行各种hook(如避免弹窗,弹窗确认,避免窗口被关闭等),一般添加任务时是指定输入点为根节点,从此节点横向向下扫描,并将所有请求和响应输出。在获取到请求和响应时需要对它们进行解析,请求里有很多输入点,而响应可能代表新的页面,需要解析伪静态,模拟点击form,另外别忘了sitemap.xml,robots.txt,feeds等也要扫扫。扫描过程中需要去重:

  • 从url入手:根据参数值将其分为两类:命令型,参数名为do,page,action,method等,参数值类似变量名。数据型,参数名为id,name,token等,参数值不象变量名(长度像hash,全是数字或数字开头,有特殊符号)。
  • 根据文档结构如使用局部敏感哈希(Locality-Sensitive Hashing, LSH),可以多搜搜论文

由于该任务极度耗费资源,因此需使用代理缓存,统一请求接口处理所有请求,在响应里封装请求耗时。另外必须写好资源管理或调度程序:

  • 宏观管理:对整个扫描进程,可使用cgroup限制
  • 微观管理:对扫描内部,可动态根据(带宽资源,CPU资源,内存资源,IO资源)动态调整任务数

另外爬虫可能需要反爬机制,需要识别需要登陆的页面,识别登录页,识别登出页,并在登陆页实现登录录制,有时可能需要被动代理模块来辅助爬取。关于爬虫可以参考如下文章:

数据分析模块

它的输入是由爬虫模块生成的原始的站点文件树,里面每一个页子节点包含原始请求和响应,非叶子节点即目录还包含孩子节点。需要解析每个树节点,识别出输入点等信息:

1.输入点识别,处理所有输入点,包括url里的参数,请求头,cookie,请求体

方式1. 从response里提取,url通过urlparse提取,headers直接拿,body含form参数和url参数,form里有input/options等,可通过xpath,bs4,re等工具提取,url是当前页面里包含的所有带参数的url,例如a标签,iframe标签,JavaScript标签,以及comment等里的带参数的url。它的缺点是无法获取类ajax输入点,而且会存在大量重复数据,去重复杂

方式2. 从request里提取,提取所有请求里的输入点(header, url),提取所有响应里的form输入点,由于整个站点文件根据path组成了目录树,所以不存在重复的情况,模拟用户点击由浏览器自动触发的请求,它里面的输入点就是包含正常数据的完整输入,质量也很高

请求头只在有其他位置输入点的页面进行测试,并且不测试一般无漏洞的头部。 请求体里的需要根据content-type进行解析,若multipart/form-data,json,xml等各种格式需要解析。

2.指纹识别

此处包括了web容器中间件指纹识别,应用指纹识别,所使用的语言,模块识别等,一般使用如下方法:

  • 检测请求头部如Server, X-Powered-By, Set-Cookie,一些应用会有自己的Cookie等头部
  • 正文特定结构内的内容,如foot里的powered by,如title里的信息,meta里的信息,一般会在特定区域里提取而不是全文匹配
  • 特定文件,如存在某特定URL,特定css,js,icon等,此处会判断文件存在性或hash值
  • 根据一些特殊页面,如404页面,无权限需跳转页面的行为分析。

对于爬取的结果处理可参考awvs,它很有学习价值。另外还可参考:Web指纹识别技术研究与优化实现Web Application finger printing一种有效的Web指纹识别方法WAD(Web Application Detector)...

扫描模块

由于webfuzz模块易误报,耗时久,因此可对插件做标记,再对其进行统计(运行时间,检出率,误报率),动态调整其权重,权重低的后扫描或者根据策略步扫描。

fuzz模块的输入数据分析模块的输出,如站点文件树,对这棵树整体与每个节点进行处理,此处以awvs调度逻辑为例:

  • PerFile:此目录下的脚本是当扫描器爬虫爬到文件后执行,比如你可以检查当前测试文件是否存在备份文件,当前测试文件的内容等;
  • PerFolder:此目录下的脚本是当扫描器爬虫爬行到目录后执行,比如你可以检测当前测试目录是否存在列目录漏洞等;
  • PerScheme:此目录下的脚本会对每个URL的 GET、POST结构的参数进行检测,AWVS定义了的参数包括HTTP头、Cookies、GET/POST参数、文件上传(multipart/form-data)……比如你可以检测XSS、SQL注入和其他的应用程序测试;
  • PerServer:此目录下的脚本只在扫描开始时执行一次,比如你可以检测Web服务器中间件类型;
  • PostScan:此目录下的脚本只在扫描结束后执行一次,比如你可以检测存储型XSS、存储型SQL注入、存储型文件包含、存储型目录遍历、存储型代码执行、存储型文件篡改、存储型php代码执行等;
  • PostCrawl:这部分的内容可在最后执行

该模块后续改动较少,需要最求运行效率,此处选择多进程同步实现,使用deasync将异步io改成同步代码,使用cluster实现多任务并发。由主进程分配任务,从进程循环接收任务并执行。

上面已经介绍的Active引擎,但是单独的Active引擎在某些情况下是无法扫出漏洞的,如网站部署目录有变化,由于插件本身不知道在哪个目录下它只能以根目录作为基础或者枚举几个目录,实际上可以充分利用爬虫和数据分析的结果识别出应用的根目录在站点根目录的哪个位置,如某网站存在http://www.victim233.com/halo/world/ecology/那么简单的active插件是扫描不到它的,此时数据分析模块分析出爬虫结果树里的/halo/world/ecology节点其实是ecology这个应用的根,于是就可以辅助active插件扫描了。同样爬虫的结果也能辅助接下来要讲的版本比较引擎。

另外现在也越来越多的会实现iast功能了,这部分没接触过不谈啦。

版本比较引擎

说实话我觉得这东西很傻逼,但是没办法,卷嘛,国外国内都在卷,我甚至见过某产品一个月新增了10万个插件,要问怎么做到的,版本比较嘛,其实像nessus这种看着几十万个插件的,95%以上都是版本比较插件。所谓版本比较,就是你首先呢拿个漏洞库,这东西还蛮多的,像NVD/CNNVD啥的都可以,然后进行数据处理,于是你就知道某个软件哪些版本存在什么漏洞了,接下来要做的一步就是怎么获取到目标的版本号。

这里先说说第一步获取数据库,这里面坑挺多的,因为几十万条数据你不可能挨个检查,只能先写个爬虫把原始数据弄下来,然后要归个类啊,翻个译啊,入个库啊才怪,实际情况会发现这个漏洞到底是什么类型的(CWE)?危险程度呢(CVSS)?最重要的受影响的版本号咋不同数据库写的不一样啊?甚至都和官方的不一样,该信谁啊?其实我们信谁不重要,客户信谁才重要,反正就是要把原始数据按照规范处理再入库。

数据有了,再看看怎么拿到版本号,如果能使用ssh之类的软件连进目标,一般一个-v参数就能获取到版本了,实际一般不会有登录扫描(此处必须说说某focus是真的骚,把弱密码等扫描的结果用来登入系统做更近一步扫描),而是使用资产扫描的流量,如一般连接某服务其banner就会返回版本号,其他的可能需要发送特定数据包来获取,这里面的坑点就是有些厂商啊(咬牙切齿)版本管理极其混乱,不同的版本版本号格式可能不同,最最讨厌的是喜欢用什么SP MP FPxx后缀又不说清楚版本号有什么含义,版本间是什么关系,比如大版本间是平行开发的那在比较时就不能认为7.0.1比6.5.3小,还有些厂商喜欢搞什么补丁版本,你远程获取不到,还有的厂商把漏洞修了不改版本号这不是为难我胖虎么?!

因此一般会对每个组件编写相应的版本获取与版本比较插件,前者作为资产扫描的一部分,后者是版本扫描的一部分。

这里列出一些漏洞库,它们内容大都重复,但又各有优势:NVD,CVE details,cve scap,VulDB,MITRE,Rapid7,Vulners,SecurityFocus,CVE Search,D2 exploit,安全客漏洞库,CNNVD,NSFocus漏洞库,ExploitDB,CXSecrutiy,Nmap seclist,packet storm,Tenable

注:一般版本比较引擎是最后执行的,因为其他部分执行时可能会收集到更多的版本信息。

基线核查

也叫基线喝茶吧,没做好就好被叫去喝茶了,所谓基线就是给你订一条条规则,什么密码要多长,几天改一次,不准安装什么服务这类东西,而核查就是检查有没有做到这些,咋办呢?有的公司喜欢往员工电脑装某不知名程序,装完后啥不知道?扫描器会使用两种方式,放已知名的agent去收集数据或者直接使用smb/ssh/rdp等协议登入,之后内就是执行各种命令再用正则匹配命令结果,就知道对方有没有做好了。基线和喝茶要更进一步用等保连接,等保咋做,基线!

DNSLOG

这里的dnslog不仅指使用dns传输数据,而是广义上的使用类似带外传输数据的机制,因为某些漏洞扫描是无回显的,如某命令注入是无法直接辨别命令是否成功执行,它既不延时也不回显,此时可以让其向外发送某数据包,该数据包携带某随机数,通过随机数即可与漏洞对应,通过是否接收到数据包判断是否存在漏洞,不过能写回显形式一定要写回显形式,例如Java某些场景已有成熟方案,DNSLOG在扫描器场景下容易出现各种限制。

image-20210725114914978

外网

在可连接外网时,还是很方便的,一般各种公开平台都可用(如ceye/dnslog等),不过商业扫描器的话一般是自己搭建咯。

内网

在很多情况下是不出网的,因此需要扫描器自身集成dnslog服务功能,一般根据漏洞利用情况需要实现如下功能: 1. 原始的dnslog功能:nslookup {random} {scanner_ip},不像能出网的情况,在内网必须使用参数指定dns查询的服务器为dnslog服务器地址(本文认为是扫描器地址),这在windows和linux都支持

  1. http log,目标能执行curl等命令,或漏洞是文件包含等,实现URL请求时可用

  2. ping包长度:ping -c 4 -s {random_size} {scanner_ip} & ping -n 4 -l {random_size} {scanner_ip},该方式很通用但是icmp的包大小有限制(65535),因此使用该方法必须与目标地址相关联,否则目标过多时随机数是不够用滴。

  3. ping模式串:ping -c 3 -p {random} {scanner_ip},只有linux可用但无icmp那种长度限制。

  4. 特殊协议,如rmi连接获取random提取信息

  5. 资源服务,有些漏洞触发需要先从外部服务器加载某文件或做类似交互,这也可由dnslog服务实现

插一嘴,命令执行要考虑如下问题:

  1. 通用,windows和linux都要存在

  2. 输出都是英文,中文容易编码错误

  3. 输入和输出要有区别以证明不是输入的简单回显而是真正执行了命令

  4. 命令需要有可是别的输出以判定命令执行成功

  5. 不影响目标,这个啊,说多了都是泪

如使用echo betamao^wulalabetamao$1wulala该命令在大多情况下都能准确判断命令执行情况。

其他部分

授权模块

嗦实发,授权就几个值,一般也就在入口做个判断,看能不能用,一般不聊防破解,毕竟都是企业用破解了被发现就是律师函警告(某厂商就特别喜欢用盗版然后等收函,扑哧),这里面就一个点签名私钥怎么保护上,要是一个员工都能接触到私钥,那不是偷一份走就能随便给别人授权了,所以一般的做法是把它放到一个很安全的服务器上,开发人员最多使用接口去请求签名,当然这些日志都会记下来,防内鬼是很必要的,虽然我特别讨厌某司最喜欢以最坏的恶意揣测员工。

升级模块

好的升级太重要了,但是扫描器其实挺复杂的,而且新产品可能迭代很快,特别某些公司还敏捷开发(笑死),版本发多了后鬼知道客户那是什么版本的,于是就是各种升级路线,升级失败不要紧,系统升崩了才好玩,虚拟机镜像还好重新导入一个,硬件盒子就只能返厂了,所以这一块别看着小设计起来还蛮有学问的,比如有人喜欢用发行版的包管理工具升,而有人喜欢喜欢自己设计一套升级系统,有人会用到多分区搞备份,又有人喜欢利用文件系统特性做快照恢复。另外升级包需要注意别被轻易破解或篡改了,一般都是全文加密加签名,先验证签名再解密酱紫的流程。其他不细说懂得都懂里面水太深。

日志与维护模块

处理下线上问题就知道日志写的好多重要了,还有维护模块,我的天瓜老爷,有的人喜欢在插件,循环里写些无用日志,一跑起来日志几百兆有用的99%都是重复的无效日志,而在日志中能找到问题那真的是沙里淘到金子的喜悦了,毕竟扫描器运行一次太太太耗时间了。而另一方面就是维护了,一个傻傻的扫描器不喜欢实现维护功能,那出问题咋办呢?让客户或技服现场开个向日葵/todesk/teamviewer你连过去,发现他连xshell都没有你再给他穿个shell工具,再传个navicat看数据库,输入原来只有开发者知道的超级管理员密钥(好了现在都知道了),进去看日志,看进程,看数据库。。。而有些产品会有维护模块,什么日志一键上传,一键与服务中心建立ssh隧道啥的,就很棒!

报表模块

扫描结果是给人看的,还要涉及到给不同的人看,我觉得吧能一眼看懂看清就好了,有的人尽喜欢整的花里胡哨的,这块没接触过不多少。

索索主流漏扫吧

和本文对标的漏扫,国外就NessusOpenvas(rapid7的nexpose🙅),国内是绿盟的RSAS,必须说它们做了很多年确实底蕴在那里,但是质量的要么不符合国情要么代码实习生写的!

openvasnessus同源,前者由GreenBone维护开源免费,后者是正统效果好很多,网上也只有在05年闭源前的源码了,作为商业应用它确实优化了很多东西,而且很多插件还是编译后不提供源码的。它们当然也使用同样的自创的nasl(nessus attack scripting language)语言开发扫描插件,该语言语法很简单可以直接从openvas里看lex,更多的问题是扫描器本身提供了很多库,这些库以编译后二进制形式发布,并且缺少官方文档,只能通过读插件加调试推测其作用。若自己要编写nasl插件,可下载sublime的语法高亮插件用着舒服点,并将其放入sublime的packages目录,若文件无法高亮请检查扩展名是否与其他包的冲突,另外在安装Nessus后,会在/opt/nessus/bin/nasl目录下存在nasl解释器,可用于运行nasl脚本,而对于调试只能使用print方法打日志了,这里列几个相关链接有需要可以康康:

[1] nasl2_reference [2] nasl_book [3] Adding custom NASL plugins to Tenable Nessus [4] Adding third party nasl plugins to OpenVAS [5] Using the 'nasl' Nessus Command Line Tool [6] nessus 文档下载 [7] nessus调试日志

至于RSRA似乎不便多说,只能说老牌厂商底蕴在那,其插件使用python或nasl开发,由于历史悠久可能有些遗留包袱不过还是有学习之处的。

关于自身安全

最后谈谈安全,一个扫描器吧,实现功能就很强了,被发现有安全漏洞最多比较丢脸其实影响不大,一般扫描器也不像服务器那样部署到关键位置,没准用完就关了,不过懂安全的人开发扫描器还是会从设计上开始考虑自身安全,当然做这东西的人能力真的良莠不齐,我见过最奇葩的是在扫描插件里使用eval解析目标响应的json格式数据,一度让我怀疑那家伙是友商派来的内鬼😂

事实上扫描器更关注自己会不会被破解,辛辛苦苦写的代码做的数据被别人偷走,所以需要对其做加固,这就分两层,系统级与软件级,因为一般企业级扫描器都是按镜像发布的,不是给你个安装包,所以它可以直接给个加密镜像,你能用但是没办法看到它的内部,比如用个全盘加密保护啊,只给你个沙盒shell啊,另一方面会做软件保护,这部分嘛就得分语言了,比如nessus用的自家的nasl,其实语法很简单,但是它生成语法树后没几个人知道怎么还原为脚本,而有的小机灵鬼抄了人家的脚本就改改解释器,用个RC4加个密再改个后缀(这次就不点名了,那位同学自己心里有数)假装自己写的脚本,其实像C/Go这种写的能直接编译为二进制文件去符号后逆向难度都挺大,但是扫描器很少用他们,再说Nodejs的要么混淆要么直接用jit转本地代码,后者就很难了,事实上大部分企业用的是python开发,python嘛,保护方式就那么几种,就以网上最强的pyarmor说的高级,其实想破解一样没问题,而企业内部很少会花精力自己研制更安全的保护方案了,所以保护上限有限,你实在要搞我也没办法咯!

最最最最后再插一句,某些安全厂商被打怕了后特别机灵,一方面认真审计自己的产品,另一方面给产品做各种代码保护!!!然后你要挖它的洞,九牛二虎只力拿到镜像:

  • 来去符号的二进制文件 -> 就这?

  • 那我再加个控制流混淆,乱序和扁平化走你 ->. 嚯?瞧不起谁?

  • 那我关键代码再加个vmp吧 ->. XXXXX(骂骂咧咧)行吧我不行你都二进制,脚本语言呢?

  • 混淆加密一把梭. -> 挖,挖个屁,拜拜了您呢!