漏洞扫描
原理
漏洞扫描的原理
漏洞扫描技术是建立在端口扫描基础之上的。从对黑客的攻击行为的分析和收集的漏洞来看,绝大多数都是针对某一端口的。所以漏洞扫描技术是以端口扫描的思路来开展扫描的。主要是检查目标主机是否存在漏洞。
漏洞扫描的方法
- 在端口扫描后得知目标主机开启的端口已经端口上的网络服务,将收集到的信息与网络漏洞扫描系统提供的漏洞库进行匹配,来查看是否有满足匹配条件的漏洞存在。
- 通过模拟黑客的攻击手法,对目标主机系统进行攻击性的安全漏洞扫描。若模拟攻击成功,则表明目标主机系统存在安全漏洞。
漏洞扫描器
nmap是一款免费开放的网络扫描和嗅探工具包,即网络映射器。具有灵活(支持10种不同扫描方式,支持多目标扫描)、强大(可扫描互联网上大规模的计算机群)、自由可移植(支持主流的操作系统,源码开放)、文档丰富,有强大的社区支持等。
通常在使用时:首先进行主机发现,找出活动主机,然后确定活动主机的端口状况。根据端口扫描,确定占用该端口的应用程序及版本信息。
nmap的基本功能是主机发现、端口扫描、应用程序与版本信息侦测、操作系统侦测。此外,提供防火墙与IDS的规避技巧,提供强大的NSE(Nmap Scripting Language)脚本引擎功能,可以对基本功能进行补充和扩展。
- Nessus
Nessus是一个可提供全方位服务的安全扫描程序。它的插件式结构允许用户自定义其系统和网络。
- OpenVAS
开放式漏洞评估系统是一套可用于扫描漏洞和全面漏洞管理的工具和服务系统。OpenVAS可提供基于网络、桌面和命令行的工具。
- WVS
WVS是一款Windows平台上的漏洞扫描器,利用该工具可以对网站中可能存在的SQL注入、XSS跨站、文件上传、命令执行等漏洞进行综合扫描。
- Burpsuite
Burpsuite是一个可以用于攻击Web应用程序的集成平台。Burp套件允许攻击者将人工的和自动的技术结合起来,以列举、分析、攻击Web应用程序,或利用这些程序的漏洞。各种各样的burp工具协同工作,共享信息,并允许将一种工具发现的漏洞作为另一种工具的基础。
- Nikto
Nikto是一款开源的网页服务器扫描器,它可以对网页服务器进行全面的多种扫描。包含超过3300种有潜在危险的文件CGIs;超过625种服务器版本;超过230种特点服务器问题。
- JoomScan
JoomScan是一个开源项目,其主要目的是实现漏洞检测的自动化,以增强Joomla CMS开发的安全性。该工具基于Perl开发,能够轻松无缝地对各种Joomla项目进行漏洞扫描,其轻量化和模块化的架构能够保证扫描过程中不会留下过多的痕迹。它不仅能够检测已知漏洞,而且还能够检测到很多错误配置漏洞和管理权限漏洞等等。JoomScan使用简单,提供了友好的用户界面,而且能够以HTML或文本格式导出扫描报告。
- CrowdStrike(心脏出血扫描器)
CrowdStrike提供一个客户端工具,可以扫描指定IP地址段的OpenSSH服务漏洞。
- MS_17_010_Scan(永恒之蓝扫描器)
扫描目标主机是否存在MS17-010漏洞
逻辑漏洞
逻辑漏洞概述
访问
在某种程度上来说,信息安全就是通过控制如何访问信息资源来防范资源泄露或未经授权修改的工作。访问是主体和客体之间的信息流动,主体是访问中主动的实体,可以是人、程序、进程等;客体是被动的实体,可以是文件、光盘、数据库等。
访问控制
主体访问客体通常需要四个步骤:
- Identification 身份标识
- Authentication 身份验证
- Authorization 授权
- Accountability 审计
访问控制模型
访问控制模型是规定主体如何访问客体的一种架构,主要分为三种:
- 自主访问控制(DAC):由客体的属主自主的对客体进行管理,自主的决定是否将访问权限授予其他主体。
- 强制访问控制(MAC):安全策略由管理员配置,访问控制由系统实施,安全策略是高于一切的存在。
- 角色型访问控制(RBAC):使用集中管理的控制方式来决定主体和客体如何交互,更多的用于企业中,根据不同的职位来分配不同的权限。
什么是逻辑漏洞
逻辑漏洞是由于人的逻辑不严谨而导致的代码中的漏洞。由于人很容易犯错,所以逻辑漏洞一直都在。而且由于逻辑漏洞产生的流量多数为合法流量,一般的防护手段或设备无法阻止,也导致逻辑漏洞成为防护中的难题。
逻辑漏洞的分类
- 验证机制缺陷
验证机制是信息系统安全机制中最简单、最前沿的一种机制。最常见的方式是信息系统要求用户提交用户名与密码,正确则允许用户登录,错误则拒绝用户登录。
- 会话管理缺陷(HTTP协议)
- 无连接
- 每次连接只处理一个请求。服务器处理完客户的请求,并受到客户的应答后,即断开连接,采用这种方式可以节省传输时间。
- 无状态
- 指协议对于事务处理没有记忆能力。
- 再给服务器发送HTTP请求后,服务器根据请求返回数据,但是发送结束后不会记录任何信息。
- 会话
- 执行会话最简单的方式是向每一个用户发布一个唯一的会话令牌或标识符,用户在每一个请求中同时提交令牌。
- 无连接
- 权限控制缺陷
从控制力度来看,可以将权限管理分为功能级权限管理和数据级权限管理;从控制方向来看,可以将权限管理分为从系统获取数据和向系统提交数据。
- 业务逻辑缺陷
每个业务系统都具有不同的业务逻辑,需要具体分析。
验证机制缺陷
暴力破解
暴力破解也称为蛮力攻击,指利用穷举法将所有的可能性一一尝试,在理论上可以破解所以密码问题。在实际测试中,考虑到攻击成本问题,通常使用字典攻击,即逐一尝试用户自定义词典中的可能密码(单词或短语)的攻击方式。
- 弱口令攻击
使用弱口令(容易被他人猜到的口令)字典进行字典攻击。除123456、12345678、admin等常见口令外,生日、姓名、手机号、1qaz@wsx等也被称为弱口令。
- 利用多余的提示信息
登陆失败后,一些网站会提示如用户不存在、密码错误、用户未注册等详细信息。通过这些信息可以推断出用户名、密码等其他信息。
- 可预测信息
类似于手机号、学号等用户名或初始密码。如果已知某网站的初始密码,则利用此密码爆破用户名会更快。
使用Burpsuite进行暴力破解
1. Burpsuite的密码暴力破解模式
Sniper:狙击手模式,单参数破解,多参数时同一个字典按顺序替换各参数;
Battering ram:攻城锤模式,只使用一个payload,每次替换所有位置;
Pitchfork:草叉模式,每个位置单独设置payload,并一一对应;
Cluster bomb:集束炸弹模式,每个位置单独设置payload,尝试使用所有组合。
2. 获取成功破解的结果
根据返回包长度:认证成功和认证失败时返回的Response包的长度通常不同
根据返回包内容:在Option选项卡中的Grep-Match中过滤Invalid\Error\Success等内容
3. 处理Hash值传输
有些网站出于安全考虑,将用户口令进行Hash之后传输
处理字典:对字典中的口令依次计算Hash值,生成新的口令字典
Burpsuite自动处理:在对应Payload选项卡中的Payload Processing中通过Add进行相关设置(添加多个处理方式时会依次进行处理)
4. 处理盐值
① 利用Burpsuite宏绕过
有些网站前端在每次发送时,增加了一个随机的salt字段,用来防止数据包重放(或是CSRF攻击),这样Intruder模块就失效了
1. 打开Options-Sessions选项卡中的Macros,并Add添加一个Macro
2. 在Macro Recorder中选择相关的请求
3. 可以根据功能自定义Macro description
4. 选择configure item进行编辑
5. 在Custom parameter locations in response窗口处选择Add
6. 在Parameter name处修改参数名称,并选择参数的位置,Burpsuite可以自动生成正则表达式
7. 点击OK可以看到Macro已经设置好了
8. 在Session Handling Rules中选择Add
9. 再Details选项卡中,可以根据功能自定义Rule Description
10. 在Rule Actions处选择Add-Run a macro
11. 选择之前设置的Macro,并选择Update only the following parameters,选择后面的Edit,添加要更改的参数名称
12. 在Scope选项卡中
1) Tools Scope选择除Extender之外的全部选项
2) URL Scope选择Include all URLs
13. 选择OK,规则设置完成
14. 之后再进行Intruder Attack即可
需要注意的是由于Requests有先后顺序,Threads不能设置的太高
② 利用requests编写python脚本
import requests
import re
url = ''
cookie = ''
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0', 'Cookie': cookie}
def getSalt():
r = requests.get(url, headers=header)
reg = '' # salt部分的正则表达式
salt = re.findall(reg, r.content)[0]
return salt
def attack():
u = open('', 'r') # 打开用户名字典
p = open('', 'r') # 打开口令字典
userlist = []
passlist = []
for line in u.readlines():
userlist.append(line.strip())
for line in p.readlines():
passlist.append(line.strip())
u.close()
p.close()
for user in userlist:
for passwd in passlist:
data = ['login': user, 'password': passwd, 'salt': getSalt()] # 构造包
rs = requests.post(url, data=data, headers=header)
print(str(len(rs.text)) + ':' + user + '/' + passwd)
attack()
5. 生成字典
① crunch:以一定的规则生成字典
示例:
1. 生成长度为4 由数字组成的字典
crunch 4 4 1234567890
crunch 4 4 -t %%%%
2. 长度为8 以2019开头的字典
crunch 8 8 -t 2019%%%%
3. % 代表数字 @ 代表小写字母 , 代表大写字母 ^ 代表特殊字符
② cupp:生成社会工程学字典
③ cewl:爬取网站内容生成字典
④ 编写脚本
字典组成要素:
1. 常见弱口令
2. 姓名全拼及缩写
3. 全部及部分手机号
4. 出生日期及变形
6. 绕过验证码
绕过图片验证码:
1. 验证码不生效/不更新/不失效
2. 验证码可预测/删除/获取
3. 验证码可识别
4. 寻找其它登陆页面
绕过短信验证码:
1. 4/6位暴力破解
2. 篡改手机号
3. 篡改Response
密码重置
常见问题
- 用户名枚举:网站反馈多余信息
- 验证码返回前端处理:可截获、修改
- 修改Request:用户名、手机号、Cookie等信息可修改
- 修改Response:操作结果成功/失败可修改
- 暴力破解验证码:验证码长度有限或验证码未设置可靠的失效时间
- 拼凑密码重置链接:重置密码链接有规可循
会话管理缺陷
令牌有含义
令牌可能是具有含义的数据,如:
- 用户名称:如user、admin、system
- 用户标识:如0001、0002、0003
- 用户权限:如admin、00101、01000(仿照Linux系统的文件权限)
应该注意的安全问题:
- 权限验证参数应设置的较为复杂,使攻击者难以猜测其含义;
- 权限验证参数不应显示在URL中;
- Cookie数据存放在客户的浏览器上,可能影响机密性、完整性;
- Session数据存放在服务器上,可能影响可用性;
- 可以采取重要信息存储在Session中,其它信息存储在Cookie中。
令牌可预测
令牌可能具有一定的规律,如:
- 顺序码:身份证号、学号、手机号
- 时间戳:当前时间、注册时间、时间戳的变形
令牌可获取
令牌可能采用了不安全的传输和存储方式,如:
- 用户令牌在URL中传输
- 明文传输
- 在分享网页时发送给他人
- 用户令牌存储在日志中
令牌不失效
令牌的有效期可能过长,可以考虑:
- 在一段时间后或关闭浏览器时使令牌失效
- 在令牌提交次数过多时使令牌失效
令牌(Cookie)属性
属性 | 含义 |
Domain | 指定可以访问该Cookie的域名。 如果设置为".google.com",则所有以".google.com"结尾的域名都可以访问该Cookie。 |
Path | Cookie的使用路径。 如果设置为"/sessionWeb/",则只有contextPath为"/sessionWeb"的程序可以访问该Cookie。如果设置为"/",则本域名下contextPath都可以访问该Cookie。 |
Expires | 指定了Cookie的生存期,默认情况下是暂时存在的,存储的值只在浏览器会话期间存在,当用户退出浏览器后这些值也会丢失。 |
HttpOnly | 如果在Cookie中设置了该属性,那么通过js脚本将无法读取到Cookie信息,这样能有效的防止XSS攻击。 |
权限控制缺陷
越权操作
越权操作是信息系统中较为常见的一种漏洞,指的是信息系统对用户的操作权限审核不严,从而使得用户进行了自己权限之外的操作。
权限控制方式
- 防火墙ACL策略:主体 - 规则 - 客体
- Linux文件权限:主体 - 读、写、执行 - 客体
- Web应用权限:基于URL、基于方法、基于数据
- RBAC:基于角色
未授权访问
定义
未授权访问是指需要安全配置或权限认证的地址、页面存在缺陷,导致其他用户可以直接访问。从而引发重要权限可被操作,数据库、网站目录等敏感信息泄露。
目前主要存在未授权访问漏洞的场景
NFS服务, Samba服务, LDAP, Rsync, FTP, GitLab, Jenkins, MongoDB, Redis, ZooKeeper, ElasticSearch, Memcache, CouchDB, Docker, Solr, Hadoop, Dubbo等。
Web应用的未授权访问
在正常情况下,管理后台的页面应该只有管理员才能够访问。这些页面是不应该被链接到前台页面上的,搜索引擎的爬虫也不应该搜索到这些页面。但是一些系统未对用户访问权限进行验证,导致任意用户只要构造出正确的URL,就能够访问到这些页面。
解决方案:
- 隐藏:只能阻止用户无法猜测到后台界面,但是爆破工具可以扫描大量后台地址。
- 页面权限控制:阻挡非认证用户登陆后台,即使找到了后台的链接、也会被认证窗口阻挡。
测试方法:
- Google-Hacking
- 域名爆破
- 端口服务扫描
- 域名关联
越权操作
水平越权的原理及修复
原理:
水平越权指攻击者尝试访问与其具有相同级别的用户资源。
用户A与用户B都属于同一个角色RoleX,但用户A与用户B都各自拥有一些私有数据。在正常情况下,应该只有用户自己才能访问自己的私有数据。但是在RBAC模型下,系统只会验证用户A是否属于角色RoleX,而不会判断具体身份。因此就有可能发生越权访问。
修复:
- 设置合理的会话管理机制,将用户的标识存储在服务器上;
- 在涉及到关于用户隐私的操作时从session中取出用户标识进行操作
- 不能轻信用户的每个输入
垂直越权的原理及修复
原理:
垂直越权指低级别攻击者尝试访问高级别用户的资源。
一般来说,高权限角色访问低权限角色的资源往往是被允许的,低权限角色访问高权限角色的资源往往是被禁止的。如果低权限角色的用户通过一些方法能够获得高权限角色的能力,则发生了越权访问。
修复:
- 设置合理的会话管理机制,在每个涉及到高权限操作的页面进行会话验证