Impacket
psexec.py
Điều kiện sử dụng
Port
445
Credentials
Cleartext hoặc hash
Share
Cần writable share
Sử dụng cơ bản:
python /usr/share/doc/python3-impacket/examples/psexec.py domain/user:password@IP
Cơ chế hoạt động
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.
smbexec.py
Điều kiện sử dụng
Port
445
Credentials
Cleartext hoặc hash
Share
Không cần writable share (SERVER mode)
Sử dụng cơ bản:
python /usr/share/doc/python3-impacket/examples/smbexec.py domain/user:password@IP
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
python /usr/share/doc/python3-impacket/examples/smbexec.py -mode SERVER domain/user:password@IP
Cơ chế hoạt động
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
atexec.py
Điều kiện sử dụng
Port
445
Credentials
Cleartext hoặc hash
Share
Access được ADMIN$ share (chỉ cần quyền read)
Sử dụng cơ bản:
python /usr/share/doc/python3-impacket/examples/atexec.py domain/user:password@IP command
atexec.py chỉ thực thi command và cho ta output chứ không tạo interactive shell như psexec.py hay smbexec.py
Cơ chế hoạt động
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

wmiexec.py
Điều kiện sử dụng
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:
python /usr/share/doc/python3-impacket/examples/wmiexec.py domain/user:password@IP command
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
python /usr/share/doc/python3-impacket/examples/wmiexec.py domain/user:password@IP -nooutput command
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
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /f /d 1
Cơ chế hoạt động
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.
Last updated