空想网安の乌托邦
首页小说读书项目归档照片墙音乐说说杂谈关于
封面

HTB Academy:Linux 基础

写作时间:2026-10-10 18:44:30
# HTB Academy
# 网安

来源: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​(管理员家目录)与 ​/​(根目录)混为一谈。

​

Linux 文件系统层级:从根目录分出配置、程序、设备、用户与运行数据目录

​

目录 主要用途 ​/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 安装、快捷键或首次配置命令。

​

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。终端里看到的正常结果与错误提示可能来自不同数据流。

​

cat 的输入与回显:绿色标出输入,红色标出标准输出

​

​

find 的正常路径与 Permission denied 错误分别属于 STDOUT 和 STDERR

​

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>​ 单独处理错误流;​>​ 默认重定向标准输出。文件不存在时创建,存在时会覆盖,追加需用 ​>>​;​<​ 把文件作为标准输入。隐藏错误只是改变显示/保存位置,不会增加原有访问权限。

​

分别保存并读取 stdout.txt 和 stderr.txt,可以验证正常结果与错误未混写

​

截图还给出了 Here-document 的完整输入过程:一直输入到独占一行的结束标记 ​EOF​,再读取文件验证内容。

cat << EOF > stream.txt
Hack
The
Box
EOF
cat stream.txt

​

Here-document:结束标记前的三行写入 stream.txt,EOF 自身不写入正文

​

管道 ​|​ 把前一个程序的标准输出交给后一个程序。课程链条先查找配置文件,再过滤 ​systemd​,最后用 ​wc -l​ 统计结果行数:

find /etc/ -name *.conf 2>/dev/null | grep systemd | wc -l

​

管道的最终验证:find → grep → wc,示例结果为 6 行

​

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​ 选择字段;​1​为首字段,​1​ 为首字段,​1​为首字段,​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 菜单展示了取得链接的位置。

​

课程 GitHub 克隆链接位置:仓库地址、Clone or download 菜单、HTTPS 链接

​

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​,可据此定位这个示例站点的文档入口。

​

Apache 默认页:课程用它确认服务已能响应 HTTP 请求

​

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 请求及状态码。

​

Python 临时 HTTP 服务中访问 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 窗口。

​

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 节的身份检查方法。

​

VNC 客户端展示远端 XFCE 桌面,作为连接和会话配置的结果验证

​

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​ 确认上下文;用导航、查找、分页和管道找到所需信息;变更时先理解文件权限和管理权限;再把安装、配置、启动/调度、访问测试和日志检查连接起来。课程练习的目标是建立这些判断能力,笔记不填写实验题答案。

avatar

Zybaxy918039

书本,学术,网安之间反复横跳的业余爱好者,目前在自学计算机网络和AI相关知识

RECOMMENDED

HTB Academy:使用 Nmap 进行网络枚举

2026-09-19 22:17:09

HTB Academy:信息收集-网络版(Web Reconnaissance)学习笔记

2026-09-19 22:22:34

HTB Academy:Footprinting(足迹收集)

2026-09-20 12:23:20

Table of Contents