目录
前言
nc(netcat)简介
实验记录
更方便的工具XFTP
补充
网络可达环境
环境变量
端口的连接和监听
前言
在上一篇文章中,我给一台旧笔记本装了 Kali 并打算用它去进行一些学习与实验,所以目前我有两台物理机,一台装载 Windows 系统用于日常应用,一台装载 Kali-Linux 系统用于学习和实验。在用 Kali 机简单做了几个 CTF 的题目后我意识到一个小问题,以往在虚拟机中使用 Kali 做实验后我直接截图就可以记录,但现在是两台物理机,我需要在 Kali 机上截图后发给我的 Windows 机。因为这两台物理机都连接同一个 WiFi ,处于一个局域网内,所以其实我要解决的其实就是局域网内的文件传输问题。
因为我平时用 nc 工具比较多,所以我第一个想到的就是它。但实际上有一些软件可以更加便捷、图形化界面的实现局域网内文件传输,比如 XFTP 工具。
所以本文会主要围绕着如何使用 nc 进行文件传输展开,先介绍 nc 工具以及实验流程,再介绍比较方便快捷的 XFTP 软件和它的使用,最后再补充一些原理相关内容。
nc(netcat)简介
nc(netcat)是一个网络工具,它可以扫描端口、建立 TCP/UDP 网络连接、监听端口并进行数据收发。通过将监听端口的一端充当服务端,主动连接的一端充当客户端,在两台物理机上使用 nc 工具可以非常方便地建立简单的 C/S 通信。
实验记录
在开始使用 nc 工具进行局域网内文件传输前,首先需要通信的两个物理机上安装有nc,对于Kali机已经预装,对于 Windows 机则需要手动下载并配置。
在这个网址下载适用于 Windows 平台的 nc :netcat 1.11 for Win32/Win64
由于这个工具算比较出名的黑客工具,会被某些杀毒软件识别并自动删除,所以我们需要给它添加到杀软白名单。比如我使用的是火绒,那么我就在它的信任区(即白名单)添加一个文件夹进去,这样我放在这个文件夹里的文件就不会被自动扫描并删除,从而可以把 nc 工具放在该文件夹中。
接下来去刚刚的网址下载并解压到这个白名单文件夹中,进入解压后的目录,记住路径,在后面我们需要将之添加到环境变量中,可以点一下上面的路径框然后复制它。
接下来去添加环境变量,可以直接搜索“环境变量”后打开配置页面。
点击环境变量。
选中 Path 这个变量,然后点击编辑。
点击新建,然后在左侧新建的路径中粘贴我们刚刚复制的路径。
接下来 win+r 键入 cmd 呼出命令行窗口测试一下配置是否成功,键入 nc ,如下则成功。同理 Kali 机也用同样的方法测试nc是否配置成功。
现在两台物理机上都有了 nc 工具,接下来简单测试 nc 工具的聊天功能。
先介绍一下实验的网络环境,两台物理机连接同一个 WiFi 并被分配了内网 IP,实现了同处一个局域网下的网络可达。
在 Windows 机使用 ipconfig,Kali 机使用 ifconfig 来查询双方目前的内网 IP 是多少以获取对方的IP 地址。
可以看到 Windows 机内网 IP 为 192.168.1.3,Kali 机内网 IP 为 192.168.1.17。互 ping 对方,可以 ping 通。
接下来在 Kali 机上使用 nc 监听 1212 端口(这里选择 1212 作为实验端口,一般来说可以使用任意端口只要该端口没有被其他程序占用即可,一般会用 8080 或者 8888,我比较喜欢 12 这个数字)代码如下:
nc -l -p 1212Windows 机用 nc 连接 Kali 机的 nc 监听端口即 1212 端口,如果出现一直闪烁的提示符,说明已经连接,代码如下:
nc 192.168.1.17 1212键入字符串并回车即可进行简单聊天。
在 Kali 机上可以看到这个从 Windows 机发送来的字符串,输入回复字符串后在 Windows 机上实时同步。
Ctrl + C 结束这个测试。
接下来我们测试文件传输,nc 本身并没有“文件传输”的命令,我们的思路是将 Windows 机作为服务端监听一个端口,Kali 机作为客户端连接该端口建立网络通信。同时使用重定向将文件作为该通信的输入输出,对 Windows 机,重定向从监听端口来的数据到一个新的文件上;对 Kali 机,将一个文件重定向为 nc 的输入从而将文件作为通信内容发送。具体实现如下:
Windows 机监听一个端口并且重定向从该连接传输来的数据到一个新的文件上,若没有该文件则创建若有则覆盖。
比如在本次实验中,我想要从 Kali 机发送一个 .txt 格式的文件过来并将之上传到 Windows 机的D盘下面的nc文件夹里,那么我就重定向从该连接来的数据到 D:\nc\from_kali.txt 代码如下:
nc -l -p 1212 > D:\nc\from_kali.txt接下来 Kali 机连接该端口并将想要发送的文件重定向为输入,代码如下:
nc 192.168.1.3 1212 < flag1.txtWindows 机打开文件管理器,进入 D 盘的 nc 文件夹,可以看到在我们指定的位置将该文件以from_kali.txt 的文件名保存下来了。
当然如果想要一次性传输多个文件的话,那就在 Kali 机上用 tar -zcvf 将多个文件打包并压缩再把打包压缩后的文件传过来就好了。
在实验的最后对上述代码做一个简单解释,我们用两行命令完成了文件传输, nc 本身并没有专门的“发送文件”或“接收文件”参数或命令,我们其实是利用 Shell 的标准输入输出重定向,把文件内容作为我们的通信数据接入网络连接,同理 Windows ,把来自网络连接的数据重定向为一个文件作为输出以实现“接受文件”的逻辑。
更方便的工具XFTP
XFTP官网:XFTP – NetSarang Website
之前在去机房给服务器上传并安装补丁文件时会用到一个工具叫做 XFTP。XFTP 是一个图形化文件传输客户端,可以通过 SFTP 等基于 SSH 的协议连接服务器。用户完成身份认证后,可以在图形界面中浏览远程文件系统并进行文件上传、下载等操作。
具体工作流程取决于服务器厂商的管理方式。以我之前接触的一些服务器和安全设备为例,服务器会提供独立的带外管理接口比如 mnt 口、mgmt 口或者直接用 eth0 口做管理口,将笔记本通过网线连接到服务器的管理网口,根据服务器文档配置本地网络地址,使两者处于同一网段,然后通过浏览器访问管理口提供的 web 管理界面,以 web 管理页面的管理员账号登录管理面板启用 SSH 服务。随后根据设备文档确定 SSH 服务对应的 IP 地址和监听端口,在 XFTP 中配置该地址和端口,使用服务器管理员用户登录即可进行文件的上传与下载。
说回我们的实验环境,在本次 Kali 机环境中,SSH 服务默认没有启动,因此需要先配置并启动 SSH 服务,之后才能让 XFTP 通过 SSH/SFTP 连接到 Kali 。
在 Kali 机上使用 root 用户或者 sudo ,vim 打开 sshd_config 文件配置 SSH 服务,代码如下:
vim /etc/ssh/sshd_config找到如下图所示的 PermitRootLogin 字段,取消掉它的注释并将后面的参数修改为 yes ,编辑好后保存退出。
PermitRootLogin 字段控制是否允许 root 用户通过 SSH 登录,本实验为了方便直接使用 root 登录,因此开启。实际生产环境通常不建议允许 root 直接 SSH 登录。
接下来开启 sshd 服务,在 shell 中键入如下命令:
service ssh start或者:
systemctl start ssh(当然,这里是因为实验环境第一次开启 sshd 服务。正常而言,如果已经启用 sshd 服务,想要通过修改配置文件让 root 用户可以通过 SSH 登录,那么在修改完成保存退出后,使用如下命令重启 sshd 服务让它重新读取修改后的配置文件内容)
service ssh restart或
systemctl restart ssh接下来使用如下命令检查是否开启 SSH服务:
service ssh status或者:
systemctl status sshActive 这一栏展示了 sshd 服务的运行情况,active 就是正在运行。
此时 Kali 机已开启 sshd 服务。Windows 机启动 XFTP,左上角点击新建一个会话,配置名称和主机。
名称就是这个会话在 XFTP 里显示的名称,用于区分多个会话。主机是目标物理机的 IP 地址,这里则是 Kali 机的 IP 地址。下面的端口号根据具体情况来,比如你要连接的服务器它的 sshd 服务监听的端口不是 22 端口而是别的端口,则在这里选择相应的监听端口。
接下来选择这个会话,点击连接。
这里会有要选择一次性接受还是保存并接受。第一次通过 SSH 连接服务器时,XFTP 会提示确认服务器的主机密钥。选择“一次性接受”表示只在本次连接中信任该主机密钥;选择“保存并接受”则会将其保存,后续再次连接时可以用于校验服务器身份。这里就选择一次性接受。
用户名是服务器的用户账号,这里使用 root 登录。
身份验证方式我们选择密码验证,也就是使用 root 用户的密码进行登录。
左边是 Windows 机的文件系统,右边是 Kali 机的文件系统,双击即可进入目录,右键一个文件可以选择将它传输到另一台物理机上或者删除。
比如这里,我进入 Kali 机的 /home/user/documents 目录后,左侧进入 Windows 机的 D:\nc 目录,右键 flag1.txt 选择传输后,会将文件从 Kali 机上传到 Windows 机的目录即 D:\nc。
补充
网络可达环境
本文所说的“网络可达”,是指两台设备之间已经具备进行网络通信的基本条件,可以通过有线或无线网络建立 IP 层通信。对应日常工作中常说的“先 ping 一下看看网络通不通”。实现网络可达环境有多种方法。
第一种就是通过无线介质实现网络可达。两台物理机连接同一个 WiFi,此时它们同处一个内网,被现代家用/企业 WiFi 设备或专门 DHCP 服务器分配了内网 IP,如果该无线网络没有启用客户端隔离等访问限制,那么这两台物理机设备则可以通过该 WiFi 使用被分配的内网 IP 实现内网通信从而网络可达。本文环境即是如此。
第二种则是通过网线介质实现网络可达。比如在机房使用笔记本直连服务器的场景,通过网线连接笔记本的以太网口和服务器的以太网口,然后进入笔记本网络配置页面选中提供以太网接口的网卡,手动分配 IP 地址,使两台设备处于同一个子网,从而可以通过网线直接进行通信,实现内网互通,网络可达。
第三种是通过互联网进行跨网络通信。例如访问网站、联网游戏、远程登录服务器等,数据包经过多个路由器,在不同网络之间转发,最终到达目标设备。
Ping 是一种常用的网络诊断命令,基于 ICMP 协议即通过发送 ICMP Echo Request 报文并等待目标返回 ICMP Echo Reply 报文并接收,来测试目标 IP 地址的连通性。在一台设备上 ping 另一台设备,如果能够正常收到响应,说明当前 ICMP 报文可以从本机到达目标并返回,因此可以认为两台设备之间的 IP 层通信是正常的。
需要注意的是,ping 通只代表 ICMP 通信正常,并不代表目标设备上的所有网络服务都可以访问。例如目标设备可能允许 ICMP,但通过防火墙阻止 TCP 22 端口。因此,在实际排查网络问题时,ping 通以后还需要进一步检查目标端口和对应的服务是否正常。
环境变量
环境变量是进程运行环境中由名称和值组成的一组变量。比如:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
HOME=/home/user
SHELL=/bin/bash
我们以 PATH 为例解释它的作用。PATH 是用于记录可执行程序搜索路径的环境变量。比如我在 Linux 的 shell 里面键入一个 ls,shell 会根据 PATH 中记录的路径查找可执行文件,然后请求操作系统执行它。
ls 在常见的 Linux 系统中是一个 ELF 格式的可执行文件,通常位于 /usr/bin/ls。因此,当我们向 shell 输入 ls 时,shell 会按照 PATH 中目录的顺序依次寻找名为 ls 的可执行文件,找到后再请求操作系统执行。
说回在 Windows 上给 nc 配置环境变量,因为我们使用 nc 的方式是在命令行界面中直接输入 nc,此时如果 nc.exe 所在的文件夹没有加入 PATH,命令行环境就无法在已有的搜索路径中找到 nc.exe,从而无法直接执行。
把 nc.exe 所在的文件夹路径添加到 PATH 后,再在命令行中输入 nc,命令行环境就可以根据 PATH 找到 nc.exe 并执行它。
端口的连接和监听
在上述实验过程中,无论是 nc 还是 XFTP,都涉及网络通信中的端口,以及通信两端常见的两种行为:监听与连接。
进程想要使用网络进行通信,或者说建立一个网络连接,就需要在本机上占用一个端口。服务端进程通常可以自己指定占用某个端口而客户端进程则通常由操作系统自动分配一个临时端口。
端口用于识别通信进程,在同一个网卡上发送出去的数据都是以这个网卡 IP 为源地址,所有使用该网卡的网络应用进程都会用这个 IP 地址发送数据包,此时当网络数据到达目标主机后,操作系统会根据目标 IP、传输层协议和目标端口等信息,将数据交给对应的网络应用。
在使用 nc 时,充当服务端的物理机使用 nc 监听一个端口,此时运行在服务端物理机上的 nc 进程占用该端口并等待连接建立。充当客户端的物理机在命令行中使用 nc 连接服务端物理机的某个端口时,客户端物理机的 nc 进程会创建一个 TCP socket,并由操作系统为其分配一个临时端口,然后向服务端物理机的端口发起 TCP 连接,三次握手完成后,两台主机之间建立 TCP 连接。
这个TCP连接可以由源 IP、源端口、目标 IP 和目标端口共同确定,也即我们所说的用源 IP、源端口、目标 IP、目标端口四元组标记网络上的一个网络连接。
在使用 XFTP 时,服务端物理机开启 sshd 服务,即让 sshd 进程监听服务端的 TCP 22 端口并等待连接。客户端启动 XFTP,配置服务端 IP 地址和 SSH 端口后发起连接。客户端操作系统会为本次 TCP 连接分配一个临时端口,随后与服务端的 22 端口进行 TCP 三次握手。TCP 连接建立后,XFTP 再通过 SSH 协议完成服务器身份验证和用户身份认证,认证成功后即可通过 SFTP 协议进行文件传输。
nc | XFTP | |
服务端进程 | nc | sshd |
服务端端口 | 实验中的 1212 | 默认 22 |
客户端进程 | nc | XFTP |
客户端端口 | 操作系统自动分配 | 操作系统自动分配 |
传输基础 | TCP | SSH/SFTP over TCP |
TCP 三次握手 | 有 | 有 |
身份认证 | 无 | SSH 身份认证 |
加密 | 默认无 | SSH 提供加密 |
文件传输操作 | 依靠重定向 | 图形化文件管理 |