首页 > 解决方案 > 利用linux、scanf和读取权限

问题描述

您可能会意识到这看起来像是一项作业,因此,我只是在寻找线索,而不一定是完整的解决方案。

TLDR:有没有办法在 C 中进行命令注入scanf?以及如何读取我们无权读取的文件?

目标是打开和读取两个文件,这将允许访问第三个文件。file1,file2file3. 该文件的权限如下:

-rw-r--r-- 1 root source 40 1 Jan. 00:00 folder/file1
-rw-r----- 1 root source 40 1 Jan. 00:00 folder/file2
-rw-r----- 1 root source 40 1 Jan. 00:00 file3
drwxr-x--x 2 root source 4096 1 Jan. 00:00 folder
-rwxr-sr-x 1 root source 14376 1 Jan. 00:00 exe

我们在一个文件夹source中,其中包含file3一个可执行文件exe和另一个包含两个文件的文件夹。该exe程序显示了file3我们是否可以访问file 1和的内容file 2file1内容是可读的,因此我们知道它的内容是 pass1。

因此,当我们执行 时exe,我们会看到一个提示(即 a scanf,程序是 C 语言)。

使用strace,这是我们得到的:

read(0, pass1
"pass1\n", 1024)               = 7
openat(AT_FDCWD, "/source1/folder/file1", O_RDONLY) = 3
read(3, "pass1", 6)                    = 6
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
// The next part only appear when we enter pass1 at the prompt
openat(AT_FDCWD, "/source1/folder/file2", O_RDONLY) = -1 EACCES (Permission denied)
read(4, 0x5636137c16c0, 16)             = -1 EBADF (Bad file descriptor)

在这里,我们看到了我认为是一种字符串比较,当我们在提示符下得到 pass1 时,exe尝试打开第二个文件但无权这样做。暂定打开之前没有第二次提示file2,所以没有机会进入第二遍尝试打开file2,反正我们没有权限。

我的问题是,有没有办法通过提示进行命令注入scanf?以及如何解决我们不允许阅读的事实file2?还有一种方法可以使我们在第二次读取时在提示符处输入的内容不同(例如:第一次读取时为 pass1,第二次读取时为 pass2,因为我们在提示符处输入了 pass1 和 pass2?)。

标签: clinuxscanfexploit

解决方案


推荐阅读