Credential Injection

Trong quá trình kiểm thử, chúng ta có thể có quyền truy cập vào mạng của domain và thu được các tài khoản AD nhưng không có đủ quyền để tạo ra một máy ở trong domain để sử dụng các tài khoản đó. Trong trường hợp này, ta sẽ cần phải sử dụng các tài khoản trên một máy mà ta kiểm soát.

Cụ thể hơn, ta sẽ sử dụng chương trình runas để chèn các tài khoản AD vào trong bộ nhớ của máy hiện tại nhằm giả mạo các người dùng khác khi truy cập vào các tài nguyên của domain:

runas.exe /netonly /user:<domain>\<username> cmd.exe

Giải thích các option:

  • /netonly: giúp chạy một câu lệnh dưới dạng local user nhưng khi truy cập vào các tài nguyên của domain thì sử dụng tài khoản được chỉ định.
  • /user: username của tài khoản dùng để truy cập vào tài nguyên của domain.
  • cmd.exe: chương trình mà ta muốn thực thi khi tài khoản AD được chèn vào bộ nhớ. Chương trình này có thể là bất cứ thứ gì nhưng cmd.exe là an toàn nhất vì với nó ta có thể chạy bất kỳ chương trình nào khác mà ta muốn với tài khoản AD đã được chèn.

Tip

Chúng ta cần đảm bảo rằng CMD dùng để chạy runas.exe được chạy dưới quyền Administrator để token của Administrator được chèn vào trong CMD. Khi chúng ta chạy các công cụ cần quyền Administrator thì token được chèn vào sẽ được sử dụng. Việc này không giúp ta có được quyền quản trị ở trong domain nhưng đảm bảo các câu lệnh local có thể được thực thi dưới quyền của Administrator.

Ví dụ chúng ta đang đăng nhập bằng tài khoản của UserA mà muốn truy cập các tập tin của UserB ở trong cùng domain Domain thì có thể sử dụng như sau:

runas.exe /user:Domain\UserB /netonly explorer.exe

Note

Khi sử dụng option /netonly, tài khoản AD sẽ không được xác thực với domain controller và nó sẽ chấp nhận bất kỳ mật khẩu nào. Do đó, chúng ta vẫn cần xác nhận rằng tài khoản mà ta sử dụng là đúng và được nạp lên thành công.

Để có thể xác nhận rằng mật khẩu là chính xác, ta có thể thực hiện việc liệt kê SYSVOL.

Mọi tài khoản AD, kể cả các tài khoản có quyền thấp, đều có thể đọc nội dung của thư mục SYSVOL. Thư mục này tồn tại trên tất cả các domain controller và là một thư mục chia sẻ chứa các Group Policy Objects (GPOs) cùng với các script liên quan đến domain. Nó là một thành phần quan trọng của AD vì nó chuyển giao các GPO đến tất cả các máy ở trong domain. Các máy khi nhận được các GPO thì sẽ áp dụng chúng.

za\maurice.palmer@THMJMP1 C:\Users\maurice.palmer>dir \\za.tryhackme.com\SYSVOL
 Volume in drive \\za.tryhackme.com\SYSVOL is Windows
 Volume Serial Number is 1634-22A9
 
 Directory of \\za.tryhackme.com\SYSVOL
 
02/24/2022  10:57 PM    <DIR>          .
02/24/2022  10:57 PM    <DIR>          ..
02/24/2022  10:57 PM    <JUNCTION>     za.tryhackme.com [C:\Windows\SYSVOL\domain]
               0 File(s)              0 bytes
               3 Dir(s)  51,590,586,368 bytes free

Sự khác nhau giữa dir \\za.tryhackme.com\SYSVOLdir \\<DC IP>\SYSVOL là gì?

Khi sử dụng hostname (za.tryhackme.com) thì giao thức xác thực được sử dụng đầu tiên sẽ là Kerberos. Thay vào đó, nếu sử dụng địa chỉ IP thì chúng ta có thể chuyển giao thức xác thực thành NTLM. Việc sử dụng NTLM để xác thực có thể giúp tránh bị phát hiện bởi blue team vì họ thường giám sát các cuộc tấn công Over-Pass và Pass-The-Hash.

Enumeration Through Microsoft Management Console

Chúng ta có thể sử dụng chương trình Microsoft Management Console (MMC) để enumerate AD:

Note

Ta cần chạy MMC từ CMD mà đã có một tài khoản AD nào đó được chèn trong bộ nhớ (sử dụng runas.exe) bởi vì chúng ta không thể xác thực và enumerate AD với các tài khoản local.

Để có thể enumerate AD, cần cài đặt tính năng RSAT: Active Directory Domain Services and Lightweight Directory Tools thông qua mục Manage Optional Features của Apps & Features và thêm AD-RSAT snap-in vào MMC ở mục File → Add/Remove Snap-in.

Sử dụng MMC, chúng ta có thể xem các OU có trong AD, các user của các OU cũng như là các nhóm mà các user đó thuộc về. Ngoài ra, chúng ta cũng có thể sử dụng MMC để xem các máy tính có trong AD chẳng hạn như các server hoặc workstation.

Nhược điểm của MMC là ta cần phải có quyền RDP hoặc giao diện để thực hiện enumerate.

Enumeration Through Command Prompt

Trong trường hợp không có RDP và blue team giám sát việc sử dụng PowerShell thì chúng ta có thể sử dụng CMD với câu lệnh net.

Liệt kê tất cả các user của domain:

C:\>net user /domain
The request will be processed at a domain controller for domain za.tryhackme.com
 
User accounts for \\THMDC
 
-------------------------------------------------------------------------------
aaron.conway             aaron.hancock            aaron.harris
aaron.johnson            aaron.lewis              aaron.moore
aaron.patel              aaron.smith              abbie.joyce
abbie.robertson          abbie.taylor             abbie.walker
abdul.akhtar             abdul.bates              abdul.holt
abdul.jones              abdul.wall               abdul.west
abdul.wilson             abigail.cox              abigail.cox1
abigail.smith            abigail.ward             abigail.wheeler
[....]
The command completed successfully.

Truy vấn một user cụ thể:

za\elliott.allen@THMJMP1 C:\Users\elliott.allen>net user aaron.harris /domain
The request will be processed at a domain controller for domain za.tryhackme.com
.
 
User name                    aaron.harris
Full Name                    Aaron Harris
Comment
User's comment
Country/region code          000 (System Default)
Account active               Yes
Account expires              Never
 
Password last set            2/24/2022 11:05:11 PM
Password expires             Never
Password changeable          2/24/2022 11:05:11 PM
Password required            Yes
User may change password     Yes
 
Workstations allowed         All
Logon script
User profile
Home directory
Last logon                   Never
 
Logon hours allowed          All
 
Local Group Memberships
Global Group memberships     *Domain Users         *Internet Access
The command completed successfully.

Note

Nếu user là thành viên của tối đa 10 nhóm trở lại thì câu lệnh trên sẽ hiển thị các nhóm đó.

Truy vấn thông tin về user Guest:

za\elliott.allen@THMJMP1 C:\Users\elliott.allen>net user Guest /domain
The request will be processed at a domain controller for domain za.tryhackme.com
.
 
User name                    Guest
Full Name
Comment                      Built-in account for guest access to the computer/d
omain
User's comment
Country/region code          000 (System Default)
Account active               No
Account expires              Never
 
Password last set            9/29/2024 7:20:50 AM
Password expires             Never
Password changeable          9/29/2024 7:20:50 AM
Password required            No
User may change password     Yes
 
Workstations allowed         All
Logon script
User profile
Home directory
Last logon                   Never
 
Logon hours allowed          All
 
Local Group Memberships      *Guests
Global Group memberships     *Domain Guests
The command completed successfully.

Truy vấn thông tin về nhóm “Tier 1 Admins”:

za\elliott.allen@THMJMP1 C:\Users\elliott.allen>net group "Tier 1 Admins" /domai
n
The request will be processed at a domain controller for domain za.tryhackme.com
.
 
Group name     Tier 1 Admins
Comment
 
Members
 
-------------------------------------------------------------------------------
t1_arthur.tyler          t1_gary.moss             t1_henry.miller
t1_jill.wallis           t1_joel.stephenson       t1_marian.yates
t1_rosie.bryant
The command completed successfully.

Chúng ta có thể xem password policy thông qua sub-option accounts của net:

za\elliott.allen@THMJMP1 C:\Users\elliott.allen>net accounts /domain
The request will be processed at a domain controller for domain za.tryhackme.com
.
 
Force user logoff how long after time expires?:       Never
Minimum password age (days):                          0
Maximum password age (days):                          Unlimited
Minimum password length:                              0
Length of password history maintained:                None
Lockout threshold:                                    Never
Lockout duration (minutes):                           30
Lockout observation window (minutes):                 30
Computer role:                                        PRIMARY
The command completed successfully.

Một số nhược điểm của net:

  • Nó cần phải chạy ở trên một máy có trong domain (domain-joined machine). Nếu không, nó sẽ truy vấn ở trên domain WORKGROUP.
  • Đôi khi không hiện tất cả các thông tin.

Enumeration Through PowerShell

Sau khi cài đặt AD-RSAT snap-in1, PowerShell sẽ có thêm khoảng 50+ cmdlets dùng để enumerate AD.

PS C:\> Get-ADUser -Identity gordon.stevens -Server za.tryhackme.com -Properties *
 
AccountExpirationDate                :
accountExpires                       : 9223372036854775807
AccountLockoutTime                   :
[...]
Deleted                              :
Department                           : Consulting
Description                          :
DisplayName                          : Gordon Stevens
DistinguishedName                    : CN=gordon.stevens,OU=Consulting,OU=People,DC=za,DC=tryhackme,DC=com
[...]

Các option:

  • Identity: chỉ định username
  • Properties: các thuộc tính sẽ hiển thị. Giá trị * tương đương với việc hiển thị tất cả.
  • Server: dùng khi thực hiện enumerate ở trên một máy không phải là một domain-joined machine và cần chỉ định domain.

Note

Trong quá trình thực hiện lab ở trên Arch Linux, cần cài đặt phiên bản openssh-git 9.7.P1.r281.g67a115e7a-1 của OpenSSH để kết nối đến domain-joined machine thay vì sử dụng phiên bản openssh 9.8p1-1.

Truy vấn thuộc tính Title của “beth.nolan”:

PS C:\Users\elliott.allen> Get-ADUser -Identity beth.nolan -Properties Title
 
 
DistinguishedName : CN=beth.nolan,OU=Sales,OU=People,DC=za,DC=tryhackme,DC=com
Enabled           : True
GivenName         : Beth
Name              : beth.nolan
ObjectClass       : user
ObjectGUID        : c4ae7c4c-4f98-4366-b3a1-c57debe3256f
SamAccountName    : beth.nolan
SID               : S-1-5-21-3330634377-1326264276-632209373-2760
Surname           : Nolan
Title             : Senior
UserPrincipalName :

Truy vấn thuộc tính DistinguishedName của “annette.manning”:

PS C:\Users\elliott.allen> Get-ADUser -Identity annette.manning -Properties Dist
inguishedName
 
 
DistinguishedName : CN=annette.manning,OU=Marketing,OU=People,DC=za,DC=tryhackm
                    e,DC=com
Enabled           : True
GivenName         : Annette
Name              : annette.manning
ObjectClass       : user
ObjectGUID        : 57069bf6-db28-4988-ac9e-0254ca51bb2f
SamAccountName    : annette.manning
SID               : S-1-5-21-3330634377-1326264276-632209373-1257
Surname           : Manning
UserPrincipalName :

Có thể dùng Option -Filter-Table để lọc và định dạng kết quả:

PS C:\> Get-ADUser -Filter 'Name -like "*stevens"' -Server za.tryhackme.com | Format-Table Name,SamAccountName -A
 
Name             SamAccountName
----             --------------
chloe.stevens    chloe.stevens
samantha.stevens samantha.stevens
[...]
janice.stevens   janice.stevens
gordon.stevens   gordon.stevens

Truy vấn SID của nhóm “Tier 2 Admins”:

PS C:\Users\arthur.campbell> Get-ADGroup -Identity "Enterprise Admins" -Properties SID
 
 
DistinguishedName : CN=Enterprise Admins,CN=Users,DC=za,DC=tryhackme,DC=com
GroupCategory     : Security
GroupScope        : Universal
Name              : Enterprise Admins
ObjectClass       : group
ObjectGUID        : 93846b04-25b9-4915-baca-e98cce4541c6
SamAccountName    : Enterprise Admins
SID               : S-1-5-21-3330634377-1326264276-632209373-519

Cũng có thể tìm các thành viên của một nhóm nào đó:

PS C:\> Get-ADGroupMember -Identity Administrators -Server za.tryhackme.com
 
 
distinguishedName : CN=Domain Admins,CN=Users,DC=za,DC=tryhackme,DC=com
 
name              : Domain Admins
objectClass       : group
objectGUID        : 8a6186e5-e20f-4f13-b1b0-067f3326f67c
SamAccountName    : Domain Admins
SID               : S-1-5-21-3330634377-1326264276-632209373-512
 
[...]
 
distinguishedName : CN=Administrator,CN=Users,DC=za,DC=tryhackme,DC=com name              : Administrator
objectClass       : user
objectGUID        : b10fe384-bcce-450b-85c8-218e3c79b30fSamAccountName    : Administrator
SID               : S-1-5-21-3330634377-1326264276-632209373-500

Sử dụng cmdlet Get-ADDomain để truy vấn thông tin về domain:

PS C:\Users\arthur.campbell> Get-ADDomain
 
 
AllowedDNSSuffixes                 : {}
ChildDomains                       : {}
ComputersContainer                 : CN=Computers,DC=za,DC=tryhackme,DC=com
DeletedObjectsContainer            : CN=Deleted Objects,DC=za,DC=tryhackme,DC=com

Nhược điểm:

  • Việc sử dụng PowerShell có thể bị giám sát bởi blue team.
  • Chúng ta cần phải cài đặt AD-RSAT, vốn là một hành động có thể bị phát hiện, để enumerate bằng PowerShell.

Enumeration Through BloodHound

BloodHound là một công cụ cho phép trực quan hóa AD ở dạng đồ thị. Mỗi kết nối giữa các node là một bước khai thác khả dụng để có thể đạt được mục đích cuối cùng.

Tuy nhiên, BloodHound chỉ được dùng trong quá trình khai thác còn công cụ thực sự được dùng để enumerate là SharpHound. Có ba loại SharpHound:

  • Sharphound.ps1: ở dạng PowerShell script và thường được dùng với RAT (Remote Access Trojan) bởi vì nó có thể được nạp trực tiếp vào bộ nhớ nhằm tránh on-disk AV (các AV chỉ quét ở trên ổ cứng). Loại này đã bị ngừng phát triển.
  • Sharphound.exe: ở dạng tập tin thực thi.
  • AzureHound.ps1: dùng cho Azure.

Note

Phiên bản của SharpHound và BloodHound cần phải tương thích với nhau do một số phiên bản BloodHound không thể xử lý dữ liệu của SharpHound quá cũ.

Nếu chạy SharpHound ở trên một domain-joined machine thì có thể sẽ bị phát hiện bởi AV cũng như là blue team do nó tạo ra rất nhiều traffic và event. Thay vào đó, chúng ta sẽ cần phải tiêm credential vào bộ nhớ của một non-domain-joined machine thông qua chương trình runas.exe và trỏ SharpHound đến một AD mà ta cần enumerate. Ở trên non-domain-joined machine, chúng ta có thể vô hiệu hóa AV hoặc tạo ra các ngoại lệ cho các tập tin và thư mục để việc enumerate không bị phát hiện.

Câu lệnh chạy SharpHound:

Sharphound.exe --CollectionMethods <Methods> --Domain za.tryhackme.com --ExcludeDCs

Giải thích các option:

  • --CollectionMethods: loại enumerate, phổ biến nhất là Default hoặc All. Đồng thời, SharpHound cache thông tin nên chúng ta có thể sử dụng method là Session sau lần chạy đầu tiên để tăng tốc độ enumerate.
  • --Domain: chỉ định domain mà ta muốn enumerate.
  • --ExcludeDCs: không động đến các domain controller nhằm giảm khả năng gây ra các alert.

Seealso

All SharpHound Flags, Explained — BloodHound 4.3.1 documentation

Ví dụ về kết quả chạy SharpHound:

PS C:\Users\arthur.campbell\Documents> .\SharpHound.exe --CollectionMethods All --Domain za.tryhackme.com --ExcludeDCs
2024-09-29T09:07:46.0565161+01:00|INFORMATION|Resolved Collection Methods: Group, LocalAdmin, GPOLocalGroup, Session, LoggedOn, Trusts, ACL, Container, RDP, ObjectProps, DCOM, SPNTargets, PSRemote
2024-09-29T09:07:46.0720898+01:00|INFORMATION|Initializing SharpHound at 9:07 AM on 9/29/2024
2024-09-29T09:07:46.6677557+01:00|INFORMATION|Flags: Group, LocalAdmin, GPOLocalGroup, Session, LoggedOn, Trusts, ACL, Container, RDP, ObjectProps, DCOM, SPNTar
gets, PSRemote
2024-09-29T09:07:46.8552693+01:00|INFORMATION|Beginning LDAP search for za.tryhackme.com
2024-09-29T09:08:16.8709527+01:00|INFORMATION|Status: 0 objects finished (+0 0)/s -- Using 49 MB RAM
2024-09-29T09:08:33.5921781+01:00|INFORMATION|Producer has finished, closing LDAP channel
2024-09-29T09:08:33.6702973+01:00|INFORMATION|LDAP channel closed, waiting for consumers
2024-09-29T09:08:34.5926142+01:00|INFORMATION|Consumers finished, closing output channel
2024-09-29T09:08:34.6549365+01:00|INFORMATION|Output channel closed, waiting for output task to complete
Closing writers
2024-09-29T09:08:35.1080018+01:00|INFORMATION|Status: 2159 objects finished (+2159 44.97917)/s -- Using 86 MB RAM
2024-09-29T09:08:35.1080018+01:00|INFORMATION|Enumeration finished in 00:00:48.2552152
2024-09-29T09:08:35.4069981+01:00|INFORMATION|SharpHound Enumeration Completed at 9:08 AM on 9/29/2024! Happy Graphing!

Sau khi chạy thì sẽ có một tập tin .zip chứa các dữ liệu về AD ở dạng JSON:

PS C:\Users\arthur.campbell\Documents> dir
 
 
    Directory: C:\Users\arthur.campbell\Documents
 
 
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        9/29/2024   9:08 AM         121167 20240929090832_BloodHound.zip
-a----        3/16/2022   5:19 PM         906752 SharpHound.exe
-a----        9/29/2024   9:08 AM         359470 YzE4MDdkYjAtYjc2MC00OTYyLTk1YTEtYjI0NjhiZmRiOWY1.bin

Sau khi có tập tin này thì ta có thể import nó vào BloodHound để phân tích cũng như là tìm cách khai thác.

Info

BloodHound sử dụng cơ sở dữ liệu đồ thị có tên là Neo4j.

Tập tin docker-compose.yml dùng để chạy Neo4j:

neo4j:
    image: neo4j:3.5.14
    container_name: neo4j
    volumes:
        - /$HOME/neo4j/logs:/logs
        - /$HOME/neo4j/config:/config
        - /$HOME/neo4j/data:/data
        - /$HOME/neo4j/plugins:/plugins
    environment:
        - NEO4J_AUTH=neo4j/password
    ports:
      - "7474:7474"
      - "7687:7687"
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    restart: always

Lưu ý là phiên bản của Neo4j và BloodHound cũng cần phải tương thích.

Cấu trúc tổng quan của AD sẽ không thay đổi theo thời gian. Tuy nhiên, các session và LogOn event thì sẽ thay đổi. Để capture được những thông tin này, chúng ta cần chạy SharpHound theo một chu kỳ nhất định. Ví dụ, chúng ta có thể chạy SharpHound với method là All ở lần đầu tiên rồi chạy method Session ít nhất 2 lần một ngày. Thời gian tốt nhất để chạy là 10:00 giờ (khi user mới uống cà phê xong) và 14:00 giờ (khi user quay lại từ bữa trưa).

Ví dụ về kết quả chạy SharpHound lần thứ 2 sau khi đã có cache:

PS C:\Users\arthur.campbell\Documents> .\SharpHound.exe --CollectionMethods All --Domain za.tryhackme.com --ExcludeDCs
2024-09-29T11:11:49.4072220+01:00|INFORMATION|Resolved Collection Methods: Group, LocalAdmin, GPOLocalGroup, Session, LoggedOn, Trusts, ACL, Container, RDP, ObjectProps, DCOM, SPNTargets, PSRemote
2024-09-29T11:11:49.4229125+01:00|INFORMATION|Initializing SharpHound at 11:11 AM on 9/29/2024
2024-09-29T11:11:50.1743745+01:00|INFORMATION|Loaded cache with stats: 2119 ID to type mappings.
 2122 name to SID mappings.
 0 machine sid mappings.
 2 sid to domain mappings.
 0 global catalog mappings.
2024-09-29T11:11:50.1900139+01:00|INFORMATION|Flags: Group, LocalAdmin, GPOLocalGroup, Session, LoggedOn, Trusts, ACL, Container, RDP, ObjectProps, DCOM, SPNTargets, PSRemote
2024-09-29T11:11:50.4243788+01:00|INFORMATION|Beginning LDAP search for za.tryhackme.com
2024-09-29T11:12:20.5387139+01:00|INFORMATION|Status: 0 objects finished (+0 0)/s -- Using 56 MB RAM
2024-09-29T11:12:29.7141339+01:00|INFORMATION|Producer has finished, closing LDAP channel
2024-09-29T11:12:29.7141339+01:00|INFORMATION|LDAP channel closed, waiting for consumers
2024-09-29T11:12:38.4040067+01:00|INFORMATION|Consumers finished, closing output channel
Closing writers
2024-09-29T11:12:38.4508609+01:00|INFORMATION|Output channel closed, waiting for output task to complete
2024-09-29T11:12:38.6540259+01:00|INFORMATION|Status: 2159 objects finished (+2159 44.97917)/s -- Using 59 MB RAM
2024-09-29T11:12:38.6540259+01:00|INFORMATION|Enumeration finished in 00:00:48.2327256
2024-09-29T11:12:38.9821111+01:00|INFORMATION|SharpHound Enumeration Completed at 11:12 AM on 9/29/2024! Happy Graphing!

Additional Enumeration Techniques

Ngoài những cách trên thì còn có một số cách để enumerate:

Mitigation

Việc chạy SharpHound sẽ tạo ra rất nhiều LogOn event và các event này thường gắn liền với một user account. Do đó, chúng ta có thể viết detection rule để phát hiện hành vi này nếu nó xuất phát từ duy nhất một user account.

Viết detection rule cho các công cụ mà cần phải được cài đặt mới có thể sử dụng chẳng hạn như SharpHound hoặc AD-RSAT.

list
from outgoing([[Enumerating Active Directory]])
sort file.ctime asc

Resources

Footnotes

  1. xem thêm Enumeration Through Microsoft Management Console