国家电网公司信息与网络安全重点实验室
国家电网公司网络安全技术分析中心
全球能源互联网研究院有限公司
前言
用友NC产品是面向集团企业的世界级高端管理软件,市场占有率在同类产品中已经达到亚太第一,已在8000家集团企业中应用,国内用户涵盖大多数关键基础设施运营单位。用友NC综合利用最新的互联网技术、云计算技术、移动应用技术等,通过构建大企业私有云来全面满足集团企业管理、全产业链管控和电子商务运营,成为大型集团企业生产运营中必备的一环,其安全性至关重要,一旦攻击者成功攻破该系统,不仅可以获取企业集团财务人员相关信息和运行数据,极易造成公司重要信息泄露,给公司带来极其不良的社会影响和经济损失;而且还可以作为突破口,进一步向基础设施运营企业的生产运营网络渗透,严重危害基础设施网络的生产安全。
由全球能源互联网研究院有限公司运营的国家电网公司信息与网络安全重点实验室的安全团队在日常渗透测试中,发现用友NC最新的6.5版本中存在JAVA反序列化远程命令执行“0-Day”漏洞,利用该漏洞可完全获取主机控制权限,造成OA平台内的敏感数据泄露,并为进一步向关键基础设施运营企业的生产网络渗透提供重要跳板。以下为漏洞发现的具体详情:
用友NC基础架构分析
用友NC是为企业提供建模、开发、继承、运行、管理一体化的IT解决方案的信息化平台。用友NC为C/S架构,使用JAVA编程语言开发,客户端可直接使用UClient,服务端接口为HTTP。
通过UClient打开用友NC,如下图所示:
UClient本质为UBroswer,一个专用的用友NC浏览器嵌入了JAVA运行环境,以解决NC 6系列之前的版本中applet在不同设备上的应用问题。经过文件目录查看分析得知用友UClient安装后,会在用户目录下新建uclient文件夹,文件结构如下所示:
其中apps中存储应用,downloads包含一些静态资源文件(logo等),log中是Uclient的运行日志,share中是UClient应用的java运行环境,其他的文件不是很重要,根据文件名理即可。
打开apps中的其中一个应用,文件结构如下:
根据看到的NCLogin65.jar文件,结合java运行进程信息,分析得知是一些界面和登陆逻辑代码,nc_client_home则是NC应用依赖的其他一些代码和jar包,因此可以使用Luyten反编译工具查看NCLogin65.jar:
通过简单运行NC应用,尝试进行用户登陆,使用wireshark抓包,发现流量经过加密处理:
查看app.log运行日志,发现大量serialize和deserialize,说明系统中应用了序列化方式来传送数据。
调试分析发现漏洞
根据万物皆可调定理,综合使用java agent和 jdwp的方式进行调试,java agent是为了准确定位打断点的位置。Java agent的Transformer代码如下,目的是将实时调用的类打印出来,方便打断点,jdwp调试不多说:
package org.javaweb;
import org.apache.log4j.Logger;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;
publicclassDebugTransformerimplementsClassFileTransformer {
Logger logger = Logger.getLogger(DebugTransformer.class);
@Override
publicbyte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain,byte[] classfileBuffer)throws IllegalClassFormatException {
className = className.replace("/",".");
if(className.startsWith("nc.")){
logger.debug("Call -> "+className);
}
return classfileBuffer;
}
}
经过分析,我们在LoginUI类中的login方法打断点,启动Idea进行跟踪调试。
当跟踪到loginImple方法时,发现多处调用了NCLocator的lookup方法查找Service接口进行操作,结合日志中serialize和deserialize、客户端中多处的jar包和class类文件,分析得出这里肯定应用了RMI去远程中心加载类进行调用。
查看NCLocator发现是个抽象类,实现了Context接口,NCLocator有多个实现类,通过跟踪发现,实际使用了RmiNCLocator类,RmiNCLocator类的lookup方法如下:
package nc.bs.framework.rmi;
import java.util.HashMap;
import java.util.Properties;
import nc.bs.framework.common.NCLocator;
import nc.bs.framework.exception.ComponentException;
import nc.bs.framework.exception.FrameworkRuntimeException;
import nc.bs.framework.naming.Context;
publicclassRmiNCLocatorextendsNCLocator {
private Context remoteContext;
private static HashMap<String, Context> remoteResolverMap = new HashMap();
publicRmiNCLocator() {
}
public Objectlookup(String name)throws ComponentException {
Object result = null;
try {
result =this.remoteContext.lookup(name);
return result;
}catch (Throwable var4) {
if (var4instanceof FrameworkRuntimeException) {
throw (FrameworkRuntimeException)var4;
}else {
thrownew ComponentException(name,"Component resolve exception ", var4);
}
}
}
......
}
看到这里的lookup,已初步判断出无需继续跟踪调试,可以直接通过jndi注入漏洞进行利用。
利用方式
构造远程命令执行POC部署公网服务器,利用JNDI注入触发漏洞,即可看到来自目标的服务器的请求,证明我们成功利用反序列化远程命令执行漏洞在目标服务器上执行了whoami命令:
继续深入利用漏洞,进行反弹shell操作,并完全获取服务器的控制权限,可执行id、whoami、ifconfig等操作系统命令。
声明:本文来自网络安全应急技术国家工程实验室,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。