Leviathan 闯关详解

本文是对 OverTheWire 的 Leviathan 系列的闯关的笔记,主要包括1-N关。

简单介绍一下闯关流程,首先使用 Level 0 的用户名和密码使用 ssh 进行访问,端口号均为 2223,接着登录成功后访问目录去寻找密码,密码均存储在 /etc/leviathan_pass 下。

leviathan 0

# 连接指令
ssh leviathan0@leviathan.labs.overthewire.org -p 2223
# 密码
leviathan0

该关卡进来之后,我们在用户目录下,首先查询利用 ls 当前目录下的内容,结果并没有文件,变去访问 /etc/leviathan_pass 结果发现不能直接查看密码(后来才意识到,如果可以这样查看的话,该题目就没意义了)。于是使用 find 指令进行简单查询(使用 ls -a 也可以),发现存在以下文件。

leviathan0-1

于是访问该文件,尝试查询 password,使用 cat 指令访问文件,并使用通道将输出送入 grep 指令中进行查询,最终获取密码。

leviathan0-2

leviathan 1

# 连接指令
ssh leviathan1@leviathan.labs.overthewire.org -p 2223
# 密码
PPIfmI1qsA

该关卡同样首先查询当前目录下面的文件,发现一个可执行文件 check,于是乎执行发现,它要求我们输入 password,于是随手尝试输入了 123,回显为 Wrong password, Good Bye …,于是便明白我们需要猜中,或者说通过某种手段找到密码。后面的内容我就不会了,于是参考了网上其他人的博客,发现主要有两种方法,首先第一种方法就是逆向,这方面需要使用 gdb 进行调试,就不太会了,简单看了下 [gdb 的指令][https://visualgdb.com/gdbreference/commands/],决定用反汇编进行查看。首先使用 gdb check 开始对文件的分析,进入 gdb 之后,使用命令 disassemble main 对主函数进行反汇编,发现以下内容。

leviathan1-1

但是弄了半天不知道怎么查看(基础太差了,于是乎又发现了另一个工具 ltrace),接着发现了密码。

leviathan1-2

另一种方法是我看到的一个博客用这个图解的,我感觉这个就是撞运气了哈哈哈。

leviathan1-3

破解之后呢,我们使用 whoami 指令发现我们权限提升为 leviathan2,因此我们可以直接访问 /etc/leviathan_pass/leviathan2 就可以获得密码。

leviathan1-4

leviathan 2

# 连接指令
ssh leviathan2@leviathan.labs.overthewire.org -p 2223
# 密码
mEh5PNl10e

同之前的关卡相同,需要分析当前文件目录下的文件,这里使用指令 ls -a 发现有一个可执行文件 printfile,接着使用同样的分析方法,我们需要知道该程序的流程。根据文件名我们猜测它应该和 cat 指令相同,会读取文件内容并打印,因此执行之后,我们尝试读取 /etc/leviathan_pass/leviathan3 结果发现并不可取,因此就需要进一步了解内部细节,应该是和权限管理相关。

leviathan2-1

这时就需要使用命令 ls -l 来查看相关权限,这里我们发现其权限如下,因此我们为了追踪该程序,我们需要先创建一个简单的文件进行读取访问,进而进行 ltrace 追踪。于是乎自己想到需要绕过这个 access 权限检测的函数,想着就是如何通过阅读一个用户 2 权限的文件,但是能读取用户 3 权限的文件呢,这里我就不知道怎么做了,于是乎只能在查看别人的方法。

leviathan2-2

leviathan2-3

这里的方法主要利用的是两点,cat 指令处理空格命名的问题ln 软连接。(1)首先 cat 指令在处理包含空格的文件名时,可能会将其作为两个文件进行读取,举例来说,当我们存在一个文件名为 test.txt file.txt 的文件,当我们使用 cat test.txt file.txt 指令时,执行的是读取 file.txt 和 test.txt 两个文件,而要读取我们创建的文件,我们就需要使用 cat test.txt\ file.txt 指令。(2)ln 软连接就是建立所谓的快捷方式。

因此我们如何进行利用呢?根本目的就是既要绕过 access 函数的检测也要让 cat 指令能够访问到我们所需的文件内容,这就要求我们输入的参数(也就是文件名)必须首先是 leviathan2 的权限,进而在文件名上作处理(添加空格)使其利用到 cat 指令处理空格的问题。下面是具体操作过程。

leviathan2-4

leviathan 3

# 连接指令
ssh leviathan3@leviathan.labs.overthewire.org -p 2223
# 密码
Q0G8j4sakn

这关和 leviathan 1 关卡相同,同样使用 ltrace 进行追踪,进而找到 password,下面直接附图。

leviathan3-1

leviathan3-2

leviathan 4

# 连接指令
ssh leviathan4@leviathan.labs.overthewire.org -p 2223
# 密码
AgvropI4OA

该关卡没有什么特殊的地方,首先我们能够看到有一个 ./trash 隐藏文件夹,进入之后有一个 bin 二进制可执行文件,尝试执行后发现,输出了一系列 01 代码,由此猜测他可能蕴含什么含义或者就是密码,因此尝试解码,这里可以使用[网站][https://coding.tools/cn/binary-to-text]。解码完成发现密码。

leviathan4-1

leviathan 5

# 连接指令
ssh leviathan5@leviathan.labs.overthewire.org -p 2223
# 密码
EKKlTF1Xqs

该关卡也比较简单,同样使用软连接即可。首先 ltrace 追踪一下流程,发现它会读取并打开 /tmp/file.log 文件,因此我们只需要将我们所需的 /etc/leviathan_pass/leviathan5 连接到 file.log 即可。

leviathan5-1

leviathan 6

# 连接指令
ssh leviathan6@leviathan.labs.overthewire.org -p 2223
# 密码
YZ55XPVk2l

该关卡同样要求我们输入与其相匹配,这里要求我们输入一个 4 位的十进制数字,在 ltrace 之后并没有什么能取的,所以准备直接上爆破(不知道是不是太粗鲁了,哈哈哈)。

leviathan6-1

爆破这里我使用 python 代码运行,代码如下:

import os
for i in range(10000):
i = str(i).zfill(4) # 填充到 4 位数字
print(i)
os.system(r"~/leviathan6 " + i)

当运行到 7123 时,程序停止,并进入终端。同样查看当前用户为 leviathan7,直接使用 cat 指令即可。

leviathan6-2

leviathan 7

# 连接指令
ssh leviathan7@leviathan.labs.overthewire.org -p 2223
# 密码
8GpZ5f8Hze

进入之后发现只有一个 CONGRATULATIONS,因此该系列到此为止啦。

总结

这个系列是对 Linux 上的文件权限的初步认识,对于文件的所有者和组有一定的认识,此外就是对 Linux 下常用的一些命令的了解,例如 cat、ln、ltrace 以及 gdb。总体来说整个系列中 最关键的就是 leviathan 1-3 关,能够很好的帮助理解 ln 链接欺骗和代码注入两个常用套路。

1: