天天看點

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.查找服務名:

  

powershell腳本之windows服務與程式

2.開啟服務,這裡以windows update服務為例

2.1找到windows update服務的服務名,查詢服務的狀态(sc query 服務名),可以看到服務狀态時關閉的。

powershell腳本之windows服務與程式
2.2開啟服務并查詢服務狀态   #開啟服務可以在非以”管理者運作cmd”下開啟服務
powershell腳本之windows服務與程式
3.關閉服務  #關閉服務必須在”以管理者運作的狀态下運作”下關閉服務,不然會提示”拒絕通路”
powershell腳本之windows服務與程式

4.當服務處于禁用狀态時,net start 服務名指令就不能用了,隻能用sc start 服務名

把windows update服務禁用掉,然後測試,可以看到當把服務禁用掉之後再使用net start 服務名就不能開啟服務了

powershell腳本之windows服務與程式
5.使用sc start 服務名開啟被禁用的服務,需要先把服務設定為自動或者手動(sc config 服務名 start =demand/auto)再使用sc start服務名或者net 服務名開啟服務  #等号和值之間需要一個空格
powershell腳本之windows服務與程式

五、用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

powershell腳本之windows服務與程式
2.在lesson5目錄下可以看到記錄了LocalSystem(本地系統)服務的名稱、可執行檔案的路徑、服務狀态、啟動類型的localsystem.log檔案(fl 以清單形式顯示)
powershell腳本之windows服務與程式

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

 

powershell腳本之windows服務與程式
4.檢視lesson5目錄下的localsystem.log檔案,可得所有的啟動類型為自動的服務
powershell腳本之windows服務與程式
用腳本執行的代碼如下: 

<#
#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

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下找到了它。

powershell腳本之windows服務與程式

2.在win7上安裝下載下傳好的exe檔案

3.測試是否存在服務路徑漏洞

從下圖可以看到服務路徑有空格而且沒有引号,可以說明存在服務路徑漏洞

powershell腳本之windows服務與程式

4.把一個反彈shell python腳本的用戶端打包成exe檔案,放到上面漏洞程式的檔案夾中,并把python打包的exe檔案重命名為帶漏洞的檔案名,開啟反彈shell服務端腳本,然後重新啟動帶漏洞的程式的服務。但連接配接是短暫的,這是因為當一個服務在Windows系統中啟動後,它必須和服務控制管理器通信。如果沒有通信,服務控制管理器會認為出現了錯誤,并會終止這個程序。我們所有需要做的就是在終止載荷程序之前,将它遷移到其它程序。

powershell腳本之windows服務與程式

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

python 反彈shell請參考:https://www.cnblogs.com/yuzly/p/10473497.html