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系统中启动后,它必须和服务控制管理器通信。如果没有通信,服务控制管理器会认为出现了错误,并会终止这个进程。我们所有需要做的就是在终止载荷进程之前,将它迁移到其它进程。

  

---------------------------------------------------------------------------------------------------------------

python 反弹shell请参考:https://www.cnblogs.com/yuzly/p/10473497.html  

powershell脚本之windows服务与进程的更多相关文章

  1. 使用脚本监控windows服务的方法

    以下脚本可监控某一个windows服务,发现其停止就立即重启之. @echo off rem 定义循环间隔时间和监测的服务: set secs=60 set srvname="NetWin ...

  2. windows服务和进程的区别和联系

    Windows Service 是主要用于服务器环境而长期运行的应用程序, 这类程序不需要有用户界面或者任何模拟输出. 任何的用户消息通常都是记录在Windows 事件日志里.Windows Serv ...

  3. Windows服务启动进程----Cjwdev.WindowsApi.dll

    windows服务下无法启动外部程序 做一个windows服务监听服务,涉及到windows服务启动外部程序的一个过程,但是调试测试发现,无法简单的用process.start()这种方法, 原因是在 ...

  4. shell脚本杀死某个服务的进程

    摘抄如下: 新建sh结尾的文件内容如下: NAME=$1echo $NAMEID=`ps -ef | grep "$NAME" | grep -v "$0" | ...

  5. 写一个Windows上的守护进程(6)Windows服务

    写一个Windows上的守护进程(6)Windows服务 守护进程因为要开机启动,还要高权限,所以我就把它做成Windows服务了. 关于Windows服务的官方文档,大家可以看https://msd ...

  6. windows服务

    .net windows 服务创建.安装.卸载和调试   原文:http://www.cnblogs.com/hfliyi/archive/2012/08/12/2635290.html 我对例子做了 ...

  7. .net windows 服务创建、安装、卸载和调试

    原文:http://blog.csdn.net/angle860123/article/details/17375895 windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境 ...

  8. windows服务启动有界面的程序

    大家写windows服务守护进程的时候,肯定会遇到启动的程序看不到界面,只能在任务管理器里面看到xxx.exe问题. 发现可能有如下情况 a.无论是开机,还是程序被关掉后,守护服务启动的程序只能看到任 ...

  9. 创建Windows服务

    windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志.计算机启动时,服务会自动开始 ...

随机推荐

  1. Docker 设置固定网络IP

    1.创建自定义网络: 2.查看自定义网络: 3.启动容器: 4.查看容器IP:

  2. JS判断滚动条到底部,页面是否有滚动条

    要判断页面滚动条是否到底,需要了解三个属性: scrollHeight:获取元素内容高度的度量,包括由于溢出导致的视图中不可见内容,说直白点,算上了滚动条不可见的那部分高度. clientHeight ...

  3. MySQL:进阶之视图函数

    一,视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 使用视图我们可以把查询过程中的临时 ...

  4. 修改wampsever中MySql5.7.14默认为空的密码

    ①打开WAMP找中MySql控制台,提示输入密码,开始密码为空,直接按回车 ②输入[use mysql],控制台提示[Database changed] ③输入[update user set aut ...

  5. 彻底弄懂python编码

    在编写python程序的过程中,中英文混用经常会出现编码问题.围绕此问题,本文首先介绍编码的含义及常用编码,随后列举几个python经常遇到的编码异常及解决方法,接着列举笔者在实践中遇到的异常出现的情 ...

  6. Ansible剧本介绍及使用演示(week5_day2)--技术流ken

    Ansible剧本编写说明 一. 缩进 yaml 的缩进要求比较严格.一定不能使用tab键 注意:编写yaml文件,就忘掉shell的tab吧. 二. 冒号 每个冒号后面一定要有一个空格 注意:1. ...

  7. js_jquery_创建cookie有效期问题_时区问题

    用jquery设置Cookie过期的两种方式: $.cookie('名', '值', { expires: 过期时间(DateTime), path: "/", domain: w ...

  8. MVC学习之路(1) EF 增删查改合集

    首先再Model中创建一个类[WMBlogDB] public class WMBlogDB : DbContext { //连接字符串. public WMBlogDB() : base(" ...

  9. [转]从minio中读取文件流进行下载文件

    本文转自:https://blog.csdn.net/ZHANGLIZENG/article/details/82892678 一.获取Minio连接    public static String ...

  10. 关于RecyclerView你知道的不知道的都在这了(下)

    目录 目录 正文 6. Recycler 7. ItemAnimator 8. ItemDecoration 9. OnFlingListener 目录 由于本篇篇幅特长,特意做了个目录,让大伙对本篇 ...