由alias引发的一次对于解释器的探索

起因:一开始是记得之前看到过能够让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牛的文章复现了下收尾

posted @ 2024-04-24 18:03  TheBlackEagle  阅读(23)  评论(0编辑  收藏  举报