snmp協議即簡單網絡管理協議(SNMP,Simple Network Management Protocol)。目前一共有3個版本:V1,V2c,V3。V3是最新的版本,在安全的設計上有了很大改進。不過目前廣泛應用的還是存在較多安全問題的V1和V2c版本,本文討論的內容也是基于這兩個版本。
了解更多snmp協議內容可以參考維基百科
顧名思義,snmp是用來進行網絡管理的。cacti和mrtg等監控工具都是基于snmp協議。snmp協議工作的原理簡單點來說就是管理主機向被管理的主機或設備發送一個請求,這個請求包含一個community和一個oid。oid就是一個代號,代表管理主機這個請求想要的信息。比如cpu的使用率的oid可能是112,內存的使用率的oid可能是113.這個oid是約定好的。被管理的主機收到這個請求后,先看請求的community是否和自己保存的一致,如果一致,則把112代表的cpu使用率,或者113代表的內存使用率返回給管理主機。如果不一致,就不會返回任何信息。所以community相當與一個認證的口令。需要提一句的是V1和V2c版本的snmp協議都是明文傳輸數據的,所以可以通過抓包嗅探等手段獲取認證需要的community。
管理主機通過snmp協議除了可以獲取被管理主機的信息,還可以修改被管理主機的一些配置信息(通常是路由器等設備)。
通過上面提到的snmp的應用可以總結出snmp弱口令或者口令泄漏引起的安全問題:一是信息泄漏,二是設備的配置可能被修改從而被他人控制。本文討論第一種情況。
看一下烏云的幾個案例,熱熱身:
既然大家都說snmp引起信息泄漏,導致服務器可能被入侵。那我們就看看snmp到底可以泄漏那些信息吧。下面是我總結的一些泄漏敏感信息的節點oid(使用snmpwalk指令來獲取信息)。歡迎補充指正。
系統信息 1.3.6.1.2.1.1
樣例:
SNMPv2-MIB::sysDescr.0 = STRING: Linux xxoo.zwt.qihoo.net 2.6.18-164.el5xen #1 SMP Thu Sep 3 04:03:03 EDT 2009 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (1876050197) 217 days, 3:15:01.97
SNMPv2-MIB::sysContact.0 = STRING: Root <[email protected]> (configure /etc/snmp/snmp.local.conf)
SNMPv2-MIB::sysName.0 = STRING: xxoo.zwt.qihoo.net
SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf)
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.00
顯然,這個sysDescr是系統的描述信息,這里我們看到這臺機器的域名很可能是xxoo.zwt.qihoo.net,內核的版本是2.6.18-164.el5xen,系統是64位的。sysUpTimeInstance就是系統運行時間了。sysContact這里顯示的是管理員的聯系方式,這個例子中管理員沒有配置。
系統進程列表 1.3.6.1.2.1.25.4.2.1.2
樣例:
HOST-RESOURCES-MIB::hrSWRunName.11855 = STRING: "httpd"
HOST-RESOURCES-MIB::hrSWRunName.12579 = STRING: "vsftpd"
HOST-RESOURCES-MIB::hrSWRunName.14653 = STRING: "xinetd"
HOST-RESOURCES-MIB::hrSWRunName.32561 = STRING: "sshd"
這里省略N多。從進程列表我們可以知道服務器上開了那些服務,有哪些有意思的進程在跑。比如這個就可以看出來,它是開了ssh的。
系統安裝軟件列表 1.3.6.1.2.1.25.6.3.1.2
樣例:
HOST-RESOURCES-MIB::hrSWInstalledName.595 = STRING: "xorg-x11-xfs-1.0.2-4"
HOST-RESOURCES-MIB::hrSWInstalledName.598 = STRING: "openssh-server-4.3p2-36.el5"
HOST-RESOURCES-MIB::hrSWInstalledName.140 = STRING: "NetworkManager-glib-0.7.0-9.el5"
HOST-RESOURCES-MIB::hrSWInstalledName.141 = STRING: "gnome-mount-0.5-3.el5"
HOST-RESOURCES-MIB::hrSWInstalledName.143 = STRING: "MySQL-devel-community-5.0.81-0.rhel5"
同樣省略N多。有耐心慢慢分析的話是可以獲取很多信息的。比如這里我看可以到它的ssh是4.3p2版本的,這個版本貌似是存在缺陷的。還有裝了mysql,是5.0的
網口的數量,類型,物理地址和流量信息等 1.3.6.1.2.1.2
樣例:
IF-MIB::ifNumber.0 = INTEGER: 3
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifIndex.3 = INTEGER: 3
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
IF-MIB::ifDescr.3 = STRING: sit0
IF-MIB::ifType.1 = INTEGER: softwareLoopback(24)
IF-MIB::ifType.2 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.3 = INTEGER: tunnel(131)
IF-MIB::ifPhysAddress.1 = STRING:
IF-MIB::ifPhysAddress.2 = STRING: aa:0:0:dc:5f:58
IF-MIB::ifPhysAddress.3 = STRING:
IF-MIB::ifInOctets.1 = Counter32: 19030140
IF-MIB::ifInOctets.2 = Counter32: 4072910622
IF-MIB::ifInOctets.3 = Counter32: 0
IF-MIB::ifOutOctets.1 = Counter32: 19030140
IF-MIB::ifOutOctets.2 = Counter32: 2001152942
IF-MIB::ifOutOctets.3 = Counter32: 0
cacti等系統就是通過獲取這些數據監控流量的。ifNumber是網口數量,ifType是網口類型,ifPhysAddress是mac地址,ifInOctets是流入的總流量,ifOutOctets是流出的總流量。等等。
IP-MAC地址轉換表 1.3.6.1.2.1.3.1
樣例:
RFC1213-MIB::atIfIndex.2.1.x.x.o.o = INTEGER: 2
RFC1213-MIB::atPhysAddress.2.1.x.x.o.o = Hex-STRING: 28 C0 DA 05 20 00
RFC1213-MIB::atNetAddress.2.1.x.x.o.o = Network Address: DC:B5:37:81
我的理解應該跟執行arp -a命令的輸出一樣吧。
網口的ip地址和子網掩碼 1.3.6.1.2.1.4.20
樣例:
IP-MIB::ipAdEntAddr.127.0.0.1 = IpAddress: 127.0.0.1
IP-MIB::ipAdEntAddr.x.x.o.o = IpAddress: x.x.o.o
IP-MIB::ipAdEntIfIndex.127.0.0.1 = INTEGER: 1
IP-MIB::ipAdEntIfIndex.x.x.o.o = INTEGER: 2
IP-MIB::ipAdEntNetMask.127.0.0.1 = IpAddress: 255.0.0.0
IP-MIB::ipAdEntNetMask.x.x.o.o = IpAddress: 255.255.255.128
IP-MIB::ipAdEntBcastAddr.127.0.0.1 = INTEGER: 0
IP-MIB::ipAdEntBcastAddr.x.x.o.o = INTEGER: 1
路由表 1.3.6.1.2.1.4.21 鑒于打碼太復雜,就不提供樣例,可自己測試。
tcp connection table 1.3.6.1.2.1.6.13 相當與netstat -t 命令
開放的udp端口 1.3.6.1.2.1.7.5
此外在互聯網上有兩個oid被很多文章轉載:
1.3.6.1.4.77.1.2.25.1.1 //**用戶列表
1.3.6.1.4.77.1.4.1.0 //**域名
這兩個oid都是存在的。不過測試了幾臺機器都沒有返回任何信息。如果大家有更準確的測試結果歡迎反饋。
耐著性子看完了上文形形色色的oid,你肯定已經知道,有了snmp的community之后,從系統內核到mac地址,路由表,到tcp connection都被我們看光光了。可是,僅僅就這個程度么?我們掌握了這么多的信息,這么多的信息,可是只靠snmp卻依然無法控制這臺設備。這是多么憂傷的一件事情。
如果snmp不僅僅可以讀system up time,如果有個oid可以讀到/etc/passwd甚至可以讀到/etc/shadow那該多好啊。雖然目前這僅僅是YY,但是下面將要介紹一個類似的漏洞。那就是
先看一下烏云案例:
中國移動H3C防火墻側漏,利用snmp獲取管理員密碼,成功登錄設備!
中國移動集團華為三層交換SNMP漏洞,可獲取管理帳號密碼,已成功登錄
看到沒,通過特定的oid讀到了設備中存儲的用戶名和密碼,可以成功登錄。
關于這個cve的來龍去脈可以參考Kurt Grutzmacher發表的文章
HP/H3C and Huawei SNMP Weak Access to Critical Data
同時Kurt Grutzmacher也提供了
長話短說,本質上這依然是snmp引起的信息泄漏,只不過這里露的過于性感,用一個只讀權限的community就可以讀取到登錄需要的用戶名和密碼。目前已知可以獲取帳號的oid有一下三個:
1.3.6.1.4.1.2011.5.2.1.10.1
1.3.6.1.4.1.2011.10.2.12.1.1.1
1.3.6.1.4.1.25506.2.12.1.1.1
對于存在該漏洞的設備,只需要以此walk上面3個oid就可以了。雖然廠商都發布補丁修復了這個漏洞。但是由于某些你懂的原因,存在這個漏洞的設備依然有很多很多很多很多。so:請不要將本文提供的信息用于非法用途,后果自負~~。
需要說一下的是,發布這個漏洞的Kurt Grutzmacher在文章和掃描插件中只提到了后面兩個oid,[email protected]?[email protected]