【安全通报】用友NC反序列化远程命令执行漏洞
![]()
概况
用友NC产品是面向集团企业的世界级高端管理软件,市场占有率在同类产品中已经达到亚太第一,已在8000家集团企业中应用,国内用户涵盖大多数关键基础设施运营单位。用友NC综合利用最新的互联网技术、云计算技术、移动应用技术等,通过构建大企业私有云来全面满足集团企业管理、全产业链管控和电子商务运营,成为大型集团企业生产运营中必备的一环,其安全性至关重要,一旦攻击者成功攻破该系统,不仅可以获取企业集团财务人员相关信息和运行数据,极易造成公司重要信息泄露,给公司带来极其不良的社会影响和经济损失;而且还可以作为突破口,进一步向基础设施运营企业的生产运营网络渗透,严重危害基础设施网络的生产安全。
由全球能源互联网研究院有限公司运营的国家电网公司信息与网络安全重点实验室的安全团队在日常渗透测试中,发现用友NC最新的6.5版本中存在JAVA反序列化远程命令执行“0-Day”漏洞,利用该漏洞可完全获取主机控制权限,造成OA平台内的敏感数据泄露,并为进一步向关键基础设施运营企业的生产网络渗透提供重要跳板。
危害等级
高危
FOFA指纹
漏洞影响范围
根据目前FOFA系统最新数据(一年内数据),显示全球范围内共有 7837 个用友NC服务对外开放。中国大陆使用数量最多,共有 7676 个,中国香港第二,共有 37 个,新加坡第三,共有 26 个,中国澳门第四,共有 17 个,马来西亚第五,共有 14 个。
全球范围内分布情况如下(仅为分布情况,非漏洞影响情况)
![]()
中国大陆地区北京市使用数量最多,共有 1859 个,浙江省第二,共有 1062 个,广东省第三,共有 658 个,江苏省第四,共有 564 个,上海市第五,共有 521 个。
![]()
漏洞分析
用友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;
public class DebugTransformer implements ClassFileTransformer {
Logger logger = Logger.getLogger(DebugTransformer.class);
@Override
public byte[] 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;
public class RmiNCLocator extends NCLocator {
private Context remoteContext;
private static HashMap<String, Context> remoteResolverMap = new HashMap();
public RmiNCLocator() {
}
public Object lookup(String name) throws ComponentException {
Object result = null;
try {
result = this.remoteContext.lookup(name);
return result;
} catch (Throwable var4) {
if (var4 instanceof FrameworkRuntimeException) {
throw (FrameworkRuntimeException)var4;
} else {
throw new ComponentException(name, "Component resolve exception ", var4);
}
}
}
......
}看到这里的lookup,已初步判断出无需继续跟踪调试,可以直接通过jndi注入漏洞进行利用。
漏洞利用
构造远程命令执行POC部署公网服务器,利用JNDI注入触发漏洞,即可看到来自目标的服务器的请求:
![]()
继续深入利用漏洞,进行反弹shell操作,并完全获取服务器的控制权限,可执行id、whoami、ifconfig等操作系统命令。
![]()
影响范围
- 用友NC <= 6.5
修复建议
缓解措施:
在官方安全补丁发布之前,建议相关企业尽快临时关闭网站的对外访问;
用友NC为商业软件,可直接联系用友官方获得安全升级方案。
参考
[1] https://mp.weixin.qq.com/s/TkzQvw1iXjySoU9LJjLdRw
白帽汇从事信息安全,专注于安全大数据、企业威胁情报。
公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC-安全讯息平台。
为您提供:网络空间测绘、企业资产收集、企业威胁情报、应急响应服务。

xiannv 1972天前
评论正在提交,请稍等...
最新评论