NASL最新smb_nt.inc中函数原型与参考手册的几处差异

前几天学习用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])来判断某个键是否存在。

Leave a Reply

Your email address will not be published. Required fields are marked *