发布于2022年11月8日3年前 0x00 前言 在渗透测试中,如果需要在目标系统上释放文件,父目录的时间属性(访问时间、上次写入时间、MFT更改时间)会发生变化,如果需要在目标系统上覆盖原文件,原文件的时间属性(创建时间、访问时间、上次写入时间、MFT更改时间)也会发生变化。 从渗透的角度来说,需要想办法修改文件的时间属性来消除痕迹。 从取证的角度来看,可以通过文件属性的异常来发现攻击者入侵的痕迹。 本文将介绍修改文件属性的方法和细节,分享实现代码,并基于利用的思想给出取证建议。 0x01 简介 本文将介绍以下内容: 基本概念 读取文件属性的方法 修改文件属性的方法 共享代码 利用理念 证据收集建议 0x02 基本概念 1、NTFS文件系统中的时间属性 包括以下四项: 创建时间(已创建) 访问时间(已访问) 上次写入时间(已修改) MFTChangeTime 前三个可以通过右键-属性获得,如下图所示。 无法直接查看MFTChangeTime。 MFTChangeTime记录了MFT的修改时间(主文件表)。如果文件属性改变,MFTChangeTime将被更新。 2、读取MFTChangeTime的方法 (1)通过NtQueryInformationFile读取 注: 无法通过WinAPI GetFileTime。 (2)解析NTFS文件格式 MasterTable中的STANDARD _ INFORMATION(偏移量0x10)和FILE _ NAME(偏移量0x30)包含完整的文件属性。 3、Win7系统默认CreateTime和AccessTime保持一致 在Win7系统(及更高版本)的默认设置下,AccessTime的更新是禁用的。 也就是说,只读取文件的操作不会改变文件属性AccessTime,为了减少硬盘的读写,和CreateTime是一致的。 对应注册表位置HKEY _本地_机器\系统\当前控制集\控制\文件系统,键值NtfsDisableLastAccessUpdate 值1表示禁用,这是默认配置,值0表示打开。只有修改注册表并重新启动系统后,系统才会生效。 4、文件属性的变化规律 读取文件: 文件属性不会被更改。 覆盖文件: 更改4个属性 5、文件夹属性的变化规律 创建新文件/删除文件/重命名文件: 更改父文件夹的AccessTime、LastWriteTime和MFTChangeTime 读取文件: 文件属性不会被更改。 覆盖文件: 文件属性不会被更改。 注: 可以借助SetMace进行测试。下载地址: https://github.com/jschicht/SetMace 0x03 读取和修改文件属性的方法 1、使用WinAPI GetFileTime和SetFileTime 可以操作三个文件属性: 创建时间(已创建) 访问时间(已访问) 上次写入时间(已修改) 无法操作MFTChangeTime。 (1)GetFileTime的使用 getFileTime到GetFileTime() FileTimeToSystemTime()将FileTime转换为SystemTime,即UTC,这是同一个标准。 通过systemtimetotzspecificaltime()将SystemTime转换为LocalTime,即UTC加时区,考虑时区的影响,与当前系统显示的时间一致。 (2)SetFileTime的使用 sscanf()将输入时间数据转换为系统时间 通过SystemTimetoFileTime()转换SystemTimeToFileTime LocalFileTimeToFileTime()将FileTime转换为相应的UTC FILETIME,即FileTime加上时区。考虑到时区的影响,与当前系统显示的时间一致。 代码是开源的,下载地址是: https://github . com/3g student/home-of-C-Language/blob/master/file time control _ winapi . CPP 该代码实现了以下功能: 文件/文件夹查看时间(创建时间、访问时间、上次写入时间) 文件/文件夹的修改时间。 将文件A的时间复制到文件b。 2、使用NtQueryInformationFile和NtSetInformationFile 可以操作四种文件属性: 创建时间(已创建) 访问时间(已访问) 上次写入时间(已修改) MFTChangeTime 我在实现中直接引用了Metasploit中timestomp的代码,地址如下: https://github . com/rapid 7/meter preter/blob/master/source/extensions/priv/server/timestomp . c 增加了一些功能,下载地址: https://github . com/3g student/home-of-C-Language/blob/master/file time control _ ntapi . CPP 该代码实现了以下功能: 文件查看时间(创建时间、访问时间、最后写入时间、MFTChangeTime) 文件被修改的时间。 将文件A的时间复制到文件b。 将时间设置为最小值(1601-01-01 00:00:00) 注: 暂时不支持对文件夹的操作。 3、使用驱动文件 (1) SetMace 可用下载地址: https://github.com/jschicht/SetMace SetMace可以正常读取文件和文件夹的时间信息(包括MFTChangeTime)。 但是时间信息不能修改,因为从nt6.x开始,Windows禁止加载未签名的驱动文件。如果可以绕过驱动程序保护,可以修改时间信息。 (2) WinHex 付费版WinHex支持写硬盘文件,可以用来修改时间信息。 补充、文件资源克隆 资源黑客由powershell自动调用,克隆可执行文件(exe、dll、scr等)的资源信息。) 下载地址: https://github.com/threatexpress/metatwin 注: 此工具不修改文件属性。 0x04 利用思路 1、在目标系统上释放文件 将更改父目录的时间属性(访问时间、上次写入时间、MFT更改时间) 可以使用SetMace查看属性的变化。 可以使用0x03中的FileTimeControl_WinAPI修改文件夹的时间属性,可以修改以下三个内容: 创建时间(已创建) 访问时间(已访问) 上次写入时间(已修改) 要进一步去除操作痕迹,需要用WinHex修改主文件表中的$STANDARD_INFORMATION(偏移量0x10)和$FILE_NAME(偏移量0x30)。 2、覆盖目标系统上原有的文件 将更改原始文件的时间属性(创建时间、访问时间、上次写入时间、MFT更改时间)。 您可以使用FileTimeControl_NTAPI来读取和修改时间属性。 要进一步去除操作痕迹,需要用WinHex修改主文件表中的$STANDARD_INFORMATION(偏移量0x10)和$FILE_NAME(偏移量0x30)。 0x05 取证建议 1.检查文件/文件夹的时间属性MFTChangeTime,它位于两个位置: 主文件表中的$STANDARD_INFORMATION(偏移量0x10) 主表中的$FILE_NAME(偏移量0x30) 如果MFTChangeTime异常(晚于其他三个),一般可以认为文件被非法修改了。 你可以用工具套装。 0x06 小结 介绍了修改文件属性的方法和细节,分享了两个实现代码(FileTimeControl_WinAPI和FileTimeControl_NTAPI),结合利用的思路给出了取证的建议。 留下回复
创建帐户或登录后发表意见