Proc 目录在 CTF 中的利用

Proc 目录在 CTF 中的利用

在 CTF 中经常会用到 /proc 这个目录来进行绕过,利用它里面的一些子目录或文件读取网站源码或者环境信息等,甚至直接读取flag或者直接Getshell。下面我们就简单总结一下 /proc 目录是什么以及他的作用。

/proc 目录

Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。

简单来讲,/proc 目录即保存在系统内存中的信息,大多数虚拟文件可以使用文件查看命令如cat、more或者less进行查看,有些文件信息表述的内容可以一目了然,但也有文件的信息却不怎么具有可读性。

/proc 目录中包含许多以数字命名的子目录,这些数字表示系统当前正在运行进程的进程号(PID),里面包含对应进程相关的多个信息文件:

ls -al /proc
image-20220530222553170

下面我们简单介绍一下 /proc 目录中的常见文件夹与文件。

上面列出的是 /proc 目录中一些进程相关的目录,每个目录中是其进程本身相关信息的文件。下面是系统上运行的一个PID为11的进程的相关文件,其中有些文件是每个进程都会具有的:

ls -al /proc/11
image-20220530222849639

这里简单讲几个与题目相关的进程文件:

cmdline

cmdline 文件存储着启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息。可以通过查看cmdline目录获取启动指定进程的完整命令:

cat /proc/1/cmdline
image-20220530223141042

可知PID为1的进程的启动命令为/init

cwd

cwd 文件是一个指向当前进程运行目录的符号链接。可以通过查看cwd文件获取目标指定进程环境的运行目录:

ls -al /proc/1/cwd
image-20220530223354747

可见PID为1的进程的运行目录为/,然后我们可以直接使用ls目录查看该进行运行目录下的文件:

ls /proc/1/cwd
image-20220530223755196

如上图所示,与直接查看/目录的效果是一样的。

exe

exe 是一个指向启动当前进程的可执行文件(完整路径)的符号链接。通过exe文件我们可以获得指定进程的可执行文件的完整路径:

ls -al /proc/1/exe
image-20220530223952567

environ

environ 文件存储着当前进程的环境变量列表,彼此间用空字符(NULL)隔开。变量用大写字母表示,其值用小写字母表示。可以通过查看environ目录来获取指定进程的环境变量信息:

cat /proc/1/environ
image-20220530224329815

常用来读取环境变量中的SECRET_KEY或FLAG。

fd

fd 是一个目录,里面包含这当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接,即每个通过这个进程打开的文件都会显示在这里。所以我们可以通过fd目录里的文件获得指定进程打开的每个文件的路径以及文件内容。

查看指定进程打开的某个文件的路径:

ls -al /proc/1/fd
image-20220530224447949

查看指定进程打开的某个文件的内容:

cat /proc/1/fd/3
image-20220530224606017

这个fd比较重要,因为在 linux 系统中,如果一个程序用open()打开了一个文件但最终没有关闭他,即便从外部(如os.remove(SECRET_FILE))删除这个文件之后,在 /proc 这个进程的 pid 目录下的 fd 文件描述符目录下还是会有这个文件的文件描述符,通过这个文件描述符我们即可得到被删除文件的内容。

self

上面这些操作列出的都是目标环境指定进程的信息,但是我们在做题的时候往往需要的当前进程的信息,这时候就用到了 /proc 目录中的 self 子目录。

/proc/self 表示当前进程目录。前面说了通过 /proc/$pid/ 来获取指定进程的信息。如果某个进程想要获取当前进程的系统信息,就可以通过进程的pid来访问/proc/$pid/目录。但是这个方法还需要获取进程pid,在fork、daemon等情况下pid还可能发生变化。为了更方便的获取本进程的信息,linux提供了 /proc/self/ 目录,这个目录比较独特,不同的进程访问该目录时获得的信息是不同的,内容等价于 /proc/本进程pid/ 。进程可以通过访问 /proc/self/ 目录来获取自己的系统信息,而不用每次都获取pid。

有了self目录就方便多了,下面我们演示一下self的常见使用。

  • 获取当前启动进程的完整命令:
cat /proc/self/cmdline
image-20220530224825090
  • 获取目标当前进程环境的运行目录与目录里的文件:
ls -al /proc/self/cwd
ls /proc/self/cwd
image-20220530224946632

当不知道目标网站的Web路径或当前路径时,这经常使用

  • 获得当前进程的可执行文件的完整路径:
ls -al /proc/self/exe
image-20220531112528384
  • 获取当前进程的环境变量信息:
cat /proc/self/environ
image-20220531112551693
  • 获取当前进程打开的文件内容:
cat /proc/self/fd/{id}

注意:在真正做题的时候,我们是不能通过命令的方式执行通过cat命令读取cmdline的,因为如果是cat读取/proc/self/cmdline的话,得到的是cat进程的信息,所以我们要通过题目的当前进程使用读取文件(如文件包含漏洞,或者SSTI使用file模块读取文件)的方式读取/proc/self/cmdline。

CTF题目

参考资料

Proc 目录在 CTF 中的利用

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇