服务与进程的区别:
Windows 服务是指系统自动完成的, 不需要和用户交互的过程, 可长时间运行的可执行应用程序
进程是程序运行的实例, 系统会给运行中的进程分配 CPU, 内存等资源
一个服务不管有没有被运行, 都在你的硬盘里, 只有当它真正被运行时, 操作系统就会真正给它分配内存, CPU 时间片等资源, 这一次运行就对应一个 "进程"
Windows 服务的登录账户有三种:
- Local System (本地系统)
- Network Service(网络服务)
- 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 系统中启动后, 它必须和服务控制管理器通信. 如果没有通信, 服务控制管理器会认为出现了错误, 并会终止这个进程. 我们所有需要做的就是在终止载荷进程之前, 将它迁移到其它进程.
---------------------------------------------------------------------------------------------------------------
python 反弹 shell 请参考: https://www.cnblogs.com/yuzly/p/10473497.html
来源: https://www.cnblogs.com/yuzly/p/10461702.html