proc被称为虚拟文件系统,它是一个控制中心,可以通过更改其中某些文件改变内核运行状态,

它也是内核提空给我们的查询中心,用户可以通过它查看系统硬件及当前运行的进程信息。

Linux中许多工具的数据来源正是proc目录中的内容,比如lsmod的命令是cat /proc/modules的别名。

/proc目录下常用文件介绍:

  • /proc/loadavg 前三列分别保存最近1分钟,5分钟,及15分钟的平均负载。
  • /proc/meminfo 当前内存使用信息
  • /proc/diskstats 磁盘I/O统计信息列表
  • /proc/net/dev 网络流入流出统计信息
  • /proc/filesystems 支持的文件系统
  • /proc/cpuinfo CPU的详细信息
  • /proc/cmdline 启动时传递至内核的启动参数,通常由grub进行传递
  • /proc/mounts 系统当前挂在的文件系统
  • /proc/uptime 系统运行时间
  • /poc/version 当前运行的内核版本号等信息

进程目录下常用文件介绍

  1. cmdline,保存了当前进程的启动命令,如果这个进程是zombie进程,则这个文件没有任何内容。

    1. 先随便启动一个进程,以haroopad为例:
      image-20191202060634265
      获取进程号
    2. 查看proc中相应进程id的cmdline:
      image-20191202060758059
  2. cwd 执行进程的运行目录,是一个符号链接

    image-20191202061709395

  3. exe: exe是一个软链接,指向进程的可执行文件,通过它可以启动当前进程的一个拷贝

    image-20191202071052532

    打开burpsuite:

    image-20191202071748952

    综合两个看发现exe指向的是启动程序的环境,第一个haroopad是通过dash命令窗口启动,第二个是java环境启动

    image-20191202071838655

  4. environ: 进程包含的环境变量

    image-20191202072301414

  5. fd: 包含了进程打开的每一个文件的文件描述符,这些描述符是指向实际文件的符号链接。可以通过它恢复删除的文件

    image-20191202072352486

    目录中的每一项都是一个符号链接,指向打开的文件,数字则代表文件描述符

  6. root : /proc/[pid]/root是进程根目录的符号链接。举例如下:

    image-20191202072703624

  7. stack : /proc/[pid]/stack显示当前进程的内核调用栈信息,只有内核编译时打开了CONFIG_STACKTRACE编译选项,才会生成这个文件。举例如下:

    image-20191202072804266

  8. comm: /proc/[pid]/comm包含进程的命令名。

    image-20191202073025030

  9. maps 参考

截取一部分ctfwp ctf

源码读取

那么思路应该是利用文件包含进行文件读取了
但是不能进行目录穿越,于是得先知道绝对路径,这里想到之前HCTF的方法:

1
http://107.167.188.241/static?file=/proc/self/environ

发现500了,应该是没有权限,换个思路

1
http://107.167.188.241/static?file=/proc/self/maps

img
发现了python路径,但是看到内容

1
2
if filename != '/home/ctf/web/app/static/test.js' and filename.find('/home/ctf/web/app') != -1:
return abort(404)

我们没有办法使用这个绝对路径,尝试了一下bypass,例如

1
/home/ctf/web_assli3fasdf/././././app

发现也不行,出题人说用了abspath
看来只能想想有没有其他途径读取文件,这里想到如下方法
我们知道

1
/proc/[pid]/cwd是进程当前工作目录的符号链接

既然之前的路径无法用,那么我们可以考虑从proc进行读取,如下:

1
2
http://107.167.188.241/static?file=/proc/self/cwd/app/__init__.py
http://107.167.188.241/static?file=/proc/self/cwd/app/views.py