HW前诞生的网络访问权限检查工具PropertyScanner

 

背景介绍

简单介绍下背景,企业内部通常会通过配置 ACL、防火墙等方式对内网主机的可访问范围进行约束。但往往由于网络过于复杂,资产过多且零散导致无法有效验证网络权限控制的落地情况。针对此需求,在 HW 前编写了此工具用于企业内部的访问权限验证。本着功能够用就行的态度,在 HW 结束后,对工具进行了优化和脱敏处理,并尝试在社区分享。实现并不复杂,主要是希望可以和社区大佬们分享交流下经验,有不足之处,还请大家指出。

项目地址:https://github.com/fmelon/PropertyScanner

运行环境:Python 3

 

应用场景

该工具用于企业资产网络访问权限检查。工具基于预先设定的各区域访问控制权限要求及运行主机所处网络区域来判断网络权限开放是否合规。

例:运行主机 IP 为 192.168.1.5,在企业网络区域划分中处于办公区。若此时该主机可以访问到位于服务器区的服务器 192.168.0.2 的 22 端口,基于该企业的网络权限管理要求,该服务器区服务器 22 端口只能开放给堡垒机,故此访问异常,属网络管理权限配置存在问题。

 

设计思路

本工具需要事先规定好每个 IP 所处的区域以及明确资产敏感端口需要开放的区域,程序运行之初首先基于主机 IP 判断出当前所处区域,随后对所有已记录的资产敏感端口进行扫描。得到扫描发现的可访问端口后,则判断当前所处区域是否为该端口的开放区域,若不属于,则可能存在异常访问,扫描结果最终会记录在 Excel 表格中。

程序具体的实现方法将以以下四个部分进行描述。

Step1 : 判断当前 IP 所处位置

当前主机 IP 所处区域是基于项目中 zone.json 文件来判断的。zone.json 文件的格式如下:

{
    "office": {
        "name":"办公区",
        "authIP":[
            "192.168.1.1/24"
        ]
    }
}

通过比对「authIP」 中的字段即可判断当前 IP 所处区域。需要注意的是,考虑到一个 IP 可能具有多个区域的权限,为更贴和实际落地场景,每个 IP 可以具有多个区域标签。

Step2 : 提取需要扫描的资产对象

资产及资产所对应的需要核查的敏感端口信息记录在项目中的 property.json 文件中。以下为一个最基础的企业资产网络访问权限记录单元,每个单元以 IP 为主键,每个 IP 可以下挂多个系统。每个系统单元记录系统名称「system」、系统负责人「owner」以及管理权限要求「auth」。

{
    "192.168.1.1": [
        {
            "system":"堡垒机",
            "owner":"Fmelon",
            "auth":[
                {
                    "ports":[22,443,3389],
                    "openzone":["IT_Department"]
                }
            ]
        }
    ]
}

通过遍历文件中每个 IP 主键及其敏感端口,即可得到需要进行扫描的 IP 列表及对应端口,之后便可对这些资产进行扫描。

Step3 : 实施扫描

扫描工作主要依托于扫描工具 Masscan,将得到的 IP 列表及所有端口信息作为参数传递给 Masscan 进行扫描。这里我尝试了两种方法,一种是每扫描一个 IP 调用一次 Masscan,这样可以保证每个 IP 只扫描其对应要检查的端口。但这种方式即便采用多线程的方式亦然效率较低。故而我采用了第二种方法,对每个 IP 扫描所有待测端口的合集,虽然会有多余的端口被扫描到,但效率相较于第一种方法仍有显著提升。

Step4 : 验证端口访问是否合法

待上一步的扫描结果产生后,即可对扫描结果进行分析。针对扫描发现每个 IP 的可访问端口借助 property.json 进行判断,若当前 IP 的区域标签不在该 IP 此敏感端口开放的区域中,则判定为网络访问异常,可能是网络访问权限控制存在问题。

 

一些 Tips

1.已经尝试做了跨平台兼容,目前 Windows、MacOS上测试没什么问题。针对不同平台的处理方法也不同,比如 Windows 平台下 Masscan 是集成在工具中的,在运行工具时会自动生成 Masscan 程序,但 Masscan 的依赖 Winpcap还是需要自行安装哈。 Linux 平台下需要自行下载 Masscan 并添加至全局路径。

2.Masscan 的扫描速度可以脚本中命令调用中自行定义。

3.工具默认设定若同级目录下存在 porperty.json 和 zone.json,则会优先读取文件中的数据。但为保证程序简洁性,支持将 porperty.json 和 zone.json 内容直接写入脚本中,只需替换脚本文件「main」函数中的「iplist」以及「zoneDict」值,并删除脚本同级目录下的 porperty.json 和 zone.json 文件即可。

4.因为落地场景不同,使用者还需根据自身需要对代码进行修改

 

总结

企业网络权限管理是企业安全管理中重要的一环,也有一定的难度。该项目只能提供一种可以检测网络安全访问权限管理情况的方法,但不能解决以下问题:

1.企业内网中资产的梳理以及访问权限的配置
2.分布式多区域检查验证的问题

其实这也是我最想去交流的部分。针对第一个问题,对于资产管理比较混乱的公司,确实是非常难以实现绝对完整的资产梳理,不知各位大佬有什么更好的方法。或许可以优先保证重点系统的网络访问权限把控,其余资产的网络访问权限验证可以分摊到各核心资产负责人去实施把控。

针对第二个问题,可能需要去修改程序,建立CS模式,设置定时任务并回传扫描结果,或许是一个解决的方法。

相信这些问题落地在企业时,各位安全同业都有各自的方法去处理。欢迎交流分享,后续有机会,该项目也会增加相应地解决方案。

 

Todo

  • 增加前端界面更为直观地修改配置文件
  • 项目一切需求紧跟企业落地,所以更新频率和领导提新要求的频率一致
  • 后续还会补充 GUI 版本,之前的 GUI 版本大概如下图吧,或许可以再优化一下
(完)