Novell环境的对象列举

/ns/ld/softld/data/20010108023545.htm

发行日期: 2000-11-8
联系人:Simple Nomad

主题:默认设置允许Novell Netware系统信息泄露

受影响的系统:Novell Netware 5.0, 5.1包括最近的补丁

摘要:
由于继承支持和默认设置的结合,使用本地IP的Novell Netware服务器在被特定访问时将通过TCP端口524泄露系统信息。
在混合的Novell/Microsoft环境中,关于Microsoft devices的信息通过Service Advertising Protocol (SAP)表被泄露出去。
第三方产品,诸如那些用于环境之间的同步目录服务更能助长这个问题。本质上,一个远程攻击者可以用控制台命令
"display servers"和DOS命令"cx /t /a /r"在没有鉴定的情况下搜集相同意义上的信息。

影响:

所有运行IP(开放524端口)的Novell Netware服务器可以被查询,所有有公共读权限的对象可以被列举。
诸如帐户名称、服务器服务、以及其他不同的对象信息可以被搜集。 在混合的环境中,象IPX和IP混合的环境,
一些被控制的、以及与基于IP的服务器通话的IPX对象会被泄露;在与Microsoft NT混合的环境中,一些NT 对象会被泄露。
搜集到的信息可能被用来分析出用户帐户名称和技术配置,以用于将来的攻击。

如果没有允许通过防火墙或从内部拨号配置访问端口524,这个影响的范围只限于内部网络。

这类似于依靠Primary或Backup Domain Controller的一个Windows NT空会话的范围。

细节:
Novell已经努力争取使Netware环境尽可能地可连接。 到目前为止,Novell已经开发了一个“纯”TCP/IP环境
(先前工具遭到反对,因为它没有完全将Netware结合到IP世界,如Netware/IP)。分配的端口524用于NCP
(Netware Core Protocol),并且很大程度上与先前的IPX风格非常类似。这允许客户端上运行的基于IPX的普通应用程序
可以和IP-only Netware服务器通话,因为客户端软件按IP包格式“包装”IPX请求并且发送到524端口。

在传统Netware环境中,IPX专用于 客户端-服务器 和 服务器-服务器 的通信。
Netware对象,如打印机,作为服务器的一个客户端,这样当最终用户想要与一台打印机通信时,他或她
可以询问服务器并且得到关于打印机位置的信息。加之,Netware服务器也可以在多种网卡之间发送IPX通信,
以及从其他服务器上获悉其他可用的服务,所有这些都通过IPX。为了保持这样丰富的环境,大多数相关的技术
以向后兼容的思想被转而坚持使用IP。基本上这意味着由于IP不支持它本身可用服务的这种"auto-discovery",
Novell在端口524上使用一种结合包装NCP命令(这命令用于在IPX上)的IP数据包,
在端口427上使用SLP(Service Location Protocol)。

Novell已经非常善于设法确保它不会封锁旧版本Netware与新版本的互用性。
然而,由于它的历史,使用两个或三个以前主要版本的旧的NCP调用仍然可以用来查询服务器。
因为这些调用现在可以在IP中被封装,所以我们可以从非Netware系统进行调用。
又因为这些调用中的多数不是首先由用户鉴别决定的,所以我们可以利用NDS对象
环境中默认NDS树设置的优势


1. 建立TCP连接。以SYN发送TCP数据包到端口524,接收SYN/ACK,以ACK回应。这是你的基础连接。

2.现在我们建立NCP连接。这与IPX以同样方式完成,除非我们用TCP数据包安置数据。 我们以没有NCP数据的NCP报头开始,
使用0x1111连接形式。

NCP (create_conn)
{
// begin NCP request header
u32 sig; // signature identifies the packet type (0x446d6454)
u32 len; // length 0x00000017 (23)
u32 reqbuf; // requested buffer size 0x00000000
u16 reqtype; // request type 0x1111 (create connection)
u8 seq; // initial sequence number 0x00
u8 connlow; // 0xff (255) wildcard
u8 task; // 0x01
u8 connhi; // 0xff (255) wildcard
// end NCP request header
} create_conn_req;

这里是回应:

NCP (create_conn_reply)
{
// begin NCP reply header
u32 sig; // signature
u32 len; // length 0x00000010 (16)
u16 reqtype; // reply 0x3333
u8 seq; // initial sequence number 0x00
u8 connlow; // 0x0e (14) <--\
u8 task; // 0x01 >-- connection number
u8 connhi; // 0x00 (0) <--/
// end NCP reply header
// begin data section
u8 cc; // completion code 0x00 (OK)
u8 cs; // connection status flags 0x00 (OK)
// end data section
} create_conn_rep;

3. 现在我们做一个服务器信心调用请求来搜集关于服务器的基础信息。

NCP (server info request)
{
// begin NCP header
u32 sig; // signature (0x446d6454)
u32 len; // length = 0x0000001a (26)
u32 ver; // version = 0x00000001
u32 bufreply; // reply buffer size = 0x00000080 (128)
u16 reqtype; // 0x2222 (request)
u8 seq; // 0x01 sequence number is incremented by one
u8 connlow; // Conn low 0x0e (14)
u8 task; // Task # 0x01
u8 connhi; // Conn hi 0x00 (0)
// end NCP header
// Request/sub-function code = 23,17
u32 req; // 0x17000111 (23,0,1,17)
} server_info_req;

注意,我们从1开始增加序列号。这是旧IPX数据包的序列号配置,从1开始增加,直到序列号为255,然后重置它为0。

在回应中我们取回一串信息:

NCP (server info reply)
{
// begin NCP header
u32 sig; // 4 byte signature
u32 len; // length = 0x00000090 (144)
u16 reqtype; // 0x3333 (reply)
u8 seq; // 0x01 sequence number
u8 connlow; // Conn low 0x0e (14)
u8 task; // Task # 0x01
u8 connhi; // Conn hi 0x00 (0)
// end NCP header
// Reply/sub-function code = 23,17
u8 cc; // completion code = 0x00 (ok)
u8 cs; // connection status flags = 0x00 (ok)
u8[47] svrname; // object name = 0x50 41 4e (PAN)
u8 ser_ver; // file service version = 0x05
u8 ser_subver; // file service sub-version = 0x00
u16 max_conn; // max service connections = 0x000e
u16 conn_use; // connections in use = 0x0000
u16 max_vols; // maximum volumes = 0x00ff
u8 rev; // revision = 0x00
u8 sft; // sft level = 0x02
u8 tts; // tts level = 0x01
u16 max_used; // max conn ever used = 0x01
u8 acct; // account version = 0x01
u8 vap; // VAP version = 0x01
u8 queue; // Queue version = 0x01
u8 print; // Print version = 0x00
u8 virt_con; // Virtual console version = 0x01
u8 int_brdg; // Internet bridge = 0x01
} server_info_rep;

现在我们知道服务器的名字是PAN,它是Netware 5.0,以及一些其他的项目。

4.执行一个NDS ping,返回NDS树名称。 NDS PING是用来说明服务器是否正在运行的。
客户端通常将这些数据包发送到第一个可用的服务器。 我们将了利用它,因为它允许我们不通过鉴别而确定树的名称。

NCP (NDS_ping)
{
// begin NCP header
u32 sig; // signature (0x446d6454)
u32 len; // length = 0x0000001b (27)
u32 ver; // version = 0x00000001
u32 bufreply; // reply buffer size = 0x00000028 (40)
u16 reqtype; // 0x2222 (request)
u8 seq; // 0x02 sequence number is incremented by one
u8 connlow; // Conn low 0x0e (14)
u8 task; // Task # 0x01
u8 connhi; // Conn hi 0x00 (0)
// end NCP header
// Request/sub-function code = 104,0
u32 req; // 0x68010000 (104,1,0,0)
} NDS_ping_req;

这里是回应:

NCP (NDS_ping_reply)
{
// begin NCP reply header
u32 sig; // signature
u32 len; // length 0x00000010 (16)
u16 reqtype; // reply 0x3333
u8 seq; // 0x02 sequence number
u8 connlow; // 0x0e (14) <--\
u8 task; // 0x01 >-- connection number
u8 connhi; // 0x00 (0) <--/
// end NCP reply header
// begin data section
u8 cc; // completion code 0x00 (OK)
u8 cs; // connection status flags 0x00 (OK)
u32 u1; // unknown
u32 treelen; // length of tree name
u8[21] treename;// 0x54 45 53 54 (in this example, TEST)
u32 objid; // object ID of tree
// end data section
} NDS_ping_rep;

现在我们得到了DNS树名称.

5. 最后,发送一个Scan Bindery Object循环请求,我们就能够列举出至少有公共读权限的所有对象。

NCP (scan bindery object request)
{
// begin NCP header
u32 sig; // signature (0x446d6454)
u32 len; // length = 0x00000022 (34)
u32 ver; // version = 0x00000001
u32 bufreply; // reply buffer size = 0x00000039 (57)
u16 reqtype; // 0x2222 (request)
u8 seq; // 0x03 (3) sequence number
u8 connlow; // Conn low 0x0e (14)
u8 task; // Task # 0x01
u8 connhi; // Conn hi 0x00 (0)
// end NCP header
// Request/sub-function code = 23,55
u32 req; // 0x17000837 (23,0,8,55)
u32 lastobj; // Last object ID seen = 0xffffffff (wild card)
// start with ffffffff and simply use the last
// object ID that was retrieved
u16 objtype; // Object type = 0xffff (wildcard)
u16 search; // search string = 0x012a ("*")
} scan_bin_obj_req;

这里是一个回应例子:

NCP (scan bindery object reply)
{
// begin NCP header
u32 sig; // signature (0x446d6454)
u32 len; // length = 0x00000049
u32 reqtype; // 0x3333 = (reply)
u8 seq; // 0x03 (3) sequence number
u8 connlow; // Conn low 0x0e (14)
u8 task; // Task # 0x01
u8 connhi; // Conn hi 0x00 (0)
// end NCP header
u8 cc; // completion code = 0x00
u8 cs; // connection status flags = 0x00
u32 obj_id; // object ID found (0xc20000a1)
u16 objtype; // object type = 0x0004 (server)
u8[48] objname; // object name = 0x50 41 4e (PAN)
u8 objflag; // object flag = 0x00 (static)
u8 sec; // security status = 0x40 (0100 write access for svr,
0000 read access for all)
u8 statflags; // status flags = 0xff (has properties)
} scan_bin_obj_rep;

有趣的是,如果名为[Public]的NDS树对象有浏览权,除了被Inherited Rights Filters限制的以外
其他所有对象将被列举出来,例如,用户名。 Novell的默认设置是[Public]有浏览权。

除了列举NDS对象外,所有SAP表中的动态列表都将被列出。 这不仅仅包括环境中附加的Novell服务,
如IP Novell系统正在与之对话的非IPNovell系统,还包括其他厂家的硬件和软件产品。
举了例子来说,0x0640型的SAP是适于NT RPC服务的,0x64e型则是适于NT IIS服务器的。
使用SAP表的信息以及查阅Novell-assigned SAP types列表,可以列举出不同的配置技术。

Novell环境公认的广告文件和出版服务的Microsoft系统可以通过0x0640 SAP类型列举出他们计算机的Netbios名称。

虽然NDS树结果的浏览可以通过调整NDS树结果的默认权限而受到限制,但这并不能限制信息由SAP表而泄露出去。

建议:

由于通过524端口会泄露一定数量的信息,建议锁定从INTERNET访问端口524。NDS对象[Public]不应有浏览权,
树结构应该只限于授权的用户,所以取消[Public]的浏览权。用ncpquery [2]来检查看看通过524端口泄露了什么。
内部威胁难于防范,特别是通过动态SAP表泄露的信息,但取消[Public]的浏览权至少限制了用户名的泄露。