Toc
  1. 关于proc
    1. 目录介绍
    2. 如何利用
      1. [网鼎杯 2020 白虎组]PicDown
        1. 读取 proc/self/environ
        2. 读取 /proc/self/fd/1,2,3
        3. 读取 proc/pid/environ
Toc
0 results found
Rayi
/proc目录的妙用
2020/11/01 方法总结 /proc

关于proc

ctf题目中经常用到/proc这个目录进行绕过,getshell,读取源码或者获取环境信息等操作

简单的介绍下/proc是什么以及他的作用

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

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

目录介绍

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

image-20201028204228045

上面列出的是/proc目录中一些进程相关的目录,每个目录中是当程本身相关信息的文件。

/proc/self就是当前运行进程ID的符号链接

image-20201028205538794

1、cmdline — 启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息

image-20201028210157867

2、cwd — 指向当前进程运行目录的一个符号链接;

image-20201028210252183

3、environ — 当前进程的环境变量列表,彼此间用空字符(NULL)隔开;变量用大写字母表示,其值用小写字母表示;

4、exe — 指向启动当前进程的可执行文件(完整路径)的符号链接,通过/proc/N/exe可以启动当前进程的一个拷贝;

5、fd — 这是个目录,包含当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接,即每个通过这个进程打开的文件都会显示在这里;

image-20201028210803596

其他目录与ctf相关性较小,先不列出了

如何利用

我们可以通过/proc目录获取一些例如脚本名称,运行目录,打开的flag文件之类的信息

[网鼎杯 2020 白虎组]PicDown

利用/proc/self/cmdline获取当前脚本的名称

image-20201028211139123

通过/proc/self/cwd读取app.py

image-20201028211243388

from flask import Flask, Response
from flask import render_template
from flask import request
import os
import urllib

app = Flask(__name__)

SECRET_FILE = "/tmp/secret.txt"
f = open(SECRET_FILE)
SECRET_KEY = f.read().strip()
os.remove(SECRET_FILE)


@app.route('/')
def index():
    return render_template('search.html')


@app.route('/page')
def page():
    url = request.args.get("url")
    try:
        if not url.lower().startswith("file"):
            res = urllib.urlopen(url)
            value = res.read()
            response = Response(value, mimetype='application/octet-stream')
            response.headers['Content-Disposition'] = 'attachment; filename=beautiful.jpg'
            return response
        else:
            value = "HACK ERROR!"
    except:
        value = "SOMETHING WRONG!"
    return render_template('search.html', res=value)


@app.route('/no_one_know_the_manager')
def manager():
    key = request.args.get("key")
    print(SECRET_KEY)
    if key == SECRET_KEY:
        shell = request.args.get("shell")
        os.system(shell)
        res = "ok"
    else:
        res = "Wrong Key!"

    return res


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

可以发现,SECRET_FILE被删除了

image-20201028211307923

利用/proc/self/fd/3读取被删除的文件(后面的数字不定,可以爆破)

image-20201028211439525

image-20201028211658285

也能通过/proc和LFI进行getshell

需要有相关文件的读取权限

读取 proc/self/environ

proc/self/environ 中保存浏览器的User-Agent

我们可以将一句话插入User-Agent中

读取 /proc/self/fd/1,2,3

类似于/proc/self/environ,不同是在referer或报错等写入php代码,然后lfi点包含,实现rce

读取 proc/pid/environ

self无法使用时,可以使用爆破pid的方式找到php的进程

proc/1/environ

proc/2/environ

相关文章

https://bbs.zkaq.cn/t/3639.html

本文作者:Rayi
版权声明:本文首发于Rayi的博客,转载请注明出处!