如何修改smb服务的默认445端口?——官方回答是无法修改,但是可以使用端口转发
修改SMB 445端口方法
前几天的永恒之蓝,导致把445端口封掉了,可项目中用到smb协议(默认端口是445),解决办法,把smb端口改成其他,具体如下:
首先要关闭445端口,可以参考微软KB 301673中的方法,在注册表的
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/NetBT/Parameters
中增加一个值:
Value Name: SmbDeviceEnabled
Type: REG_DWORD
Value Data: 0
然后重新启动系统。
在注册表中增加:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Smb]
"SessionPort"=dword:0000022b
"DatagramPort"=dword:0000022b
上面的端口为16进制
我这里改成了555端口,也可以改成其他。
winserver如何修改smb服务的默认445端口?
-
שאלה
-
תשובות
-
SMB端口445是无法更改的,但是可以使用端口转发的方式,将445端口转发到4455端口上。
原理如下:SMB客户端—连接—>端口转发—连接—>SMB服务端。
请问您的SMB客户端和服务器都是什么版本的?如果是server2012,windows10及以上版本,您可以遵循如下步骤进行端口转发:共享文件服务端口设置
端口转发成功后,通过\\127.0.0.1的形式访问到远程服务器共享。
Please remember to mark the replies as answers if they help.
If you have feedback for TechNet Subscriber Support, contact tnmff@microsoft.com通过 TCP/IP 的直接主机 SMB
- 项目
- 2021/12/07
本文介绍如何通过 TCP/IP (SMB) 主机服务器消息阻止。
适用于: Windows Server 2012 R2
原始 KB 编号: 204279摘要
Windows TCP 上直接托管的 SMB 协议支持文件和打印机共享通信。 SMB 1.0 和较旧的 CIFS 流量支持 NetBIOS over TCP (NBT) 协议支持 UDP 传输,但从 Windows Vista 和具有 SMB 2.0.2 的 Windows Server 2008 开始,需要端口 445 上的 TCP/IP。 删除 NetBIOS 传输具有多个优点,包括:
- 简化 SMB 流量的传输。
- 删除 WINS 和 NetBIOS 广播作为名称解析的一种途径。
- 在 DNS 上标准化文件和打印机共享的名称解析。
- 删除安全性不太安全的 NetBIOS 协议作为攻击方法
如果同时启用了直接托管接口和 NBT 接口,则同时尝试这两种方法,并且使用第一个响应方法。 此机制Windows支持 SMB 流量直接托管的操作系统正常运行。
更多信息
Tcp 上的 NetBIOS 通常使用下列端口:
- NBName:137/UDP
- NBName:137/TCP
- NBDatagram:138/UDP
- NBSession:139/TCP
直接托管 的无 NetBIOS SMB 流量使用端口 445 (TCP) 。 在这种情况下,四字节标头位于 SMB 流量之前。 此标头的第一个字节始终0x00,接下来的 3 个字节是剩余数据的长度。
使用以下步骤禁用通过 TCP/IP 的 NetBIOS。 此过程强制所有 SMB 流量直接托管 SMB 流量。 请谨慎实现此设置,因为它会导致基于 Windows 的计算机无法使用 SMB 流量与早期操作系统进行通信:
- 选择 "开始**",设置,** 然后选择"网络和 拨号连接"。
- 右键单击 "本地连接", 然后选择"属性 "。
- 选择 "INTERNET 协议 (TCP/IP) ", 然后选择"属性 "。
- 选择“高级”。
- 选择 WINS 选项卡,然后选择"禁用 TCP/IP 上的 NetBIOS"。
您还可以使用 DHCP 服务器禁用 NetBIOS over TCP/IP,该服务器将 Microsoft 供应商特定的选项配置为代码 1,禁用 NetBIOS over TCP/IP。 将此选项设置为值 2 可禁用 NBT。 有关使用此方法的信息,请参阅 DHCP Server Help file in Windows。
若要确定基于 TCP/IP 的 NetBIOS 是否Windows,在命令提示符下运行
net config redirector
或net config server
命令。 输出显示 NetbiosSmb 设备 (它是无 NetBIOS 的传输) 和 NetBT_Tcpip 设备 (它是 NetBIOS over TCP 传输) 。 例如,以下示例输出显示绑定到适配器的直接托管传输和 NBT 传输:控制台Workstation active on NetbiosSmb (000000000000) NetBT_Tcpip_{610E2A3A-16C7-4E66-A11D-A483A5468C10} (02004C4F4F50) NetBT_Tcpip_{CAF8956D-99FB-46E3-B04B-D4BB1AE93982} (009027CED4C2)
NetBT_Tcpip绑定到每个适配器。 系统NetBT_Tcpip绑定到的每个网络适配器显示一个网络适配器实例。 NetbiosSmb 是一种全局设备,不基于每个适配器进行绑定。 因此,除非完全禁用 Microsoft 网络的文件和打印机Windows,否则无法禁用直接托管 SMB。
-----------------------------------------------------------------修改Windows SMB相关服务的默认端口
wangyangcheng2004-08-26 05:10:51
修改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
; ------------------------------------------------------------------------