Linux的/proc/self/学习 ++ CTF例题

目录:

    • /proc目录
      • 1.cmdline
      • 2.wd
      • 3.exe
      • 4.environ
      • 5.fd ,比较重要~~
      • 6.self
        • 1.获取当前启动进程的完成命令:
        • 2.获取目标当前进程的运行目录与目录里的文件:
        • 3.获得当前进程的可执行文件的完整路径:
        • 4.获取当前环境变量
        • 5.获取当前进程打开的文件内容
    • 例题:
      • No.1 [网鼎杯 2020 白虎组]PicDown
      • No.2 [V&N2020 公开赛]CHECKIN

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

学习自:WHOAMI。。能起上这个名字,就不一般,,,

/proc目录

Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

还有的是一些以数字命名的目录,他们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的PID号为目录名,他们是读取进程信息的接口。而self目录则是读取进程本身的信息接口,是一个link

Linux的/proc/self/学习 ++ CTF例题_第1张图片
右边的蓝色字就是进程号PID

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

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

Linux的/proc/self/学习 ++ CTF例题_第2张图片

1.cmdline

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

cat /proc/1035/cmdline

在这里插入图片描述

可知PID为1035的进程的启动命令为 /usr/sbin/cups-browsed。。。我也不知道我知道这个之后有什么用处啊啊。。。

2.wd

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

ls -al /proc/1090/cwd

在这里插入图片描述
可见PID为1090的进程的运行目录为/var/lib/postgresql/9.5/main
然后我们可以直接使用ls目录查看该进行运行目录下的文件:

ls /proc/1090/cwd

在这里插入图片描述

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

3.exe

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

ls -al /proc/1090/exe

在这里插入图片描述

4.environ

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

cat /proc/2889/environ

在这里插入图片描述

5.fd ,比较重要~~

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

ls -al /proc/1070/fd 

Linux的/proc/self/学习 ++ CTF例题_第3张图片
查看指定进程打开的某个文件的内容。那个数字就是那个数字嘛,,

ls -al /proc/1070/fd/4

Linux的/proc/self/学习 ++ CTF例题_第4张图片

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

6.self

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

/proc/self表示当前进程目录。前面说了通过/proc/$pid/来获取指定进程的信息。如果某个进程想要获取当前进程的系统信息,就可以通过进程的pid来访问/proc/$pid/目录。但是这个方法还需要获取进程pid

在fork、daemon等情况下pid还可能发生变化。

为了更方便的获取本进程的信息,Linux提供了/proc/self/目录,这个目录比较独特,不同的进程访问该目录时获得的信息时不同的,内容等价于/proc/本进程pid/。进程可以通过访问/proc/self/目录来获取自己的系统信息,而不用每次都获取pid。

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

1.获取当前启动进程的完成命令:

cat /proc/self/cmdline

在这里插入图片描述

2.获取目标当前进程的运行目录与目录里的文件:

ls -al /proc/self/cwd
ls /proc/self/cwd

在这里插入图片描述
在这里插入图片描述这样就和我直接在当前情况下ls一样了啊

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

3.获得当前进程的可执行文件的完整路径:

ls -al /proc/self/exe

Linux的/proc/self/学习 ++ CTF例题_第5张图片

4.获取当前环境变量

/proc/self/environ

Linux的/proc/self/学习 ++ CTF例题_第6张图片

5.获取当前进程打开的文件内容

cat /proc/self/fd/{
     id}

下文在题目中演示,

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

例题:

No.1 [网鼎杯 2020 白虎组]PicDown

BUUCTF: [网鼎杯 2020 白虎组]PicDown — proc文件的利用, — python反弹shell ---- python代码审计

No.2 [V&N2020 公开赛]CHECKIN

BUUCTF:[V&N2020 公开赛]CHECKIN – proc文件的利用 — python反弹shell ---- python代码审计

你可能感兴趣的:(linux,proc)