开始学习基础知识
GETTING STARTED WITH THE BASICS
从本质上而言,黑客就是行动者。我们想要触摸和玩弄一些东西,我们也希望创造并且有时可能会破坏一些事物。在我们能够做我们最喜欢的事情之前,我们中很少有人想要阅读信息技术理论的长篇大论:黑客攻击。考虑到这一点,本章旨在为您提供一些基本技能,帮助您在 Kali 中启动和运行。现在!
在本章中,我们不会详细介绍任何一个概念 - 我们将覆盖足够的内容,让您在黑客的操作系统中进行游戏和探索:Linux。我们将为后面的章节保存更深入的讨论。
介绍术语和概念
在开始我们的黑客 Linux 基础知识奇妙世界之旅之前,我想介绍几个术语,这些术语应该澄清本章后面讨论的一些概念。
二进制文件此术语是指可以执行的文件,类似于 Windows 中的可执行文件。 二进制文件通常位于/usr/bin 或 usr/sbin 目录中,包括 ps,cat,ls 和 cd 等实用程序(我们将在本章中介绍所有四个)以及无线应用程序黑客工具 aircrackng 和入侵检测系统(IDS)Snort。
区分大小写与 Windows 不同,Linux 区分大小写。 这意味着Desktop与desktop不同,与DeskTop不同。 其中每个都代表不同的文件或目录名称。许多来自 Windows 环境的人都会发现这令人沮丧。 如果您收到错误消息“找不到文件或目录”(“file or directory not found”),并且您确定文件或目录存在,则可能需要检查您的大小写。
目录这与 Windows 中的文件夹相同。目录提供了一种组织文件的方式,通常是采用分层方法。
Home每个用户都有自己的/ home 目录,这通常是默认情况下保存您创建的文件的位置。
Kali Linux是专为渗透测试而设计的 Linux 发行版。它预装了数百种工具,可以节省您自己下载和安装它们所需的时间。在撰写本文时,我将使用最新版本的 Kali:Kali 2018.2,于 2018 年 4 月首次发布。
root与几乎所有操作系统一样,Linux 拥有管理员或超级用户帐户,专为可以在系统上执行任何操作的受信任人员使用而设计。这包括重新配置系统,添加用户和更改密码等内容。在 Linux 中,该帐户称为 root。作为黑客或测试者,您通常会使用 root 帐户来控制系统。实际上,许多黑客工具都要求您使用 root 帐户。
脚本这是在解释环境中运行的一系列命令,可将每行转换为源代码。许多黑客工具都是简单的脚本。 脚本可以使用 bash 解释器或任何其他脚本语言解释器运行,例如 Python,Perl 或 Ruby。Python 是目前黑客中最受欢迎的解释器。
Shell这是一个在 Linux 中运行命令的环境和解释器。最广泛使用的 shell 是 bash,它代表 Bourneagain shell,但其他流行的 shell 包括 C shell 和 Z shell。我将在本书中专门使用 bash shell。
终端(Terminal)这是命令行界面(CLI)。
有了这些基础知识,我们将尝试有条不紊地强化成为黑客或渗透测试人员所需的基本 Linux 技能。在第一章中,我将引导您开始使用 Kali Linux。
KALI 之旅
一旦你启动 Kali,你就会看到一个登录界面,如图 1-1 所示。使用root帐户用户名root和默认密码toor登录。
图 11: 使用 root 帐户登录 Kali
您现在应该可以访问您的 Kali 桌面(参见图 1-2)。 我们将快速查看桌面的两个最基本的方面:终端接口和文件结构。
图 12: Kali 桌面
终端
使用 Kali 的第一步是打开终端,这是我们将在本书中使用的命令行界面。在 Kali Linux 中,您将在桌面底部找到终端的图标。双击此图标以打开终端或CTRLALTT。您的新终端应如图 1-3 所示。
图 13: Kali 终端
此终端打开命令行环境(称为 shell),使您可以在底层操作系统上运行命令并编写脚本。虽然 Linux 有许多不同的 shell 环境,但最受欢迎的是bash shell,它也是 Kali 和许多其他 Linux 发行版中的默认 shell。
要更改密码,可以使用命令passwd。
Linux 文件系统
Linux 文件系统结构与 Windows 有些不同。Linux 在文件系统的基础上没有物理驱动器(例如 C:驱动器),而是使用逻辑文件系统。在文件系统结构的最顶层是/,它通常被称为文件系统的根,就好像它是一个倒置树(见图 1-4)。请记住,这与 root 用户不同。这些术语起初可能看起来令人困惑,但是一旦习惯了 Linux,它们就会变得更容易区分。
图 14: Linux 文件系统
文件系统的根(/)位于文件系统目录树的顶部,以下是要了解的最重要的子目录:
/root root 用户的主目录
/etc 通常包含 Linux 配置文件 - 控制程序启动时间和方式的文件
/home 用户的主目录
/mnt 将其他文件系统附加或安装到文件系统的位置
/media CD 和 USB 设备通常连接或安装到文件系统的位置
/bin 其中包含应用程序二进制文件(相当于 Microsoft Windows 中的可执行文件)
/lib lib 库文件(与 Windows DLL 类似的共享程序)
在本书中,我们将花更多时间在这些关键目录上。了解这些一级目录对于从命令行导航文件系统非常重要。
在开始之前,知道在执行例行任务时不应该以 root 用户身份登录也很重要,因为当你以 root 身份登录时,任何攻击你的系统的人(是的,黑客有时会被黑客入侵)会立即获得 root 权限,从而“拥有”你的系统。在启动常规应用程序,浏览 Web,运行 Wireshark 等工具时以常规用户身份登录。
LINUX 基本命令
首先,让我们看看一些基本命令,它们将帮助您在 Linux 中启动和运行。
用 pwd 查看当前目录
与在 Windows 或 macOS 等图形用户界面(GUI)环境中工作的情况不同,Linux 中的命令行并不总是能够明确显示您当前所在的目录。要导航到新目录,通常需要知道你现在的位置。显示当前工作目录使用命令pwd。
在目录结构中的位置输入pwd。在您的终端输入密码以查看您的所在目录位置:
kali\>pwd
/root
在这种情况下,Linux 返回/root,告诉我当前在 root 用户的目录中。并且因为您在启动 Linux 时以 root 用户身份登录,所以您也应该位于 root 用户的目录中,该目录位于文件系统结构顶部(/)的一级目录。
如果您在另一个目录中,pwd 将返回该目录名称。
使用 whoami 查看登录用户
在 Linux 中,超级用户或系统管理员名为 root,它具有添加用户、更改密码、更改权限等所需的所有系统权限。显然,您不希望任何人有能力进行此类更改;您希望有人可以信任并且对操作系统有正确的了解。作为黑客,您通常需要拥有所有这些权限来运行您需要的程序和命令(除非您拥有 root 权限,否则许多黑客工具将无法运行),因此您需要以 root 用户身份登录。
如果您忘记了以 root 用户身份还是以其他用户身份登录,则可以使用whoami命令查看您登录的用户:
kali\>whoami
root
如果我以其他用户身份登录,例如我的个人帐户,那么 whoami 会返回我的用户名,如下所示:
kali \>whoami
OTW
浏览 Linux 文件系统
从终端导航到文件系统是一项重要的 Linux 技能。要完成任何工作,您需要能够寻找位于其他目录中的应用程序、文件和目录。在基于 GUI 的系统中,您可以直观地看到目录,但是当您使用命令行界面时,结构完全基于文本,导航文件系统意味着使用某些命令。
使用 cd 更改目录
要从终端更改目录,请使用更改目录命令cd。例如,以下是如何进入用于存储配置文件的 /etc
目录:
kali \>cd /etc
root\@kali:/etc\#
提示符更改为root \@ kali:/ etc,表示我们位于/ etc 目录中。我们可以通过输入pwd来确认:
root\@kali:/etc\# pwd
/etc
要在文件结构中向上移动一级(朝向文件结构的根目录,或 /
),我们使用 cd 后跟双点(..),如下所示:
root\@kali:/etc\# cd ..
root\@kali:/\# pwd
/
root\@kali:/\#
这会将我们从 /etc
升级到 /root
目录,但您可以根据需要向上移动多个级别。只需使用相同数量的双点对(..)作为要移动的级别数:
你会使用 .. 向上移动一级。 你会使用 .. .. 向上移动两级目录。 您可以使用 .. .. .. 向上移动三级,依此类推。 因此,例如要向上移动两级目录,请输入 cd,然后输入两组双点,其间有空格:
kali \>cd .. ..
您还可以通过输入 cd /
,从任何地方升级到文件结构中的根级别,其中 /
表示文件系统的根目录。
使用 ls 列出目录的内容
要查看目录(文件和子目录)的内容,我们可以使用ls(list)命令。这与 Windows 中的 dir 命令非常相似。
kali \>ls
bin initrd.img media run var
boot initrd.img.old mnt sbin vmlinuz
dev lib opt srv vmlinuz.old
etc lib64 proc tmp
home lost+found root usr
此命令列出目录中包含的文件和目录。您也可以在任何特定目录上使用此命令,而不仅仅是您当前所在的目录,方法是在命令后列出目录名称,例如,ls /etc显示/etc 目录中的内容。
要获取有关文件和目录的更多信息,例如它们的权限、所有者、大小以及上次修改它们的时间,可以在ls之后添加-l参数(l 代表 long)。这通常被称为长列表。我们来试试吧:
如您所见,ls -l为我们提供了更多信息,例如对象是文件还是目录、链接数、所有者、组、大小、创建或修改时的时间及其名称。
我通常在 Linux 中进行列出文件列表时添加-l 参数,但是每个参数都需要自己添加。我们将在第 5 章中详细讨论ls -l。
Linux 中的某些文件是隐藏的,不会通过简单的ls或ls -l命令显示。要显示隐藏文件,请添加小写-a参数,如下所示:
kali \>ls -la
如果平时(使用ls)你没有看到你期望看到的文件,那么值得尝试使用 ls 加上 –a 参数。
获取帮助
几乎每个命令,应用程序或实用程序都在 Linux 中有一个专用的帮助文件,为其使用提供指导。例如,如果我需要使用最好的无线破解工具 aircrackng 的帮助,我只需输入 aircrack-ng 命令,然后输入 - help 命令:
kali \>aircrack-ng - help
请注意这里的双破折号( - )。Linux 中的约定是在单词类选项参数之前使用双短划线( - ),例如帮助,在单字母选项参数之前使用单个短划线( - ),例如-h。
输入此命令时,您应该看到该工具的简短描述以及如何使用它的指导。在某些情况下,您可以使用-h 或 -? 转到帮助文件例如,如果我在使用黑客最好的端口扫描工具 nmap 时需要帮助,我将输入以下内容:
kali \>nmap -h
不幸的是,虽然许多应用程序支持所有三个选项( - help,-h 和 -?),但无法保证您正在使用的应用程序。因此,如果其中一个选项不起作用,请尝试另一个。
使用 man 引用手册页
除了帮助信息之外,大多数命令和应用程序都有一个手册(man)页面,其中包含更多信息,例如命令或应用程序的描述和概要。只需在命令、实用程序或应用程序之前键入man即可查看手册页。例如,要查看 aircrackng 的手册页,请输入以下内容:
这将打开 aircrackng 手册,为您提供比帮助信息更详细的信息。您可以使用ENTER键滚动浏览此手册文件,也可以分别使用 PG DN 和 PG UP 键向上和向下翻页。要退出,只需输入q(退出),然后返回命令提示符。
搜索查找
在你熟悉 Linux 之前,找到自己的方法会很令人沮丧,但是对一些基本命令和技术的了解将大大有助于使命令行更加友好。以下命令可帮助您从终端查找内容。
使用 locate 搜索
可能最容易使用的命令是locate。接下来是一个关键字,表示您想要查找的内容,此命令将遍历整个文件系统并找到该单词的每个匹配项。
例如,要查找 aircrackng,请输入以下内容:
kali \>locate aircrack-ng
/usr/bin/aircrackng
/usr/share/applications/kaliaircrackng.desktop
/usr/share/desktopdirectories/05101aircrackng.directory
snip
/var/lib/dpkg/info/aircrackng.mg5sums
但是,locate 命令并不完美。有时,定位的结果可能是压倒性的,给你太多的信息。此外,locate使用的数据库通常每天只更新一次,因此如果您刚刚在几分钟或几小时前创建了一个文件,它可能会在第二天才显示在此列表中。了解这些基本命令的缺点,以便您可以更好地决定何时最好使用每个命令。
用 whereis 查找二进制文件
如果您要查找二进制文件,可以使用whereis命令找到它。此命令不仅返回二进制文件的位置,还返回其源和手册页(如果可用)。以下是一个例子:
kali \>whereis aircrack-ng
aircarckng: /usr/bin/aircarckng /usr/share/man/man1/aircarckng.1.gz
在这种情况下,whereis只返回 aircrackng 二进制文件和手册页,而不是每次出现 aircrackng 这个词。 更有效率和更有启发性,你不觉得吗?
用 which 在 PATH 变量中查找二进制文件
which命令更具体:它只返回 Linux 中 PATH 变量中二进制文件的位置。我们将在第 7 章中更仔细地查看 PATH 变量,但是现在知道 PATH 保存操作系统查找在命令行执行的命令的目录就足够了。例如,当我在命令行上输入 aircrack-ng 时,操作系统会查看 PATH 变量以查看它应该在哪些目录中查找 aircrackng:
kali \>which aircrack-ng
/usr/bin/aircrackng
在这里,它能够在 PATH 变量中列出的目录中找到单个二进制文件。 至少,这些目录通常包含 /usr/bin
,但可能包括/usr/sbin 以及其他一些目录。
使用 find 执行更强大的搜索
find 命令是搜索实用程序中功能最强大且最灵活的。它能够在任何指定的目录中开始搜索,并查找许多不同的参数,当然包括文件名,还包括创建或修改的日期,所有者,组,权限和大小。
这是 find 的基本语法:
find _directory options expression_
因此,如果我想在根目录中搜索一个名为 apache2(开放源码 web 服务器)的文件,我将输入以下命令:
kali \>find /➊ -type f➋ -name apache2➌
首先,➊ 是说明了开始搜索的目录,在这种情况下是 /。然后 ➋ 我指定要搜索的文件类型,在本例中为 f 表示普通文件。最后,➌ 我给出了我正在搜索的文件的名称,在本例中为 apache2。
此搜索的结果如下所示:
kali \>find / -type f -name apache2
/usr/lib/apache2/mpmitk/apache2
/usr/lib/apache2/mpmevent/apache2
/usr/lib/apache2/mpmworker/apache2
/usr/lib/apache2/mpmprefork/apache2
/etc/cron.daily/apache2
etc/logrotate.d/apache2
/etc/init.d/apache2
/etc/default/apache2
find 命令从文件系统(/)的顶部开始,遍历每个目录,在文件名中查找 apache2,然后列出找到的所有实例。
正如您可能想象的那样,在每个目录中查找的搜索可能很慢。加快速度的一种方法是只查看您希望找到所需文件的所在目录。在这种情况下,比如我们正在寻找配置文件,因此我们可以在/etc 目录中开始搜索,而 Linux 只会搜索其子目录。我们来试试吧:
kali \>find /etc -type f -name apache2
/etc/init.d/apache2
/etc/logrotate.d/apache2
/etc/cron.daily/apache2
这个更快的搜索只在/etc 目录及其子目录中发现了 apache2 的出现。同样重要的是,要注意与其他一些搜索命令不同,find 只显示确切的名称匹配。如果文件 apache2 有扩展名,例如 apache2.conf,则搜索找不到匹配项。我们可以通过使用通配符来解决此限制,这使我们能够匹配多个字符。通配符有几种不同的形式:*. , ? 和 [] 。
让我们在/etc 目录中查看以 apache2 开头并具有任何扩展名的所有文件。为此,我们可以使用以下通配符编写 find 命令:
kali \>find /etc -type f - name apache2.\*
/etc/apache2/apache2.conf
当我们运行此命令时,我们发现/etc 目录中有一个文件符合apache2.*模式。当我们使用一个点后跟*通配符时,终端会在文件名 apache2 之后查找任何扩展名。这对于查找您不知道文件扩展名的文件非常有用。
当我运行此命令时,我在/etc 目录中找到两个以 apache2 开头的文件,包括 apache2.conf 文件。
用 grep 过滤
通常在使用命令行时,您需要搜索特定关键字。 为此,您可以使用grep命令作为过滤器来搜索关键字。
当输出从一个命令传送到另一个命令时,通常使用grep命令。我在第 2 章介绍了管道,但是现在,只要说 Linux(和 Windows 就此问题)允许我们获取一个命令的输出并将其作为输入发送到另一个命令就足够了。这叫做管道,我们使用 \|
命令符号执行此操作(|键通常位于键盘上的 ENTER 键上方)。
ps命令用于显示有关计算机上运行的进程的信息。我们将在第 6 章中更详细地介绍这一点,但是对于这个示例,假设我想看到我的 Linux 系统上运行的所有进程。在这种情况下,我可以使用ps(进程)命令,然后使用aux参数来指定要显示的进程信息,如下所示:
kali \>ps aux
这为我提供了在这个系统中运行的所有进程的列表 - 但是如果我只是想找到一个进程来查看它是否正在运行呢?
我可以通过将ps的输出信息,管道输出到grep并搜索关键字来完成此操作。例如,要查明 apache2 服务是否正在运行,我将输入以下内容。
kali \>ps aux \| grep apache2
root 4851 0.2 0.7 37548 7668 ? Ss 10:14 0:00 /usr/sbin/apache2 k start
root 4906 0.0 0.4 37572 4228 ? S 10:14 0:00 /usr/sbin/apache2 k start
root 4910 0.0 0.4 37572 4228 ? Ss 10:14 0:00 /usr/sbin/apache2 k start
snip
此命令告诉 Linux 显示我的所有服务,然后将该输出发送到grep,后者将查看关键字 apache2 的输出,然后仅显示 apache2 相关的输出,从而为我节省了大量时间和视力。
修改文件和目录
找到文件和目录后,您将希望能够对它们执行操作。在本节中,我们将介绍如何创建文件和目录,复制文件,重命名文件以及删除文件和目录。
创建文件
有许多方法可以在 Linux 中创建文件,但是现在我们只看两个简单的方法。第一个是cat,它是连接(concatenate)的缩写,意思是将各个部分组合在一起(不是你最喜欢的驯养猫科动物 cat)。cat命令通常用于显示文件的内容,但也可用于创建小文件。要创建更大的文件,最好在文本编辑器(如 vim,emacs,leafpad,gedit 或 kate)中输入代码,然后将其另存为文件。
使用 cat 连接
cat 命令后跟一个文件名将显示该文件的内容,但是为了创建一个文件,我们遵循带有重定向的 cat 命令,用 > 符号表示,以及我们想要创建的文件的名称。以下是一个例子:
kali\> cat \> hackingskills
Hacking is the most valuable skill set of the 21st century!
当您按ENTER键时,Linux 将进入交互模式并等待您开始输入该文件的内容。这可能令人费解,因为提示符( kali \>
)消失了,但只要你开始打字,无论你输入什么都将写入文件内(在这种情况下,输入 hackingskills)。在这里,我键入“Hacking is the most valuable skill set of the 21st century!”。
要退出并返回提示,请按CTRLD。然后,当我想查看文件 hackingskills 中的内容时,我输入以下内容:
kali\> cat hackingskills
Hacking is the most valuable skill set of the 21st century!
如果您不使用重定向符号,Linux 将直接在终端打印出文件的内容。要向文件添加或附加更多内容,可以使用带有双重定向(>>)的cat命令,然后使用要添加到文件末尾的任何内容。以下是一个例子:
kali\> cat \>\> hackingskills
Everyone should learn hacking
Linux 再次进入人机交互模式,等待输入内容附加到文件。当我键入“Everyone should learn hacking”并按CTRLD,我回到了终端提示符。现在,当我用 cat 显示该文件的内容时,我可以看到该文件已经附加了内容“Everyone should learn hacking”,如下所示:
kali \> cat hackingskills
Hacking is the most valuable skill set of the 21st century! Everyone should
learn hacking
如果我想用新内容信息覆盖文件,我可以简单地再次使用cat命令和一个重定向符号(>),如下所示:
kali \> cat \> hackingskills
Everyone in IT security without hacking skills is in the dark
kali \> cat hackingskills
Everyone in IT security without hacking skills is in the dark
命令的含义如下:
cat \> hackingskills \#
是打开或创建一个文件并(以人机交互模式)写入内容
cat hackingskills \#
在控制台终端上打印查看文件内容
正如您在此处看到的,Linux 进入交互模式,然后输入新文本然后退回到提示符。当我再次使用cat来查看文件的内容时,我发现我之前的单词已被最新文本覆盖。
用 touch 创建文件
文件创建的第二个命令是touch。此命令最初开发是用来用户只需 touch 文件即可更改其某些详细信息,例如创建或修改日期。但是,如果该文件尚不存在,则此命令默认情况下会创建该文件。
让我们用touch创建一个文件名为 newfile:
kali \>touch newfile
现在,当我使用ls -l查看目录的长列表时,我看到已经创建了一个名为newfile的新文件。 请注意,它的大小为 0,因为newfile中没有内容。
创建目录
在 Linux 中创建目录的命令是mkdir,它是创建目录(make directory)的缩写。要创建名为 newdirectory 的目录,请输入以下命令:
kali \>mkdir newdirectory
要导航进入到这个新创建的目录下,只需输入:
kali \>cd newdirectory
复制文件
要复制文件,我们使用cp命令。这会在新的目录位置创建文件的副本,并保留旧文件。
在这里,我们将使用touch在根目录中创建一个文件 oldfile,并将其复制到/root/newdirectory,在进程中重命名并保留原始 oldfile:
kali \>touch oldfile
kali \>cp oldfile /root/newdirectory/newfile
重命名文件是可选的,只需将您想要的名称添加到目录路径的末尾即可。如果在复制文件时不重命名该文件,则默认情况下该文件将保留原始名称。
当我们导航进入到 newdirectory 下时,我们看到有一个名为 newfile 的 oldfile 的精确副本:
kali \>cd newdirectory
kali \>ls
newfile oldfile
重命名文件
不幸的是,Linux 没有专门用于重命名文件的命令(如 Windows 和其他一些操作系统那样),但它确实有 mv(move)命令。
mv 命令可用于将文件或目录移动到新的目录位置,或者只是为现有文件指定一个新名称(重命名)。要将 newfile 重命名为 newfile2,请输入以下内容:
kali \>mv newfile newfile2
kali \>ls
oldfile newfile2
现在当您列出(ls)该目录时,您会看到 newfile2 而不是 newfile,因为它已被重命名。你可以对目录做同样的事情。
删除文件
要删除文件,只需使用rm命令,如下所示:
kali \>rm newfile2
如果您现在在目录上执行长列表的ls命令,则可以确认该文件已被删除。
删除目录
删除目录的命令类似于删除文件的rm命令,但附加了dir(用于目录),如下所示:
kali \>rmdir newdirectory
rmdir:failed to remove 'newdirectory': Directory not empty
重要的是要注意rmdir不会删除非空的目录,但会给你一条警告信息“目录不为空”(Directory not empty),如本例所示。在删除目录之前,必须先删除该目录下的所有内容。这是为了阻止您意外删除您不想删除的对象文件。
如果你想一次性删除一个目录及其下的内容,你可以在rm之后使用-r参数,如下所示:
kali \>rm -r newdirectory
但需要注意的是:要小心使用-r选项和rm,至少在开始时,因为错误地删除有价值的文件和目录非常容易。例如,在主目录(/)中使用rm -r会删除那里的每一个文件和目录 – 这不是你想要的致命性的动作。
现在开始!
现在您已经掌握了一些在文件系统中导航切换的基本技能,您可以在进行(黑客游戏)之前稍微使用 Linux 系统。使用终端的最佳方法是立即尝试使用新发现的技能。在随后的章节中,我们将深入探讨我们的黑客游戏。