Bash-Vino0o0o
今天才知道将ASCII字符转为八进制在bash环境中也能执行命令。。。all right
不过测试了一下似乎只能够执行一些没有参数的命令。
文件描述符 名称 常用缩写 默认值
0 标准输入 stdin 键盘
1 标准输出 stdout 屏幕
2 标准错误输出 stderr 屏幕
一些bash小技巧
1 | - 命令替换:$(命令) => $(echo whoami) 将命令的结果当作命令执行 |
通过文字重定向执行命令
1 | bash <<< $'\154\163' |
bash可通过变量0获得,即$0。
1 | $0 <<< $'\154\163' |
接下来构造数字1-8组合为八进制执行命令。
数字1通过默认变量#的长度获得
1 | ${##} |
数字2通过1左移运算1次获得
1 | $((${##}<<${##})) |
数字3通过将二进制11转为十进制获得
1 | $(($((${##}<<${##}))#${##}${##})) |
数字4通过1左移运算2次获得
1 | $((${##}<<${##}<<${##})) |
数字5通过将二进制101转为十进制获得
1 | $(($((${##}<<${##}))#${##}$#${##})) |
数字6通过将二进制110转为十进制获得
1 | $(($((${##}<<${##}))#${##}${##}$#)) |
数字7通过将二进制111转为十进制获得
1 | $(($((${##}<<${##}))#${##}${##}${##})) |
假设允许特殊符号及数字那么我们可以直接这样执行命令
1 | $0 <<< $'\154\163\40\57' 等同于如下命令 |
但我们现在的场景只允许特殊符号及0, 我们已知可以通过bash的拓展构造出八进制所需的数字0-7, 那么便可以根据需求编写脚本生成Payload。
构造ls命令, ls八进制为154 163, 构造这两个数字前的第一个数字必须转义。
1 | $0<<<$0\<\<\<\$\'\\${##}$(($((${##}<<${##}))#${##}$#${##}))$((${##}<<${##}<<${##}))\\${##}$(($((${##}<<${##}))#${##}${##}$#))$(($((${##}<<${##}))#${##}${##}))\' |
生成命令脚本:
1 | from fire import Fire |
使用方法
python3 bash.py whoami
参考文章:
https://medium.com/@orik_/34c3-ctf-minbashmaxfun-writeup-4470b596df60
https://hack.more.systems/writeup/2017/12/30/34c3ctf-minbashmaxfun