Impacket
Last updated
Last updated
Port
445
Credentials
Cleartext hoặc hash
Share
Cần writable share
Sử dụng cơ bản:
Tóm tắt: psexec.py sẽ sử dụng SMB share để uplaod RemComSvc, sau đó dùng name pipe \svcctl để remote tạo service run RemComSvc binary, RemComSvc sẽ tạo các name pipe cho phép psexec.py thực thi câu lệnh
Chi tiết cơ chế hoạt đọng của psexec.py sẽ như sau:
Đầu tiên thực hiện kết nối SMB với target để giao tiếp với name pipe \svcctl
Sau đó tạo object installService
và gọi installService.install()
Ta để ý phần remcomsvc.RemComSvc()
chính là binary của RecomSvc
Còn phần service name và remote binary name nếu ta không truyền vào qua câu lệnh thì sẽ random như sau
Đi vào hàm installService.install()
đầu tiên dùng name pipe \srvsvc để enum share và tìm writeable share (1), sau đó copy Recom binary vào writeable share (2), cuối cùng dùng SvcManager qua name pipe \svcctl để tạo service và khởi chạy service
Khi RecomSvc chạy sẽ tạo các name pipe, psexec.py sẽ giao tiếp với các name pipe này thông qua IPC$ share để thực thi command từ xa
Cụ thể RecomSvc hoạt động như thế nào thì mình sẽ không nói đến, vì RecomSvc bị detect bởi Win defender nên thông thường khi tác chiến mình sẽ thay thế bằng binary khác (con hàng nào đó bypass được AV và call về C2 luôn)
Kết quả khi ta chạy thành công
Trên máy victim ta sẽ thấy file exe tên QIpJyqwh và service GTew
Dùng sysinternal handle ta sẽ thấy được các name pipe của RemCom đang chạy trên máy victim
Và cuối cùng vì psexec.py chỉ kết nối 1 chiều đến victim, nên cho dù victim có block out bound TCP chỉ cho phép inbound thì ta cũng có thể remote access.
Port
445
Credentials
Cleartext hoặc hash
Share
Không cần writable share (SERVER mode)
Sử dụng cơ bản:
smbexec sẽ có 2 mode là SERVER và SHARE. Mặc định sẽ dùng mode SHARE, còn trong trường hợp không có writeable share ta sẽ dùng mode SERVER. Cụ thể từng mode thì mình sẽ nói ở phần cơ chế hoạt động
Tóm tắt: Về cơ bản cơ chế giống như smbexec nhưng không dùng đến RemComSvc mà sẽ thực thi cmd qua file batch rồi lưu output ở 1 file khác, sau đó qua SMB share đọc output từ file đó
Nhìn vào phần description trong code ta cũng biết được 1 phần cơ chế của smbexec
Smbexec dựa trên kỹ thuật này. Lợi dụng \svcctl để thực thi cmd bằng remote service rồi lưu vào file output. Nếu ở SHARE mode (tức là có writeable share) thì sẽ write và đọc output trực tiếp vào share trên victim. Nếu ở SERVER mode (tức là không có writeable share) thì sẽ open SMB share ở máy attacker để đọc output. Đây cũng chính là điểm khác biệt với psexec và lý do tại sao shell trong smbexec được gọi là semi-interactive.
Sau khi thực hiện kết nối SMB với victim smbexec.py gọi đến object RemoteShell
Khi init Object sẽ khai báo một số thông tin như sau:
%COMSPEC%
là biến môi trường trỏ đến con shell (thường là cmd). Ta có thể chọn shell type là cmd hoặc powershell thông qua options -shell-type
Tiếp theo mỗi lần ta gõ command smbexec sẽ tạo service với binpath như sau
Chạy smbexec với options debug ta sẽ thấy được full HD binpath là như thế này
Ta sẽ thấy smbexec thực thi command và lưu output vào file __output
. Đoạn command thực thi và lấy output được lưu vào file batch với tên random, sau khi file batch thực thi thì sẽ tự động được xóa.
Nếu run ở Share mode thì smbexec sẽ đọc output từ file __output
và xóa file đi, còn run ở Server mode thì sẽ copy file __output
về SMB share của attacker
Điều này dẫn đến 1 hạn chế nếu attacker run Server mode thì file output sẽ tồn tại đến khi nào attacker exit session mới thôi
Với cơ chế như trên thì dễ thấy smbexec bypass được trường hợp không có writeable share nhưng lại rất noise với việc create service, xóa service, create file và xóa file liên tục
Ngoài ra smbexec do không drop RecomSVC mà chỉ ghi file batch nên sẽ bypass được WinDef và một số AV
Port
445
Credentials
Cleartext hoặc hash
Share
Access được ADMIN$ share (chỉ cần quyền read)
Sử dụng cơ bản:
atexec.py chỉ thực thi command và cho ta output chứ không tạo interactive shell như psexec.py hay smbexec.py
Tóm tắt: Atexec sẽ lợi dụng name pipe \atsvc để remote tạo schedule task thực thi command, output sẽ được lưu trong file temp
Kết nối với victim để dùng name pipe \atsvc
Command sẽ được write dưới format xml như sau
Ta thấy kết quả output sẽ được lưu vào %windir%\Temp\<random>.tmp. Tiếp theo atexec.py dùng SchRpcRegisterTask để tạo, start và xóa schedule task sau khi thực thi xong
Kết quả sẽ được đọc thông qua $ADMIN share, sau khi kết thúc thì được tự động xóa
Kết quả thực thi thành công
Ta có thể thay đổi share muốn lấy output trong source code chứ atexec.py không hỗ trợ options nào thay đổi share. Cuối cùng vì không drop binary nên không bị detect bởi windef và một số AV
Log create, start và delete task
Port
135, 4915x/TCP (cần thêm port 445 - nếu muốn output)
Credentials
Cleartext hoặc hash
Share
Không cần
Sử dụng cơ bản:
Trong trường hợp target có mở SMB thì wmiexec.py có thể thực thi command và cho ta output thông qua share theo cơ chế semi-interactive shell
Còn trong trường hợp không mở SMB ta vẫn có thể remote execute thông qua port 135 và 4915x với option -nooutput
Trong trường hợp nếu không chạy được thì lý do là bị dính UAC với máy không join domain (tham khảo)
Fix
Tóm tắt: wmiexec sẽ lợi dụng wmi trên nền DCOM để remote thực thi command, trong trường hợp victim có mở SMB thì output được write và đọc qua share, còn nếu không mở SMB share thì chỉ thực thi command
Phần wmiexec này có nhiều đoạn trong code mình không hiểu lắm nên mình chỉ tóm tắt flow chính của nó.
Đầu tiên trước khi thực hiện kết nối qua RPC thì nó test kết nối SMB để handle việc xuất output, nếu không có thì smbConnection
là None.
Tiếp theo tạo DCOMConnection
và gọi đến method CoCreateInstanceEx
để kết nối với victim qua RPC và tạo interface đại diện cho DCOM object
Đoạn code trong CoCreateInstanceEx
mình không hiểu lắm nhưng tóm tắt là sẽ tạo kết nối qua RPC đến victim và get DCOM object rồi store vào python interface.
Tiếp theo authen bằng NTML với name pipe /root/cimv2
Code của method NTMLogin
là implement lại method này. Từ DCOM object đã get ở trên ta tiến hành authen để lấy IWbemServices
object mà associated với name space cho phép tương tác với computer hardware và configuration từ name pipe /root/cimv2
(tham khảo tại đây)
Khi nhảy vào method request ta sẽ có đoạn code sau:
Tại method get_dce_rpc
chính là lấy ra DCOM object
Dừng một xíu tại chỗ này thì khi thực hiện kết nối get DCOM object thành công code gọi về class "ông" của nó để lưu interface đại diện cho DCOM object vào list CONNECTIONS
Do đó về sau ta chỉ cần gọi về list CONNECTIONS
nếu muốn giao tiếp với DCOM object.
Sau khi có được IWbemServices
object, release DCOM object và get Win32_Process
để thực hiện các thao tác liên quan remote access
Đoạn execute command thì đơn giản như các tools trước
Nếu target có SMB thì output được save vào ADMIN$ share và get thông qua SMB
Cuối cùng vì không drop binary nào hết nên sẽ bypass được WinDef và một số AV. Ngoài ra khi chạy options nooutput chỉ remote access qua RPC cũng giảm được 1 phần malicous đối với EDR/XDR.