该学习路径讲解了网络安全入门的必备技术知识,比如计算机网络、网络协议、Linux命令、Windows设置等内容。过去两篇已经对计算机网络和网络协议进行了简单介绍,本篇博客将记录 Linux命令部分。
Linux 系统的优点就是其轻量级,有些 Linux 系统为了达到更加轻量级的目的甚至没有 GUI (Graphical user interface,用户图形界面) 或者 桌面环境。因此与这种系统交互绝大一部分通过 Terminal (终端) 完成。
终端就是一个黑框框,和 Windows 上的 CMD 很像。
先介绍两个最基本的两个命令:echo 和 whoami。
echo 命令与编程语言的输出很像,都是直接输出内容:
whoami ,直译过来意思是"我是谁",的确该命令用于显示当前登录的用户:
Linux Fundamentals Part 1
Interacting with the filesystem
在操作系统中,我们经常需要要对文件系统进行操作。对于文件系统,我们经常会用到下面几个命令:ls、cd、cat、pwd
ls 命令用于列出工作目录下的文件:
cd 命令用于进入另一个目录:
cat 命令用于输出文件内容:
pwd 命令用于展示当前工作目录的完整路径,pwd 是 p rint w orking directory 的缩写:
Searching for files
在与文件系统进行交互时,我们有时候会想去直接搜索某些文件。搜索文件常用如下两个命令:find、grep
find 命令用于在当前目录下寻找指定文件:
find 查找指定文件名文件
find 使用通配符查找文件
grep 命令用于搜索文件内容,查找需要的特定值:
Shell operators
在终端输入命令时,我们经常会用到几个操作符,这些操作符可以在一定程度上方便我们的工作:&、&&、>、>>
& 操作符允许我们将该命令置于后台执行。当我们需要复制一个大文件时,将其置于后台执行,我们就可以做其他事情了。
图上可以看出,当我们使用了 & 操作符时,系统会给我们返回该任务的进程号。
&& 操作符用于创建一个要运行的命令列表。例如我们可以构建一串命令 command 1 && command 2,当 command 1 被成功执行后,紧接着就会执行 command 2.
> 操作符被称为输出重定向器,它可以从运行的命令中获取输出,然后将输出发送到其他地方。
>> 操作符也是输出重定向器,它与 > 操作符的作用一样。二者不同之处在于,> 操作符会将输出覆盖,而 >> 操作符会把输出追加。下面进行举例对比:
如图所示,operatortest 文件中有一个数字 1。现在使用 > 操作符给该文件中写入内容,发现文件中的内容被覆盖:
此时再用 >> 操作符给该文件写入内容,发现内容追加到文件尾部:
Linux Fundamentals Part 2
Flags & switches
大多数命令都允许提供参数,在使用命令时除非另有说明,否则该命令将执行其默认行为。比如,ls 命令默认会列出工作目录的内容,但不会显示隐藏文件。所以我们可以使用 flags (标志) 和 switches (开关)来扩展命令的功能。
以 ls 命令为例,当我们输入 ls -a 时,输出结果多了一些文件和文件夹,其中以 . 开头的就是隐藏文件。
要想知道命令有哪些选项可供选择,则可以输入 --help 选项来查看:
实际上,通过 --help 输出的内容是 man (manual 的缩写) 页的格式化输出,其中包含 Linux 命令和应用程序的文档。下图就是 man ls 这一命令的输出结果:
Filesystem interaction continued
在前面我们已经知晓了部分文件系统相关的命令。接下来将继续介绍几个关于文件系统的命令,它们主要围绕者 增加、删除、移动这些操作。
首先讲用于"增加"的命令:touch、mkdir
touch 命令用于创建一个新文件 ,mkdir 命令用于创建一个新文件夹。
然后是用于"移动"的命令:cp、mv
cp 命令用于复制一个文件或文件夹。cp 命令需要两个参数,第一个参数是已存在文件的名字,第二个参数希望在复制后为新文件指定的名字。
mv 命令也需要两个参数,并且它不是复制或创建一个新文件,而是合并或修改我们作为参数提供的第二个文件。我们可以使用该命令将文件移动到不同文件夹下,也可以对文件进行重命名。
移动文件
重命名文件
接下来就是"删除"命令:rm
想必大家或多或少都听过关于 rm -rf 的传奇故事,在此不过多赘述。它的使用示例:
实际上,通过上述图片可以发现,Linux 的文件系统默认是不显示文件扩展名的,这种情况下要推测文件用途和内容比较麻烦。因此我们需要一个命令来展示文件类型,这个命令就是 file:
上图中显示,当前目录下的 code 是一个文件夹类型。
Permissions
在使用 Linux 的过程中,我们会发现有时候某些用户无法访问一些文件或文件夹,这就是访问权限所导致的。
前面已经讲过命令的 flags 和 switches,在此我们可以使用ls -lh来查看关于当前目录下文件的更多内容。其中,-l 表示以长列表格式输出,-h 表示用便于人类阅读的形式展示:
在红圈圈起来的地方,有一串字符串。这串字符串声明了当前文件的访问权限:
- read,可读,由 r 表示
- write,可写,由 w 表示
- execute,可执行,由 x 表示
最前面的 d 表示这是个文件夹,如果是个文件则使用 " - " 来表示。总结来说,这一串字符串的含义如下图所示:
此处引入了 属主 和 属组 的概念。在 Linux 中,用户是按组来分类的,一个用户可以属于一个或多个组。简单来说,属主 就是该文件的拥有者,属组 就是 属主 所在的组。如果一个用户既不是属主,也不在属组内,那他就是其他用户。一个文件的 属主 和 属组 也显示在了 ls -lh 的输出结果中。
用一张图总结:
Switching between users
既然不同用户有不同访问权限,那么有时候可能就会通过切换到对应的用户来获得相应权限。用户切换要使用命令:su。
使用 su 命令时,需要事先知道:
- 我们要切换的用户的用户名
- 该用户的密码
su 命令也有许多 flags 和 switches 供使用。
Common directories
Linux 在根目录下有许许多多的文件夹,与 Windows 操作系统一样,它们各司其职。下面简要地介绍其中几个常见文件夹的用途。
- /etc 目录。该目录是 Linux 中重要的根目录之一,它是存储操作系统使用的系统文件的常用位置。需要重点介绍的就是该目录下的 passwd 和 shadow 文件,这两个文件展示了 Linux 如何使用 SHA512 的加密算法来存储每个用户的密码。
- /var 目录。"var" 是变量的缩写,该目录是 Linux 的主要根目录之一。该目录存储系统上运行的服务或应用程序经常访问与写入的数据。比如,服务和应用程序的日志文件会被写入该目录。
- /root目录。与 /home 目录不同,/root 是系统用户 root 的主目录。
- /tmp目录。"tmp" 是单词 "temporary" 的缩写,意为"临时"。该目录是 Linux 系统中一个独特的根目录,它是易失性的,如同电脑内存,一旦电脑重启,其中的内容就会被清除。因此该目录一般用于存储只需访问一两次的数据。由于该目录任何用户都能写入,所以在渗透测试中,一旦获取了访问机器的权限,就可以将脚本文件存于该目录下。
Linux Fundamentals Part 3
Text editors
之前对于文本编辑,我们只知道使用 echo 命令加 > / >> 操作符来将内容写入文件中。但是在处理多行文本和对文本内容进行排序时,这个方法就不能很有效地去处理了。因此,text editor (文本编辑器) 就有了用武之地。
Nano
Nano 非常容易上手,想使用 Nano 创建或编辑文件,只需要输入**nano + {filename}**即可。
使用 nano 后的页面
就如同 Windows 上的记事本,nano 的操作也很类似,且它还支持许多额外功能,都写在界面最底下。其中,^ 符号表示 Ctrl 键。因此假如我们想退出时,只需要按下 Ctrl + X 即可。
VIM
VIM 是一款更高级的文本编辑器。VIM 的优点有很多:
- 可定制化,可以根据自己需要修改键盘快捷键。
- 语法高亮,这对维护和编写代码很有用。
- VIM 可在所有终端上运行,nano 不行
- VIM 有许多教学资源可供学习和使用。
总而言之,VIM 可能难以入手,但熟悉后能极高地提升我们的 Linux 水平。
General/Useful utilities
Downloding files
计算机的一个基本功能就是传输文件,在 Linux 中,我们可以使用 wget 命令来借助 HTTP 协议从网页上下载文件,就如同在浏览器中访问文件一样。
假如我们知道一个资源所在的页面,那么我们就可以使用 **wget + {文件所在页面}**即可下载。
Transferring files from your host
Secure copy (SCP,安全复制) 是一种安全复制文件的方法。与普通的 cp 命令不同,scp 命令允许用户使用 SSH 协议在两台电脑间传输文件,并提供身份验证和加密功能。
SCP 能让我们从当前主机上将文件复制到远程服务器上,反过来也可以。
使用 SCP 时,我们需要知晓远程服务器的用户名和 IP 地址。假设当前远程服务器的 IP 地址为 192.168.1.30,用户名为 ubuntu。现在我们本地有个叫 important.txt 的文件,我们想把它传输到远程服务器上,并重命名为 transferred.txt。那么所写的命令如下:
scp important.txt ubuntu@192.168.1.30:/home/ubuntu/transferred.txt
总结就是 scp {要传输的文件名} {远程服务器用户名}@{远程服务器 IP 地址}:{文件传输后的路径}
Serving files from your host
Ubuntu 系统预装了 Python 3,而 Python 提供了一个名为 HTTPServer 的轻量级易用模块,该模块能使你的主机变为一个快速、简便的 Web 服务器。我们可以借助这个服务器来提供自己的文件,其他主机可以通过 curl 或 wget 命令来将这些文件下载到它们的机器上。
HTTPServer 只为当前的工作目录提供服务。在确定工作目录后,当该目录下输入 python3 -m http.server即可启动 Web 服务:
以上图为例,我在本地的 /home/wcy 路径下启动了一个小型的 Web 服务器。
这时其他主机就可以通过我们的 IP 地址下载文件(这里的其他主机我用的是另一个 terminal,所以后续的两个图片 IP 地址都是相同的):
可以看到本地主机也会返回出远程主机的访问记录:
HTTPServer 的缺点就在于,你必须事先知道要下载的文件的确切名称和位置才能获取。
Processes
进程是在机器上运行的程序,它们由内核管理,每个进程都有一个与之相关的 ID,叫做 PID。PID 会按照进程启动顺序递增。
Viewing processes
在 Linux 中,可以使用 ps 命令查看用户会话中正在运行的进程列表和一些其他信息,比如进程的状态代码、运行进程的会话、使用 CPU 的时间和正在执行的实际程序:
若要查看其他用户运行的进程 或不在会话中运行的进程 (比如系统进程),则需要使用 ps aux命令:
另一个有用的命令是 top。该命令可以提供系统上运行进程的实时统计数据,这些数据会每 10 秒刷新一次:
Managing processes
我们可以发送终止某个进程的命令,这个命令就是 kill命令。该命令有多种类型的终止信号可用于终止进程,具体选择取决于内核处理进程的"干净"程度。
简单介绍其中最常用的:
- SIGTERM,-15,杀死进程,但允许它先执行一些清理任务。
- SIGKILL,-9,杀死进程,但事后不做任何清理。
- SIGSTOP,-19,停止/暂停进程。
Getting processes/services to start on boot
对于有些应用程序我们希望它能在系统启动时启动,比如 Web 服务器、数据库服务器、文件传输服务器等。用于配置开机自启的命令为 systemctl 。它的格式为 systemctl {选项} {服务名}。
其中,比较常用的选项为如下四种:
- start,启动服务
- stop,停止服务
- enable,开机自启服务
- disable,关闭开机自启
Backgrounding & foregrounding
在 Linux 系统中,进程可以在两个状态下运行:后台和前台。
前面我们学到,可以使用 & 操作符使命令后台执行。除此之外,我们还可以使用 Ctrl + Z 把正在执行的命令进行"暂停"并丢到后台。
而不管是使用了 & 操作符还是使用 Ctrl + Z 将进程置于后台后,我们都可以使用 fg命令使居于后台的进程置于前台执行:
Maintaining your system
Automation
用户可能会希望在某段时间内,系统会自动执行安排的某项操作或任务,比如运行命令、备份数据或启动程序等。
这个可以通过 crontab来实现。Crontab 是系统启动时会自动启动的进程之一,负责管理 cron 作业。
图上的 crontab 是一个特殊文件,其格式会被 cron 进程识别,以逐步执行每一行。Crontab 有 6 个设定值:
- MIN,在哪分钟执行
- HOUR,在哪小时执行
- DOM,在每月哪一天执行
- MON,在每年哪一月执行
- DOW,在每周哪一天执行
- CMD,要执行的命令
写在 crontab 文件中的指令格式如下图所示:
我们可以使用 crontab -e来编辑 crontab 文件,编辑完内容后保存,crontab 就创建了一个定时任务。
如上图所示,我们添加了一个每 12 小时执行一次的定时任务,它用于备份文件。
Package management
当开发者希望向社区提交软件时,他们会将其提交到 "apt 软件仓库"。如果获得批准,他们的程序和工具就会被广泛发布。
我们可以通过 ls 命令查看到当前操作系统的软件源。虽然操作系统供应商会维护自己的软件源,但我们也可以添加社区软件源。添加软件源需要依靠命令 add-apt-repository来实现。
除了使用命令添加软件源外,还可以通过手动来添加/删除软件源。虽然安装软件可以通过软件包安装程序(如 dpkg)完成,但 apt 的好处在于:当我们更新系统时,我们添加的软件的软件源也会被检查更新。
下面是将 Sublime Text 添加到 Ubuntu 机器上的软件源的手动操作步骤:
- 为 Sublime Text 3 的开发人员添加 GPG 密钥并使用 apt-key 信任它。GPG (Gnu privacy guard) 密钥可以保证下载内容的完整性,这些密钥本质上是安全检查,表示这是由开发人员做出来的软件。假如密钥和系统信任的密钥或者和开发人员使用的密钥不一致,则软件无法下载。命令如下:wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add -
- 现在我们将密钥添加到了可信列表中,可以把 Sublime Text 3 的软件源添加到 apt 源列表中了。推荐为每个添加的第三方软件源都建立一个单独的文件:
- 在新创建的文件中添加 Sublime Text 3 的仓库地址:
- 添加完成后,就可以使用 apt-update 命令进行更新。更新完成后,就可以使用 apt install sublime-text安装该软件了。
移除软件源就比较简单了,用命令添加的可以使用 apt-repository --remove ppa:{PPA_Name}/ppa 命令移除;手动添加的只需删除前面步骤中第 2 步创建的文件即可。删除后,要使用 **apt remove {软件名}**来移除程序。
Logs
在前面我们知道 Linux 日志一般位于 /var/log 目录下,该目录包含了系统上运行的应用程序和服务的日志信息。
在日志目录下,我们需要重要关注的是 Web 服务器日志、登录失败的日志、防火墙日志等重要日志。如下图所示,就需要关注 Apache 日志、fail2ban (用于监控暴力尝试) 日志和用作防火墙的 UFW 服务日志。
这些服务和日志是监控系统健康状况和保护系统的好帮手。像 Web 服务器等服务的日志还会包含每个请求的相关信息,这使得开发人员或管理员可以诊断性能问题或调查入侵者活动。以上图中 Apache 服务器日志为例,我们需要重点关注 access log 和 error log:
当然,除了 Web 服务器日志以外,也有一些日志会存储有关操作系统如何运行以及用户执行的操作(比如身份验证尝试)的信息。