如何修改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端口,也可以改成其他。

 
===》这个是04年的一个文章写的,所以未必有效。。。。
 
下面是比较新的做法:

winserver如何修改smb服务的默认445端口? RRS feed

  • שאלה

  • 如题,比如将默认445端口修改成4455。

    以及,修改后该使用什么方式来访问,是否用“\\ip:新端口号”的方式来访问呢?


    暴躁老哥,在线发飙 Grumpy man have a cow online

    יום רביעי 30 דצמבר 2020 09:05
     

תשובות

  •  

    您好,

    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

    本文介绍如何通过 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 流量与早期操作系统进行通信:

    1. 选择 "开始**",设置,** 然后选择"网络和 拨号连接"。
    2. 右键单击 "本地连接", 然后选择"属性 "。
    3. 选择 "INTERNET 协议 (TCP/IP) ", 然后选择"属性 "。
    4. 选择“高级”。
    5. 选择 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
    ; ------------------------------------------------------------------------
     
posted @ 2022-07-28 17:59  bonelee  阅读(6588)  评论(0编辑  收藏  举报