powershell脚本之windows服务与进程
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服务与进程的更多相关文章
- 使用脚本监控windows服务的方法
以下脚本可监控某一个windows服务,发现其停止就立即重启之. @echo off rem 定义循环间隔时间和监测的服务: set secs=60 set srvname="NetWin ...
- windows服务和进程的区别和联系
Windows Service 是主要用于服务器环境而长期运行的应用程序, 这类程序不需要有用户界面或者任何模拟输出. 任何的用户消息通常都是记录在Windows 事件日志里.Windows Serv ...
- Windows服务启动进程----Cjwdev.WindowsApi.dll
windows服务下无法启动外部程序 做一个windows服务监听服务,涉及到windows服务启动外部程序的一个过程,但是调试测试发现,无法简单的用process.start()这种方法, 原因是在 ...
- shell脚本杀死某个服务的进程
摘抄如下: 新建sh结尾的文件内容如下: NAME=$1echo $NAMEID=`ps -ef | grep "$NAME" | grep -v "$0" | ...
- 写一个Windows上的守护进程(6)Windows服务
写一个Windows上的守护进程(6)Windows服务 守护进程因为要开机启动,还要高权限,所以我就把它做成Windows服务了. 关于Windows服务的官方文档,大家可以看https://msd ...
- windows服务
.net windows 服务创建.安装.卸载和调试 原文:http://www.cnblogs.com/hfliyi/archive/2012/08/12/2635290.html 我对例子做了 ...
- .net windows 服务创建、安装、卸载和调试
原文:http://blog.csdn.net/angle860123/article/details/17375895 windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境 ...
- windows服务启动有界面的程序
大家写windows服务守护进程的时候,肯定会遇到启动的程序看不到界面,只能在任务管理器里面看到xxx.exe问题. 发现可能有如下情况 a.无论是开机,还是程序被关掉后,守护服务启动的程序只能看到任 ...
- 创建Windows服务
windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志.计算机启动时,服务会自动开始 ...
随机推荐
- [机器学习]梯度提升决策树--GBDT
概述 GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由 ...
- MySQL:测试题
一,表关系的练习测试 请创建如下表关系,并建立相关约束 一,创建表结构数据: 创建的话肯定先创建没有关联的表,老师,课程(关联老师),年级,班级(关联年级),学生(关联班级), 班级任职表 (关联老师 ...
- #19 re&jieba模块
前言 在Python中,需要对字符串进行大量的操作,有时需要从一个字符串中提取到特定的信息,用切片肯定是不行的,所有这一节记录两个强大的文本处理模块,一个是正则表达式re模块,另一个是中文处理模块ji ...
- Perl的子程序
子程序(subroutine) perl中的子程序其实就是自定义函数.它使用sub关键字开头,表示声明一个子程序 子程序名称有独立的名称空间,不会和其它名称冲突 Perl中的子程序中可以定义.引用.修 ...
- ORA-28002:the password will expire within 6 days
1.查看用户的proifle SELECT username,PROFILE FROM dba_users; 2.查看指定概要文件(如default)的密码有效期设置:SELECT * FROM db ...
- 爬虫之抓取js生成的数据
有很多页面,当我们用request发送请求,返回的内容里面并没有页面上显示的数据,主要有两种情况,一是通过ajax异步发送请求,得到响应把数据放入页面中,对于这种情况,我们可以查看关于ajax的请求, ...
- tiny210 tslib 测试(基于 ft5x06 触摸屏),解决触摸无效问题
1. 拷贝至开发板 将上次实验中的 tmp 文件夹拷贝到开发板,可以通过 nfs 来传输,并将 tmp/lib 下的所有 .so 文件拷贝至 开发板的 /usr/lib 中,并且确保库的映射关系正确. ...
- C#线程同步--限量使用
问题抽象:当某一资源同一时刻允许一定数量的线程使用的时候,需要有个机制来阻塞多余的线程,直到资源再次变得可用.线程同步方案:Semaphore.SemaphoreSlim.CountdownEvent ...
- PHP定界符eof 的使用
PHP是一个Web编程语言,在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况,如果用传统的输出方法 ——按字符串输出的话, 肯定要有大量的转义符来对字符串中的引号等 ...
- 使用xhprof会在nginx下报502 Bad Gateway错误
使用xhprof会在nginx下报502 Bad Gateway错误 xhprof_enable()xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMO ...