如何通过Linux xxd命令进行提权

2019-08-16 123037人围观 ,发现 4 个不明物体 系统安全

本文将为大家介绍另一个可用于提权的Linux命令,即“xxd”。xxd命令的作用是将给定的标准输入或者文件,做一次十六进制的输出,反之它也可以将十六进制的输出转换为原来的二进制格式。

注:发布“Linux for Pentester”系列文章的主要目的,是为了向渗透测试人员介绍有关在解决CTF挑战或基于Linux提权的OSCP labs时可能遇到的情况和问题。而不是为了在这里对任何网络或系统管理员,提供程序/文件等高权限的错误配置行为进行批评。

xxd 介绍

我们知道如果想要将某个文件转换成另一种格式,我们可以通过使用一些在线的转换工具,它可以帮助我们将一个文件转换成几乎任何我们所需的文件格式,例如:“pdf to word,jpg to pdf,excel to pdf“等等。但如果有人想要将任意文件转换为十六进制或二进制形式,那又该怎么办呢?

其实这很简单,在Linux上我们可以通过xxd这个命令来做到这一点。xxd命令可以为给定的标准输入或者文件做一次十六进制的输出,它也可以将十六进制输出转换为原来的二进制格式。这也有助于对任意文件的编码和解码。

首先,让我们使用help/man命令,查看xxd命令的具体使用方法。

xxd -h

1.png

使用 xxd 执行的主要操作

将文件内容转换为十六进制:例如,我创建了一个名为“secret.txt”的新文件,现在我想将其内容都转换为十六进制形式,我可以通过键入以下命令执行:

Syntax: xxd <options> filename

xxd secret.txt

如下图所示,很明显xxd已经为文件“secret.txt”生成了十六进制转储。

在这里我们可以观察到,以下十六进制转储获得了它的默认格式,例如:

索引行数(例如:00000000, 00000010, 00000020…………00000220)

每组的默认八位字节数为2(-e: 4 little-endian hexdump),其分组大小为4字节(例如:4967 6e69…………6e67)

标准列长度为16位,带有空格

2.png

使用xxd跳过第n行:在转换文件时,有许多数据可能是我们不需要的。因此,我们可以跳过这些内容(跳过行数)。我们可以使用xxd跳过第n行,并在跳过的行后生成十六进制值。

假设在我当前的情况下,我想要从第5行生成十六进制转储,那么可以通过使用“-s”参数后跟xxd命令来实现。

xxd -s 0x50 secret.txt

将输出限制为特定长度:以上我已经解释了如何通过跳过行数(即从特定行输出)来检索数据。但是,如果你想要限制标准输出的长度,那么你可以使用“-l”参数。

这里,我限制了我的内容长度,以将数据打印到有限的范围,即第5行,如下图所示。

xxd -l 0x50 secret.txt

因此,我们可以观察到两个命令之间的差异;第一个命令生成从第6行初始化的十六进制值,第二个命令根据十六进制索引以第5行结束,请参考以上截图。

3.png

将文件内容转换为二进制文件:如果你想将文件转换为二进制形式,则可以使用“-b”选项。命令如下:

xxd -b secret.txt

4.png

设置列长:上面我已经介绍了如何跳过并限制输出到范围,其实我们还可以设置列的长度。默认情况下,对于任何转储文件它都是12, 16。

默认值:我们知道默认列长度为16。这将打印16个字符,包括空格。

xxd -l 0x20 secret.txt

将列长度设置为32:我使用“-l”选项设置了结束索引以限制打印数据的范围。然后我使用“-c”参数,将列的长度设为了32。

xxd -l 0x40 -c 32 secret.txt

从下图中,我们可以知道xxd是如何限制列长度的。

将列长度设置为9:现在我们将列长度设置为“9”。

xxd -l 0x40 -c 9 secret.txt

在所有这些情况下,xxd都是通过空格计数每个字符来为文件创建十六进制转储的。

5.png

纯16进制转储:我们可以使用“-ps”选项,以 postscript的连续16进制转储输出。这里我们将其输出保存在hex文件中,以获取secret.txt文件的纯16进制转储。为了验证结果,我们使用cat命令从hex文件中读取输出。

xxd -ps secret.txt > hex
cat hex

从下图中,我们可以知道xxd是如何为“secret.txt”文件,创建纯十六进制转储的。

还原文件:我们可以使用“-r”选项,来还原转换的文件内容。在我们的例子中,我使用了“-r -p”将纯十六进制转储的反向输出打印为了ASCII格式。

xxd -r -p hex

6.png

分组大小字节:如果我们需要将输出分组为多个八位字节,那么我们可以使用“-g”选项来实现。默认情况下为2(-e: 4 little-endian hex dump)。因此,如果我们将值设为4,那么它将被分组为8位。

在下图中我们将值设为8,它将分组为16位作为输出以简化结果。

xxd -l 0x30 -g 8 secret.txt

7.png

SUID Lab 设置

SUID特殊权限是以命令(可执行文件)的所有者权限来运行这一命令的,而不是以执行者的权限来运行该命令。现在,让我们在xxd上启用SUID权限,这样本地用户就有机会利用xxd来获取root权限。

键入以下命令,启用SUID位:

which xxd
chmod u+s /usr/bin/xxd
ls -al /usr/bin/xxd

SUID 利用

现在,我们将通过特殊权限位SUID来利用xxd服务。为此,我创建了一个受害者机器的会话,这将允许我们利用目标系统的本地用户访问。

让我们使用ssh连接到目标机器,命令如下:

ssh test@192.168.1.103

成功访问受害者机器后,我们使用find命令来查找具有SUID权限的二进制文件。

find / -perm -u=s -type f 2>/dev/null

这里我们可以看到有许多二进制文件具有SUID位,但我们重点关注/usr/bin/xxd。

9.png

在xxd上获得特殊权限位SUID,我们将获取用于提取密码哈希文件的shadow文件。

如下图所示,我已请求通过使用xxd暴露/etc/shadow文件,它将为该文件生成十六进制转储,并通过管道传输xxd命令来恢复其输出。 

xxd "/etc/shadow" | xxd -r

10.png

现在,我将使用john the ripper这款工具来破解哈希密码。这样我们就可以获取用户凭据,如下图所示。

john hash

11.png

获取凭据后,我们就可以切换用户了。首先,我们来检查下用户的sudo权限:raj,发现用户“raj”具有所有权限。

su raj
sudo -l
sudo su

因此,让我们直接切换到root用户帐户,并访问root shell(如下图所示)。至此,我们已成功利用xxd命令提升了我们的用户权限。

12.png

*参考来源:hackingarticles,FB小编secist编译,转载请注明来自FreeBuf.COM

相关推荐

这些评论亮了

  • 老马 回复
    文章看起来很长,全部都是废话。要有权限设置 SUID 干嘛还这么费力。直接 sudo -i 不就行了吗?
    )55( 亮了
发表评论

已有 4 条评论

取消
Loading...

特别推荐

推荐关注

活动预告

填写个人信息

姓名
电话
邮箱
公司
行业
职位
css.php