mysql 帐户枚举漏洞_漏洞分析:OpenSSH用户枚举漏洞(CVE-2018-15473)分析

2024-01-16 11:40

本文主要是介绍mysql 帐户枚举漏洞_漏洞分析:OpenSSH用户枚举漏洞(CVE-2018-15473)分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原标题:漏洞分析:OpenSSH用户枚举漏洞(CVE-2018-15473)分析

80a5d7ca46e1f19a98b5bc4e079c9481.png

介绍

这个漏洞虽然不能生成有效用户名列表,但是它可以允许攻击者猜测用户名。目前这个OpenSSH用户枚举漏洞(CVE-2018-15473)的详细信息已经上传至了GitHub,感兴趣的同学可以自行查看【传送门】。

在这篇文章中,我们将对该漏洞进行深入分析,并提供一些可行的缓解方案。

技术细节

这个漏洞存在于OpenSSH所实现的一些认证功能之中,首先我们一起看一看Ubuntu OpenSSH的公共密钥认证漏洞。

通过向一台OpenSSH服务器发送恶意的公共密钥认证消息,攻击者将能够获取特定的用户名信息。如果用户不存在,服务器将会向客户端发送认证失败的消息。如果用户存在,消息将无法解析并终止通信,即通信连接会在没有任何消息回传的情况下断开。关于该漏洞的漏洞利用代码可以从这个Python PoC脚本中获取:【传送门】。

这个漏洞之所以存在,是因为服务器在对消息完整解析之前,用户查询了不存在的用户名。想要修复该漏洞也很简单,按攻击逻辑反着来就行了:首先对消息进行完整解析,然后再建立通信连接。

测试漏洞利用PoC的一种方法就是在调试模式下开启OpenSSH服务器:

32730e4c3b2e0878672d97aa9508e951.png

然后用已存在的有效用户名运行PoC脚本:

在服务器端将会查看到错误提示:

499fa01c7315333875aa331d5bb94101.png

相关错误信息还可以在/var/log/auth.log中找到:

55a9c3fad45550a37f9007f559682c2a.png

如果无法正确解析消息,会导致客户端跟服务器端之间的通信中断,而且中断时不会收到服务器发送的提示信息:

304c3457ac717955efc7dfae5cd3fb2d.png

注意粉红色标记的最后一个数据包(客户端数据包),这里没有后续的蓝色数据包(服务器数据包)。

当PoC脚本以不存在的用户名运行之后:

不会弹出“imcomplete message”错误提示:

e1604eb973f9e329858b47eb9b9c5517.png

67921af304abe325865e12a3a403d6ba.png

注意通信数据结尾处的蓝色服务器数据包。

这就是该漏洞(公共密钥认证漏洞)暴露有效用户名的整个流程了。

其中,userauth_pubkey函数是认证功能所实现的其中一个函数,专门用于根据公共密钥来完成身份验证。如果认证失败,则返回“0”,成功则返回“1”。当服务器端接收到了SSH2_MSG_USERAUTH_REQUEST请求后,便会调用该函数,之后的结果会用来给客户端回传SSH2_MSG_USERAUTH_FAILURE或SSH2_MSG_USERAUTH_SUCCESS消息。

f842b3f31e3a3c965a5f2eef3ce8e150.png

该函数的运行逻辑为:

1. 如果用户名不存在:返回“0”;

2. 如果用户名存在但密钥错误:返回“0”;

3. 如果用户名存在且密钥正确:返回“1”;

但是有人发现,我们竟然可以在第一步和第二步中间终止userauth_pubkey函数的运行。第一步执行完后,userauth_pubkey函数会从客户端获取消息字符串,如果获取失败(恶意字符串导致),整个过程都会终止,并在不发送任何回传消息的情况下关闭连接。

packet_get_string所导致的情况如下:

7ae9165e91fb3c25a80854873b4e1136.png

如果用户名存在,第一步会在程序从消息域中提取完数据后进行。

第一个提取的数据域是一个布尔值(1字节),对应函数为packet_get_char()。如果认证类型为publickey,返回值就是“1”。后续跟着的是两个字符串:算法和密钥。在SSH消息中,字符串会以一个“长度-值“键值对进行编码,一个字符串为4个字节。

函数packet_get_string可以从消息中提取字符串,并对其进行验证,这个函数还需要依赖另一个函数:ssh_ssh_packet_get_string。

8a1543e00a61db5c652af51fed77a7fd.png

ssh_packet_get_string函数会调用sshpkt_get_string函数,如果返回的值不是“0”,它还会调用fatal函数。函数fatal会记录致命的错误事件,然后终止生成的OpenSSH进程(不回传任何错误信息)。

c47715446d6ed3cf417fecd25662aab2.png

接下来会执行sshpkt_get_string函数并调用sshbuf_get_string函数:

a3073c5341872e4cc0244f4655262999.png

然后sshbuf_get_string函数会调用sshbuf_get_string_direct:

675d51814babcfcedba6f72cb0d74f87.png

然后sshbuf_get_string_direct会调用sshbuf_peek_string_direct:

e6f695a8ad311ef26673b97d22d30a42.png

最后,sshbuf_peek_string_direct会进行字符串验证:

b5c300a354a5df10e97ca31eebe7b63d.png

如果消息中剩余数据小于4字节,或者说消息中的剩余数据小于字符串长度,则会返回SSH_ERR_MESSAGE_INCOMPLETE 错误消息。这就是我们之前那个Python PoC脚本所要触发的东西。首先,它会跟OpenSSH服务器建立一条加密的通信链接,然后向其发送恶意的SSH2_MSG_USERAUTH_REQUEST消息。通过重定义add_boolean函数,消息中的布尔值域会被忽略。

当函数userauth_pubkey解析了恶意消息之后,首先会读取布尔值域,由于这个域其实是不存在的,因此读取的会是下一个域(函数packet_get_char):加密算法字符串的4字节长度值。然后调用下一个函数packet_get_string来读取加密算法字符串。

下面是解析合法消息的过程:

07b050088e870a8322e282067459ebe1.png

下面是解析恶意消息的过程:

ebdf80ee9b8762cd5bf0d5cc16866032.png

结果就是,代码解析了一个1907字节的字符串(十六进制为0×00000773),这比整个消息的长度还要长,这会导致ssh_packet_get_string调用fatal函数,并中断OpenSSH进程。

漏洞总结

这是一个非常隐蔽的漏洞,它不是一个缓冲区溢出漏洞,也不是远程代码执行漏洞,更不是错误输入验证漏洞。这里不存在任何的缓冲区溢出问题,所有的输入都在使用之前进行了验证。问题就是,输入验证是在进行了一些函数处理之后完成的。

问题的解决方法也比较简单:更换函数的调用顺序即可,也就是首先进行输入验证,然后再进行函数处理就可以了。

* 参考来源:nviso,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM返回搜狐,查看更多

责任编辑:

这篇关于mysql 帐户枚举漏洞_漏洞分析:OpenSSH用户枚举漏洞(CVE-2018-15473)分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/612469

相关文章

SQL BETWEEN 的常见用法小结

《SQLBETWEEN的常见用法小结》BETWEEN操作符是SQL中非常有用的工具,它允许你快速选取某个范围内的值,本文给大家介绍SQLBETWEEN的常见用法,感兴趣的朋友一起看看吧... 在SQL中,BETWEEN是一个操作符,用于选取介于两个值之间的数据。它包含这两个边界值。BETWEEN操作符常用

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

MySql match against工具详细用法

《MySqlmatchagainst工具详细用法》在MySQL中,MATCH……AGAINST是全文索引(Full-Textindex)的查询语法,它允许你对文本进行高效的全文搜素,支持自然语言搜... 目录一、全文索引的基本概念二、创建全文索引三、自然语言搜索四、布尔搜索五、相关性排序六、全文索引的限制七

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

SQL server配置管理器找不到如何打开它

《SQLserver配置管理器找不到如何打开它》最近遇到了SQLserver配置管理器打不开的问题,尝试在开始菜单栏搜SQLServerManager无果,于是将自己找到的方法总结分享给大家,对SQ... 目录方法一:桌面图标进入方法二:运行窗口进入方法三:查找文件路径方法四:检查 SQL Server 安

MySQL 中的 LIMIT 语句及基本用法

《MySQL中的LIMIT语句及基本用法》LIMIT语句用于限制查询返回的行数,常用于分页查询或取部分数据,提高查询效率,:本文主要介绍MySQL中的LIMIT语句,需要的朋友可以参考下... 目录mysql 中的 LIMIT 语句1. LIMIT 语法2. LIMIT 基本用法(1) 获取前 N 行数据(

MySQL 分区与分库分表策略应用小结

《MySQL分区与分库分表策略应用小结》在大数据量、复杂查询和高并发的应用场景下,单一数据库往往难以满足性能和扩展性的要求,本文将详细介绍这两种策略的基本概念、实现方法及优缺点,并通过实际案例展示如... 目录mysql 分区与分库分表策略1. 数据库水平拆分的背景2. MySQL 分区策略2.1 分区概念