在 Windows 上将 SSH 传输到 wireshark

在 Windows 上将 SSH 传输到 wireshark

在我的日常操作中,我经常需要在远程服务器上执行 tcpdump,将输出保存到文件然后必须将文件移动到我的笔记本电脑上以在 wireshark 上进行分析,这很麻烦。

我正在探索下面的命令,它在 Linux 上运行良好

ssh <remote_host> sudo tcpdump -vv -i eth0 -U -w - | wireshark -k -i -

但不幸的是,公司为我提供的办公笔记本电脑装有 Windows,他们不允许我更换操作系统。鉴于这一限制,我试图在 Windows 中实现相同的结果...

如果我在 Windows 中的 powershell 中执行以下命令

ssh <remote_host> sudo tcpdump -vv -i eth0 -U -w - | 'C:\Program Files\Wireshark\Wireshark.exe' -k -i -

我收到这个错误

    At line:1 char:87
+ ...  -i eth0 -U -w - | 'C:\Program Files\Wireshark\Wireshark.exe' -k -i -
+                                                                   ~~
Unexpected token '-k' in expression or statement.
At line:1 char:44
+ ...  -i eth0 -U -w - | 'C:\Program Files\Wireshark\Wireshark.exe' -k -i -
+                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Expressions are only allowed as the first element of a pipeline.
At line:1 char:90
+ ...  -i eth0 -U -w - | 'C:\Program Files\Wireshark\Wireshark.exe' -k -i -
+                                                                      ~~
Unexpected token '-i' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

如果我执行不带 ssh 部分的 wireshark 命令,我会得到同样的错误,但如果我像这样执行它

& 'C:\Program Files\Wireshark\Wireshark.exe' -k -i -

它打开 wireshark 并等待数据输入。考虑到这一点,我尝试将命令更改为

ssh <remote_host> sudo tcpdump -vv -i eth0 -U -w - | & 'C:\Program Files\Wireshark\Wireshark.exe' -k -i -

这样,ssh 命令就会执行,远程主机上的 tcpdump 就会启动,而 wireshark 则永远不会启动。我做错了什么?为什么与 Linux 中最相似的管道命令在 Windows 中不起作用,管道有什么不同吗?

答案1

正如@Jasen 在评论中提到的,我尝试不使用 PowerShell 而是使用 Windows 10 上的 Git Bash 执行该命令。

#!/bin/bash
server=<remote-host>
iface="ens6"
ssh $server "tcpdump -s 0 -U -n -w - -i $iface not port 22" | wireshark -k -i -

此脚本假设您已在 Windows 计算机上安装了 GitBash 和 wireshark,并且服务器和主机通过公钥身份验证进行通信。使用时请确保您具有 root 权限tcpdump。端口 22 被明确忽略,因此在数据包嗅探会话期间看不到 ssh 流量。

答案2

搭便车@krylon 的回答,我能够使用 git-bash 通过以下单行命令来运行它:

(根据这里的答案:如何使用 wireshark 嗅探远程机器的流量?

ssh user@host sudo tcpdump -U -s0 'not port 22' -i enp118s0 -w - | wireshark -k -i -

(请注意,tcpdump为了简化操作,我将 sudoers 文件添加为无密码文件)

为了能够从 PowerShell 使用它,你可以使用以下命令从 PS 提示符启动 git-bash:

对于交互式 shell:

& "C:\Program Files\Git\bin\bash.exe" -i -l

运行命令:

& "C:\Program Files\Git\bin\bash.exe" -c "command"

我将它们组合在我的 powershell 配置文件 (C:\Users\username\Documents\WindowsPowerShell\profile.ps1) 中以创建一个快捷方式:

function capture-remote {
    & "C:\Program Files\Git\bin\bash.exe" -c "ssh user@host sudo tcpdump -U -s0 'not port 22' -i enp118s0 -w - | wireshark -k -i -"
}

现在,重新启动 powershell 窗口,然后就可以通过命令启动 wireshark 并进行远程数据包捕获capture-remote

您可以通过向上面的函数添加用户、主机等参数来进一步增强此功能。

function capture-remote ($user = default-user, $host = default-host) {
    & "C:\Program Files\Git\bin\bash.exe" -c "ssh $user@$host sudo tcpdump -U -s0 'not port 22' -i enp118s0 -w - | wireshark -k -i -"
}

然后从 PS 提示调用capture-remote user host

相关内容