且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

我谈网络扫描 -- 之二

更新时间:2022-10-04 20:09:21

在本系列文章的第一部分(我谈网络扫描 -- 之一),我们讨论了网络扫描基本和端口扫描技术,接下来,我们继续讨论漏洞扫描。
 
三. 常规漏洞扫描
1.漏洞(vulnerability)扫描原理分析
1)漏洞定义:
      软件代码中存在的缺陷(flaw),这种漏洞是开放人员的失误导致的,比如常见的缓存溢出(buffer overflow)这种漏洞,在代码上就表现为开发人员使用了诸如 C 语言的 strcopy 函数,但是又没有进行参数字符串长度检查;
      软件配置错误(misconfiguring),这种漏洞是维护人员的失误导致的,比如常见的盗链这种漏洞,在配置上就表现为维护人员没有在 WEB 服务器软件配置文件里面配置防盗链;
2)漏洞扫描目的:在黑客发现我们的系统漏洞之前,我们去发现自己系统的漏洞,并修复这些漏洞,从而使黑客无机可乘。
3)漏洞扫描过程:
      第一步,检查目标是否存在(alive);
      第二步,检查目标的操作系统类别和版本;
      第三步,检查目标开放的端口,和这些端口所对应的服务的细节:比如是什么软件开放的端口,软件的版本号,软件的补丁情况,相关配置等;
      第四步,将第二步和第三步的检查结果跟自己的漏洞特征库里面的特征进行比较,找出目标的漏洞;
      第五步,使用自己的攻击代码去验证第四步找出来的漏洞;
      第六步,给出扫描报告:其中包含目标的漏洞及相应的参考网址和修复建议;
4)几个术语的关联:漏洞,完全披露(full disclosure),CVE(通用漏洞披露),通过隐瞒实现安全(Security Through Obscurity),漏洞利用(exploit),概念证明(proof of concept), pen-test/bugtraq 邮件列表,漏洞扫描软件;
     如果我们关注过信息安全,这些术语我们肯定接触过,怎样把它们关联起来呢?
     a. 漏洞一旦被发现,往往会被发现者发布到 pen-test/bugtraq 邮件列表(
[url]www.securityfocus.com[/url]),而且,往往都附带了漏洞利用代码,  被称之为概念证明;
     b. 完全披露是一种漏洞披露的方法,就是一旦发现漏洞,就将其公布于众,让每人都知道这些漏洞,让厂家迫于压力而快速修复这些漏洞,让管理员和程序员能够学习到这些漏洞而不再制造同样的漏洞,但是也会让更多的“坏人”知道并利用这些漏洞。pen-test/bugtraq 在披露漏洞方面就是用的完全披露方法;
    c. 通过隐瞒实现安全:不让公众知道系统的细节将会更安全,漏洞的详细信息应该只限于厂商和少量安全专家知晓。事实证明,这种思想和做法并不能实现真正的安全; 
    d. 对于发现的漏洞,CVE(cve.mitre.org)对其进行编码,以便统一各个安全厂商和团体对该漏洞的引用;
    e. 漏洞扫描软件使用 pen-test/bugtraq 邮件列表里面披露的漏洞特征(和漏洞扫描软件开发商自己发现的漏洞特征)及漏洞利用代码(或开发自己的漏洞利用代码)来检查目标的漏洞,并且,其漏洞扫描报告中往往会包含对发现的漏洞的 CVE 参考;
5)推论:如果我们确实很关注系统的漏洞,那么不要太过于依赖漏洞扫描软件,应该订阅 pen-test 和 bugtraq 邮件列表,以便第一时间得知我们系统的漏洞(这两个邮件列表量都比较大,建议订阅每天一份的汇总邮件);
        如果不喜欢加入邮件列表,可以每天早晨花5分钟查看 
[url]www.securityfocus.com[/url] 报告的前一天的漏洞,或每周一查花30分钟查看 [url]www.us-cert.gov[/url] 报告的上一周的漏洞;
        如果可以,配置我们的漏洞扫描软件自动更新特征库,如果漏洞扫描软件不支持自动更新,那么记得在扫描前先更新特征库;
        如果我们得知自己的系统存在漏洞,应该关注上述邮件列表或网站发布的修复措施(一般在报告漏洞的时候,往往都附带了修复措施;
            或者相关软件开发商或第三方安全人士随后会发布相关的修复措施)或者密切关注相关软件开发商的主页,查看修复措施;
        如果我们得知自己的系统存在严重的漏洞,并且风险很高,而暂时又没有修复措施,那么可以考虑升级软件,
            如果升级软件不可行,只有暂时采取措施限制公网对该服务的访问了;
        闲话:风险高 = 漏洞多而且严重 x 威胁多而且强大 x 威胁利用漏洞的可能性高 x 威胁利用漏洞成功后造成的损失严重
      
2.我钟爱的 nessus(
[url]www.nessus.org[/url])  
1)简述:作为***的免费漏洞扫描器,它安装配置简单,扫描速度快,插件丰富而且更新频繁,用户界面友好,可定制性强(提供专门的脚本语言NASL,方便用户自定义插件),扫描效率高(C/S 结构),具有比大多数商业漏洞扫描软件更强大的功能;
2)安装和配置:
   第一步:安装,# rpm -ivh Nessus-x.x.x-xxx.i386.rpm ;
   第二步:注册,# /opt/nessus/bin/nessus-fetch --register <注册码> (nessus.org 会发一封邮件到你在下载 nessus 时输入的 E-MAIL 地址,里面包含了给你的注册码;一旦注册了,而且你的系统能够访问 INTERNET, 那么 nessus 会自动更新自己的插件);
   第三步:添加一个 nessus 管理用户,# /opt/nessus//sbin/nessus-add-first-user,按照提示输入用户名,密码,提示输入“user rules”时,直接 Ctrl + D;
   第四步:启动 nessus,# /etc/init.d/nessusd start(nessus 已经配置为随系统启动而自动启动);
   第五步:验证
          # ps -ef | grep ness   
          root      3101     1  0 19:48 ?   00:00:00 nessusd: waiting for 
          # netstat -lnp | grep :1241
         tcp        0      0 0.0.0.0:1241  0.0.0.0:*      LISTEN      3101/nessusd: 
   第六步:安装 windows 客户端,如果打算使用 windows GUI 客户端,则需要安装 Nessus client;
3)使用体会:   
   a. 如果习惯在 Linux 下的 nessus 服务器端进行漏洞扫描,那么可以写一个简单的脚步来方便操作,毕竟 nessus 的语法不好记:
      # cat scan.sh 
      #!/bin/bash
      #
      nessus -xq -T html localhost 1241 <username> <password> target.txt report.html
      # ll scan.sh
      -rwx------  1 root root 116 Jan 27 20:57 scan.sh
      # cat target.txt
      192.168.0.0/28
      192.168.0.20
      (如果使用 secureCRT, 那么可以使用 sz report.html 命令把 report.html 文件发送到 secureCRT 的 download 目录,
        以方便用浏览器查看扫描报告)
   b. 如果在 Linux 下的 nessus 服务器端执行扫描,默认情况下只能执行安全检查,如果想执行可能会导致目标崩溃的扫描,建议使用 windows 下的 nessus GUI 客户端。如果有兴趣,也可是尝试在 Linux 下 使用 update-nessusrc PERL 脚本来加载非安全的插件;
   c. 建议为我们维护的每一类系统都定义一个扫描策略,然后为每个扫描策略选择适当的插件,以节省扫描时间并提供扫描结果的准确度;
   d. 如果我们的系统已经禁 ping 了,那么就需要使用 TCP ping 来判断出我们需要扫描的在线服务器(这是 nessus 的默认配置);
我谈网络扫描 -- 之二
   e. 对于我们新配置的还没有上线的系统,建议进行非安全检查(可能会导致系统崩溃的测试);
我谈网络扫描 -- 之二
   f. 对于我们的目标很大的系统(比如有名的网站),建议选择某个维护时间(比如凌晨5点,取决于我们的具体应用)进行非安全检查;
   g. 对于我们的一般的系统,使用 nessus 默认的扫描测量 default policy ,进行安全检查就可以了;
 
四. WEB 应用漏洞扫描
1.常见的 WEB 漏洞
1)跨站脚本(CSS,XSS): 一个用户提交了含有恶意 JS 的内容,而 WEB 应用没有过滤或编码这些恶意 JS,就直接把这些内容发送给了其他用户的浏览器,如果其他用户的浏览器没有配置为拒绝执行 JS ,那么就会执行这些恶意的 JS 脚本,从而导致对 WEB 站点或其他用户的损害;
2)注入漏洞:通常包括 SQL 注入和命令注入两类,SQL 注入指的是恶意用户提交了含有 SQL 关键字(比如 OR, AND, UPDATE, DELETE 等)的信息,而 WEB 应用没有对这些恶意信息进行过滤和编码,就直接使用这些信息来动态构造自己的 SQL 语句(称之为动态 SQL),常常用在动态构造的 SQL 语句的 WHERE 部分,从而导致 WEB 应用返回给了恶意用户不该看到的信息(比如表结构),或者执行了破坏性的数据库操作(比如删掉了用户表);命令注入往往指的是用户提交了恶意的 SHELL 命令,比如 rm -rf /,而 WEB 应用没有对这些恶意的脚本命令进行过滤,就直接交给相应的命令解释器解释执行了,从而导致对 WEB 应用服务器的损害;            
3)恶意文件执行:WEB 应该在使用文件和流函数的代码部分,没有对这些函数的参数进行安全检查,以至于恶意用户可以随心所欲地为这些函数提供文件名,而这些文件名可能指向的是远程站点的恶意文件(远程文件包含),从而致使 WEB 应用执行恶意文件,也可能指向本地不希望被用户访问的文件,从而导致 WEB 服务器上重要敏感信息的泄漏,PHP 最容易出现这种漏洞;
4)不安全的直接对象引用:WEB 应用引用了内部对象,比如文件,目录,数据库记录等,而且把引用的方法暴露在了 URL 里面或者 表格(form)的参数里,从而导致聪明的用户明白了其中的引用规律,加上又没有配置严格的授权,以至于“聪明”的用户可以通过修改引用的目标,访问自己本不应该访问的信息。经典的例子是在网上银行应用中,登录后,通过篡改帐号,访问其它人的帐户信息;
5)跨站请求伪装(CSRF,XSFR):某些 WEB 应用,一旦用户登录了,就仅仅依靠在用户登录时写入到用户浏览器的 Cookie 信息,来验证用户执行某些关键动作(比如转账,改密码)的权限,不再需要用户输入身份验证信息和对将执行动作进行确认。由于这些表明用户身份的 Cookie 信息,会自动被浏览器发送给 WEB 应用,所以对于已经登录的用户来说,就有可能点击恶意用户(通常很熟悉被害者的操作细节)制造的链接,在完全不知觉的情况下执行了对自己有害的动作(比如把自己帐上的资金转给了别人,把自己的密码修改为恶意用户选择的秘密);
6)信息泄漏和有缺陷的错误处理:由于 WEB 服务器的配置错误或者应用的代码问题,导致了有关 WEB 服务器配置,目录结构,环境变量等信息或其他的隐私信息的泄漏;WEB 服务器的错误输出中,包含了过于详细的信息,比如对于不同的错误显示了不同的错误代码,向用户指出是用户名错误还是密码错误;从而使得恶意用户可以获得 WEB 服务器和应用的更准确的信息,方便其发动攻击;
7)有问题的身份验证和会话管理:WEB 应用没有保护好帐户凭据和会话令牌,或者使用了不安全的身份验证方式,从而导致了用户帐户或管理员帐户被劫持,授权和记账控制被破坏,隐私被暴露;比如让用户在在非安全页面输入用户帐户信息,在 URL 里面暴露用户的帐户信息,在已经登录的用户修改密码之前不对其当前密码进行验证;
8)不安全的加密存储:该加密存储的数据没有加密,使用的加密算法不够强悍,使用自己发明的加密算法,加密了的数据存放到了容易被解密的存储上,没有对 IT 基础设施的凭据(比如数据库密码,expect 脚本里面的秘密)进行保护;
9)不安全的通信方式:在没有加密的网络通道上传输敏感数据,比如用户帐户信息; WEB 应用通常的加密通道是 SSL;
10)未限制 URL 访问:对于不希望某些用户访问的 URL 或配置文件,并没有使用访问控制来限制这些用户对这些 资源 的访问,唯有的保护就是不把这些资源显示在这些用户能够看到的页面上,实际上这些用户可以通过所谓的“强制浏览”(猜链接)来浏览这些 URL 或配置文件;或者在客户端用 JS 来实现对这些资源访问的控制,但是这些用户可以通过定制 HTTP 请求的方式来避开这些 JS 实现的访问控制;
上述标题来自 OWASP top ten 2007(
[url]http://www.owasp.org/index.php/Top_10_2007[/url]),解释来自自己对这些漏洞的理解。
如果翻译或理解有误,欢迎大家指出来。
如果我们对研究 WEB 漏洞有兴趣,那么很有必要熟悉 firefox 的 tamper data 插件。

2.我钟爱的 nikto(
[url]http://www.cirt.net/code/nikto.shtml[/url])
1)简述:一款用 PERL 写的开源 WEB 服务器和应用漏洞扫描器,能够检查出 WEB 服务器的代码漏洞,配置漏洞,默认文件及 WEB 应用中的各种漏洞。
2)安装配置: 
   第一步:验证系统安装了基本的 PERL 支持,# rpm -qa | grep perl;
   第二步:下载并解压 nikto;
   第三步:更新漏洞特征数据库,# ./nikto.pl -update   
3)使用体会:
   a. 典型的使用例子:# ./nikto.pl -h target.txt -Format htm -o result.html
                     # cat target.txt
                       172.17.18.13,80,6280 
                       172.17.18.14,80
   b. 选择扫描类型:如果只想检查是否存在某类或某几类漏洞,可以用 -Tuning 选项来选择扫描类型;
   c. 如果 WEB 服务器已经配置了禁止使用 IP 地址访问 WEB 页面(通常的做法),那么应该使用 -vhost 选项来指定虚拟主机名;
   d. 如果配置了防止恶意用户代理(User Agent)访问,那么记得在扫描之前,允许 Nikto 访问;
   e. nikto 在做测试的时候,可能会向数据库写入大量的测试数据,导致数据混乱,所以,在测试之前,要备份好数据;
   f. 有些 WEB 应用有发邮件的功能,在测试的时候,nikto 可能会导致这样的 WEB 应用发送巨量的邮件,导致相关人员的邮箱爆满,
      所以,在扫描之前,一定要得到自己主管的授权后再执行;
   g. 为了防止 nikto 扫描产生的日志扰乱了网站的日志统计,应该在扫描之前,配置 WEB 服务器禁止对 nikto 访问记录日志;
切记:为了得到尽可能准确的漏洞信息,对于通用漏洞和特殊应用漏洞,建议各使用两种扫描软件进行扫描,一种免费漏洞扫描软件,比如 nessus,nikto,一种商业漏洞扫描软件,比如 GFI LANguard, Appscan。
 
 
下面的内容,将在“我谈网络扫描 -- 之三”讲述
五. 如何应对网络扫描
1. 检查网络扫描
2. 防护网络扫描
六. 结语


本文转自zkjian517 51CTO博客,原文链接:http://blog.51cto.com/zoukejian/61149