前几天学习用NASL写简单的Nessus脚本做一些主机信息搜集。在使用过程中发现最新版的smb_nt.inc中实现的SMB库函数与NASL参考手册有几处差异,在此公布,以便遇到错误的朋友们免去调试之苦。
本文涉及的smb_nt.inc版本号为1.84,参考手册为Michel Arboi . The NASL2 reference manual.www.nessus.org/doc/nasl2_reference.pdf 。
1、smb_nt.inc文件
我使用Nessus 4.2 for Windows,在安装并下载插件后,smb_nt.inc只有82B,没有实际内容。因此,接下来调用任何SMB函数都会报错。
为了正常使用,我在
http://www.nessus.org/plugins/smb_nt.inc
下载了大小为95KB的smb_nt.inc,版本号为1.84,由Tenable官方提供。
2、smb_session_request()
文档的定义是:
smb_session_request(soc,remote)
而1.84版头文件中定义为:
smb_session_request(soc,remote,transport)
其中参数transport表示建立会话使用的端口号。在实际调试中,发现这个参数不能省略,否则session无法建立,将造成下一步SMB登陆协议协商中产生未定义的错误(NBSS协议中, Negative session response时发生错误,类型为Unspecified error,代码为8F,在RFC1002 4.3.4节定义了这个错误类型)。
3、smbntcreatex()
文档的定义是:
smbntcreatex(soc,uid,tid)
而头文件中定义为:
smbntcreatex(soc,uid,tid,name)
其中name的值为”\winreg”,也是一个不能省略的参数。
4、registry_get_key()
关于注册表键访问函数registry_get_key,文档中指出,当键不存在时,返回NULL。
在实际调试中,发现并非如此。事实上,无论键是否存在,返回的都是108字节信息,经过对传输数据的分析,发现包括SMB协议数据中以下部分:NetBIOS Session Service、SMB、SMB Pipe Protocol、DCE RPC Response、Remote Registry Service,即整个SMB数据块。
因而,并不能通过直接判空来确定注册表某个键是否存在。通过对比,发现存在和不存在的区别,体现在最后四个字节,即Remote Registry Service部分的错误代码字段,存在时为0×00000000,不存在时为0×02000000。因此,在程序中,我使用的if(key_h[104])来判断某个键是否存在。