来源:Linux Fundamentals,模块 18,共 30 节。按课程主线归纳概念、命令、操作条件与结果判断;课程未给出的安装或配置步骤不自行补写。配图使用课程图片的 HTTPS 地址。以下示例中的 IP、路径及账户按自己的课程环境替换。
全部 30 节的来源与逐节配图检查保存在同名 .audit.json。图片为远程链接,显示依赖网络与 CDN;实际验证结果另存于 .checks.json。
学习路线
先理解系统结构与 Shell,再练习导航、文件、查找和管道;随后把这些基本操作用于权限、用户、软件包、进程、服务、备份、网络及安全管理。学习命令时同时记住“操作对象是什么、需要哪些权限、怎样验证结果”。
一、认识 Linux 与 Shell
1. Linux 结构
Linux 内核负责管理 CPU、内存与设备等资源;发行版把内核、工具、库、配置及界面组合成适用于不同用途的系统。Shell 接收并解释用户命令,终端提供交互入口,守护进程承担后台服务。课程使用的 Pwnbox 基于面向安全、隐私与开发的 Parrot OS。
课程的设计理念可以归为:以文件接口访问资源、让小工具各自做好一件事、用工具组合完成复杂任务、通过 Shell 获得灵活控制、用文本保存配置。
文件系统从根目录 / 向下组织;不要把 /root(管理员家目录)与 /(根目录)混为一谈。

目录 主要用途 /bin、/sbin 基本命令与系统管理程序。 /boot 内核、引导器及启动所需文件。 /dev 设备文件。 /etc 系统与应用配置。 /home、/root 普通用户家目录和 root 家目录。 /lib 启动等功能需要的共享库。 /media、/mnt 可移动设备挂载位置和临时挂载点。 /opt 可选的第三方软件。 /tmp 临时数据;课程指出它可能在启动或其他时候被清理。 /usr 用户程序、库和手册等。 /var 日志、邮件、Web 应用及其他变化的数据。
2. Linux 发行版
发行版共享 Linux 内核,区别主要在软件包组合、工具、默认配置、桌面界面及维护方式。课程分别讨论桌面、服务器、嵌入式、云计算和安全工作场景,并列出 Ubuntu、Fedora、Debian、Red Hat、Parrot 等例子。
Debian 的重点是稳定性、可定制性和软件包维护,使用 APT 管理软件与更新。选择发行版应联系工作需求和管理方式;课程中的发行版数量、支持年限等属于页面描述,不作为当前产品规格。本节只介绍发行版,没有给出操作系统安装教程。
3. Shell、终端与多路复用器
终端是文本输入输出入口,Shell 是解释命令的程序;终端模拟器让图形桌面也能使用文本程序。Bash 是课程主要讨论的 Shell,其他例子包括 Tcsh/Csh、Ksh、Zsh 和 Fish。
Tmux 展示了一个终端内划分多个独立窗格的工作方式:图中各窗格位于不同项目目录,分别执行 ls,因此可以同时保留多个工作上下文。本节没有提供 Tmux 安装、快捷键或首次配置命令。

4. 理解命令提示符
提示符一般显示用户名、主机名和当前目录。~ 代表当前用户的家目录;课程示例用 $ 表示普通用户提示符,用 # 表示 root 提示符。提示符样式受 PS1 控制,简单 Shell 可能只显示一个符号,因此后续仍要用系统信息命令确认运行身份。
<username>@<hostname>[~]$
root@htb[/htb]#
Bash 在 .bashrc 等 Shell 配置中设置提示符相关内容;课程介绍 \u(用户名)、\h(主机名)、\w(当前完整路径)、\H(完整主机名)、\d/\D{格式}(日期)、\t/\T(时间)、\j(任务数量)及换行等标记。
提示符可以辅助识别当前主机、目录和操作时间;课程还提到 script 和 .bash_history 作为操作记录线索。详细定制不在本节范围,可参考课程提供的 bash-prompt-generator 与 Powerline。
5. 遇到陌生命令怎样求助
先明确目标,再查命令用法与参数。不同工具的帮助选项可能不同;课程以 ls 和 curl 为例:
man ls
ls --help
curl -h
apropos sudo
man <工具> 给出名称、语法、选项和详细解释,阅读器中 q 退出、h 查看帮助;--help/-h 适合快速浏览选项。apropos <关键词> 搜索手册的简短说明,例如 apropos sudo 找到与 sudo 配置、编辑、策略有关的手册条目。
课内示例通过 ls 列出目录,用 -a/--all 查看以点开头的条目;-A/--almost-all 不显示隐含的 . 和 ..。长命令难理解时,课程给出 ExplainShell 作为逐段解释资源。
6. 系统信息与首次 SSH 连接
大多数系统信息工具在课内 Linux 环境中已预装。本节使用实验目标地址与 htb-student 账户建立 SSH 连接,再收集主机、用户、组与内核信息;需要目标的有效账户与对应认证资料。首次服务安装、密码登录说明见第 19 节,自动化所需的密钥生成与分发见第 21 节;具体资料使用实验页面提供的信息。
ssh htb-student@<目标IP>
hostname
whoami
id
uname -a
uname -r
验证连接后,hostname 确认当前主机,whoami 确认运行用户,id 查看 UID、GID 和组成员关系。课程提示关注非标准组以及 adm、sudo 等组;组名是权限线索,实际允许的操作仍与系统策略有关。
uname -a 汇总内核、节点、版本与架构信息;uname -r 单独查看内核 release,-m 查看机器架构。版本信息用于后续定位环境与调查线索,不能仅凭版本号就证明存在可利用漏洞。
命令 用途 pwd 当前工作目录。 ifconfig、ip 接口、地址和路由信息/管理。 netstat、ss 网络连接与套接字。 ps、who 进程状态与当前登录用户。 env 环境变量或带指定环境运行命令。 lsblk、lsusb、lspci 块设备、USB 与 PCI 设备。 lsof 已打开的文件。
二、文件与文本工作流
7. 目录导航
先用 pwd 定位当前目录,再用 ls 看内容、用 cd 移动。课程建议在有快照的本地虚拟机中练习,避免误操作影响系统。
pwd
ls -la
ls -l /var/
cd /dev/shm
cd -
cd ..
cd shm && clear
ls -l 的列包含类型/权限、硬链接数、所有者、所属组、大小、时间和文件名;-a 显示点开头的隐藏条目。可以直接给 ls 目标路径,无需先进入目录。. 是当前目录,.. 是父目录,cd - 回到上一个工作目录,区别于返回父目录。
输入目录前缀后按 Tab 可补全,候选不唯一时按两次 Tab 列出匹配项。clear 或 Ctrl+L 清理屏幕;方向键回看命令,Ctrl+R 按文字搜索历史。课程的 cd shm && clear 表示前一步成功后再执行清屏。
8. 创建、移动和复制文件
本节先按实验页面的 SSH 连接说明进入目标,再在当前目录练习。创建文件、创建目录和复制/移动是不同操作,创建后用 tree 检查结构,不只看命令有没有输出。
touch info.txt
mkdir -p Storage/local/user/documents
touch ./Storage/local/user/userinfo.txt
tree .
mv info.txt information.txt
touch readme.txt
mv information.txt readme.txt Storage/
cp Storage/readme.txt Storage/local/
tree .
touch 的课程示例创建空文件;mkdir -p 同时创建缺失的父目录。mv 的两个主要用途是重命名和移动;多个文件移动到同一目录时,目录放在最后。cp 复制后原文件仍在源位置;课程通过两处 readme.txt 的树形输出确认结果。
删除文件/目录在本节作为自主探索练习提出,没有给出具体删除命令。本笔记保留已演示的文件操作,不补入额外命令。
9. 编辑文件:Nano 与 Vim
Nano 适合快速编辑和入门;课程直接把文件名作为参数:
nano notes.txt
在 Nano 底部,^ 代表 Ctrl。输入内容后,Ctrl+W 搜索,输入关键词并回车;再次 Ctrl+W 后回车可继续查找。Ctrl+O 保存并回车确认文件名,Ctrl+X 退出,然后用 cat notes.txt 核对实际文件内容。这形成“编辑 → 保存 → 退出 → 读取验证”的完整过程。
Vim 是模态编辑器,进入后默认通常为 Normal 模式,敲字符不一定是在输入文本。课程介绍六种模式:
模式 意义 Normal 解释编辑命令。 Insert 插入文本。 Visual 选择文本区域并进行操作。 Command 输入单行命令,例如排序或替换。 Replace 输入内容覆盖已有字符。 Ex 顺序执行多条 Ex 命令。
vim
vimtutor
课程在 Vim 中用 :q 退出,并推荐 vimtutor 的交互式教程;首次练习使用教程副本。课程没有在本节给出完整的 Vim 编辑/保存快捷键教程,不把外部用法混入此处。
文件内容也关系到系统安全:/etc/passwd 用于账户信息,密码哈希通常在权限更严格的 /etc/shadow;应把文件用途与访问权限结合起来理解。
10. 查找程序、文件与目录
which 查询将被执行的程序路径,适合确认当前环境是否能找到某个命令;课程以 Python 为例。find 实际搜索指定位置,并按类型、名称、所有者、大小、时间等条件筛选;locate 查询本地数据库,速度较快,但数据库是否更新和筛选能力都影响结果。
which python
find / -type f -name *.conf -user root -size +20k -newermt 2020-03-03 -exec ls -al {} \; 2>/dev/null
sudo updatedb
locate *.conf
以上沿用课程查找示例:-type f 限定普通文件,-name 指定名称模式,-user root 限定属主,-size +20k 限定超过 20 KiB,-newermt 限定更新时间晚于给定日期;-exec 对结果执行命令,{} 替换为路径,; 终止这段执行参数。2>/dev/null 是 Shell 错误重定向,不是 find 的选项。
sudo updatedb 是课程给出的数据库更新方式,随后再用 locate 查询;需结合使用数据库和实际遍历这两种方式选择工具。
11. 文件描述符、重定向与管道
文件描述符是内核维护的 I/O 资源引用;标准输入 STDIN 为 0,标准输出 STDOUT 为 1,标准错误 STDERR 为 2。终端里看到的正常结果与错误提示可能来自不同数据流。


find /etc/ -name shadow 2>/dev/null
find /etc/ -name shadow 2>/dev/null > results.txt
find /etc/ -name shadow 2> stderr.txt 1> stdout.txt
cat < stdout.txt
find /etc/ -name passwd >> stdout.txt 2>/dev/null
2> 单独处理错误流;> 默认重定向标准输出。文件不存在时创建,存在时会覆盖,追加需用 >>;< 把文件作为标准输入。隐藏错误只是改变显示/保存位置,不会增加原有访问权限。

截图还给出了 Here-document 的完整输入过程:一直输入到独占一行的结束标记 EOF,再读取文件验证内容。
cat << EOF > stream.txt
Hack
The
Box
EOF
cat stream.txt

管道 | 把前一个程序的标准输出交给后一个程序。课程链条先查找配置文件,再过滤 systemd,最后用 wc -l 统计结果行数:
find /etc/ -name *.conf 2>/dev/null | grep systemd | wc -l

12. 读取和筛选文本
课程用 /etc/passwd 连续演示筛选。先选择需要的数据,再取字段、格式化或计数;每加一段管道都观察中间结果,避免把格式变化误当成原始字段变化。
工具 作用及课内用法 more、less 分页查看长文件,q 退出;例 cat /etc/passwd | more、less /etc/passwd。 head、tail 默认分别输出开头/末尾 10 行。 sort 排序文本,让结果更容易比较。 grep 按模式保留匹配行,-v 反选。 cut -d 指定分隔符,-f 选择字段;用户名位于冒号分隔记录的第一列。 tr 替换字符,例如把冒号变为空格。 column -t 按列排版输出。 awk 选择字段;NF 为末字段。 sed 流式替换;s/原模式/新模式/g 对所有匹配执行替换。 wc -l 统计行数。
head /etc/passwd
tail /etc/passwd
cat /etc/passwd | sort
cat /etc/passwd | grep "/bin/bash"
cat /etc/passwd | grep -v "false\|nologin" | cut -d":" -f1
cat /etc/passwd | grep -v "false\|nologin" | tr ":" " " | column -t
cat /etc/passwd | grep -v "false\|nologin" | tr ":" " " | awk '{print $1, $NF}'
课程示例指出,账户说明里有空格时,单纯转换分隔符再按空格排版会改变列数;使用首字段与末字段可提取示例需要的用户名和 Shell。接上 sed 's/bin/HTB/g' 能观察替换效果,接上 wc -l 得到筛选行数。本节练习围绕用户名、UID、Shell、输出分隔符和排除条件展开。
13. 正则表达式
正则表达式描述文本模式,可用于 grep/sed 等工具的搜索、筛选和替换。圆括号组合模式,方括号描述字符集合,例如 [a-z];花括号描述重复次数,例如 {1,10};竖线表示 OR。
grep -E "(my|false)" /etc/passwd
grep -E "(my.*false)" /etc/passwd
grep -E "my" /etc/passwd | grep -E "false"
grep -E 启用扩展正则。第一条匹配含任一词的行;第二条要求 my 出现在 false 之前,中间允许任意文本。课程把它用于类似 AND 的示例,但顺序条件不能丢掉;两次 grep 则逐层筛选包含两个词的行。
课程让读者在 /etc/ssh/sshd_config 中练习排除注释、词首/词尾、含 Key 及 Password 与 yes 的组合条件;笔记保留这些练习目标,不加入题目答案。
14. 权限与所有权
权限分配给所有者、所属组和其他用户,分别控制读 r、写 w、执行 x。对目录,x 表示可进入/遍历,w 涉及创建、删除、重命名目录条目;对文件,执行权限针对该文件。不要把目录可遍历直接理解为目录内所有文件都能执行或写入。
ls -l 首字符表示类型(普通文件 -、目录 d、链接 l),随后三组权限对应 user/group/others。八进制用 r=4、w=2、x=1 相加表示一组权限:
数字 权限 计算 7 rwx 4+2+1 5 r-x 4+1 4 r-- 4
chmod a+r shell && ls -l shell
chmod 754 shell && ls -l shell
chown root:root shell && ls -l shell
chmod 的符号引用为 u/g/o/a,+ 增加、- 移除;a+r 给所有类别增加读取权限,754 直接指定三组权限。chown <用户>:<组> <路径> 修改所有权,课程通过后续 ls -l 的属主/组列验证变化。
SUID/SGID 用 s 标记执行时采用文件所有者/组的权限,错误授予可能扩大权限。课程以具备其他功能的程序为例提示风险,并链接 GTFOBins。
共享目录的 sticky bit 限制谁能删除或重命名其中条目,课程列出文件所有者、目录所有者和 root。t 同时带有对应的执行位,T 表示 sticky 设置但该执行位未设置;它们都不能仅被解读为一般文件可写权限。
三、系统与服务管理
15. 用户与组管理
用户管理围绕账户、组成员和允许执行的操作展开。课程通过普通用户读 /etc/shadow 被拒绝,再用获准的 sudo 执行同一命令对比权限:
cat /etc/shadow
sudo cat /etc/shadow
sudo 只允许被策略授权的用户以另一个身份执行命令;su 通过 PAM 请求相应凭据并切换用户身份、启动 Shell,默认目标为超级用户。
工具 课程列出的用途 useradd、userdel、usermod 新建、删除和修改用户账户。 addgroup、delgroup 添加/移除组。 passwd 修改用户密码。
本节未给出上述账户管理工具的详细参数教程,因此只归纳已给出的用途。练习应联系前面学过的文件、权限、筛选和重定向,并用当前身份与访问结果验证授权是否符合预期。
16. 软件包管理与获取项目
软件包包含程序、配置、依赖和维护信息;包管理器处理下载、安装、更新与移除。Debian 系使用 APT 与 dpkg;课程还列出 aptitude、snap、Ruby 的 gem 和 Python 的 pip,但只给出主要 APT/dpkg 操作实例。
其中 aptitude 是 APT 的替代高层接口,snap 管理 Snap 包,gem 面向 RubyGems,pip 面向 Python 包;这些名称的用途需要区分,不能把它们当成可在所有发行版互换的同一个安装器。
APT 从软件源查询包并处理依赖。课程列出 /etc/apt/sources.list,Parrot 示例使用 /etc/apt/sources.list.d/parrot.list。先查询包,再确认依赖与已安装状态,最后安装:
apt-cache search impacket
apt-cache show impacket-scripts
apt list --installed
sudo apt install impacket-scripts -y
安装操作示例使用 sudo;-y 自动接受安装确认。apt-cache show 的依赖和架构字段用于理解要装什么,不必照抄长输出。课文要求先通过 APT 安装 Git,之后复制仓库的 HTTPS 地址并克隆;图中的旧版 GitHub 菜单展示了取得链接的位置。

mkdir ~/nishang/ && git clone https://github.com/samratashok/nishang.git ~/nishang
克隆的前提是 Git 已安装;此处只是取得项目,课程把项目本身的用途留到后续模块。
dpkg 的课内例子下载 Ubuntu 18.04/amd64 的 strace 包,安装后调用帮助验证程序可执行:
wget http://archive.ubuntu.com/ubuntu/pool/main/s/strace/strace_4.21-1ubuntu1_amd64.deb
sudo dpkg -i strace_4.21-1ubuntu1_amd64.deb
strace -h
上述包地址和版本属于课程示例;不把它当成所有发行版的统一安装来源。比较 APT 的仓库/依赖管理与 dpkg 的本地包操作,是本节重点。
17. 服务、进程与前后台任务
服务通常作为后台守护进程运行;进程具有 PID,父子进程还涉及 PPID,/proc/ 提供进程相关信息。管理时区分“现在运行”与“开机自动运行”。课内 SSH 服务操作以前提“已安装 OpenSSH”为起点;安装方法见第 19 节。
systemctl start ssh
systemctl status ssh
systemctl enable ssh
ps -aux | grep ssh
systemctl list-units --type=service
journalctl -u ssh.service --no-pager
status 看活动状态、主 PID 和日志摘要;enable 设置启动关联;ps 检查进程,启动失败时用 journalctl 查看服务日志,而不是只重复启动。
进程可能处于 Running、Waiting、Stopped 或 Zombie 状态。kill -l 列出信号;课程重点包括 SIGHUP(1)、SIGINT(2)、SIGKILL(9)、SIGTERM(15)、SIGSTOP(19)和 SIGTSTP(20)。SIGKILL 立即结束且不进行清理,SIGTERM 表示终止请求。原页强制终止示例写为 kill 9 <PID>,本笔记不把这一省略信号选项标记的写法列作可直接执行示例。
课内还列出 pkill、pgrep、killall 等进程查找/控制工具,具体参数未展开,可沿用第 5 节的求助方法核对。
ping -c 10 www.hackthebox.eu
jobs
bg
fg 1
ping -c 10 www.hackthebox.eu &
运行程序时 Ctrl+Z 是暂停,并非继续后台执行;之后用 bg 恢复到后台,jobs 查看当前 Shell 的任务,fg <任务号> 恢复前台交互。命令尾部 & 则直接以后台方式启动。
命令连接方式也要区分:; 不因上一条失败而停止后续命令,&& 只在上一条成功时继续,| 将标准输出送入下一个程序。
18. 定时任务:systemd timer 与 Cron
自动更新、脚本、数据库维护和备份都可由调度完成。systemd 把“何时运行”和“执行什么”分别写在 .timer 与 .service 中;课内配置位于 /etc/systemd/system/,创建与启用示例使用 sudo。
mytimer.timer:
[Unit]
Description=My Timer
[Timer]
OnBootSec=3min
OnUnitActiveSec=1hour
[Install]
WantedBy=timers.target
mytimer.service:
[Unit]
Description=My Service
[Service]
ExecStart=/full/path/to/my/script.sh
[Install]
WantedBy=multi-user.target
课程先创建 mytimer.timer.d 目录,再编辑两份配置;ExecStart 替换为实际脚本完整路径。配置完成后重新加载并启动/启用 timer:
sudo mkdir /etc/systemd/system/mytimer.timer.d
sudo vim /etc/systemd/system/mytimer.timer
sudo vim /etc/systemd/system/mytimer.service
sudo systemctl daemon-reload
sudo systemctl start mytimer.timer
sudo systemctl enable mytimer.timer
OnBootSec=3min 是启动后延迟,OnUnitActiveSec=1hour 是相对上次活动的间隔;timer 按安排触发同名 service。
Cron 使用 crontab。五个时间字段依次为分、时、月中日、月、星期,后面是命令/脚本;星期 0 和 7 在课程示例中都表示星期日。
0 */6 * * * /path/to/update_software.sh
0 0 1 * * /path/to/scripts/run_scripts.sh
0 0 * * 0 /path/to/scripts/clean_database.sh
0 0 * * 7 /path/to/scripts/backup.sh
这四行分别对应每 6 小时、每月首日午夜、每周日午夜、每周日午夜。配置方式不同是本节比较重点;课程也强调监控执行结果以及审核未经授权的定时脚本。
19. 网络服务的首次安装与配置
网络服务的用途不同,传输是否加密也不同。课程以明文 FTP 可能暴露凭据为例说明理解协议的重要性;本节主要给出 SSH、NFS、Web 服务和 VPN 的安装及连接方法。
OpenSSH:目标上必须有可用且运行中的 SSH 服务。安装、状态检查与登录示例:
sudo apt install openssh-server -y
systemctl status ssh
ssh <用户名>@<目标IP>
首次连接会显示主机密钥指纹和确认提示,课内登录随后要求目标账户密码。/etc/ssh/sshd_config 控制并发、密码/密钥登录等服务端设置;需要有效认证资料,不能把 IP 可达等同于可登录。课程未给出完整的密钥生成或分发教程。
NFS:把远端共享挂到本地目录,再像本地文件一样使用。
sudo apt install nfs-kernel-server -y
systemctl status nfs-kernel-server
mkdir ~/target_nfs
mount <服务器IP>:/home/john/dev_scripts ~/target_nfs
tree ~/target_nfs
服务端用 /etc/exports 定义共享目录、允许的客户端和选项;修改系统配置及挂载需要相应管理权限。课程示例形式为:
/home/cry0l1t3/nfs_sharing hostname(rw,sync,no_root_squash)
rw/ro 控制读写,root_squash 限制客户端 root,no_root_squash 不做这种降权;sync/async 涉及提交时机和一致性。示例中的 no_root_squash 是需要审查的安全条件,不应不加判断地当成所有共享的默认方案。
Apache 与 Python Web 服务:Apache 安装后,/etc/apache2/apache2.conf 控制目录访问,默认站点目录为 /var/www/html;.htaccess 可用于目录级设置。课程目录块包含 Options Indexes FollowSymLinks、AllowOverride All、Require all granted,分别涉及索引/链接、覆盖与访问规则。
sudo apt install apache2 -y
sudo apt install python3 -y
python3 -m http.server
python3 -m http.server --directory /home/cry0l1t3/target_files
python3 -m http.server 443
Python 示例默认在 TCP 8000 提供当前目录,也可指定目录或端口。最后一条只改变监听端口,本节没有配置 TLS,不把端口 443 自动理解成 HTTPS。
OpenVPN:安装后使用服务器提供的 .ovpn 配置连接;服务端配置文件为 /etc/openvpn/server.conf。
sudo apt install openvpn -y
sudo openvpn --config internal.ovpn
前置条件是取得对应服务器的配置文件;连接建立后才可按配置与路由访问内网目标。
20. Web 服务的启动、访问和文件传输
延续第 19 节的安装,Apache 一般通过 systemctl、service 或 apache2ctl 管理;课程说明不直接运行 apache2 二进制的原因是默认配置使用环境变量。
sudo systemctl start apache2
curl http://localhost
wget http://localhost
Apache 默认 HTTP 端口为 80;浏览器出现默认页可作为启动验证。curl 默认把响应源文本写到标准输出,wget 示例把页面保存为 index.html,两者不是“渲染网页”与“浏览器”的同一种过程。
默认页截图还说明了测试文件位置 /var/www/html/index.html,可据此定位这个示例站点的文档入口。

Pwnbox 的 80 端口可能已被占用。课程将 /etc/apache2/ports.conf 改为 Listen 8080,文件内注释提醒同时检查 /etc/apache2/sites-enabled/000-default.conf 中的 VirtualHost;重启后用以下请求核验:
curl -I http://localhost:8080
示例响应为 200 OK,还可观察服务器头、内容类型等。Python 临时服务使用第 19 节的 python3 -m http.server,服务器根目录就是启动命令所在目录;课程从浏览器访问 <http://localhost:8000/readme.html,服务端终端则记录各个> GET 请求及状态码。

Apache 模块可扩展 HTTPS(mod_ssl)、代理(mod_proxy)、HTTP 头与 URL 重写(mod_headers/mod_rewrite);本节介绍用途,没有给出这些模块的独立安装配置教程。
21. 备份、恢复与自动同步
课程列出 Rsync、Duplicity 和 Deja Dup,分别强调高效同步、加密备份和图形界面;主要命令教程是 Rsync。备份不仅要复制,也要考虑保存属性、传输加密、恢复路径与自动运行所需的认证条件。
sudo apt install rsync -y
rsync -av /path/to/mydirectory user@backup_server:/path/to/backup/directory
rsync -avz -e ssh /path/to/mydirectory user@backup_server:/path/to/backup/directory
rsync -av user@remote_host:/path/to/backup/directory /path/to/mydirectory
-a 保存属性,-v 显示过程,-z 压缩,-e ssh 使用 SSH 加密传输;恢复时反转来源与目的位置。课程另给出 --backup --backup-dir=<路径> --delete 组合:保存备份版本,同时删除目的端在来源已不存在的条目。--delete 的影响必须和普通复制区别开。
自动化通过脚本和 Cron 实现,前提是解决 SSH 的交互式认证。课程明确要求配置密钥登录:
ssh-keygen -t rsa -b 2048
ssh-copy-id user@backup_server
课内默认私钥位置为 ~/.ssh/id_rsa,生成过程可设置口令。将同步命令写入 RSYNC_Backup.sh,给脚本执行权限,确认属主正确后编辑 crontab:
chmod +x RSYNC_Backup.sh
crontab -e
0 * * * * /path/to/RSYNC_Backup.sh
每小时的第 0 分钟运行。课程建议先用 Pwnbox 的两个目录和 127.0.0.1 练习,同步后检查目的文件,再比较变更后的同步结果。
22. 文件系统、分区、挂载与 Swap
文件系统选择联系可靠性、性能、完整性和兼容性:课程比较 ext2、带日志的 ext3/ext4、支持快照/完整性检查的 Btrfs、高 I/O 与大文件的 XFS,以及 Windows 兼容场景中的 NTFS。
inode 保存权限、属主、大小、时间等元数据及数据位置,不是文件名或文件正文。可用 ls -il 查看 inode 编号;普通文件、目录、符号链接是不同对象类型。
ls -il
sudo fdisk -l
cat /etc/fstab
mount
sudo mount /dev/sdb1 /mnt/usb
cd /mnt/usb && ls -l
sudo umount /mnt/usb
fdisk -l 看设备、分区、大小与类型;mount 无参数列当前挂载。挂载把设备/分区接入目录树,课内设备和挂载点要按实验环境替换。/etc/fstab 用于启动时挂载设置;noauto 防止对应条目自动挂载。示例 USB 条目为:
/dev/sdb1 /mnt/usb ext4 rw,noauto,user 0 0
卸载需要足够权限,且不能仍被运行进程使用;课程用 lsof 调查打开文件,再处理占用。不能把“不自动挂载”误解为“不在关机时正常卸载”。
Swap 为内存压力和休眠提供空间:mkswap 准备交换区,swapon 启用。课程讨论按 RAM/工作负载选择容量,以及交换区可能含敏感数据的加密需求,没有给出统一容量或完整创建命令教程。
23. Docker 与 LXC 容器
容器共享宿主内核,把程序与依赖放入隔离环境;与虚拟机不同,不为每个实例运行独立内核。Docker 偏应用打包和镜像分发,LXC 偏系统级 Linux 环境;隔离与权限配置都要考虑,不能把容器等同于完全安全的边界。
Docker 首次安装(课内 Ubuntu 环境):准备证书与工具、添加官方仓库密钥和源、安装 Engine,加入 docker 组后重新登录,再运行 hello-world 验证。
sudo apt update -y
sudo apt install ca-certificates curl gnupg lsb-release -y
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update -y
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
sudo usermod -aG docker htb-student
重新登录使组变更生效,然后:
docker run hello-world
课程用 Ubuntu 22.04 镜像搭建含 Apache 和 SSH 的文件传输环境。Dockerfile 的关键关系是 FROM 选基础镜像、RUN 安装/配置、EXPOSE 描述端口、CMD 启动服务;完整演示还创建 docker-user、设置密码与 Web 目录所有权,并授予免密 sudo。后者是课内演示配置,不能误记为普通服务器加固方案。
docker build -t <镜像标签> .
docker run -p 8022:22 -p 8080:80 -d <镜像标签>
docker ps
docker logs <容器>
docker stop <容器>
docker start <容器>
-t 设镜像标签,. 指构建目录;-p 左侧为宿主端口、右侧为容器端口,-d 后台运行。课内 FS_docker 字样在这里统一用待替换的标签表示。课程还列出 restart、rm 和 rmi,分别重启、移除容器和移除镜像;镜像与容器不能混为一谈,运行时变化也不会自动写回原镜像,持久数据需另作安排。
LXC 首次使用:需要支持容器功能的 Linux 内核;安装、创建、启动、查看和进入容器的课内流程:
sudo apt install lxc -y
sudo lxc-create -n linuxcontainer -t ubuntu
sudo lxc-start -n linuxcontainer
sudo lxc-info -n linuxcontainer -i
sudo lxc-attach -n linuxcontainer
lxc-ls 列容器,lxc-info 查状态/PID/IP/资源,lxc-stop 停止,lxc-stop -r 重启,lxc-console 接控制台;lxc-cgroup 查改运行时资源值。
课内特权容器的配置位于 /var/lib/lxc/<容器>/config。网络键为 lxc.net.0.*;共享宿主目录使用 lxc.mount.entry bind 条目,而不是把共享路径传给 lxc-attach。lxc-config 只查询全局参数,不能当作 LXD 的 lxc config 客户端。
lxc.mount.entry = /path/on/host path/in/container none bind,create=dir 0 0
lxc.cgroup.cpu.shares = 512
lxc.cgroup.memory.limit_in_bytes = 512M
CPU shares 是相对权重,内存项是限制值。修改容器配置后停止再启动该容器使其重载;临时修改可用:
sudo lxc-cgroup -n linuxcontainer cpu.shares 512
sudo lxc-cgroup -n linuxcontainer memory.limit_in_bytes 512M
安全部分归为访问限制、资源限额、宿主隔离、强制访问控制和更新。命名空间区分进程、网络和挂载视图,不能仅因有命名空间就忽略额外防护。相关指令参考课程链接的 Dockerfile 文档 与 docker run 文档。
四、网络、图形访问与加固
24. 网络配置与故障定位
先检查接口、地址和状态,再分别检查路由、DNS、连接及访问控制;不要把“能 ping IP”和“能解析域名”混成一项。
ifconfig
ip addr
sudo ip link set eth0 up
sudo ifconfig eth0 192.168.1.2
sudo ifconfig eth0 netmask 255.255.255.0
sudo route add default gw 192.168.1.1 eth0
接口名称、地址、掩码和网关按课内环境替换。课程也给出 ifconfig eth0 up 的接口启用方式,并指出 ip 是较新的管理工具。上述即时设置与持久配置不同:课程持久示例编辑 /etc/network/interfaces。
auto eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 8.8.8.8 8.8.4.4
保存后执行课内的 sudo systemctl restart networking。/etc/resolv.conf 中可列 nameserver,但课程明确提醒它可能被 NetworkManager/systemd-resolved 重写,持久 DNS 应通过实际网络管理方式配置。
ping 8.8.8.8
traceroute www.inlanefreight.com
netstat -a
ping 看响应和丢包,traceroute 看逐跳路径及延迟,netstat 看协议、端点和连接状态。路径中 * 代表没有收到该次探测回应,不应单凭它就认定设备不存在。排障方向包括连通性、DNS、丢包和性能,以及对应的路由、防火墙、链路、硬件与配置问题。
访问控制模型:DAC 由资源所有者控制,MAC 由系统策略强制执行,RBAC 按组织角色分配。课程介绍 SELinux(标签与细粒度策略)、AppArmor(应用 profile)和 TCP wrappers(服务/来源访问规则);安装和策略编写属于本节自主练习,正文没有详细操作教程。流量监测的 Wireshark、tshark、Tcpdump 和 ELK 也仅作为工具与后续学习方向介绍。
25. X11、XDMCP 与 VNC 远程图形访问
RDP/VNC 用于远程桌面,X11 则让远端图形应用在本地显示。课程介绍 X server 在用户显示一侧,X11 通信本身可能未加密,可通过 SSH 转发;服务端要允许 X11Forwarding yes。
cat /etc/ssh/sshd_config | grep X11Forwarding
ssh -X htb-student@<目标IP> /usr/bin/firefox
前提是 SSH 认证可用、服务端开启 X11 转发、本地有相应显示环境;课内结果是在客户端看到远端 Firefox 窗口。

XDMCP 使用 UDP 177 管理远程 X 会话,服务端需要图形系统;课程强调其未受充分保护时的风险。VNC 基于 RFB 提供桌面控制,常见显示 0 使用 TCP 5900、显示 1 使用 5901。本节列出 TigerVNC、TightVNC、RealVNC、UltraVNC,但实际首次配置教程使用 TigerVNC 与 XFCE4。
sudo apt install xfce4 xfce4-goodies tigervnc-standalone-server -y
vncpasswd
touch ~/.vnc/xstartup ~/.vnc/config
设置 VNC 密码后,~/.vnc/xstartup 的课程内容为:
#!/bin/bash
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
/usr/bin/startxfce4
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
x-window-manager &
~/.vnc/config 设置 geometry=1920x1080 与 dpi=96,然后赋予启动文件执行权限并检查会话:
chmod +x ~/.vnc/xstartup
vncserver
vncserver -list
课程输出显示 :1、5901 和对应 PID。加密访问采用 SSH 隧道,连接它还需要 SSH 账户认证和 VNC 密码:
ssh -L 5901:127.0.0.1:5901 -N -f -l htb-student <目标IP>
xtightvncviewer localhost:5901
客户端连接本地 5901,由 SSH 转发到服务端本地的 VNC 端口。VNC 的加密方式应联系具体实现和这条隧道理解,不把所有 VNC 会话自动认定为已加密。
效果图中的远端终端还执行 id,核对 UID/GID 和组:确认桌面连上之后,也确认实际运行账户;这沿用第 6 节的身份检查方法。

26. Linux 安全基线
安全是持续维护过程。本节重点为系统与软件更新、减少服务、限制访问、强认证、权限审计和日志。课程更新示例:
apt update && apt dist-upgrade
SSH 加固包括禁止 root 直接登录、按需要收紧密码登录;sudo 按具体任务授权,避免赋予不必要的全部权限。定期审查内核、用户权限、全局可写文件、cron、服务和不需要的 SUID/SGID 程序;账号独立、强密码、密码更新/复用策略及失败锁定也是课内清单。
fail2ban 按失败登录次数处理来源;SELinux/AppArmor 限制进程访问,Snort、chkrootkit、rkhunter、Lynis 为课程列出的其他安全工具,本节没有其完整安装教程。保持 NTP 和 Syslog 可用,移除依赖明文认证的服务,并联系第 28 节检查实际记录。
TCP wrappers 的课内配置使用 /etc/hosts.allow 与 /etc/hosts.deny,以服务名称和来源条件决定访问。例如 allow 文件里的:
sshd : 10.129.14.0/24
ftpd : 10.129.14.10
以及 deny 文件里的 sshd : 10.129.22.22。这类服务访问机制不能替代防火墙;应检查实际服务是否支持及规则生效情况。
27. 防火墙:iptables 的规则模型
Netfilter 提供内核处理钩子,iptables 用命令配置规则。把规则理解为“表 → 链 → 匹配条件 → 动作”更容易定位数据包为何被放行或阻止。
项目 用途 filter 常规过滤;重点链为 INPUT、OUTPUT、FORWARD。 nat 地址转换;本节重点介绍 PREROUTING/POSTROUTING。 mangle 调整数据包字段。 raw 特殊处理,课程列出 PREROUTING/OUTPUT。
INPUT 面向本机接收,OUTPUT 面向本机发出,FORWARD 面向转发。-A 追加规则,-p 协议,--dport/--sport 目标/源端口,-s/-d 源/目标地址,-j 指定动作:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
这两个课内例子分别匹配入站 TCP 的 22/80 端口并接受。常见动作是 ACCEPT、DROP、REJECT、LOG;SNAT、DNAT、MASQUERADE 用于地址转换,REDIRECT 和 MARK 涉及重定向与标记。
-m 扩展匹配包括 state/conntrack、multiport、tcp/udp、string、limit、mark、mac、iprange。课程也比较 nftables、ufw、firewalld 的定位,但没有给出安装命令和完整迁移教程;练习围绕允许/阻止端口、来源、协议,以及创建链、删除/列出规则展开。
28. 系统日志与监控线索
日志用于还原系统、账户、应用及安全事件。分析时先确定时间、组件、来源和事件结果,再结合多类日志,避免从单条记录直接断定入侵。
类型 课程列出的路径/用途 内核 /var/log/kern.log:驱动、内核事件、资源与崩溃。 系统 /var/log/syslog:服务、重启、调度等。 认证 Ubuntu /var/log/auth.log;CentOS/RHEL 示例为 /var/log/secure。 Web Apache /var/log/apache2/access.log 与 error.log;Nginx /var/log/nginx/access.log。 数据库 MySQL、PostgreSQL 的各自日志目录与文件。 systemd /var/log/journal/。 安全工具 /var/log/fail2ban.log、/var/log/ufw.log 等。
课内样例先出现 SSH Failed password,随后 Accepted password;另一组记录包含 Accepted publickey、sudo 的工作目录/目标身份/COMMAND、会话开启,以及 cron 会话开关。把身份、来源 IP、时间与操作连成事件链,才便于解释权限与访问行为。
读取与筛选可使用前面学过的 tail、grep、sed;本节主要展示日志条目和默认位置,没有新增命令语法教程。管理要点为合适日志级别、轮转、存储保护和定期分析。
29. Solaris 与 Linux 的操作对照
Solaris 是 Unix 系统,本节从目录、系统信息、包管理、权限、NFS、进程文件与系统调用跟踪对照 Linux。共同的命令外形不能证明所有版本的选项语义相同;原页同时包含 Solaris 10 的输出和 IPS 介绍,实际管理应联系目标版本。
目标 课内 Linux 示例 课内 Solaris 示例 系统信息 uname -a showrev -a 安装包 sudo apt-get install apache2 pkgadd -d SUNWapchr 权限 chmod 700 filename 同样介绍 chmod。 共享 NFS /etc/exports share -F nfs -o rw /export/home、/etc/dfs/dfstab。 查看进程打开文件 sudo lsof -c apache2 pfiles 配合 pgrep 查 PID。 系统调用跟踪 strace truss ls。
mount -F nfs 10.129.15.122:/nfs_share /mnt/local
pfiles `pgrep httpd`
sudo strace -p `pgrep apache2`
truss ls
目录方面新增关注 /kernel(内核相关)与 /lost+found(恢复文件),通用的 /etc、/var 等用途联系第 1 节。权限模型与 RBAC、服务管理 SMF、包管理 IPS 是课程介绍的其他 Solaris 特征。
原页把 find -perm 4000 与 find -perm -4000 的差别概括为两平台权限系统差异,并对跟踪工具能力作绝对比较;这些不宜当作通用命令保证,本笔记保留操作对照,具体选项按目标的 man 页核对。
30. 常用快捷键
目的 快捷键 补全 Tab。 行首/行尾 Ctrl+A / Ctrl+E。 按词移动 Ctrl+方向键;Alt+B / Alt+F。 删除到行首/行尾 Ctrl+U / Ctrl+K。 删除前一个词 Ctrl+W。 粘回被删除内容 Ctrl+Y。 中断任务 Ctrl+C,发送 SIGINT。 输入结束 Ctrl+D,表示 EOF。 清屏 Ctrl+L,或 clear。 暂停任务 Ctrl+Z,发送 SIGTSTP,恢复见第 17 节。 搜历史 Ctrl+R;上下键逐条选择。 切换应用 Alt+Tab。 缩放 Ctrl++ / Ctrl+-。
第 17 节原页信号表把 Ctrl+D 与 SIGQUIT 联系在一起;这里依照本节明确的 EOF 说明区分它和 Ctrl+C、Ctrl+Z,避免把结束输入、终止和暂停混为一谈。
复习与操作闭环
从 pwd / whoami / id / uname 确认上下文;用导航、查找、分页和管道找到所需信息;变更时先理解文件权限和管理权限;再把安装、配置、启动/调度、访问测试和日志检查连接起来。课程练习的目标是建立这些判断能力,笔记不填写实验题答案。
