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. MySQL SQL语句执行顺序

    MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来 ...

  2. Tomcat他山之石.可以攻玉(一)Server组件

    Server组件 Server组件作用: 采用观察者模式,又叫源-收听者的设计模式,提供了可以动态添加.删除的监听器,作用是在Server组件的不同生命周期中完成不同的功能.逻辑: Tomcat容器的 ...

  3. 【Javascript系列】变量作用域

    问题描述 本篇文章主要讲解javascript变量及其作用域. 1   内容区 在js中,变量大致可分为全局变量(全局作用域)和局部变量(局部作用域): 用关键字var定义变量(全局变量,可以省略va ...

  4. uniq命令

    bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html uniq是去重,不相邻的行不算重复值. uniq [OPTIO ...

  5. OJ:析构函数实现多态

    Description 下面程序的输出结果是: destructor B destructor A 请完整写出 class A. 限制条件:不得为 class A 编写构造函数. #include & ...

  6. 动态规划法(十)最长公共子序列(LCS)问题

    问题介绍   给定一个序列\(X=<x_1,x_2,....,x_m>\),另一个序列\(Z=<z_1,z_2,....,z_k>\)满足如下条件时称为X的子序列:存在一个严格 ...

  7. Entity Framework Core 中文入门文档

    点击链接查看文档: Entity Framework Core 中文入门文档

  8. 跨域学习笔记3--web.config设置之system.webServer 详细介绍,为网站设置默认文档

    自己并不懂,在此先记录下来,留待以后学习... 如何:为 IIS 7.0 配置 <system.webServer> 节2008-06-14 22:26http://technet.mic ...

  9. python使用udp实现聊天器

    聊天器简易版 使用udp实现一个简单的聊天器程序,要求如下: 在一个电脑中编写1个程序,有2个功能 1.获取键盘数据,并将其发送给对方 2.接收数据并显示 并且功能数据进行选择以上的2个功能调用 例子 ...

  10. jquery中找到元素在数组中位置,添加或者删除元素的新方法

    一:查找元素在数组中的位置 jQuery.inArray()函数用于在数组中搜索指定的值,并返回其索引值.如果数组中不存在该值,则返回 -1. jQuery.inArray( value, array ...