扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
日志功能中使用vsphntf()在日志文件中生成字符串,日志文件名为NetSetup.LOG,它保存在%SYSTEMROOT%\debug目录中。这个记录函数有部分处理Workstation服务命令的函数调用,如NetValidateName、NetJoinDomain等。在NetValidateName()这个函数中,computer name作为第二个参数最终记录在日志文件中。
例如,我们使用如下形式调用NetValidateName()APL
NetValidateName(L"\\\\192.168.0.100","AAAAAAAA",NULL,NULL,0);
那么,我们可以在远程主机中产生如下记录条目:
08/13 13:01:01 NetpValidateName:checking to see if''is valid as type 0 name 08/13 13:01:01 NetpValidateName:''is not a valid NetBIOS\\AAAAAAAA name:0x57
如果我们指定超长字符串作为NetVaUdateName()API的第二个参数,如果调试文件可写就可以在特定主机上发生缓冲区溢出。
一般如果是NTFS文件系统,在Windows目录中的debug目录不允许所有人可写,这表示不能使用NULL会话来生成日志。因为WsImpersonateClien()API在打开日志文件前调用,如果连接客户端没有有效的权限来写日志文件,那么CreateFUe()就会失败,vsphntf()就不会被执行,因此此漏洞在FAT32系统和%SYSTEMROOT%\debug目录可写的情况下可被利用。
但是,在WindowsXP上实现了部分扩展的RPC函数,这些函数在调用WsImpersonateClient()前打开日志文件,不过这些RPC函数没有提供文档化说明,但可以通过观察WKSSVC.DLL中的函数表得到。这些扩展命令的RPC号开始于OxlB,如OXlB调用NetpManageComputers(),但在打开日志文件前不调用WsImpersonateClient()。
NetpManageComputers()的使用没有被公开化,但是我们可以在LMJoin.h中找到NetAddAlternateComputerName()API的原型定义,这个API从NETAPI32.DLL导出,这个API也一样没有文档化。
我们可以使用如下形式调用这个RPC函数
(0x1B):
NetAddAlternateComputerName(L"\\\\192.168.0.200",LONG_UNICODE_STRING,0,0,0);
使用上述方法,我们不需要任何特殊权限(只需要有能建立IPCNULLSession的权限),便可使得远程主机把第二个参数写到它的日志文件中去,如定义超长Unicode字符串作为第二个参数("AltemateName"),在第一个参数指定的的远程系统就会由于缓冲区溢出而崩溃。Unicode字符串long_unicode_string会在日志记录函数调用前被转换为ASCII字符串。
从以上的详细技术信息中,我们可以得知有两种攻击方法。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者