起因:一开始是记得之前看到过能够让linux把一个命令变成别的命令的方式,比如输入的是ls结果实际执行的是其他东西,然后想将这种方式用在awd上边(千辛万苦打了进来结果一执行发现啥也干不了)
然后搜到了alias这个别名命令
用法:alias 实际输入='实际执行'
比如说alias ls='echo 123',这样ls后输出就会变成123
(这个命令直接执行就行,我这里是整了一晚上习惯了直接改配置文件
后来试了一晚上,踩了挺多坑才发现实际上实现不了
首先是踩坑,第一个就是bash和zsh的问题记得不要用kali或者其他解释器是zsh的试,如果非要用应该也可以,但是要把所有的bash改成zsh,因为从2020.4版本开始kali就使用zsh作为默认解释器而不是bash,用bash似乎会爆很多错(其实解释器这里我就该意识到不对劲的,唉)
这里我还以为是因为改文件改的不对,捅咕了半天~/.bashrc这个文件
我这里使用的是vps,系统是ubuntu,用的还是bash环境
其次是想要保留原有命令功能,我试了一晚上发现不太行
通过预先将命令保存到别的别名中好像行不通
然后在解决脚本化的过程中,因为上边的报错(指bash和zsh)将修改的脚本从~/.bashrc换到了~/.bash_aliases
贴下代码:
#!/bin/bash
#目前已知绕过方式:常见的都能绕
#变量拼接:a="ca";b="t";$a$b
#转义符号:ca\t,ca''t
#空变量ca$*t
#直接用路径:/bin/ls等
#恢复后需要重连/执行. .bash_aliases才能变回原来的,否则当前shell还是被改的,同时也改不了已经连接的
echo "alias unalias='echo cai jiu duo lian'" >> ~/.bash_aliases
echo "alias vi='echo cai jiu duo lian'" >> ~/.bash_aliases
echo "alias touch='echo cai jiu duo lian'" >> ~/.bash_aliases
echo "alias rm='echo cai jiu duo lian'" >> ~/.bash_aliases
echo "alias mkdir='echo cai jiu duo lian'" >> ~/.bash_aliases
echo "alias rmdir='echo cai jiu duo lian'" >> ~/.bash_aliases
echo "alias cat='echo cai jiu duo lian'" >> ~/.bash_aliases
echo "alias ls='echo cai jiu duo lian'" >> ~/.bash_aliases
echo "alias whoami='echo cai jiu duo lian'" >> ~/.bash_aliases
echo "alias tac='echo cai jiu duo lian'" >> ~/.bash_aliases
echo "alias head='echo cai jiu duo lian'" >> ~/.bash_aliases
echo "alias tail='echo cai jiu duo lian'" >> ~/.bash_aliases
#echo "alias alias='echo cai jiu duo lian'" >> ~/.bash_aliases
sleep 3
. .bash_aliases
这是改命令的脚本,下边是恢复的
sed -i "1,\$d" .bash_aliases
. .bash_aliases
如上注释所说,执行修改和恢复脚本后都需要重连才能好使
然后是上边保存原有命令功能的问题,我忽然想到既然是要用在awd里,而且需要重连才能生效,那让我们队先连上去然后再开,直接把所有命令都改了也影响不到我们
于是就决定这样愉快地处理这个问题
那现在具体功能已经实现了,也没有什么bug,该想想别人要是有这种东西怎么绕过
结果刚一试就发现,这玩意除了最基本的直接执行原始命令剩下啥都过滤不了,就跟只过滤了flag没过滤任何特殊符号的php题,闭着眼睛都能打
虽然但是这还不是最悲剧的,原本寻思就算不能防任何绕过吧,那万一哪个队写脚本批量打的时候是直接执行命令的,结果正好被我的别名给防住了呢
结果连上蚁剑一试,不好使!
于是乎我开始搜php的system等函数是如何执行代码的
然后发现我的alias只能改解释器这边,但是那些函数根本不走这里
我又想到那弹shell不是要用bash吗,虽然他换个nc就能出来了但是总归让我研究了一晚上的东西有点用吧
结果回头一瞅:
这bash里边也没用命令啊,这我改谁别名去
于是我就想着详细分析一下system这几个命令执行的函数,试图找出某种能够像这样修改它们的命令的方式
想着找找system的源码看到底它们长什么样,结果搜了半天居然没搜到
最后还是找到了p牛的博客(感觉p牛的博客里有着整个宇宙):https://tttang.com/archive/1450/
通过p牛的分析以及我的理解,最终发现它们调用的还是这个sh
而sh又是能够使用alias的
理论上来说应该能够让sh里的命令也全部被修改
结果又看到这句话
还是太心急了,还是看完p神文章再说吧
然后发现对咱们有帮助的似乎就到这里,总结了一下p牛的文章,大概就是在可以控制环境变量的情况下,执行了一个system函数(不可控的),如何getshell
p牛是从system这个函数下手,经过了popen和sh,找到dash和bash并进行审计
结果很悲伤的是dash这边并没找到利用方式,而是bash有了解决方法(这也和咱们关系不太大)
而咱们目前应该考虑的是dash是否有能够在使用sh -c这种方式时仍然能够像bash一样继续让bash_aliases这种文件生效
但是很遗憾的是不仅是dash,就连bash也不支持
这又让我想到了-c和不带-c到底有什么区别
进一步尝试发现在手动使用bash命令时甚至没有alias这个命令?
然后了解到了还有内建命令这一说以及posix标准等等
感觉看不太懂,不如直接学p神瞅瞅dash的源码到底长啥样(虽然我的c语言功底不怎么样,不过就当补基础了)
p牛提供了三种方法,这里对比一下决定使用最简单的第三种直接通过包管理器下载
直接使用apt source命令来下载对应的源码
下载后获取到的这四个文件如p神所说
这里我们的则是dash的源码
直接进到第一个dash文件夹中
源码都在src中,其他都是更新日志之类的东西
审了半天感觉自己还是太菜了,看不出来啥
连传参的地方到底在哪都没找到
于是就简单看了下p牛找到的地方
感觉能从这种地方找出来洞实在是太强了
实在是审不动代码,最后跟着p牛的文章复现了下收尾