文件传输与包管理

警告

为了保证运行安全,本平台提供的靶机实操环境采取了严格的网络隔离机制(无外网连接且节点间相互隔离)。 本章介绍的传输与下载指令无法在当前靶场靶机中打通外部网络,但它们是真实 Linux 环境运维和实际渗透测试中不可或缺的必备工具技能。此处我们仅讲解其工作原理与语法命令。

命令行文件传输方式

在没有图形界面的情况下,以下几种命令是最常用的数据传输通道:

从 Web 下载文件与网络通信:wget 与 curl

安全研究人员常常需要通过命令行与 Web 服务器进行通信或下载外部资源:

  • wget:一款强大的非交互式文件下载器。默认将从 Web 端下载的文件直接写入并存储到本地磁盘
    crow@opsbox:~$ wget http://example.com/software.tar.gz
    
  • curl:一个极其灵活的命令行数据传输工具。默认情况下,curl 会将获取的 Web 服务端响应内容直接输出在屏幕上(即标准输出 STDOUT),这非常适合与 grepawk 结合使用:
    crow@opsbox:~$ curl http://localhost
    

跨计算机的安全复制:scp

scp(Secure Copy)是基于 SSH 协议进行远程安全文件复制的工具。它能够对传输的数据提供身份验证与全程加密保护。其工作遵循 源路径 映射到 目标路径 的基本模型:

  • 将本地文件复制到远程机器
    crow@opsbox:~$ scp local_note.txt [email protected]:/home/remote_user/transferred.txt
    
  • 从远程机器复制文件到本地
    crow@opsbox:~$ scp [email protected]:/home/remote_user/documents.txt local_notes.txt
    

scp 一次性复制不同,sftp(SSH File Transfer Protocol)提供的是交互式会话。登录后会进入 sftp> 提示符,你可以像操作本地目录一样,用 put 上传、get 下载、ls 列目录:

crow@opsbox:~$ sftp [email protected]
[email protected]'s password:
Connected to 192.168.1.30.
sftp> put local_note.txt
Uploading local_note.txt to /home/crow/local_note.txt
local_note.txt                            100% 1240     1.2MB/s   00:00
sftp> ls
local_note.txt
sftp> bye

极简临时 Web 服务器:Python3 HTTP 模块

当你在远程 Linux 主机上需要把一个文件夹内的多份工具文件传输出来,而系统上没有配置传统的 Nginx 或 FTP 服务时,可以借助 Python 内置的极简网页服务组件。 只需在该文件夹下执行以下命令,即可把当前目录映射为 Web 根目录,并开启 8000 端口提供下载服务:

crow@opsbox:~$ python3 -m http.server

此时,在另一台互通的机器上,只需使用浏览器或 wget 指定端口(如端口 8000)即可下载该目录下的文件。若目录中没有 index.html,这个简单服务默认还会列出目录内容;生产环境不应把它直接暴露给不受信任的网络。

crow@opsbox:~$ wget http://Target_IP:8000/tools.exe

软件包管理与版本控制工具:APT、DPKG 与 Git

为了便于管理库文件以及解决各种复杂的软件运行依赖问题,Linux 通常使用软件包管理器来集中式下载与管理软件。

高级软件包工具(APT)

基于 Debian 的发行版使用 APT 管理软件包(格式为 .deb 存档)。系统通过查询配置在 /etc/apt/sources.list 或其子目录 /etc/apt/sources.list.d/ 下的软件镜像源仓库,来判断软件的最新状态。APT 会使用一个名为 APT 缓存的本地数据库来保存已有的软件包关系。

  • 更新本地软件包索引缓存(安装前建议推荐执行):

    crow@opsbox:~$ sudo apt update
    
  • 安装软件(自动解析并拉取所需依赖包):

    crow@opsbox:~$ sudo apt install git
    

    执行后,APT 会自动解析依赖、下载对应的 .deb 包,并依次完成解压与配置,完整的日志流大致如下:

    crow@opsbox:~$ sudo apt install git
    Reading package lists... Done
    Building dependency tree... Done
    The following additional packages will be installed:
      git-man liberror-perl
    The following NEW packages will be installed:
      git git-man liberror-perl
    0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
    Need to get 4,153 kB of archives.
    After this operation, 20.5 MB of additional disk space will be used.
    Get:1 http://archive.ubuntu.com/ubuntu jammy/main amd64 git-man all 1:2.34.1 [954 kB]
    Get:2 http://archive.ubuntu.com/ubuntu jammy/main amd64 git amd64 1:2.34.1 [3,166 kB]
    Fetched 4,153 kB in 1s (5,204 kB/s)
    Unpacking git (1:2.34.1-1ubuntu1.10) ...
    Setting up git (1:2.34.1-1ubuntu1.10) ...
    Processing triggers for man-db (2.10.2-1) ...
    
  • 卸载已安装的软件包

    crow@opsbox:~$ sudo apt remove git
    

    在安装和获取第三方软件时,APT 会校验软件仓库元数据的 GPG(GNU Privacy Guard)签名,以确认软件包索引来自受信任的仓库且未被篡改。

离线包安装:dpkg

如果你已经使用 wget 将一个独立的软件包文件(如 strace.deb)下载到了本地目录,则不需要配置镜像源,可以直接使用低级的包管理工具 dpkg 进行本地安装。需要注意,dpkg 本身不具备自动解析并下载依赖项的能力:

crow@opsbox:~$ dpkg -i strace.deb

获取开源安全工具库:Git 克隆

除了官方仓库打包好的软件包,开源工具也常托管在代码托管服务上。 git 是一款分布式版本控制系统。作为工具使用者,我们通常使用其克隆(clone)功能,从指定的远程仓库地址取得工作副本与版本历史:

crow@opsbox:~$ git clone <仓库地址>

克隆完成后,当前目录下会出现与仓库同名的文件夹。使用第三方工具前,应先核验来源、许可与代码内容。