TryHackMe 第4天 | Pre Security (三)

该学习路径讲解了网络安全入门的必备技术知识,比如计算机网络、网络协议、Linux命令、Windows设置等内容。过去两篇已经对计算机网络和网络协议进行了简单介绍,本篇博客将记录 Linux命令部分。

Linux 系统的优点就是其轻量级,有些 Linux 系统为了达到更加轻量级的目的甚至没有 GUI (Graphical user interface,用户图形界面) 或者 桌面环境。因此与这种系统交互绝大一部分通过 Terminal (终端) 完成。

终端就是一个黑框框,和 Windows 上的 CMD 很像。

先介绍两个最基本的两个命令:echowhoami

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 命令时,需要事先知道:

  1. 我们要切换的用户的用户名
  2. 该用户的密码

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 机器上的软件源的手动操作步骤:

  1. 为 Sublime Text 3 的开发人员添加 GPG 密钥并使用 apt-key 信任它。GPG (Gnu privacy guard) 密钥可以保证下载内容的完整性,这些密钥本质上是安全检查,表示这是由开发人员做出来的软件。假如密钥和系统信任的密钥或者和开发人员使用的密钥不一致,则软件无法下载。命令如下:wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add -
  2. 现在我们将密钥添加到了可信列表中,可以把 Sublime Text 3 的软件源添加到 apt 源列表中了。推荐为每个添加的第三方软件源都建立一个单独的文件:
  3. 在新创建的文件中添加 Sublime Text 3 的仓库地址:
  4. 添加完成后,就可以使用 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 服务器日志以外,也有一些日志会存储有关操作系统如何运行以及用户执行的操作(比如身份验证尝试)的信息。

相关推荐
用户962377954483 小时前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机6 小时前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机6 小时前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954488 小时前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star8 小时前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户9623779544811 小时前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher2 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行5 天前
网络安全总结
安全·web安全
red1giant_star5 天前
手把手教你用Vulhub复现ecshop collection_list-sqli漏洞(附完整POC)
安全
ZeroNews内网穿透5 天前
谷歌封杀OpenClaw背后:本地部署或是出路
运维·服务器·数据库·安全