Memcached是一套分布式的高速緩存系統。它以Key-Value(鍵值對)形式將數據存儲在內存中,這些數據通常是應用讀取頻繁的。正因為內存中數據的讀取遠遠大於硬盤,因此可以用來加速應用的訪問。本文和大家分享的是Memcache中未授權訪問漏洞利用及修復相關知識,希望對大家學習Memcache有所幫助。
漏洞成因:
由於memcached安全設計缺陷,客戶端連接memcached服務器后 無需認證就 可讀取、修改服務器緩存內容。
漏洞影響:
除memcached中數據可被直接讀取泄漏和惡意修改外,由於memcached中的數據像正常網站用戶訪問提交變量一樣會被后端代碼處理,當處理代碼存在缺陷時會再次導致不同類型的安全問題。
不同的是,在處理 前端用戶直接輸入的數據時一般會接受更多的安全校驗,而從memcached中讀取的數據則更容易被開發者認為是可信的,或者是已經通過安全校驗的,因此更容易導致安全問題。
由此可見,導致的二次安全漏洞類型一般 由memcached數據使用的位置(XSS通常稱之為sink)的不同而不同, 如:
(1)緩存數據未經過濾直接輸出可導致XSS;
(2) 緩存數據 未經過濾代入拼接的SQL注入查詢語句可導致SQL注入;
(3) 緩存數據 存儲敏感信息(如:用戶名、密碼),可以通過讀取操作直接泄漏;
(4) 緩存數據 未經過濾直接通過system()、eval()等函數處理可導致命令執行;
(5) 緩存數據 未經過濾直接在header()函數中輸出,可導致CRLF漏洞(HTTP響應拆分)。
… …
漏洞利用:
漏洞的利用根據所造成二次漏洞的不同,可在緩存變量中構造相應的payload。
針對memcached未授權訪問漏洞緩存數據的抓取,可使用 go-derper工具。
注: memcached服務器基本操作及go-derper工具使用方法參見鏈接。
漏洞攻擊DEMO:
http://niiconsulting.com/checkmate/2013/05/memcache-exploit/
漏洞檢測:
1、登錄機器執行netstat -an | more命令查看端口監聽情況。回顯0.0.0.0:11211表示在所有網卡進行監聽,存在memcached 未授權訪問漏洞。
2、telnet IP 11211, 或 nc -vv11211,提示連接成功表示漏洞存在(telnet連接成功后是一個黑框,執行Memcached命令stats)。
memcache stats命令詳解
參數 | 值 | 描述 |
---|---|---|
pid | 7862 | memcache服務器進程ID |
uptime | 12617972 | 服務器已運行秒數 |
time | 1320756409 | 服務器當前Unix時間戳 |
version | 1.4.5 | memcache版本 |
pointer_size | 64 | 操作系統指針大小 |
rusage_user | 1.731736 | 進程累計用戶時間 |
rusage_system | 251.421778 | 進程累計系統時間 |
curr_connections | 41 | 當前連接數量 |
total_connections | 848 | Memcached運行以來連接總數 |
connection_structures | 46 | Memcached分配的連接結構數量 |
cmd_get | 164377 | get命令請求次數 |
cmd_set | 58617 | set命令請求次數 |
cmd_flush | 0 | flush命令請求次數 |
get_hits | 105598 | get命令命中次數 |
get_misses | 58779 | get命令未命中次數 |
delete_misses | 0 | delete命令未命中次數 |
delete_hits | 0 | delete命令命中次數 |
incr_misses | 0 | incr命令未命中次數 |
incr_hits | 0 | incr命令命中次數 |
decr_misses | 0 | decr命令未命中次數 |
decr_hits | 0 | decr命令命中次數 |
cas_misses | 0 | cas命令未命中次數 |
cas_hits | 0 | cas命令命中次數 |
cas_badval | 0 | 使用擦拭次數 |
auth_cmds | 0 | 認證命令處理的次數 |
auth_errors | 0 | 認證失敗數目 |
bytes_read | 262113283 | 讀取總字節數 |
bytes_written | 460023263 | 發送總字節數 |
limit_maxbytes | 536870912 | 分配的內存總大小(字節) |
accepting_conns | 1 | 服務器是否達到過最大連接(0/1) |
listen_disabled_num | 0 | 失效的監聽數 |
threads | 4 | 當前線程數 |
conn_yields | 0 | 連接操作主動放棄數目 |
bytes | 1941693 | 當前存儲占用的字節數 |
curr_items | 476 | 當前存儲的數據總數 |
total_items | 58617 | 啟動以來存儲的數據總數 |
evictions | 0 | LRU釋放的對象數目 |
reclaimed | 48830 | 已過期的數據條目來存儲新數據的數目 |
3、使用端口掃描工具nmap進行遠程掃描:nmap -sV -p 11211 --script=memcached-info IP。
11211/tcpopen memcached
| memcached-info:
| ProcessID 18568
| Uptime 6950 seconds
| Servertime SatDec 31 14:16:10 2011
| Architecture 64 bit
| UsedCPU (user) 0.172010
| UsedCPU (system) 0.200012
| Currentconnections 10
| Totalconnections 78
| Maximumconnections 1024
| TCPPort 11211
| UDPPort 11211
|_ Authentication no
漏洞修復:
1、配置memcached監聽本地回環地址127.0.0.1。
[root@local ~]# vim /etc/sysconfig/memcached
OPTIONS="-l 127.0.0.1" #設置本地為監聽
[root@local ~]# /etc/init.d/memcached restart #重啟服務
2、當memcached 配置為監聽內網IP或公網IP時, 使用主機防火牆(iptalbes、 firewalld等)和 網絡防火牆對memcached服務端口 進行過濾。
參考:
http://blog.nsfocus.net/
http://blog.csdn.net/qq_32506555/article/details/53581809
http://gdd.gd/1072.html
https://www.cnblogs.com/Alight/p/3546400.html