首页 | 安全文章 | 安全工具 | Exploits | 本站原创 | 关于我们 | 网站地图 | 安全论坛
  当前位置:主页>安全文章>文章资料>网络安全>文章内容
修改Windows SMB相关服务的默认端口
来源:www.xfocus.org 作者:tombkeeper 发布时间:2004-08-09  

修改Windows SMB相关服务的默认端口

作 者:于旸
邮 件:tombkeeper[0x40]nsfocus[0x2e]com
tombkeeper[0x40]xfocus[0x2e]org
完成于:2004.07.22
关键字:SMB、NetBT、NetBios、netbt.sys、默认端口


Windows NT系列操作系统的NetBT(NetBios Over Tcpip)服务,是用来处理SMB
(Server Message Block)相关的服务/客户操作的。

NetBT服务对应的驱动程序文件是netbt.sys,对应的注册表项是:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT。
微软的KB 120642和KB 314053分别描述了Windows NT、Windows 2000、Windows XP上
该键值的部分可选参数。

NetBT服务对应的在Windows NT 4.0上对应的端口是:

NameservicePort 137/UDP
DatagramPort 138/UDP
SessionPort 139/TCP

从Windows 2000开始,微软引入了SMB Direct Over TCP的445端口。上述的137、
138、139 端口虽然被保留,并可正常工作,但是默认情况下,系统总是会使用445端
口进行SMB会话,仅在445端口工作失败的情形下,才会使用139端口作为SessionPort。
445端口默认情况下是始终开放的。如果要关闭该端口,可以参考微软KB 301673中的
方法,在
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\NetBT\Parameters
中增加一个值:

Value Name: SmbDeviceEnabled
Type: REG_DWORD
Value Data: 0

然后重新启动系统。

顺便提一下,如果要关闭139端口,可以参考微软的KB 299977:

1、 单击开始,指向设置,然后单击网络和拨号连接。
2、 单击您希望静态配置的本地连接,单击文件菜单中的属性。
3、 单击 Internet 协议 (TCP/IP),单击属性,单击高级,然后单击 WINS 选项卡。
4、 单击禁用 TCP/IP 上的 NetBIOS。
5、 单击确定,单击确定,再次单击确定。

修改会立即生效,不必重新启动系统。

这个445 端口可不可以改成别的值呢?分析netbt.sys可知,服务初始化的时候,
函数NbtReadRegistry分别调用ReadParameters和ReadSmbDeviceInfo从注册表中获取
NetBT服务的配置信息:

; ------------------------------------------------------------------------
push [ebp+Handle]
push offset _NbtConfig
call _ReadParameters@8 ; ReadParameters(x,x)
push [ebp+KeyHandle]
call _ReadSmbDeviceInfo@4 ; ReadSmbDeviceInfo(x)
; ------------------------------------------------------------------------

ReadParameters读取的注册表值就在上面提到的三篇KB中基本都有相关说明,但
是ReadSmbDeviceInfo 所获取的信息,似乎还没有现成的文档描述。下面是逆向工程
出来的5.0.2195.6783版本netbt.sys的ReadSmbDeviceInfo函数:

; ------------------------------------------------------------------------
; __stdcall ReadSmbDeviceInfo(KeyHandle)

KeyHandle = dword ptr 8

push ebp
mov ebp, esp
lea eax, [ebp+KeyHandle]
push esi
push eax ; KeyHandle
push offset aParametersSmb ; "Parameters\Smb"
push [ebp+KeyHandle] ; int
call _NbtOpenRegistry@12 ; NbtOpenRegistry(x,x,x)
mov esi, eax
test esi, esi
jl short SetDefaultPort ;如果键不存在则转向去设置默认值
push 1
push 1BDh ; 默认值445
push offset aSessionport ; "SessionPort"
push [ebp+KeyHandle]
call _NbtReadSingleParameter@16 ; NbtReadSingleParameter(x,x,x,x)
push 1
push 1BDh ; 默认值445
push offset aDatagramport ; "DatagramPort"
mov word_2BA88, ax
push [ebp+KeyHandle]
call _NbtReadSingleParameter@16 ; NbtReadSingleParameter(x,x,x,x)
push [ebp+KeyHandle] ; Handle
mov word_2BA8A, ax
call ds:__imp__ZwClose@4 ; __declspec(dllimport) ZwClose(x)
jmp short Return

SetDefaultPort:
mov SessionPort, 1BDh ;设置SessionPort为445
mov DatagramPort, 1BDh ;设置DatagramPort为445

Return:
mov eax, esi
pop esi
pop ebp
retn 4
; ------------------------------------------------------------------------

显然,ReadSmbDeviceInfo会先试图打开
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\NetBT\Parameters\Smb
然后分别读取SessionPort 和DatagramPort,根据其中的值来设置相关端口。如果打
开键失败,则转向 SetDefaultPort,将两个端口设置为默认的445,如果读取值失败,
NbtReadSingleParameter的第三型参也指定了默认的返回值445。

SessionPort 和DatagramPort分别对应TCP和UDP的端口。不过我从来没有见到过
UDP的SMB会话,所以,还是SessionPort更加重要一些。

然后NbtCreateAddressObjects根据这些信息,来打开端口,创建服务:

; ------------------------------------------------------------------------
mov eax, [ebp+var_8]
mov cx, SessionPort ; tcp端口值
mov esi, offset aSmbserver ; "*SMBSERVER "
mov [eax+1F2h], cx
mov eax, [ebp+var_8]
mov cx, DatagramPort ; udp端口值
mov [eax+1F6h], cx
mov eax, [ebp+var_8]
mov [eax+1F4h], di
mov eax, [ebp+var_8]
lea edi, [eax+1F8h]
movsd
movsd
movsd
movsd
push [ebp+var_8]
push 0
push 7F000001h
call _NbtCreateAddressObjects@12 ; NbtCreateAddressObjects(x,x,x)
; ------------------------------------------------------------------------

明确了流程,方法也就出来了。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\NetBT\Parameters\Smb
这个项默认情况下是没有的,所以程序总是会转向SetDefaultPort,如果我们手工创
建Smb 项和下面的两个值,系统就会按照我们创建的值来设定端口。这是最简单的办
法。当然,如果你愿意,手工修改netbt.sys 也是可以的。下面是一个把端口设定为
555的注册表例子:

; ------------------------------------------------------------------------
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Smb]
"SessionPort"=dword:0000022b
"DatagramPort"=dword:0000022b
; ------------------------------------------------------------------------

上面提到的修改,会同时影响服务器和客户端。也就是说,如果我们把端口改为
555,那么不但本机的SMB Direct Over TCP会监听555端口,访问其他机器的SMB服务
时也会尝试往555 端口连接。也就是说,假使我们将两台计算机做同样的修改,那么
这两台计算机之间可以正常互访共享,但是其它计算机则不能访问它们。

修改这个端口有什么用处呢?

1、 研究中有时候需要使用本机的445端口,例如做一些SMB会话劫持的试验。

2、 如果希望通过阻塞了445、139等端口的防火墙来访问网络共享,可以将服务器和
客户端的SessionPort都设为80,这样,两者之间就会通过80端口进行SMB会话。
而且,一般来说,这种修改并不会影响对其他正常服务器的访问,因为对80建立
连接失败后,客户端会自动转用139端口。

3、 如果我们按照一开始提到的方法,禁用139 端口,并且将一个网络内所有的系统
都修改为一个共同的值,那么这些机器相互之间的共享访问仍然不受任何影响,
但是任何外来的访问都会失败。这在某种程度上可以增强安全性,抵御恶意入侵
和一些蠕虫。

139 端口可不可以改为其它的呢?也是可以的,不过,没有像上面那样优雅的方
法,只能靠修改netbt.sys文件或者动态修改内存中相应的位置。5.0.2195.6783版本
netbt.sys设定端口部分的代码如下:

; ------------------------------------------------------------------------
66 C7 86 F2 01 00 00 8B 00 mov word ptr [esi+1F2h], 8Bh ; 139
66 C7 86 F4 01 00 00 89 00 mov word ptr [esi+1F4h], 89h ; 137
66 C7 86 F6 01 00 00 8A 00 mov word ptr [esi+1F6h], 8Ah ; 138
; ------------------------------------------------------------------------

Windows XP和Windows 2003上的相关结构和Windows 2000不同,代码有些差别,
下面是5.2.3790.69版本netbt.sys设定端口部分的代码:

; ------------------------------------------------------------------------
66 C7 86 F8 01 00 00 8B 00 mov word ptr [esi+1F8h], 8Bh ; 139
66 C7 86 FA 01 00 00 89 00 mov word ptr [esi+1FAh], 89h ; 137
66 C7 86 FC 01 00 00 8A 00 mov word ptr [esi+1FCh], 8Ah ; 138
; ------------------------------------------------------------------------

显然,Opcode之间的差别也就是偏移量,所以很容易写出可以支持Windows 2000、
Windows XP和Windows 2003的动态或者静态Patch代码。


参考:

Windows 2000 或 Windows NT 的 TCP/IP 和 NBT 配置参数:
http://support.microsoft.com/default.aspx?kbid=120642

Windows XP 的 TCP/IP 和 NBT 配置参数:
http://support.microsoft.com/default.aspx?kbid=314053

You Cannot Make More Than One Client Connection Over a NAT Device
http://support.microsoft.com/default.aspx?kbid=301673



 
[推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文章
·一句话木马
·samcrypt.lib简介
·教你轻松查看QQ空间加密后的好友
·web sniffer 在线嗅探/online ht
·SPIKE与Peach Fuzzer相关知识
·asp,php,aspx一句话集合
·Cisco PIX525 配置备忘
·用Iptables+Fedora做ADSL 路由器
·检查 Web 应用安全的几款开源免
·Md5(base64)加密与解密实战
·NT下动态切换进程分析笔记
·风险评估中的渗透测试
  相关文章
·对Native API NtSystemDebugCont
·缓冲区溢出攻防
·全面分析黑客常用的九种攻击方法
·如何在评测之外粗略评价NIDS的检
·利用系统fingerprint 协助网络事
·补丁管理最佳安全实践之资产评估
·补丁管理框架
·风险评估应用技术和工具初探
·某大型企业局域网安全解决方案
·关于netflow在大网安全应用的两
·使用 OpenSSL API 进行安全编程
·另外一种隐藏LKM的方法
  推荐广告
CopyRight © 2002-2022 VFocuS.Net All Rights Reserved