精华内容
下载资源
问答
  • 创建27017端口
    千次阅读
    2020-11-12 09:42:54

    一、漏洞危害

    对外开放的MongoDB服务,未配置访问认证授权,无需认证连接数据库后对数据库进行任意操作(增、删、改、查高危动作),存在严重的数据泄露风险。

    二、漏洞成因

    MongoDB服务安装后,默认未开启权限验证。如果服务监听在0.0.0.0,则可远程无需授权访问数据库。

    3.0之前版本的MongoDB,默认监听在0.0.0.0,3.0及之后版本默认监听在127.0.0.1。

    3.0之前版本,如未添加用户管理员账号及数据库账号,使用--auth参数启动时,在本地通过127.0.0.1仍可无需账号密码登陆访问数据库,远程访问则提示需认证;

    3.0及之后版本,使用--auth参数启动后,无账号则本地和远程均无任何数据库访问权限。

    三、漏洞验证

    MongoDB存在未授权访问漏洞时,使用MongoDB的高版本shell工具mongo(高版本兼容低版本)直接连接成功,执行show dbs命令,无报错信息,列表存在默认库local库,则判断存在未授权访问(local库即便删除,重启MongoDB后仍会生成)。

    C:\ "C:\Program Files\MongoDB\Server\4.0\bin\mongo.exe" 127.0.0.1
    
    > show dbs
    admin   0.000GB
    config  0.000GB
    local   0.000GB
    test    0.000GB

    部分版本默认不存在admin库,但如果创建了用户管理员账号,这个库一定存在,如果存在admin库,可以进入该库查看是否有用户,有用户则表示添加了用户管理员账号,但未使用--auth参数启动。

    > use admin
    switched to db admin
    > show users
    {
            "_id" : "admin.admin",
            "user" : "admin",
            "db" : "admin",
            "roles" : [
                    {
                            "role" : "userAdminAnyDatabase",
                            "db" : "admin"
                    }
            ],
            "mechanisms" : [
                    "SCRAM-SHA-1",
                    "SCRAM-SHA-256"
            ]
    }

    也可以使用图形化界面管理工具连接服务进行测试。

    Robo 3T下载地址:https://robomongo.org/download,建议使用1.2.1版本,使用1.3及之后版本的话,服务端如果使用较低版本MongoDB,存在未授权访问时仍无法连接。

    四、整改建议

    4.1. 方案1:本地监听

    如MongoDB只需在本地使用,建议只在本地开启监听服务,使用--bind_ip 127.0.0.1绑定监听地址。

    $ mongod --bind_ip 127.0.0.1 --dbpath /tmp/test

    或:在配置文件中指定监听IP,Linux下默认配置文件为/etc/mongod.conf。

    # network interfaces
    net:
      port: 27017
      bindIp: 127.0.0.1

    指定配置文件启动

    mongod --config /etc/mongod.conf

    3.0及之后版本的MongoDB,监听服务默认在127.0.0.1开启。

    4.2. 方案2:限制访问源

    如果仅对内网服务器提供服务,建议禁止将MongoDB服务发布到互联网上,并在主机上通过防火墙限制访问源IP。

    Linux主机,使用iptables进行限制:

    iptables -A INPUT -s <ip-address> -p tcp --destination-port 27017 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27017 -m state --state ESTABLISHED -j ACCEPT

    <ip-address>替换成需访问MongoDB服务的IP;第一条规则允许外部应用访问MongoDB默认服务端口27017,第二条规则允许MongoDB外出流量到达外部应用。Windows主机,可以通过图形管理界面添加防火墙策略或使用netsh命令添加,参考文档:https://docs.mongodb.com/manual/tutorial/configure-windows-netsh-firewall/

    4.3. 方案3:启动基于角色的登录认证功能

    MongoDB支持SCRAM、x.509证书认证等多种认证机制,SCRAM(Salted Challenge Response Authentication Mechanism)是3.x版本的默认认证机制,该机制通过用户名、密码验证,基于用户角色进行访问控制。下面是添加账号认证的方法:

    MongoDB 3.0及以上版本启动时添加--auth参数开启认证访问,此时若数据库中无账号,本地登录则无权限进行任何操作,因此需要先以无认证的方式启动服务并创建系统用户管理员账号。

    1)以无访问认证的方式启动MongoDB

    $ mongod --dbpath /data/db

    2)未开启认证的环境下,登录到数据库

    $ mongo --host 127.0.0.1 --port 27017
    MongoDB shell version v4.0.8
    connecting to: mongodb://127.0.0.1:27017/test?gssapiServiceName=mongodb

    3)创建系统用户管理员创建一个用户名为myUserAdmin,密码为Passw0rd的系统用户管理员账号。

    #切换到admin库:
    > use admin
    switched to db admin
    
    #创建用户
    > db.createUser(
      {
        user: "myUserAdmin",
        pwd: "Passw0rd",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
      }
    )
    
    #创建成功后提示信息:
    Successfully added user: {
        "user" : "myUserAdmin",
        "roles" : [
            {
                "role" : "userAdminAnyDatabase",
                "db" : "admin"
            }
        ]
    }

    说明:3.0之前版本使用db.addUser方法创建用户。

    4)重启MongoDB服务,开启访问认证启动时添加--auth参数

    $ mongod --auth --port 27017 --dbpath /tmp/test

    或:在配置文件中添加以下内容,指定配置文件启动服务:

    #security:
    security:
      authorization: enabled

    指定配置文件启动MongoDB

    $ mongod --config /etc/mongod.conf

    5)使用系统用户管理员账号登录

    $ mongo --port 27017 -u "myUserAdmin" -p "Passw0rd" --authenticationDatabase "admin"

    也可以在连接MongoDB是不指定认证信息,连接成功后通过db.auth()方法进行认证:

    > use admin
    switched to db admin
    > db.auth("myUserAdmin","Passw0rd")
    1  #返回1,表示认证成功

    6)创建数据库用户创建完系统用户管理员账号并通过系统用户管理员登陆后,对每个库创建指定的用户。下面以对products库创建一个具有读写权限的用户accountUser为例:

    > use products
    > db.createUser(
       {
         user: "accountUser",
         pwd: "password",
         roles: [ "readWrite", "dbAdmin" ]
       }
    )
    
    #用户创建成功
    Successfully added user: { "user" : "accountUser", "roles" : [ "readWrite", "dbAdmin" ] }

    7)使用数据库用户访问指定库

    $ mongo --port 27017 -u "accountUser" -p "password" --authenticationDatabase "products"

    五、MongoDB安装

    5.1. Windows下安装

    MongoDB支持以下系统:

    Windows 7/Server 2008 R2

    Windows 8/2012 R2 and later

    Windows 2012 Server和Windows 10需要安装KB2999226用以提供C Runtime支持。

    1. 下载安装文件MongoDB Download Center操作系统(OS)选择Windows 64-bit x64,然后点击Download按钮进行下载。

    2. 安装MongoDB双击下载好的MSI文件开始安装,注意不要勾选“Install MongoDB as a Service”。

    3. 启动服务在C盘根目录下创建一个目录data,用于存放MongoDB数据文件。使用管理员权限开启CMD窗口,执行以下命令:

    "C:\Program Files\MongoDB\Server\4.0\bin\mongod.exe" --bind_ip 0.0.0.0 --port 27017 --dbpath="c:\data"

    5.2. Ubuntu下安装

    1. 添加MongoDB GPG公钥

    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4

    2. 添加MongoDB软件源需根据Ubuntu版本添加软件源

    Ubuntu 14.04 (Trusty)

    echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list

    Ubuntu 16.04 (Xenial)

    echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list

    Ubuntu 18.04 (Bionic)

    echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list

    3. 更新软件包列表

    sudo apt-get update

    4. 安装MongoDB

    sudo apt-get install -y mongodb-org

    1.启动服务在/tmp目录下创建一个文件夹,用于存放MongoDB数据库文件(实际生产环境中根据需求指定MongoDB目录路径,严禁存放在/tmp目录下)。执行以下命令启动服务

    mongod --bind_ip 0.0.0.0 --port 27017 --dbpath /tmp/mongodb_test

    六、各类工具检测漏报原因分析

    6.1. Python脚本检测

    网上流传的各类Python检测脚本,主要检测方式是以下两种:

    1.一种检测方式是使用Python的PyMongo库,不使用账号密码连接MongoDB服务,连接成功则证明存在未授权访问漏洞。由于PyMongo库只支持MongoDB 2.6及之后版本,低版本MongoDB存在漏洞时无法发现。

    2.另一种检测方式是使用socket与MongoDB服务端口建立连接后发送数据库查询指令,返回的数据中,存在默认库local,则表示数据库查询成功,存在未授权访问漏洞。在1.9版本的MongoDB服务中,报错信息中包含local字符,引起误报。

    6.2. Nmap脚本

    Nmap的mongodb-brute脚本,先判断是否开启验证,如果开启验证再判断是否存在弱口令。脚本运行的条件是端口为27017或服务名称为mongodb,由于Nmap端口检测结果中的服务名称是mongod,名称不一致,脚本不运行,存在漏报。另外脚本执行过程中,脚本执行出错,也会引起漏报。

    该问题已向Nmap提交更新请求,检测非默认端口的MongoDB服务。https://github.com/nmap/nmap/issues/1565

    七、Python检测脚本示例

    def mongodb(self, ip):
        try:
            socket.setdefaulttimeout(timeout)
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((ip, 27017))        s.send('\x3F\x00\x00\x00\x7E\x00\x00\x00\x00\x00\x00\x00\xD4\x07\x00\x00\x04\x00\x00\x00\x61\x64\x6D\x69\x6E\x2E\x24\x63\x6D\x64\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\x18\x00\x00\x00\x10\x6C\x69\x73\x74\x44\x61\x74\x61\x62\x61\x73\x65\x73\x00\x01\x00\x00\x00\x00')
            result = s.recv(1024)
            if 'local' in result and 'errmsg' not in result:  #增加一个“errmsg”字符串判断,避免1.9版本中的误报。
                print(u'{}[+] {}:27017\tMongoDB存在未授权访问{}'.format(G, ip, W))
                with open('weakpass.txt', 'a+') as f:
                    f.write('{}\t27017\tMongoDB存在未授权访问\n'.format(ip,))
        except Exception as e:
            pass
        finally:
            s.close()
    
    
    mongodb_check("192.168.1.10","27017")

    八、参考资料

    账号管理命令

    修改用户权限

    db.updateUser("root", {roles:[{role:"readWriteAnyDatabase", db:"admin"}] })

    修改用户密码

    db.changeUserPassword(“username","newPasswd")

    删除用户

    db.changeUserPassword(“username","newPasswd")

    MongoDB内建角色:https://docs.mongodb.com/manual/core/security-built-in-roles/

    认证相关官方文档该整改建议中命令方法在4.0版本中测试通过,低版本的MongoDB中,命令或角色定义可能有所变化,整改过程中,建议根据实际使用版本,查询MongoDB官方文档。

    更多相关内容
  • 创建本地端口

    千次阅读 2020-10-23 14:45:37
    第一步:进入防火墙,点击高级设置 第二步:点击入站规则 第三步:新建规则 第四步:选择端口 第五步:选择UDP协议,特定本地端口,输入端口号如:9001 第六步:允许连接

    第一步:进入防火墙,点击高级设置
    在这里插入图片描述
    第二步:点击入站规则
    在这里插入图片描述
    第三步:新建规则
    在这里插入图片描述
    第四步:选择端口
    在这里插入图片描述
    第五步:选择UDP协议,特定本地端口,输入端口号如:9001
    在这里插入图片描述
    第六步:允许连接
    在这里插入图片描述

    展开全文
  • 创建IPC端口失败:拒绝访问

    万次阅读 2015-08-10 11:56:54
    1、错误描述 2、错误原因  由于多次双击MySQL Workbench,导致该软件的端口被占用 3、解决办法  关闭所有的MySQL Workbench进程,重新打开一个

    1、错误描述



    2、错误原因

         由于多次双击MySQL Workbench,导致该软件的端口被占用


    3、解决办法

         关闭所有的MySQL Workbench进程,重新打开一个

    展开全文
  • docker容器创建后新增端口映射

    千次阅读 2020-10-13 16:27:11
    需求场景:目前所做的动态插桩工具需要对 docker 容器中的 java web程序进行插桩,动态插桩工具能够根据 java web程序使用的端口号自动查找 web 程序的进程号,即 pid 。查找 pid 的时候使用了 netstat 命令,而做...

    需求场景:目前所做的动态插桩工具需要对 docker 容器中的 java web程序进行插桩,动态插桩工具能够根据 java web程序使用的端口号自动查找 web 程序的进程号,即 pid 。查找 pid 的时候使用了 netstat 命令,而做实验的 docker 容器 demo 中默认是不带有该工具的。

    1、创建的docker容器中没有netstat命令的解决方式

    首先进入docker容器,此处不举例了,然后执行以下命令

    apt-get update
    apt-get install net-tools
    

    2、基于已有的docker容器新增端口映射

    因为所做的项目有些涉密,对方应该不允许对他们的docker配置文件进行修改,此处采用曲线救国方法,使用iptables命令

    (1) 根据容器id获取容器ip

    需要注意容器每次重新启动时,容器ip可能会发生变化,而容器id不会改变

    docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container-ID>
    

    结果如下,需要注意,在创建这个14bd容器时,并没有指定宿主机与该容器的端口映射规则
    在这里插入图片描述

    (2)iptable转发端口

    将宿主机的8745端口映射到容器的8745端口,注意该规则加到了nat中名字为 DOCKER 的chain中

    iptables -t nat -A  DOCKER -p tcp --dport 8745 -j DNAT --to-destination 172.16.10.4:8745
    

    iptables新增的端口映射规则,不会体现在 docker ps 命令中,即docker ps显示的结果不变,如图
    在这里插入图片描述
    此处需要使用以下命令来查看刚刚新增的规则

    iptables -t nat -nvL --line-numbers
    

    指令参数解释

    -t选项指定要操作的表,省略"-t 表名"时,默认表示操作filter表
    -L表示列出规则,即查看规则
    -v显示更多信息
    -n不对地址进行名称反解,直接显示ip地址
    --line-numbers 或--line,显示规则的序号
    -x计数器中的信息显示为精确的计数值,而不是经过可读优化的计数值。
    

    在这里插入图片描述
    由图中可以看出映射规则确实增加了。(8413,8144是调用插桩工具的java web程序,添加方式跟上面所讲的相同,此处不再赘述)

    (3)删除iptables中指定的映射规则

    通用方法

    语法规则:iptables -t 表名 -D chain rulenum [options]
    

    其中: chain 是链的意思,就是INPUT FORWARD 之类的定语,在该例子中为 DOCKER
    rulenum 是该条规则的编号。 即指定–line-numbers参数显示的编号

    此处删除刚刚新增的8745端口映射,语句为

    iptables -t nat -D DOCKER 5
    

    在这里插入图片描述

    另一种方法

    第二种办法是 -A 命令的映射,不过用-D替换-A。当你的链中规则很复杂,而你不想计算它们的编号的时候这就十分有用了。
    也就是说,你如何一开始时用iptables -A…. 语句定义了一个规则,那么删除此条规则时直接用 -D 来代替- A, 其余的都不变即可,而不需要什么编号了。

    即创建时使用如下指令

    iptables -t nat -A  DOCKER -p tcp --dport 8745 -j DNAT --to-destination 172.16.10.4:8745
    

    删除时使用以下指令即可

    iptables -t nat -D  DOCKER -p tcp --dport 8745 -j DNAT --to-destination 172.16.10.4:8745
    

    在这里插入图片描述
    在这里插入图片描述

    3、将插桩工具(projectInsert)与调用插桩工具的JavaWeb程序(executecall.jar)复制进docker容器中

    以下内容有些文不对题,只是个人为了较完整的记录整个流程
    docker复制命令

    语法规则 docker cp [宿主机文件路径] [容器id]:[容器中存放该文件的路径]
    
    docker cp projectInsert 14b:/
    docker cp executecall.jar 14b:/
    

    4、进入待插桩的docker容器,后台方式启动executecall.jar

    docker exec -it 14b /bin/bash
    touch log.txt
    nohup java -jar executecall.jar >log.txt 2>&1 &
    

    executecall.jar日志内容会输出到log.txt文件中

    停止executecall.jar程序

    (1)可以直接重新启动docker容器

    (2)使用kill命令,结束掉executecall.jar进程

    注:8143为excutecall.jar使用的端口号

    netstat -anp | grep 8143
    kill -9 PID
    

    参考的文章

    1. 【Docker】Docker容器中安装netstat命令
    2. 如何获取 docker 容器(container)的 ip 地址
    3. 修改docker容器端口映射的方法
    4. iptables 2: 规则的查看、添加、删除、修改
    5. iptables规则的删除-怎么删除一条已有的iptables规则
    6. CentOS里用命令行运行不挂断的Java程序
    展开全文
  • 创建VLAN及端口配置

    千次阅读 2019-07-26 23:27:46
    学习VLAN的创建和删除,掌握交换机接口模式的配置。 【知识点】 VLAN的作用,交换机接口模式 【实验场景】 两台主机处于同一局域网,通过两台交换机相连,现在因为业务需求,在不修改IP地址的情况下将两台主机划分为...
  • 在docker容器创建之后,想要增加端口映射,一般来说都是将原有的容器导出为镜像,然后删除原有容器,在重新创建的时候增加端口映射,但是这样操作起来太过于麻烦了。 现在有的办法也就是修改容器的配置文件。 主要有...
  • 1.找到运行的容器文件所在目录 container id为docker容器文件目录名前缀 docker ps df -h ...3.到容器目录下,编辑hostconfig.json和config.v2.json文件并增加新的端口内容 cd /disk01/docker...
  • 在 TCP 连接中,客户端在发起连接请求前会先确定一个客户端的端口,然后用这个端口去和服务器端进行握手建立连接。那么在 Linux 上,客户端的端口到底是如何被确定下来的呢? 事实上,我们平时很多遇到的问题都和这...
  • Docker创建MySQL并关联端口映射

    千次阅读 2019-02-27 14:21:01
    https://blog.csdn.net/u014454538/article/details/78544227
  • k8s创建service,令外部端口访问

    千次阅读 2020-05-22 16:19:44
    一、pod IP 每个pod 都有自己的 IP 地址,存在于pod scope。 当 controller 用新 ...这意味着在一个pod 里的容器们能够通过localhost访问彼此的端口。 二、service的三种端口 ...
  • vlan创建以及添加到端口

    万次阅读 2018-01-16 20:55:01
    有几家公司要接入到我方公司的内网来访问服务器,作为网络上的萌新...vlan +数字n //创建vlan interface Vlan-interface n //进入到vlan配置页面  ip address X.X.X.X x.x.x.x //配置网段,大写的是网关地址,小
  • k8s修改ingress默认80端口为其他端口

    千次阅读 2021-11-20 22:57:22
    其实很多时候客户都不给用80端口,亦或者80端口已经被其他服务占用。 而我们使用K8S的时候,默认的 ingress-controller 端口是 80 端口。 遇到这种情况,可以将 K8S 默认的 80 端口修改为其他端口,例如 80 修改为 ...
  • 通过netsh创建了通道代理,有时候会出现不能使用的情况,一般重启代理服务器都能解决该问题。那么究竟是什么原因导致了该问题呢?通过检查占用端口的进程,以及与该进程关联的服务,发现有一个叫做“iphlpsvc”的...
  • socket.accept后,会产生新端口吗?

    千次阅读 2019-09-29 16:43:46
    客户端与服务端成功建立连接后,客户端这边肯定是需要开启一个新的端口的,而服务端其实只需要一个监听端口就行,不用每个新连接一来,就创建一个新的端口。 如上图,客户端跟服务端,建立了两个连接,连接1和连接2...
  • 交换机Access端口配置及VLAN的创建

    千次阅读 2020-05-08 10:53:28
    配置(配置access端口) (1)在交换机中创建VLAN a.vlan id:可创建一个VLAN b.vlan batch id id id:可批量创建多个VLAN (2)配置端口类型,将端口加入VLAN a.port link-type 类型 b.port default vlan ID 六....
  • 在工作站计算机中创建策略,禁止任何计算机访问本机 8000 端口 记录一下学习 1.控制面板-管理工具-本地安全策略-打开IP安全策略 2.右键-管理IP筛选器列表和筛选器操作 3.在IP筛选器列表中点击添加,并取名,比如该...
  • 文章目录 方法一 1. 复制容器id 2. 关闭 docker 3. 进入容器目录 4. 修改配置文件 5.... 启动容器 docker start 容器名或id 方法二 将现有容器提交为新镜像,并使用新镜像重新创建容器时配置新的端口映射
  • spring boot创建应用 端口冲突8080

    万次阅读 热门讨论 2017-08-02 09:26:59
    如果你电脑上的8080端口号被其它程序(如jenkins)占用了,则运行lightsword会报以下错误:java.net.BindException: Address already in use......Failed to start component [Connector[HTTP/1.1-8080]]... ...
  • 1、创建端口组名称 port-group name #命令用来创建Port Group名称。 undo port-group name #命令用来删除Port Group名称。 display port-group #命令用来查看永久端口组的成员接口信息。 2、在端口组里面添加...
  • 我们平时所说的端口其实不是指物理意义上的端口,而是特指TCP/IP协议中的端口,是逻辑意义上的端口。这篇文章主要介绍了开放windows服务器端口(以打开端口8080为例),需要的朋友可以参考下 什么是端口? 我们...
  • 解析:ServerSocket(int port) 是服务端绑定port端口,调accept()监听等待客户端连接,...Socket(InetAddress address , int port)是创建客户端连接主机的socket流,其中InetAddress是用来记录主机的类,port指定端口
  • 如果希望监听TCP端口9000,服务器端应该怎样创建socket? A.new Socket(“localhost”,9000); B.new ServerSocket(9000); C.new Socket(9000); D.new ServerSocket(“localhost”,9000); 答案:B 原因: ServerSocket...
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • 选在创建端口,选择 local port 这一项,点击下一步,提示输入端口名称,输入共享打印机的绝对路径,格式为***(共享打印机的计算机名称或IP地址); 5. 选择好自己的网络打印机厂商、型号,点下一步,如果列表中...
  • 出现该问题,就是jmeter的slave进程监听端口被占用,导致不能使用该端口 修改master机器的jmeter.property文件,该配置文件在jmeter的bin目录下,默认配置只开放了10个端口范围给监听使用,只需要修改即可 我这里...
  • MQTTnet入门(三) - 使用证书创建SSL加密端口 文章目录MQTTnet入门(三) - 使用证书创建SSL加密端口前言使用证书创建SSL加密端口Demo创建证书编写MQTT服务端代码连接测试附录一:Win10下的Ubuntu子系统附录二:MQTT...
  • 简介:大家在Mac上装的Docker想要修改创建后容器端口映射的时候,在网上大部分搜到的都是让你进入 /var/lib/docker 目录,然后就经历了被 -bash: cd: /var/lib/docker: No such file or directory 支配的恐惧。...
  • 使用docker 创建nginx容器映射宿主机端口并外网访问 docker run -ti -d --name my-nginx -p 8088:80 docker.io/nginx -p 小写p表示docker会选择一个具体的宿主机端口映射到容器内部开放的网络端口上。 这个时候...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,224,749
精华内容 489,899
关键字:

创建27017端口