powershell脚本之windows服务与进程
服务与进程的区别:
Windows服务是指系统自动完成的,不需要和用户交互的过程,可长时间运行的可执行应用程序
进程是程序运行的实例,系统会给运行中的进程分配CPU、内存等资源
一个服务不管有没有被运行,都在你的硬盘里,只有当它真正被运行时,操作系统就会真正给它分配内存、CPU时间片等资源,这一次运行就对应一个“进程”
windows服务的登录账户有三种:
1.Local System (本地系统)
2.Network Service(网络服务)
3.Local Service(本地服务)
一、 Local System (本地系统)
首先,该账户也隶属于本地Administrators用户组,因此所有本地Administrators用户能够进行的操作该账户也能够进行。
其次,该账户还能够控制文件的权限(NTFS 文件系统)和注册表权限,甚至占据所有者权限来取得访问资格。如果机器处于域中,那么运行于Local System账户下的服务还可以使用机器账户在同一个森林中得到其他机器的自动认证。最后一点就是运行于Local System下的进程能够使用空会话(null session)去访问网络资源。
二、Network Service(网络服务)
Network Service账户是预设的拥有本机部分权限的本地账户,它能够以计算机的名义访问网络资源。但是他没有Local System那么多的权限,以这个账户运行的服务会根据实际环境把访问凭据提交给远程的计算机。
三、Local Service(本地服务)
Local Service账户是预设的拥有最小权限的本地账户,并在网络凭证中具有匿名的身份。
运行于此账户下的进程和运行于Network Service账户下的进程的区别在于运行于Local Service账户下的进程只能访问允许匿名访问的网络资源。
四、服务管理命令
在cmd下可有两种方法启动服务,net和sc,net用于打开没有被禁用的服务,语法是:
net start 服务名 ——启动服务
net stop 服务名——停止服务
用sc可打开被禁用的服务,语法是:
sc config 服务名 start= demand //手动
sc condig 服务名 start= auto //自动
sc config 服务名 start= disabled //禁用
sc start 服务名
sc stop 服务名
sc命令中=号后面都有一个空格,=号前面没有空格
注:1.服务名不一定是你在服务面板看到的那个名,需要查看服务属性,从那里看服务名称,注意是服务名称,不是显示名称
2.net 只能打开没有被禁用的服务sc命令 等号和值之间需要一个空格。
net用法:
1.查找服务名:
2.开启服务,这里以windows update服务为例
2.1找到windows update服务的服务名,查询服务的状态(sc query 服务名),可以看到服务状态时关闭的。
2.2开启服务并查询服务状态 #开启服务可以在非以”管理员运行cmd”下开启服务
3.关闭服务 #关闭服务必须在”以管理员运行的状态下运行”下关闭服务,不然会提示”拒绝访问”
4.当服务处于禁用状态时,net start 服务名命令就不能用了,只能用sc start 服务名
把windows update服务禁用掉,然后测试,可以看到当把服务禁用掉之后再使用net start 服务名就不能开启服务了
5.使用sc start 服务名开启被禁用的服务,需要先把服务设置为自动或者手动(sc config 服务名 start =demand/auto)再使用sc start服务名或者net 服务名开启服务 #等号和值之间需要一个空格
五、用powershell查看系统启用了哪些服务
1.打开powershell,键入如下命令
Get-WmiObject Win32_Service|?{$_.startname -like "LocalSystem"}|fl Name,PathName,State,StartMode|out-file C:\Users\wangyixue\Desktop\homework\Windows\lesson5\localsystem.log
2.在lesson5目录下可以看到记录了LocalSystem(本地系统)服务的名称、可执行文件的路径、服务状态、启动类型的localsystem.log文件(fl 以列表形式显示)
3.继续键入以下命令,筛选出启动类型为“Auto”(自动)的服务
Get-WmiObject Win32_Service|?{$_.startname -like "LocalSystem" -and $_.startmode -like "Auto"}|fl Name,PathName,State,StartMode|out-file C:\Users\wangyixue\Desktop\homework\Windows\lesson5\localsystem.log
4.查看lesson5目录下的localsystem.log文件,可得所有的启动类型为自动的服务
用脚本执行的代码如下:
<#
#get-wmiobject win32_service | ?{$_.startname -like "LocalSystem"}|ft name,pathname,startmode | out-file -filepath c:\test\service.log
?是Where-Object的另一个别名 可以使用 Get-Alias -Definition Where-Object 查看Where-Object的所有别名
% 是foreach-Object的另一个别名 可以使用 Get-Alias -Definition foreach-object 查foreach-object的所有别名
#LocalSystem 本地系统
#NT AUTHORITY\NetworkService 网络服务
# NT AUTHORITY\LocalService 本地服务
#>
$aaa=get-wmiobject win32_service #获得所有服务
$s1=@()
$s2=@() #创建空数据
$s3=@()
foreach($i in $aaa) #遍历对象数组
{
if ($i.startname -like "LocalSystem")
{
$s1+=$i #添加数组
}
elseif($i.startname -like "NT AUTHORITY\LocalService")
{
$s2+=$i
}
else
{
$s3+=$i
}
}
$s1|fl name,pathname,startmode | out-file -filepath c:\test\localsystem.log #按表格输出并保存到文件
$s2|fl name,pathname,startmode | out-file -filepath c:\test\localservice.log
$s3|fl name,pathname,startmode | out-file -filepath c:\test\netservice.log
六、检查每个系统服务路径的权限
<#
获得系统服务的服务程序路径的权限
get-acl 获得应用程序的权限,执行后返回的对象,包含若干方法可以用来更新权限和设定所有权
#icacls 也是获得应用程序的权限,不同之处是icacls获得的是对象数组
#>
$ErrorActionPreference="SilentlyContinue"
$a=whoami #查看当前的用户
#对whoami获得结果进行处理,得到当前用户名 $a是对象数组,具有split方法
$uname=$a.split("\")[1]
$group=(net user $uname | where {$_ -like "本地组*"}).split("*")[1].trim() #获得当前用户所属组 本次实验只适用于用户属于一个组
#获得所有*System服务账户类型、启动类型
$s=Get-WmiObject win32_service |where{$_.startname -like "*System" -and $_.startmode -like "Auto"}
#匹配所有的服务程序路径 ~为powershell中的转义符 #?匹配0次或1次
$lujing=$s|where{$_.pathname -match ".+exe(`")?$"}
#循环遍历获得所有服务程序的权限 get-acl 获得应用程序的权限,执行后返回的对象,包含若干方法可以用来更新权限和设定所有权
#icacls 也是获得应用程序的权限,不同之处是icacls获得的是对象数组
$lujing|foreach{
Trap{ #Trap异常处理,遇到错误,丢弃掉,继续往下处理
get-acl $_.pathname
continue
}
if($?){
"********************************************************************"
$_.name
$_.pathname
(icacls $_.pathname.tostring()|where{$_ -like "*$group*"}).trim()
}
}
七、利用服务漏洞进行提权
1.Trusted Service Paths
这个漏洞存在于二进制服务文件路径中Windows错误解释空格。这些服务通常都是以系统权限运行的,如果我们利用这些服务就可能提权到系统权限。例如如下文件路径:
C:\Program Files\Some Folder\Service.exe
上面文件路径中的空格,Windows会尝试寻找并执行以空格前单词为名字的程序,操作系统会在文件路径下查找所有可能匹配项直到找到一个匹配为止。例如如下例子,Windows会尝试定位并执行如下的程序:
C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe
Note:这种特性发生在开发人员没有将整个文件路径包含在引号内。将文件路径包含在引号内会降低这个漏洞的威胁。所以这个漏洞被称为“不带引号的服务路径(Unquoted Service Paths.)”
检测目标主机是否存在该漏洞:
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr/i /v """
下面做一个实验来验证服务路径漏洞是否存在
实验环境:
win7和存在服务路径漏洞的photodex proshow.exe文件 从github下载:https://www.exploit-db.com/exploits/24872
1.首先,我们在Windows系统中下载并安装一个名为photodex proshow的漏洞应用程序,我们可以在Exploit DB下找到了它。
2.在win7上安装下载好的exe文件
3.测试是否存在服务路径漏洞
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr/i /v """
从下图可以看到服务路径有空格而且没有引号,可以说明存在服务路径漏洞
4.把一个反弹shell python脚本的客户端打包成exe文件,放到上面漏洞程序的文件夹中,并把python打包的exe文件重命名为带漏洞的文件名,开启反弹shell服务端脚本,然后重新启动带漏洞的程序的服务。但连接是短暂的,这是因为当一个服务在Windows系统中启动后,它必须和服务控制管理器通信。如果没有通信,服务控制管理器会认为出现了错误,并会终止这个进程。我们所有需要做的就是在终止载荷进程之前,将它迁移到其它进程。