之前写了一篇 快速自检电脑是否被黑客入侵过 (Windows 版) , 这次就来写写 Linux 版本的.
严谨地说, Linux 只是一个内核, GNU Linux 才算完整的操作系统, 但在本文里还是用通俗的叫法, 把 Ubuntu,Debian,RedHat,CentOS,ArchLinux 等发行版都统称为 Linux. 本文里所说的方法不仅对 Linux 的发行版适用, 部分方法对 Mac OSX 操作系统也是适用的.
如果黑客曾经获得过命令运行的机会, 对方往往会想要将这个机会持续下去, 业内称之为
. 而创建后门帐号, 往往是一个持久化的途径.
- 持久化(persistence)
cat /etc/passwd 可以看到当前系统中的所有用户和对应的组信息, 如果帐号太多一眼看不过来, 我通常会用下述方法筛选:
- cat
- /etc/passwd
- |
- awk
- -F:
- '{print $7}'
- |
- sort
- |
- uniq
- -c
改命令的作用是打印所有类型的 shell 和对应的数量, 对于有 shell 的用户, 要仔细检查.
如果上一步获得了某个异常的用户名 (假设为 hacker), 可以用以下方法详细检查该用户:
注: finger 命令在某些操作系统里不是内置的, 可以自行用包管理工具安装, 如: Ubuntu/Debian: apt-get install finger CentOS/RedHat: yum install finger ArchLinux: pacman -S finger 下面提到的其他非内置命令类似
一般的 Linux 用户都会用 sudo 来让普通用户可以执行 root 操作, 因此对于已经存在的普通用户, 也不可掉以轻心. sudo 所管理的权限, 在 / etc/sudoers 以及 / etc/sudoers.d 中可以查看, 最好经常检查改文件以确保没有普通用户获得了意外的权限. 对于每个普通用户, 可以用命令 groups username 来查询其所属的组, 如果是 root 或者 sudo 组, 或者该组在 / etc/sudoers 文件中, 那就要格外警觉了.
Linux 下的自启动流程根据其服务管理器的不同而不同, 常用的有以下三种:
Upstart 是基于事件的, 用来取代古老的 / sbin/init 进程来处理任务和服务自启动的方法. 查看该类型的自启动文件可以用以下命令:
- initctl show-config evil
SystemV 就是常用的
命令背后的服务管理系统. 查看该类型的自启动文件可以用以下命令:
- service start/stop/status xxx.service
SystemD 是现代的服务管理系统, 比较新的 Linux 版都已经迁移为 SystemD 了. 有两种方式查看所有自启动的服务:
- systemctl list-unit-files --type=service
- ls /lib/systemd/system/*.service /etc/systemd/system/*.service
旧版本的 Linux 一般是 Upstart 和 SystemV 混用, 新版本都大多迁移到 SystemD 了.
除了上述的自启动服务, Linux 下还可以通过计划任务来进行持久化运行, 检查异常的计划任务相对简单, 只需要查看 / etc/crontab 以及子目录下 / etc/cron.* 的计划任务文件即可.
用过 Linux 的都知道, 在 $HOME/.bashrc 文件里可以进行初始化配置并应用于每个 shell, 也就是说里面的脚本在每次新开一个 terminal 的时候都是有可能被运行的. 这类配置文件包括. bashrc, .bash_profile, .bash_login, .profile 等等. 其是否运行以及运行的顺序由 shell 被调用时是否登录, 以及是否交互运行来决定, 对于 bash 来说, 执行流程如下表:
脚本名称 | 交互登录 | 交互非登录 | 脚本 (即非交互) |
---|---|---|---|
/etc/profile | A | ||
/etc/bash.bashrc | A | ||
~/.bashrc | B | ||
~/.bash_profile | B1 | ||
~/.bash_login | B2 | ||
~/.profile | B3 | ||
$BASHENV | A | ||
`| | |~/.bash_logout ` | C |
其中执行顺序为 A->B->C, B[123] 表示只有当第一个脚本存在时候才会执行. 用流程图表示如下:
关于登录 / 非登录 shell 以及交互 / 非交互 shell 的内容可以参考网上的其他介绍, 这里就不展开了. 只要知道自己的 shell 初始化所执行的文件顺序, 并检查这些文件看是否有可疑命令, 从而才能发现异常信息.
要找到所有可疑的自启动项是困难的, 有经验攻击者可以修改现有的自启动脚本, 额外拉起命令, 从而减少被发现的风险. 一些 Linux 桌面版本也会负责运行类似的自启动命令, 比如我最爱的 xfce, 在
就可以添加自启动的应用.
- Settings -> Session Starup -> Application Autostart
一般而言, 黑客获取 shell 之后会在上面执行某些命令, 我们可以通过 history 命令来查看曾经运行过的命令. 或者直接查看~/.bash_history 文件. 聪明的黑客干完坏事也许会清理痕迹, 但如果发现 history 被恶意清除, 或者被异常篡改, 那也足以给我们警示的信号了.
日志, 尤其是系统日志, 是我们绝佳的帮手, 下面一些命令可以用来读取日志文件并输出相关信息:
当然, 有心的攻击者也会在这些命令中隐藏自己的痕迹, 比如使用小工具 hidemyass .
系统日志一般都由 rsyslogd 进程产生, 配置在 / etc/rsyslog.conf 文件以及 / etc/rsyslog.d / 目录下, 一些常见的日志和介绍如下:
通过检查上述日志, 往往可以发现一些意想不到的痕迹 (如果有的话).
虽然说自检主要是从犯罪痕迹中找到线索和指示, 但有时候攻击者留下的恶意软件还是会正在运行中的, 这时, 从犯罪现场来搜寻蛛丝马迹也是一个不错的主意.
查找异常进程, 可以用 top 命令查看正在运行的程序所占用的资源, 或者用 ps -ef 列出当前系统所用的进程. 如果发现自己不认识的进程, 可以用以下命令进行详细的检查:
- ps eho command -p $PID
- readlink /proc/$PID/cwd
- strings -f /proc/$PID/environ | cut -f2 -d ' '
- netstat -pan | grep $PID
当然, 如果攻击者用某种手段隐藏了进程, 也还是会留下一些线索, 比如可疑的 LKM 模块, 这里就不深入了.
如果某个恶意进程正在活动, 很可能此时正在与外界网络有交流, 这就需要通过抓包工具来进行分析了. 对于 Linux 桌面用户, wireshark 是个绝佳选择, 而对于服务端, tcpdump 是个好工具, 对其掌握也是很必要的.
以 wireshark 为例, 打开抓包几分钟左右, 通过内置的过滤规则, 加上上面分析到的应用所打开的网络连接, 就可以看到这个恶意应用到底在和外界做些什么邪恶的交流, 从而及时评估损失和保护数据.
除了恶意软件发起的网络浏览, 还有一些是通过自身发起的. 比如攻击者修改了 iptables,DNS,http 代理, 或者 / etc/hosts, 都可能会导致我们正常的网络请求被攻击者监听并篡改. 这些小小的修改也许不是很明显, 可一旦发现自身网络环境'不太对劲', 就要提高警惕, 仔细排查了.
使用 Linux 作为日常桌面操作系统的人, 一般都是有一定的技术水平, 但道高一尺, 魔高一丈, 攻击 Linux 的人对应地技术水平也会高些, 所以本文相对于 Windows 版的自检 略为详细. 正所谓'未知攻, 焉知防', 本文很多自检方法也是根据笔者日常的红队经验得到的, 希望能对提高小伙伴们的安全意识和防护能力有所帮助吧.
来源: https://www.cnblogs.com/pannengzhi/p/2017-12-24-linux-self-check.html