snmp弱口令引起的資訊洩漏

wyzsk發表於2020-08-19
作者: D&G · 2013/08/02 10:45

0x00 snmp協議簡介


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弱口令或者口令洩漏引起的安全問題:一是資訊洩漏,二是裝置的配置可能被修改從而被他人控制。本文討論第一種情況。

0x01 通用的資訊洩漏


看一下烏雲的幾個案例,熱熱身:

優酷後臺訪問未設定許可權+snmp弱口令

蘑菇街SNMP弱口令一枚

CactiEZ 中文版snmp預設團體名

kingsoft 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都是存在的。不過測試了幾臺機器都沒有返回任何資訊。如果大家有更準確的測試結果歡迎反饋。

0x02 能不能更給力一點


耐著性子看完了上文形形色色的oid,你肯定已經知道,有了snmp的community之後,從系統核心到mac地址,路由表,到tcp connection都被我們看光光了。可是,僅僅就這個程度麼?我們掌握了這麼多的資訊,這麼多的資訊,可是隻靠snmp卻依然無法控制這臺裝置。這是多麼憂傷的一件事情。

如果snmp不僅僅可以讀system up time,如果有個oid可以讀到/etc/passwd甚至可以讀到/etc/shadow那該多好啊。雖然目前這僅僅是YY,但是下面將要介紹一個類似的漏洞。那就是

CVE-2012-3268

先看一下烏雲案例:

中國移動H3C防火牆側漏,利用snmp獲取管理員密碼,成功登入裝置!

中國移動集團華為三層交換SNMP漏洞,可獲取管理帳號密碼,已成功登入

透過snmp獲取中國移動華為防火牆交換機等裝置的登入密碼

看到沒,透過特定的oid讀到了裝置中儲存的使用者名稱和密碼,可以成功登入。

關於這個cve的來龍去脈可以參考Kurt Grutzmacher發表的文章

HP/H3C and Huawei SNMP Weak Access to Critical Data

同時Kurt Grutzmacher也提供了

nmap和msf掃描這個漏洞的外掛和破解加密密碼的工具

長話短說,本質上這依然是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]

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章