精华内容
下载资源
问答
  • 这是去年毕设做的一个Web漏洞扫描工具,主要针对简单的SQL注入漏洞、SQL盲注和XSS漏洞,代码是看过github外国大神(听说是SMAP的编写者之一)的两个小工具源码,根据里面的思路自己写的。以下是使用说明和源代码。...
  • 针对传统漏洞扫描与匹配分类需要深厚专业的计算机知识,且需要深入了解计算机底层协议极其相关内容这问题,文中结合计算机自动化测试与前端网页技术,实现轻量级网页漏洞扫描工具。该系统在Python的编程语言的基础...
  • .Lynis安全漏洞扫描工具 (1)将所需软件包传至集群(第二幅图是如果您想直接从网上下载,需先安装wegt包) (2)解压并使用 (3)查看日志信息 二.Linux系统口令安全 (1)编辑文件设置密码有效期,起到安全防护作用 ...

    Lynis安全漏洞扫描工具

    Lynis:是一款Unix系统的安全审计以及加固工具,能够进行深层次的安全扫描,其目的是检测潜在危险并对系统加固提供建议

    一.Lynis安全漏洞扫描工具

    (1)将所需软件包传至集群(第二幅图是如果您想直接从网上下载,需先安装wegt包)
    在这里插入图片描述
    在这里插入图片描述
    (2)解压并使用
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    (3)查看日志信息
    在这里插入图片描述
    二.Linux系统口令安全

    (1)编辑文件设置密码有效期,起到安全防护作用
    在这里插入图片描述
    (2)重启虚拟机开机时按F2进入引导界面
    在这里插入图片描述
    (3)按e进入编辑界面
    在这里插入图片描述
    (4)修改文件,按方向键找到linux16这一行(修改为黄色下划线编辑的rw init=/sysroot/bin/sh),完毕后按Ctrl+x重启
    在这里插入图片描述
    在这里插入图片描述
    (5)进入单用户模式,并使用命令进入root用户下
    在这里插入图片描述
    在这里插入图片描述
    (6)设置输入英语并修改root密码,切记,必须输入touch /.authrelabel,否则可能无法重启
    在这里插入图片描述
    在这里插入图片描述
    (7)重启验证旧密码root已失效
    在这里插入图片描述
    (8)为了防止GRUB安全漏洞,利用下面命令设置GRUB口令从而起到保护作用
    在这里插入图片描述
    三.Linux用户网络访问权限的控制

    (1)搭建ftp服务
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    (2)测试ftp服务
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    ftp服务搭建完毕无误。

    (2)禁止telnet远程终端登录(将该文件清空即可实现)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    OK,验证完毕,搭建正常。

    展开全文
  • weakscan(漏洞扫描工具)

    2020-01-04 21:57:40
    weakscan是拥有独立知识产权的国产软件,在对代码文件进行充分的词法分析、语法分析的基础上,应用数据流分析、符号执行、约束求解等技术实现对代码文件的深度扫描,发现代码中存在的漏洞
  • 以CWE为依据,在对代码文件进行充分的词法分析、语法分析的基础上,应用数据流分析、符号执行、约束求解等技术实现对代码文件的深度扫描,发现代码中存在的缓冲区溢出、双重释放、越界访问等数十种代码漏洞,...
  • 10大Web漏洞扫描工具

    万次阅读 多人点赞 2018-09-20 18:19:19
    这是一个开源的Web服务器扫描程序,它可以对Web服务器的多种项目(包括3500个潜在的危险文件/CGI,以及超过900个服务器版本,还有250多个服务器上的版本特定问题)进行全面的测试。其扫描项目和插件经常更新并且可以...

    Web scan tool

    推荐10大Web漏洞扫描程序

    Nikto

    这是一个开源的Web服务器扫描程序,它可以对Web服务器的多种项目(包括3500个潜在的危险文件/CGI,以及超过900个服务器版本,还有250多个服务器上的版本特定问题)进行全面的测试。其扫描项目和插件经常更新并且可以自动更新(如果需要的话)。
    
    Nikto可以在尽可能短的周期内测试你的Web服务器,这在其日志文件中相当明显。不过,如果你想试验一下(或者测试你的IDS系统),它也可以支持LibWhisker的反IDS方法。

    https://cirt.net/Nikto2

    Paros

    这是一个对Web应用程序的漏洞进行评估的代理程序,即一个基于Java的web代理程序,可以评估Web应用程序的漏洞。

    WebScarab

    它可以分析使用HTTP 和HTTPS协议进行通信的应用程序,WebScarab可以用最简单地形式记录它观察的会话,并允许操作人员以各种方式观查会话。如果你需要观察一个基于HTTP(S)应用程序的运行状态,那么WebScarabi就可以满足你这种需要。不管是帮助开发人员调试其它方面的难题,还是允许安全专业人员识别漏洞,它都是一款不错的工具。

    WebInspect

    这是一款强大的Web应用程序扫描程序。SPI Dynamics的这款应用程序安全评估工具有助于确认Web应用中已知的和未知的漏洞。它还可以检查一个Web服务器是否正确配置,并会尝试一些常见的Web攻击,如参数注入、跨站脚本、目录遍历攻击(directory traversal)等等。

    Whisker/libwhisker

    Libwhisker是一个Perla模块,适合于HTTP测试。它可以针对许多已知的安全漏洞,测试HTTP服务器,特别是检测危险CGI的存在。Whisker是一个使用libwhisker的扫描程序。

    Burpsuite

    这是一个可以用于攻击Web应用程序的集成平台。Burp套件允许一个攻击者将人工的和自动的技术结合起来,以列举、分析、攻击Web应用程序,或利用这些程序的漏洞。各种各样的burp工具协同工作,共享信息,并允许将一种工具发现的漏洞形成另外一种工具的基础。

    Wikto

    可以说这是一个Web服务器评估工具,它可以检查Web服务器中的漏洞,并提供与Nikto一样的很多功能,但增加了许多有趣的功能部分,如后端miner和紧密的Google集成。它为MS.NET环境编写,但用户需要注册才能下载其二进制文件和源代码。

    Acunetix Web Vulnerability Scanner

    这是一款商业级的Web漏洞扫描程序,它可以检查Web应用程序中的漏洞,如SQL注入、跨站脚本攻击、身份验证页上的弱口令长度等。它拥有一个操作方便的图形用户界面,并且能够创建专业级的Web站点安全审核报告。

    Watchfire AppScan

    这也是一款商业类的Web漏洞扫描程序。AppScan在应用程序的整个开发周期都提供安全测试,从而测试简化了部件测试和开发早期的安全保证。它可以扫描许多常见的漏洞,如跨站脚本攻击、HTTP响应拆分漏洞、参数篡改、隐式字段处理、后门/调试选项、缓冲区溢出等等。

    N-Stealth

    N-Stealth是一款商业级的Web服务器安全扫描程序。它比一些免费的Web扫描程序,如Whisker/libwhisker、 Nikto等的升级频率更高,它宣称含有“30000个漏洞和漏洞程序”以及“每天增加大量的漏洞检查”,不过这种说法令人质疑。还要注意,实际上所有通用的VA工具,如Nessus, ISS Internet Scanner, Retina, SAINT, Sara等都包含Web 扫描部件。(虽然这些工具并非总能保持软件更新,也不一定很灵活。)N-Stealth主要为Windows平台提供扫描,但并不提供源代码。

    一款优秀的Linux漏洞扫描器

    对于系统管理员来说,每天进行安全漏洞分析和软件更新是每日必需的基本活动。为了避免生产环境中的故障,对系统管理员来说选择不使用由保管理器提供的自动更新选项并执行手动更新非常常见。但是这会导致以下问题的发生:

    1、系统管理员必需不断提防NVD(国际漏洞数据库)中所有新的安全漏洞等。对于系统管理员来说

    2、如果在服务器上安装了大量的软件,那么监控所有的软件基本是不可能的。

    3、通过执行分析来确定被漏洞影响的服务器需要付出高昂的代价。在分析过程中忽略一两个服务器是很正常的。

    Vuls是解决以上问题的工具。它具有以下特征:

    1、通知系统相关漏洞的用户。

    2、通知受影响服务器的用户。

    3、实现漏洞自动化检测以防止检查。

    4、在使用CRON等的日常基础上生成报告来管理漏洞。

    more info

    Linux下查找系统漏洞的两类常用工具 基于主机的实用扫描软件

    more info

    漏洞管理

    Rapid7 Nexpose 识别和管理“可被利用的”漏洞。

    渗透测试

    Metasploit 帮助验证漏洞和补救方案,并管理风险评估

    一、网络漏洞扫描的三个阶段

    1、寻找目标主机或网络

    2、进一步搜集目标信息,包括OS类型,运行的服务以及服务软件的版本等

    3、判断或进一步检测系统是否存在安全漏洞

    二、漏洞扫描的两种策略:

    (1)被动式策略

    被动式策略就是基于主机之上,对系统中不合适的设置、脆弱的口令以及其他与安全规则抵触的对象进行
    检查,称为系统安全扫描。

    (2)主动式策略

    主动式策略是基于网络的,它通过执行一些脚本文件模拟对系统进行攻击的行为并记录系统的反应,从而
    发现其中的漏洞,称为网络安全扫描。

    三、漏洞扫描技术的原理:

    漏洞扫描技术是建立在端口扫描技术的基础之上的,从对黑客的攻击行为的分析和收集的漏洞来看,绝大多数都是针对某一个特定的端口的,所以漏洞扫描技术以与端口扫描技术同样的思路来开展扫描的。漏洞扫描技术的原理是主要通过以下两种方法来检查目标主机是否存在漏洞,在端口扫描后得知目标主机开启的端口以及端口上的网络服务,将这些相关信息与网络漏洞扫描系统提供的漏洞库进行匹配,查看是否有满足匹配条件的漏洞存在,通过模拟黑客的攻击手法,对目标主机系统进行攻击性的安全漏洞扫描,若模拟攻击成功,则表明目标主机系统存在安全漏洞,

    (1)漏洞库的特征匹配方法
    基于网络系统漏洞库的漏洞扫描的关键部分就是它所使用的漏洞库。通过采用基于规则的匹配技术,即根据安全专家对网络系统安全漏洞、黑客攻击案例的分析和系统管理员对网络系统的安全配置的实际经验,可以形成一套标准的网络系统漏洞库,然后再次基础上构成相应的匹配规则,由扫描程序自动的进行漏洞扫描的工作。若没有被匹配的规则,系统的网络连接是禁止的。

    工作原理:
    扫描客户端提供良好的界面,对扫描目标的、范围、方法等进行设置,向扫描
    引擎(服务器端)发出扫描命令。服务器根据客户端的选项进行安全检查,并调用
    规则匹配库检测主机,在获得目标主机TCP/IP端口和其对应的网络访问服务的相关信息后,
    与网络漏洞扫描系统提供的系统漏洞库进行匹配,如果满足条件,则视为存在漏洞。
    服务器的检测完成后将结果返回到客户端,并生成直观的报告。在服务器端的规则
    匹配库是许多共享程序的集合,存储各种扫描攻击方法。漏洞数据从扫描代码中分离。
    使用户能自行对扫描引擎进行更新。
    因此漏洞库信息的完整性和有效性决定了漏洞扫描的性能,漏洞库的修订和更新
    的性能也会影响漏洞扫描系统运行的时间。

    (2)功能模块(插件)技术
    插件是由脚本语言填写的子程序,扫描程序可以通过调用它来执行漏洞扫描。 检测出系统中存在的一个或多个漏洞。添加新的插件就可以使漏洞扫描软件 增加新的功能,扫描出更多的漏洞。插件编写规范化后,基于用户自己都可以 Perl、C或自行设计的脚本语言编写的插件来扩充漏洞扫描软件的功能, 这种技术使漏洞扫描软件的升级维护变的相对简单,而专用脚本语言的 使用也简化了编写新插件的编程工作,使漏洞扫描软件具有强的扩展性。
    工作原理:
    它的前端工作原理基本和基于网络系统漏洞库的漏洞扫描工作原理相同,不同的就是将系统漏洞库和规则匹配库换成了扫描插件库和脆弱性数据库。扫描插件库包含各种脆弱性扫描插件,每个插件对一个或多个脆弱点进行检查和测试。插件之间相对独立,这部分应该随着新脆弱性的发现而及时更新。脆弱性数据库收集了国际上公开发布的脆弱性数据,用于检查检测的完备性。它与扫描插件库之间是一对一或者是一对多的关系,寄一个插件可以进行一个或多个脆弱点的检测。因此,扫描插件库和脆弱性数据库可以及时更新,具有很强的扩展性。

    如何借助lynis扫描Linux的安全漏洞?

    Nmap

    Nmap即Network Mapper,它是在免费软件基金会的GNU General Public License (GPL)下发布的。其基本功能有:探测一组主机是否在线;扫描主机端口,嗅探提供的网络服务;判断主机的操作系统。软件下载后,执行 configure、make和make install三个命令,将nmap二进制码安装到系统上,就可以执行nmap了。

    Nmap支持不同类别的端口扫描,TCP连接扫描可以使用“-sT”命令。

     nmap -sT -p 80 -I -O www.yourserver.com

    p0f

    p0f对于网络攻击非常有用,它利用SYN数据包实现操作系统被动检测技术,能够正确地识别目标系统类型。和其他扫描软件不同,它不向目标系统发送任何的数据,只是被动地接受来自目标系统的数据进行分析。因此,一个很大的优点是:几乎无法被检测到,而且p0f是专门系统识别工具,其指纹数据库非常详尽,更新也比较快,特别适合于安装在网关中

    ISS

     ISS Internet Scanner是全球网络安全市场的顶尖产品,通过对网络安全弱点全面和自主地检测与分析并检查它们的弱点,将风险分为高中低三个等级,并且可以生成大范围的有意义的报表。现在,这个软件的收费版本提供了更多的攻击方式,并逐渐朝着商业化的方向发展。

    Nessus

      Nessus是一款功能强大的远程安全扫描器,它具有强大的报告输出能力,可以产生HTML、XML、LaTeX和ASCII文本等格式的安全报告,并能为每个安全问题提出建议。软件系统为client/sever模式,服务器端负责进行安全检查,客户端用来配置管理服务器端。在服务端还采用了 plug-in的体系,允许用户加入执行特定功能的插件,可以进行更快速和更复杂的安全检查。除了插件外,Nessus还为用户提供了描述攻击类型的脚本语言,来进行附加的安全测试。

    Xprobe

      XProbe是一款主动操作系统指纹识别工具,它可以测定远程主机操作系统的类型。XProbe依靠与一个签名数据库的模糊匹配以及合理的推测来确定远程操作系统的类型,利用ICMP协议进行操作系统指纹识别是它的独到之处。使用时,它假设某个端口没有被使用,它会向目标主机的较高端口发送 UDP包,目标主机就会回应ICMP包,然后,XProbe会发送其他的包来分辨目标主机系统,有了这个软件,判断对方的操作系统就很容易了

    展开全文
  • Android漏洞扫描工具Code Arbiter

    千次阅读 2017-08-17 19:04:00
    目前Android应用代码漏洞扫描工具种类繁多,效果良莠不齐,这些工具有一个共同的特点,都是在应用打包完成后对应用进行解包扫描。这种扫描有非常明显的缺点,扫描周期较长,不能向开发者实时反馈代码中存在的安全...

    目前Android应用代码漏洞扫描工具种类繁多,效果良莠不齐,这些工具有一个共同的特点,都是在应用打包完成后对应用进行解包扫描。这种扫描有非常明显的缺点,扫描周期较长,不能向开发者实时反馈代码中存在的安全问题,并且对于问题代码的定位需要手动搜索匹配源码,这样就更不利于开发者对问题代码进行及时的修改。Code Arbiter正是为解决上述两个问题而开发的,专门对Android Studio中的源码进行安全扫描。

    1 背景介绍

    为实现对Android Studio中的源码进行扫描,最方便的方式便是将扫描工具以IDE插件的形式进行工作。此时一个很自然的想法便是从头构建一个Android Studio插件,但是进行仔细的评估后会发现,这样做难度并不小:

    1. 工作量大,许多知识需要学习,如IDE开放API接口、插件UI构建等,同时许多底层模块需要从头构建;
    2. 插件的稳定性、检测问题的准确性上都不一定能够达到已有开源工具的效果。

    因此我们转而考虑在已有漏洞检测插件的基础上进行扩展,以满足需求。经过调研,最终入围的两款检测插件是PMD和FindBugs,其中PMD是对Java源码进行扫描,而FindBugs则是对Java源码编译后的class文件进行扫描。考虑到可扩展性及检测的准确性,最终选定了FindBugs。FindBugs是一个静态分析工具,它检查类或者JAR文件,将字节码与一组缺陷模式进行对比来发现可能的问题,可以以独立的JAR包形式运行,也可以作为集成开发工具的插件形式存在。

    扩展优化

    那么,怎么扩展FindBugs呢?调研发现FindBugs插件具有着极强的可扩展性,只需要将扩展的JAR包导入FindBugs插件,重启,即可完成相关功能的扩展。安装JAR包示意图如下所示。

    安装jar包

    下面的问题是如何构建可安装的JAR包。继续调研,发现FindBugs有一款专门对安全问题进行检测的扩展插件Find Security Bugs,该插件主要用于对Web安全问题进行检测,也有极少对Android相关安全问题的检测规则。考虑以下几个原因,需要对该插件的源码进行重构。

    1. 对Android安全问题的检测太少,只包含外部文件使用、Webview、Broadcast使用等寥寥几项;
    2. 检测的细粒度上考虑不够完全,会造成大量的误报,无法满足检测精度的要求;
    3. 检测问题的上报只支持英文模式,且问题展示的逻辑性不够严谨,不便于开发者进行问题排查。

    基于以上三个原因,我们需要对Find Security Bugs的源码进行重写、优化,通过增加检测项来检测尽可能多的安全问题,通过优化检测规则来减少检测的误报,问题展示使用中文进行描述,同时优化问题描述的逻辑性,使得开发者能够更易理解并修改相关问题,至此插件实现及优化的方案确定。

    2 工具实现介绍

    FindBugs检测的是class文件,因此当待检测的源码未生成编译文件时,FindBugs会先将源码编译生成.class文件,然后对这个class文件进行分析。FindBugs会完成对class文件的自动建模,在此模型的基础上对代码进行分析。按照在实际编写检测代码过程中的总结,把检测的实现方式分成四种方式,下面分别进行介绍。

    2.1 逐行检查

    逐行检查主要是针对代码中使用的一些不安全方法或参数进行检测,其实现方式是重写sawOpcode()方法,下面以Android中使用外部存储问题作为示例进行讲解。

    Android中获取外部存储文件夹地址的方法主要包括下面这些方法:

    getExternalCacheDir()
    getExternalCacheDirs()
    getExternalFilesDir()
    getExternalFilesDirs()
    getExternalMediaDirs()
    Environment.getExternalStorageDirectory()
    Environment.getExternalStoragePublicDirectory()
    

    检测的方式便是,如果发现存在该方法的调用,则作为一个问题进行上报,实现完整代码如下所示:

    public class ExternalFileAccessDetector extends OpcodeStackDetector {
    
        private static final String ANDROID_EXTERNAL_FILE_ACCESS_TYPE = "ANDROID_EXTERNAL_FILE_ACCESS";
        private BugReporter bugReporter;
        public ExternalFileAccessDetector(BugReporter bugReporter) {
            this.bugReporter = bugReporter;
        }
    
        @Override
     public void sawOpcode(int seen) {
            //printOpCode(seen);
     if (seen == Constants.INVOKEVIRTUAL && (
            getNameConstantOperand().equals("getExternalCacheDir") ||
            getNameConstantOperand().equals("getExternalCacheDirs") ||
            getNameConstantOperand().equals("getExternalFilesDir") ||
            getNameConstantOperand().equals("getExternalFilesDirs") ||
            getNameConstantOperand().equals("getExternalMediaDirs")
                )) {
    // System.out.println(getSigConstantOperand());
     bugReporter.reportBug(new BugInstance(this, ANDROID_EXTERNAL_FILE_ACCESS_TYPE, Priorities.NORMAL_PRIORITY).addClass(this).addMethod(this).addSourceLine(this));
            }
            else if(seen == Constants.INVOKESTATIC && getClassConstantOperand().equals("android/os/Environment") && (getNameConstantOperand().equals("getExternalStorageDirectory") || getNameConstantOperand().equals("getExternalStoragePublicDirectory"))) {
                bugReporter.reportBug(new BugInstance(this, ANDROID_EXTERNAL_FILE_ACCESS_TYPE, Priorities.NORMAL_PRIORITY).addClass(this).addMethod(this).addSourceLine(this));
            }
        }
    }
    

    该类的实现是继承OpcodeStackDetector类,是FindBugs中的一个抽象类,封装了对于获取代码特定参数的方法调用。sawOpcode方法参数可以理解为待检测代码行的行号,通过printOpCode(seen)可以打印该代码行的具体内容。Constants.INVOKEVIRTUAL表示该行调用类的实例方法,Constants.INVOKESTATIC表示调用类的静态方法。getNameConstantOperand方法表示获取被调用方法的名称,getClassConstantOperand方法表示获取调用类的名称,getSigConstantOperand方法表示获取方法的所有参数。bugReporter.reportBug用于上报检测到的漏洞信息,其中BugInstance的三个参数分别表示:检测器、漏洞类型、漏洞等级,其中漏洞等级分为五个级别,如下表所示:

    名称参数含义
    HIGH_PRIORITY1高危风险
    NORMAL_PRIORITY2中危风险
    LOW_PRIORITY3低危风险
    EXP_PRIORITY4安全提醒
    IGNORE_PRIORITY5可忽略风险

    addClass、addMethod、addSourceLine用于指定该漏洞所在的类、方法、行,方便报告漏洞时定位关键代码。

    2.2 逐方法检查

    逐方法检查首先获取待检测类的所有内容,然后对类中的方法进行逐个检查,多用于对方法体进行检测,其实现的方法主要是通过重写visitClassContext方法,下面以对Android TrustManager的空实现的检测为例进行说明。
    TrustManager的空实现,主要是指对于检测Server端证书是否可信的方法checkServerTrusted,是否是空实现。下面展示问题代码,如果是空实现那么将导致客户端接收任意证书,从而造成加密后的HTTPS消息被中间人解密。

    @Override
    public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
    
    }
    

    检测的方式是通过遍历类中的所有方法,找到checkServerTrusted方法,对方法整体进行检测,确定其是否为空实现,部分代码如下所示:

    public class WeakTrustManagerDetector implements Detector {
    ...
    public WeakTrustManagerDetector(BugReporter bugReporter) {
            this.bugReporter = bugReporter;
        }
    
        @Override
     public void visitClassContext(ClassContext classContext) {
            JavaClass javaClass = classContext.getJavaClass();
    
            //The class extends X509TrustManager
      boolean isTrustManager = InterfaceUtils.isSubtype(javaClass,"javax.net.ssl.X509TrustManager");
            boolean isHostnameVerifier = InterfaceUtils.isSubtype(javaClass,"javax.net.ssl.HostnameVerifier");
    
    // if (!isTrustManager && !isHostnameVerifier) return;
     if (!isTrustManager && !isHostnameVerifier){
                for (Method m : javaClass.getMethods()) {
                    allow_All_Hostname_Verify(classContext, javaClass, m);
                }
            }
    
            Method[] methodList = javaClass.getMethods();
    
            for (Method m : methodList) {
                MethodGen methodGen = classContext.getMethodGen(m);
    
                if (DEBUG) System.out.println(">>> Method: " + m.getName());
    
                if (isTrustManager &&
                        (m.getName().equals("checkClientTrusted") ||
                         m.getName().equals("checkServerTrusted") ||
                         m.getName().equals("getAcceptedIssuers"))) {
                    if(isEmptyImplementation(methodGen)) {
                        bugReporter.reportBug(new BugInstance(this, WEAK_TRUST_MANAGER_TYPE, Priorities.NORMAL_PRIORITY).addClassAndMethod(javaClass, m));
                    }
    ......
    

    classContext.getJavaClass用于获取整个类的所有内容;javaClass.getMethods用于获取该类中的所有方法,以一个方法列表的形式返回;classContext.getMethodGen用于获取该方法的内容;isEmptyImplementation将方法的内容导入该函数进行检测,用于确定方法是否是空实现,该方法的代码如下所示:

    private boolean isEmptyImplementation(MethodGen methodGen){
        boolean invokeInst = false;
        boolean loadField = false;
    
        for (Iterator itIns = methodGen.getInstructionList().iterator();itIns.hasNext();) {
            Instruction inst = ((InstructionHandle) itIns.next()).getInstruction();
            if (DEBUG)
                System.out.println(inst.toString(true));
    
            if (inst instanceof InvokeInstruction) {
                invokeInst = true;
            }
            if (inst instanceof GETFIELD) {
                loadField = true;
            }
        }
        return !invokeInst && !loadField;
    }
    

    该方法主要用于检测方法中是否包含方法调用、域操作,如果没有包含则认为是一个空实现的方法。因此该方法对于只包含 return true/false 语句的方法体同样认为是一个空实现。

    2.3 污点分析

    数据流分析主要用于分析特定方法加载的参数是否能够被用户控制,即进行污点分析。做污点分析首先需要定义污染源(source点),污染源可以理解为能够被用户控制的输入数据,这里定义的Android污染源主要包括用户的输入、Intent传入的数据,下面展示定义的部分污染源(source点):

    - EditText
    android/widget/EditText.getText()Landroid/text/Editable;:TAINTED
    - Intent
    android/content/Intent.getAction()Ljava/lang/String;:TAINTED
    android/content/Intent.getStringExtra(Ljava/lang/String;)Ljava/lang/String;:TAINTED
    ......
    - Bundle
    android/os/Bundle.get(Ljava/lang/String;)Ljava/lang/Object;:TAINTED
    android/os/Bundle.getString(Ljava/lang/String;)Ljava/lang/String;:TAINTED
    ......
    

    定义好污染源后就需要确定污染的触发点(sink点),可以理解为会触发危险操作的函数。定义sink点的方式有两种,一种是直接从文件中导入,以命令注入为示例,代码如下:

    public class CommandInjectionDetector extends BasicInjectionDetector {
    
        public CommandInjectionDetector(BugReporter bugReporter) {
            super(bugReporter);
            loadConfiguredSinks("command.txt", "COMMAND_INJECTION");
     }
    

    从代码中可以清楚的看到其导入方式是继承BasicInjectionDetector类,然后再该类的构造方法中通过loadConfiguredSinks方法,导入包含sink点的文件,下面展示该示例文件中的内容:

    java/lang/Runtime.exec(Ljava/lang/String;)Ljava/lang/Process;:0
    java/lang/Runtime.exec([Ljava/lang/String;)Ljava/lang/Process;:0
    java/lang/Runtime.exec(Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/Process;:0,1
    java/lang/Runtime.exec([Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/Process;:0,1
    java/lang/Runtime.exec(Ljava/lang/String;[Ljava/lang/String;Ljava/io/File;)Ljava/lang/Process;:1,2
    java/lang/Runtime.exec([Ljava/lang/String;[Ljava/lang/String;Ljava/io/File;)Ljava/lang/Process;:1,2
    java/lang/ProcessBuilder.<init>([Ljava/lang/String;)V:0
    java/lang/ProcessBuilder.<init>(Ljava/util/List;)V:0
    java/lang/ProcessBuilder.command([Ljava/lang/String;)Ljava/lang/ProcessBuilder;:0
    java/lang/ProcessBuilder.command(Ljava/util/List;)Ljava/lang/ProcessBuilder;:0
    dalvik/system/DexClassLoader.loadClass(Ljava/lang/String;)Ljava/lang/Class;:0
    

    另一种是自定义导入,其实现是通过覆盖BasicInjectionDetector类中的getInjectionPoint方法,以WebView.loadurl方法为例,示例代码如下所示:

    @Override
     protected InjectionPoint getInjectionPoint(InvokeInstruction invoke, ConstantPoolGen cpg, InstructionHandle handle) {
            assert invoke != null && cpg != null;
            String method = invoke.getMethodName(cpg);
            String sig    = invoke.getSignature(cpg);
    // System.out.println(invoke.getClassName(cpg));
     if(sig.contains("Ljava/lang/String;")) {
                if("loadUrl".equals(method)){
                    if(sig.contains("Ljava/util/Map;")){
                        return new InjectionPoint(new int[]{1}, WEBVIEW_LOAD_DATA_URL_TYPE);
                    }else{
                        return new InjectionPoint(new int[]{0}, WEBVIEW_LOAD_DATA_URL_TYPE);
                    }
                }else if("loadData".equals(method)){
                    return new InjectionPoint(new int[]{2}, WEBVIEW_LOAD_DATA_URL_TYPE);
                }else if("loadDataWithBaseURL".equals(method)){
                    //BUG
     return new InjectionPoint(new int[]{4}, WEBVIEW_LOAD_DATA_URL_TYPE);
                }
            }
            return InjectionPoint.NONE;
        }
    

    通过实例化InjectionPoint类构造新的sink点,其构造方法中的第一个参数表示该方法接收污染数据参数的位置,如方法为webView.loadUrl(url),其第一个参数就是new int[]{0},其它的以此类推。

    上报发现漏洞的情况,则通过覆盖getPriorityFromTaintFrame方法的实现,示例代码如下所示:

    @Override
     protected int getPriorityFromTaintFrame(TaintFrame fact, int offset)
                throws DataflowAnalysisException {
            Taint stringValue = fact.getStackValue(offset);
    // System.out.println(stringValue.getConstantValue());
     if (stringValue.isTainted() || stringValue.isUnknown()) {
                return Priorities.NORMAL_PRIORITY;
            } else {
                return Priorities.IGNORE_PRIORITY;
            }
        }
    

    通过fact.getStackValue获取检测的函数变量,如果该变量被污染(isTainted)或 变量是否被污染未知(但是是可控制变量),那么作为一个中危风险(Priorities.NORMAL_PRIORITY)进行上报,其它的情况则上报为可忽略风险(Priorities.IGNORE_PRIORITY)。

    2.4 自定义代码检测

    自定义代码检测实现的前半部分同2.2的逐方法检测类似,均是获取类的内容,然后遍历所有的方法,对方法的内容进行检测,但是在具体代码检测实现上是通过自定义分析进行。目前自定义检测只应用到Android中本地拒绝服务的检测。本地拒绝服务的被触发的重要原因在于对通过Intent获取的参数未进行异常捕获,因此检测实现的方式便是检测获取参数的代码行是否被try catch包裹(这个存在误差,待改进)。对于其代码分析,不能使用FindBugs模型进行分析,而是使用最原始的class代码进行分析,原始class代码的形式通过javap命令进行查看,下图展示示例代码。

    class示例代码

    对原始class文件进行分析存在的缺陷是无法定位具体的代码行,那么在进行问题上报时无法将问题定位到代码行,因此第一步需要在原有模型的基础上对所有包含Intent获取参数的方法的位置存储到一个Map结构中,方便后面对方法的定位,代码实现如下所示,获取方法所在的行,然后以方法名作为Key值,以代码行相关信息作为Value值,存储到Map中。

    private Map<String, List<Location>> get_line_location(Method m, ClassContext classContext){
            HashMap<String, List<Location>> all_line_location = new HashMap<>();
            ConstantPoolGen cpg = classContext.getConstantPoolGen();
            CFG cfg = null;
            try {
                cfg = classContext.getCFG(m);
            } catch (CFGBuilderException e) {
                e.printStackTrace();
                return all_line_location;
            }
            for (Iterator<Location> i = cfg.locationIterator(); i.hasNext(); ) {
                Location loc = i.next();
                Instruction inst = loc.getHandle().getInstruction();
                if(inst instanceof INVOKEVIRTUAL) {
                    INVOKEVIRTUAL invoke = (INVOKEVIRTUAL) inst;
     if(all_line_location.containsKey(invoke.getMethodName(cpg))){
                            all_line_location.get(invoke.getMethodName(cpg)).add(loc);
                        }else {
                            LinkedList<Location> loc_list = new LinkedList<>();
                            loc_list.add(loc);
                            all_line_location.put(invoke.getMethodName(cpg), loc_list);
                        }
    // }
     }
            }
            return all_line_location;
        }
    

    之后获取Exception包裹的范围,FindBugs中包含对Exception的建模,因此能够通过其模型能够直接获取其范围并存储到一个列表中,代码如下所示,其中exceptionTable[i].getStartPC用于获取try catch 的起始代码行,exceptionTable[i].getEndPC用于获取try catch 的结束代码行。

    public int[] getExceptionScope(){
            try {
                CodeException[] exceptionTable = this.code.getExceptionTable();
                int[] exception_scop = new int[exceptionTable.length * 2];
                for (int i = 0; i < exceptionTable.length; i++) {
                    exception_scop[i * 2] = exceptionTable[i].getStartPC();
                    exception_scop[i * 2 + 1] = exceptionTable[i].getEndPC();
                }
                return exception_scop;
            }catch (Exception e){
     }
            return new int[0];
        }
    

    在对代码进行逐行检查时,因为使用的是最原始class文件形式,因此需要限定其遍历的范围,限定的方式是通过代码的行号,即上图中每行代码的第一个数值。首先需要获取代码总行数的大小,获取的方式便是解析FindBugs建模后的第一行代码,找到关键词code-length后面的数值,即为代码的行数,解析代码如下所示:

    public int get_Code_Length(String firstLineCode){
            try{
                String[] split1 = firstLineCode.split("code_length");
    // System.out.println(split1[split1.length-1]);
     byte[] code_length_bytes = split1[split1.length-1].getBytes();
                byte[] new_code_bytes = new byte[code_length_bytes.length];
                for(int i=0; i<code_length_bytes.length; i++){
    // System.out.println();
     if(code_length_bytes[i]<48 || code_length_bytes[i]>57){
                        new_code_bytes[i] = 32;
                    }else{
                        new_code_bytes[i] = code_length_bytes[i];
                    }
                }
                return Integer.parseInt(new String(new_code_bytes).trim());
            }catch(Exception e){
                e.printStackTrace();
            }
            return 0;
        }
    

    最后对代码进行逐行遍历,遍历中为防止try catch块被遍历到,使用行号来限制遍历的范围。检测代码行是否包含通过Intent获取参数,及该行是否被try catch 包裹,如果上述两个条件均被触发,那么就作为一个问题进行上报。示例代码如下,其中get_code_line_index方法用于获取代码的行号,获取的方式是截取代码行的首字符的数值,以确定是否在代码包裹的范围内。

    private void analyzeMethod(JavaClass javaClass, Method m, ClassContext classContext) throws CFGBuilderException {
            HashMap<String, List<Location>> all_line_location = (HashMap<String, List<Location>>) get_line_location(m, classContext);
            Code code = m.getCode();
            StringCodeAnalysis sca = new StringCodeAnalysis(code);
            String[] codes = sca.codes_String_Array();
            int code_length = sca.get_Code_Length(sca.get_First_Code(codes));
            int[] exception_scop = sca.getExceptionScope();
            for(int i=1; i<codes.length; i++){
                int line_index = sca.get_code_line_index(codes[i]);
                if (line_index < code_length){
                    if(codes[i].toLowerCase().contains("invokevirtual") &&
                            (codes[i].contains("android.content.Intent.get")  || codes[i].contains("android.os.Bundle.get"))){
                        if(exception_scop.length == 0){
                            ......
                        }else{
                            boolean is_scope = false;
                            for(int j=0; j<exception_scop.length; j+=2){
                                int start = exception_scop[j];
                                int end = exception_scop[j+1];
                                if(line_index >= start && line_index <= end){
                                    is_scope = true;
                                }
                                if(is_scope){
                                    break;
                                }
                            }
                            if(!is_scope){
                                String method_name = get_method_name(codes[i]);
                                if(all_line_location.containsKey(method_name)){
                                    for(Location loc : all_line_location.get(method_name)){
                                        bugReporter.reportBug(new BugInstance(this, LOCAL_DENIAL_SERVICE_TYPE, Priorities.NORMAL_PRIORITY).addClass(javaClass).addMethod(javaClass, m).addSourceLine(classContext, m, loc));
                                    }
                                }else {
                                    bugReporter.reportBug(new BugInstance(this, LOCAL_DENIAL_SERVICE_TYPE, Priorities.NORMAL_PRIORITY).addClass(javaClass).addMethod(javaClass, m));
     }
                            }
                        }
                    }
                }
            }
        }
    

    3 注册打包

    上面详细叙述了如何构造自己的问题检测代码,完成检测方法的书写后,下一步就是在配置文件中对检测方法进行注册,才能使检测代码运转起来。

    需要在两个文件中进行注册,第一个是findbugs.xml,注册示例如下:

    <Detector class="com.h3xstream.findsecbugs.android.LocalDenialOfServiceDetector" reports="LOCAL_DENIAL_SERVICE"/>
    <BugPattern type="LOCAL_DENIAL_SERVICE" abbrev="SECLDOS" category="Android安全问题" cweid="276"/>
    

    其中Detector用于注册该检测方法的位置及其唯一标识,BugPattern用于对检测出的问题进行归类,方便展示,如此处归类到"Android安全问题"中,那么在生成报告的时候问题也将被归类到"Android安全问题"中。

    第二个是messages.xml注册,注册示例如下,该注册主要是对该问题进行说明,包括问题的危害及修复方法。

    <Detector class="com.h3xstream.findsecbugs.android.LocalDenialOfServiceDetector">
<Details>Local Denial of Service.</Details>
</Detector>
<BugPattern type="LOCAL_DENIAL_SERVICE">
<ShortDescription>本地拒绝服务</ShortDescription>
<LongDescription>通过Intent接收的参数未进行异常捕获,导致出现异常使得应用崩溃</LongDescription>
<Details>
<![CDATA[
    <p>
        <b>危害:</b><br/>
        <pre>
            应用崩溃无法使用,影响用户体验;
            被竞争对手利用,进行点对点攻击。
        </pre>
    </p>
    <p>
        <b>错误代码:</b><br/>
        <pre>
            bundle.getString(""); //未try/catch
            intent.getStringExtra(""); //未try/catch
        </pre>
    </p>
    <p>
        <b>解决方案:</b><br/>
        <pre>
            对通过Intent接收的参数处理时,进行严格的异常捕获。
            try {
                bundle.getString("");
                intent.getStringExtra(""); 
            }catch (Exception e){}
        </pre>
    </p>
]]>
</Details>
</BugPattern>
<BugCode abbrev="SECLDOS">本地拒绝服务</BugCode>
    

    一切完成就绪后使用Maven进行打包,就生产了供FindBugs集成开发工具插件使用的JAR包,完成安装并重启,即可使用自定义插件对特定问题进行检测。
    最终分析的效果图如下图所示:

    分析效果图

    4 结语

    本文介绍了Android集成开发环境Android Studio的代码实时检测工具Code Arbiter的产生原因及代码实现,最后展示了分析的效果。通过Code Arbiter在生产环境中的应用,其检测效果还是相当不错,能够发现很多编码过程中存在的问题。但是Code Arbiter仍然存在许多不足,需要优化。后续将在以下两个方面对工具进行改进:

    1. 扩大漏洞检测范围,使Code Arbiter能够囊括Android编码常见安全问题;
    2. 优化漏洞检测规则,提高检测的准确性,减少误报。

    5 作者简介

    建弋,2016年加入美团点评,目前主要负责金融部门相关的安全工作。对于代码审计/漏洞扫描感兴趣的同学,可以阅读本人Freebuf上发表的相关文章,期待与大家共同学习共同提高。

    美团点评金融服务平台-安全与合规中心致力于维护美团点评金融平台的安全工作,努力构建行业顶级安全架构,打造行业领先安全产品。欢迎各位行业同仁加入我们,共同建设美团点评金融安全。
    联系邮箱:isec#meituan.com

    【思考题】

    文中描述了Android IDE漏洞扫描工具产生的前因后果,对实现的代码也进行了概括总结。不管是在IDE集成开发环境下的源码扫描,还是对APK文件的解包扫描,其最终的目的还是为了保证应用的安全性,那么大家在日常的工作中对于移动安全建设,以及互联网快速迭代环境下业务安全问题的排查有何独到的见地呢?希望不吝赐教。




    发现文章有错误、对内容有疑问,都可以关注美团点评技术团队微信公众号(meituantech),在后台给我们留言。我们每周会挑选出一位热心小伙伴,送上一份精美的小礼品。快来扫码关注我们吧!

    展开全文
  • OpenVAS是一个功能齐全的漏洞扫描程序。其功能包括未经验证的测试,经过身份验证的测试,各种高级和低级Internet和工业协议,用于大规模扫描的性能调整以及用于实现任何类型的漏洞测试的强大内部编程语言。扫描程序...

    OpenVAS简介

        Openvas是开源的,是Nessus项目分支,用于管理目标系统的漏洞,检测目标网络或主机的安全性。OpenVAS是一个功能齐全的漏洞扫描程序。其功能包括未经验证的测试,经过身份验证的测试,各种高级和低级Internet和工业协议,用于大规模扫描的性能调整以及用于实现任何类型的漏洞测试的强大内部编程语言。扫描程序附带一个漏洞测试源,具有悠久的历史记录和每日更新。

    OpnVAS安装与使用

    1.安装openvas

    root@afei:~# apt-get update && apt-get upgrade -y
    ...
    Setting up mutter (3.30.2-7) ...
    Processing triggers for libc-bin (2.28-8) ...
    root@afei:~# apt-get install openvas -y
    Running mktexl
    展开全文
  • 漏洞扫描以及常用扫描工具总结

    千次阅读 2019-08-19 16:35:04
    、网络漏洞扫描的三阶段 1、寻找目标主机或网络 2、进一步搜集目标信息,包括OS类型,运行的服务以及服务软件的版本等 3、判断或进一步检测系统是否存在安全漏洞 二、漏洞扫描的两种策略: (1)被动式策略 被动...
  • Backtrack5常用的漏洞扫描工具

    千次阅读 2014-11-21 23:58:02
    黑客在攻击之前习惯扫描操作系统是绝对不可缺少的,黑客袭击就和战争...网站漏洞扫描工具:主要应用网站漏洞扫描工具,其原理是通过工具通过对网站的代码阅读,发现其可被利用的漏洞进行告示,通过前人收集的漏洞编成
  • 向大家介绍款可以扫描DockerContainer内部漏洞的方法。 这里的漏洞是指安全更新提供的漏洞(有CVE-ID的漏洞),而不是网络服务的漏洞诊断提供的漏洞。 闲话不多说,先上工具 knqyf263/trivy 为了方便在CI上使用,只...
  • 漏洞扫描工具AWVS介绍及安装教程

    千次阅读 2019-05-06 18:28:12
    Acunetix Web Vulnerability Scanner(简称AWVS)是款知名的网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测流行安全漏洞。WVS可以检查SQL注入漏洞,也可以检查跨站脚本攻击漏洞,可以扫描任何可以通过...
  • 漏洞扫描工具nexpose安装及使用

    千次阅读 2020-02-13 19:02:22
        Nexpose是由Rapid 7公司开发,它是款商业版的扫描软件,能够完成完整的漏洞管理实现。 nexpose安装及使用     Nexpose是商业软件,免费版只有14天的试用期,过期了得重新安装注册。 1.下载Nexpose ...
  • 自制分布式漏洞扫描工具

    千次阅读 2014-01-14 13:07:55
    在渗透测试和安全扫描工作中,发现越来越多站点部署了应用防护系统或异常流量监控系统,其中包括:WEB应用防火墙(软件WAF、硬件WAF、云WAF)、入侵检测系统、入侵防御系统、访问监控系统等。很多防护系统不仅可实时...
  • 在linux下实现漏洞扫描器的原理,通过调用可执行程序来发现漏洞。
  • 漏洞扫描

    千次阅读 2020-07-14 15:02:13
    漏洞扫描原理及工具 1.扫描原理 ping检测: 通过ping返回的TTL值大致的了解一些信息 128:xp、2000、2003 64:7、2008、Linux 255:交换机、路由器等 此方法式只能大致判断,并不准确。 端口扫描 telnet IP 端口 ...
  • 一个WEB漏洞扫描系统的设计与实现(一)一、关于我以及本文的背景 文章的标题有点唬人的味道。 首先,作为一个毕业还不到3年的普通本科生,我还没修炼成为WEB安全方面的行家;其次,作为一个总代码行数还不到5万的...
  • 背景 androguard是Android静态分析工具,可以解析...通过合理的使用这些API,可以帮助我们确定受关注的接口是否被某些类/入口调用过,自动化发现漏洞(类似工具JAndroid) 源码阅读 androguard API文档对整个架...
  • 网站安全--01 开源漏洞扫描工具

    千次阅读 2018-04-27 15:04:18
    1、Java自动化SQL注入测试工具 jSQL链接:http://www.oschina.net/p/jsql-tooljSQL是款轻量级安全测试工具,可以检测SQL注入漏洞。它跨平台(Windows, Linux, Mac OS X, Solaris)、开源且免费。2、漏洞评估系统 ...
  • 漏洞扫描器对漏洞进行扫描,以验证具体目标是否存在对应的具体漏洞。但是也存在错误扫描,需要对扫描结果进行漏洞验证。 扫描器的原理大致相同都是通过发送对应的验证数据到目标具体服务进行验证。当收到目标返回...
  • 作为一个渗透人员,在每次渗透网站的时候都要拿出一堆黑客工具,比如nmap, awvs, 御剑等工具进行测试,由于实在厌烦了一些低级重复性的工作,趁着2020年新年创建了一个工具集合平台,将渗透测试常见的域名扫描,端口...
  • Nessus漏洞扫描教程之使用Nmap工具扫描识别指纹
  • 2020年红日安全星火沙龙PPT 分布式资产发现与漏洞扫描原理及实现-Silence.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,779
精华内容 11,511
关键字:

如何实现一个漏洞扫描工具