windows服务powershell的.exe权限

我的代码被屏蔽了

我将尝试解释我想用它做什么,我的代码是扫描不同的 Windows 服务,只将使用 .exe 的内容保留在内存中,然后在其中搜索用户可以完全控制的内容。我希望它在最后显示服务及其权利。

$services = Get-WmiObject win32_service | ?{$_.PathName -like '*.exe*'} | select Name, State, Pathname, StartName  | Out-Null 
foreach ($service in $services) {
$var = "{0}.exe" -f ($Service.PathName -Split ".exe")[0] 
foreach ($right in $var ){

if ( (Get-Acl $var).Access -ccontains "BUILTINUtilisateurs FullControl "{
    
    Write-Warning " Exploit detected "
}

 }
 }

提前感谢您的反馈

回答

Get-CimInstance Win32_Service |
  Where-Object { $_.PathName -like '*.exe*'} | 
    Select-Object Name, State, Pathname, StartName |
      ForEach-Object {
        $_.PathName = ($_.PathName -split '(?<=.exeb)')[0].Trim('"')
        Add-Member -PassThru -InputObject $_ Acl (Get-Acl -LiteralPath $_.PathName)
      } | 
        Where-Object { 
          $_.Acl.Access.Where({
             $_.IdentityReference -ceq 'BUILTINUtilisateurs' -and 
              $_.FileSystemRights -eq 'FullControl' 
          }, 'First').Count -gt 0
        }

请注意,我已替换Get-WmiObjectGet-CimInstance,因为 CIM cmdlet 取代了 PowerShell v3(2012 年 9 月发布)中的 WMI cmdlet。因此,应该避免使用 WMI cmdlet,尤其是因为 PowerShell (Core) (v6+),未来所有的努力都将进行,甚至不再拥有它们。但是请注意,WMI 仍然CIM cmdlet 的基础。有关更多信息,请参阅此答案。

以上使用ForEach-Object调用:

  • 更新.PathName每个对象的属性以仅包含每个服务的可执行文件的 - 未引用 - 路径。

  • .Acl通过 向每个对象添加一个属性Add-Member,其中包含通过获得的服务可执行文件的 ACL Get-Acl

生成的对象列表随后由其服务可执行 ACL 包含身份BUILTINUtilisateurs[1]条目的对象进行过滤,该条目具有对可执行文件的完全控制权。

也就是说,结果对象实际上是您打算为其发出的对象 Write-Warning " Exploit detected "


至于你尝试什么

  • $services = ... | Out-Null根据定义,变量中捕获任何内容[2]$services,因为它Out-Null的目的是抑制输出。

  • 虽然$var = "{0}.exe" -f ($Service.PathName -Split ".exe")[0]确实提取了可执行路径(虽然.exe应该是.exeb,为了健壮性),但它可能包含括起来的双引号,应该去掉。

  • 目前还不清楚$rights从哪里来。

  • 您无法使用-ccontains跨匹配多个对象的属性,并注意为目的-contains经营者及其变种是一个值的测试存在于全集合中,而不是寻找一个子串在一个字符串。


[1] 有趣的是,这些身份引用是本地化的;在美国-英语系统上的等价物是BUILTINUsers. 通常,最好获得此身份的独立于文化的表示形式,即其 SID,并将其用于比较:$_.IdentityReference.Translate([System.Security.Principal.SecurityIdentifier]).Value -eq 'S-1-5-32-545'

[2] 粗略地说,$null; 从技术上讲,它是 PowerShell 用来表示“未收到输出”的单例值,[System.Management.Automation.Internal.AutomationNull]::Value.


以上是windows服务powershell的.exe权限的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>