查看原文
其他

渗透测试的WINDOWS NTFS技巧集合(二)

lipss 看雪学院 2019-05-26


第一部分:渗透测试的WINDOWS NTFS技巧集合(一)


技巧5:隐藏供选数据流


如前所述,可以通过dir命令中的/r开关查看ADS。而streams.exe是Sysinternals里的一个工具,它也可以查看数据流:

 图17:streams.exe查看ADS

 

在旧版本的Windows中,可以使用保留名作为基本名称来隐藏ADS (例如: CON, NUL, COM1, COM2, LPT1, …)。而在Windows 10上就做不到了,但“…”仍然有效:

 图18:测试保留名隐藏ADS

 

“…”上的ADS是成功创建的,但是没有被streams.exe工具列出。在COM1上创建ADS会导致错误,在NUL上创建ADS没有任何提示(ADS没被创建)。

 

请注意,还可以在驱动器上创建一个ADS,比如“echo 123 > C:\:abc.txt”。将隐藏在C:\ 中的“dir /r” 命令中。但是,它将在“..”目录的C:\子文件夹中显示ADS。例如:

图19:在C:创建ADS的效果

 

红色标记的部分ADS是由 C:\:abc.txt 创建。如果直接在C:\上调用 ,那么通过Sysinternals工具流也看到ADS。因此,为了避开这两种工具,应该使用“…”技巧。

 

所以还存在可用于隐藏工具的第二技巧。在Windows上可以添加“.<空格>.”在文件的末尾,Windows将会自动删除它(规范化将其删除)。

 

图20:添加...的技巧,echo 123  > "abc. ."

 

但是我们可以用ADS创建这样的文件!用工具不能打开这个文件,因为像“xyz. .”这样的路径会自动地更改为“xyz”,而这个文件不存在。

 

这是证明:

图21:“xyz. .”文件被创建

 

创建的ADS foobar.txt通过工具是无法找到的:

图22:foobar.txt

 

附注1:此类文件也可以通过以下方式创建: echo test > “test. .::$DATA”

 

附注2:请注意“..:abc.txt”是在“C:\:abc.txt”上创建的ADS。

 

我们还可以创建一个名为“. .” 的目录,如下所示:

图23:创建一个名为“. .” 的目录

 

这个文件夹是不可以进入的:

图24:不可以进入名为“. .” 的目录

 

前面提到过(像cd . .. .\ 无法正常使用),但是cd “. .::$INDEX_ALLOCATION”  是可以使用的(双引号很重要)。

 

如果我们可以在文件夹名之间添加空格,那我们也可以在末尾添加空格,如 “b ” 或“.. ”  或“. “。


图25:文件夹末尾添加空格

 

说明:有一个“b”和一个“b ”文件夹,一个名为“a”的文件,一个名为“a ”的文件,两个默认的目录“.”和“..”和“. ”和“. .”。

 

名称为“.. ”的目录可以使用我们已经讨论过的技术进行写入文件:

图26:写入文件到“. . ”目录中

 

附注1:如果在文件夹上单击两次,可以通过文件管理器打开该文件夹。也会正确显示文件夹的内容。但是由于路径错误,无法打开其中的文件(explorer.exe  使用 C:\test22.. .. \123.txt 而不是 C:\test22.. \123.txt)。在搜索这样的文件夹时,Powershell将再次陷入无限循环。

 

附注2:还可以在一个名为“abc”的文件夹上创建ADS。然后可以将文件夹重命名为仅包含数字的名称(如“1”)。之后你仍然可以看到ADS,但是你不能打开它。(用数字作为名称的文件夹上的ADS不起作用)。要打开ADS数据,必须首先将文件夹重命名为“abc”。

 

文件系统与反病毒产品/取证软件:


我快速验证了上述针对AntiVirus产品的技巧,以验证它们是否可以捕获滥用技巧的恶意软件。最值得关注之处是文件/文件夹以 “. .”结尾产生的变化。例如我将eicar(测试病毒)储存在一个文件夹中,并用以下命令复制:

copy eicar.com > "123. .::$DATA"

copy eicar.com > tester

echo 123 > "foo. .::INDEX_ALLOCATION"

cd "foo. .::$INDEX_ALLOCATION"

copy ..\eicar.com .

copy ..\eicar.com .\eicar


之后,我重新启用了AntiVirus解决方案并扫描了该文件夹,所有AntiVirus解决方案都在此文件夹中找到了“eicar.com”和“tester”,而不是“123. .”  中的eicar病毒或“foo. .” 文件夹中的两个文件。但是进入该文件夹并启动文件时,AntiVirus产品会找到它们(因为内容是从文件系统加载到内存的)。Windows Defender的“删除”操作无法删除文件,因此没有影响。


但是Emsisoft的“删除”操作可以删除文件夹中的tester病毒(译者注:Emsisoft是来自澳大利亚的杀毒软件)。Emsisoft删除了 “foo. .”  文件夹中的 “eicar.com” 文件,“eicar”文件没有被删除,内容可以毫无问题地读取(Emsisoft回应我们,只有映射为可执行文件的文件才会被扫描,有些特定的文件扩展名如.com除外)。这种行为可以在文件保护设置中通过切换到“彻底扫描”来读取就可以进行查杀;另一方面,Windows Defender也阻止了将“eicar”作为文本文件读取)。


我还对Autopsy 4.6.0(免费取证软件)进行了一个简短的测试。通过将“logical files ”模式加载到工具中(从正在运行的系统;不是一个磁盘映像),可以输入“…” 文件夹,但是不能输入“foo. .” 文件夹。我创建了两个文件,一个命名为“valid”,内容为“valid”,还有一个文件命名为“valid.”,内容为“secret”。Autopsy 显示了两个文件的内容“valid”(而不是“secret”的内容)。在“logical files ”模式下双击“.. ”文件夹(末尾有空格)后被转化为“..” 。在磁盘镜像(raw)模式下,一切都显示正确(在live模式中,Autopsy使用Windows API访问数据,才会出现问题。)

 


技巧6:隐藏进程二进制


正如上面已经讨论过的:Windows会在文件的末尾自动删除“. .” 。如果我们可以以“file1. .” 这样的名称来启动一个进程呢?好吧,那就会在“file1”执行的情况发生检查(例如:来自AntiVirus产品的签名检查)。让我们试试以下命令:


图27:复制了三个文件

 

我们创建了3个文件:

  • 来自taskmgr具有微软签名的文件“file”

  • “file. .”这是我们的"假恶意软件",应该隐藏但执行

  • “filex x”包含WinSCP的签名,此文件稍后将变得重要。


我们现在需要一种方法来从 “file. .” 二进制文件启动进程,这不是一项简单的任务,因为所有Microsoft Windows API调用都会自动从文件名中删除“. .”,然后启动“file”(taskmgr)。为了解决这个问题,我们使用以下代码:

图28:解决自动从文件名中删除“. .”的代码

 

上面的代码只是调用CreateProcessA来从“filex x”(WinSCP)创建一个进程。如果我们编译这个应用程序并启动它,最终将执行的是WinSCP。可我们不能正常启动这个文件。相反,我们在调试器内启动应用程序(例如:WinDbg)。现在我们在函数中设置一个断点,它将产生相关的系统函数调用,调用:“bp ntdll!NtCreateUserProcess”。我们可以使用 “g” (go)   命令在调试器中启动程序并命中断点。在断点处,可以dump当前堆栈 (“dq rsp”) 。堆栈上的第12个指针很重要,应该被dump。这个地址的第四个值是指向文件名的指针。

 

图29:windbg

 

文件名(绿色框)现在是标准化显示(以\??\C:\… 开头)。这种标准化还需要从文件名末尾删除 “. .”  ——这就是为什么上面的C代码不使用“file. .” 作为进程名的原因。但是由于文件已经被改变为标准化,现在可以修改这个值。让我们用“.” 覆盖 “x”  字符。(命令“eb”用于编辑字节):

图30:编辑字节为"."

 

然后继续执行“g”。猜猜会发生什么?

 

“file. .” (恶意软件)被执行。但如果用户右键单击任务管理器中的进程并选择“属性”,则显示“file” (taskmgr) 的Microsoft签名。


图31:显示“file” (taskmgr) 的Microsoft签名。

 

但是“filex x” (WiSCP)是什么呢?是的,这个文件也显示为正在运行的进程,即进程资源管理器(因为路径是在调用NtCreateUserProcess之前设置的)。

 

图32:"filex x"运行情况

 

与PowerShell有什么关系?是的,也是错误的二进制文件:

图33:Powershell显示情况

 

这是不是安全问题得视情况而定。首先,攻击者可以启动一个进程(恶意软件),重命名/删除它,然后将一个有效的文件重命名为相同的名称。在taskmanager和process explorer中也会出现上述效果。但是不同之处在于,使用上述技巧,得在进程启动的同时发生。

 

例如,如果在云中已知二进制哈希,请考虑已经安装的端点保护检查每个已启动的进程。通过此技巧,端点保护可能会使用错误的二进制文件来验证哈希是否为白名单。另外还要注意创建此类进程并不需要调试器,应用程序可以挂钩 NtCreateUserProcess函数并在钩子中就可以实现修改。

 

WINDOWS CMD的技巧:

 

这些技巧与文件系统技巧没有任何关系,但是我认为它们很适合这篇博文。在Windows cmd中,可以在命令中的任何位置写入^符号,CMD将完全忽略掉这个符号。例如,“calc.exe” 和“ca^l^c”效果相同。^是不是最后一个符号不重要,并且两个^符号在相邻时无法使用。使用双引号"隔开就没有限制了(它可以是最后一个字符或多次使用)。例如,^ca^“^”^lc^“将启动计算器。

 

这同样适用于零长度环境变量。可以通过%name%访问环境变量。如果环境变量的长度为零,则“cal%name%c”将与“calc”相同。由于环境变量的默认值长度不为零,因此不能直接使用。但是,可以使用特殊语法(:~start,end)在环境变量上调用substring。下图显示了“windir”环境变量以及子字符串如何与negativ值一起使用以获取返回的零长度变量:

 

图34:环境变量取字符

 

下图显示了这些技术的组合,以隐藏Powershell在版本2中启动(这些技巧在之前很有用,但在最新的Windows 10系统上应该是实现不了):

图35:运行Powershell技巧

 

可以看到使用^和环境变量技巧(%os:~0,-56%),还使用版本“00000000002.0000”(而不仅仅是2)并且参数是“?ver ”不是“-ver”(注意,这不是正常的?符号,它是U+2015 ;光使用?不起作用)。

 

在Windows上除了“\” 也可以把“/”作为路径使用。例如,C:\Windows/\//\system32\calc.exe 与C:\Windows\system32\calc.exe 相同。 而且还可以通过UNC路径访问二进制文件不用 “C:\”模式: \\127.0.0.1\C$\windows\system32\calc.exe。

 

通常可以使用类似的技巧来突破使用黑名单的方法(例如,如果禁止使用Powershell.exe,则攻击者可以调用Power^shell.exe来绕过限制。或者如果禁止使用calc,则可以执行:

^"%LOCALAPPDATA:~-3%^%SYSTEMROOT:~0,1%^"

 

启动calc.exe等)。

 

这篇博客文章由RenéFreingruber (@ReneFreingruber) 代表SEC Consult Vulnerability Lab撰写。James Forshaw(@tiraniddo)将一系列的技术列表文档化。Alex Inführ (@insertScript) 在他的博客文章中记录了一些ADS隐藏技巧。有关ADS之前的参考文献,请参阅以下参考资料部分。

 


参考文献:

  • https://msdn.microsoft.com/en-us/library/dn393272.aspx

  • https://tyranidslair.blogspot.co.at/2014/05/abusive-directory-syndrome.html

  • https://tyranidslair.blogspot.co.at/2014/06/addictive-double-quoting-sickness.html

  • https://googleprojectzero.blogspot.co.at/2016/02/the-definitive-guide-on-win32-to-nt.html

  • https://googleprojectzero.blogspot.co.at/2015/12/between-rock-and-hard-link.html

  • https://googleprojectzero.blogspot.co.at/2015/08/windows-10hh-symbolic-link-mitigations.html

  • http://insert-script.blogspot.co.at/2012/11/hidden-alternative-data-streams.html

  • https://bogner.sh/2017/11/avgater-getting-local-admin-by-abusing-the-anti-virus-quarantine/



附录:

译者注:经过测试Windows XP后微软就禁止用户从ADS里执行程序了。不允许执行,但是写入,读出操作都可以。其实只是禁用了OWASP中提到的start命令,文章中用WMIC运行就很巧妙的绕过封堵,测试方法如下(需要使用绝对路径)。

wmic process call create "C:\ProjectCode\test\test:putty.exe"


文中的zone.identifier是一个文本文件,然后作为数据流存放到了putty.exe里。ADS并不是一个新的话题了,在翻译过程中发现国内有许多相关资料写得都不错,国人很棒棒。根据目前知识量的储备在WinDBG调试部分翻译的词汇翻译不够准确,根据需求请参考原文。

 


文章来源

1)https://www.sec-consult.com/en/blog/2018/06/pentesters-windows-ntfs-tricks-collection/

2)OWASP alternate_data_stream

3)https://www.owasp.org/index.php/Windows_::DATA_alternate_data_stream

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

5)http://www.freebuf.com/articles/73270.html

6)文件流-MSDN说明

7)https://msdn.microsoft.com/en-us/library/dn410405.aspx

8)https://docs.microsoft.com/zh-cn/windows/desktop/FileIO/file-streams

9)Hidden Alternative Data Streams的进阶利用技巧

10)  http://www.4hou.com/technology/4783.html



看雪ID:lipss  

bbs.pediy.com/user-214974


本文由看雪论坛 lipss 原创

转载请注明来自看雪社区



热门技术文章推荐:









 戳原文,看看大家都是怎么说的?

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存