我用Docker搭建的WordPress,运行了WPScan并尝试寻找修复方法
这是《SA Advance Advent Calendar 2018》的第6天文章。
你好。
我是シーエー·アドバンス技术统括本部的 @asami-H-Ishi。
虽然我是在入职时没有开发经验的,但已经是公司的第三个年头了,其中有大约两年时间从事诊断员的工作。
目前,我负责协调诊断团队与开发部门之间的脆弱性诊断相关工作。
首先
在我们公司对使用WordPress创建的网站进行漏洞扫描时,我们按照以下的方式进行诊断。
-
- Burp Suite Pro を使った通常どおりの診断
-
- WPScanを利用した診断
- WPScanで見つけられないWordPress固有の観点の調査
我打算验证一下,为了更深入理解从WPScan的诊断结果到修正措施的流程。
在这篇文章中,
1. 我们将使用Docker在本地环境搭建WordPress。
2. 在搭建的本地环境中,我们将运行WPScan。
3. 通过WPScan的结果,我们将确认在诊断时需要指出的问题。
4. 我们将修正针对这些问题的解决方案。
5. 然后,我们将再次运行WPScan进行重新诊断,以确认修复是否成功。
(Translation: “In this article, we will follow the following steps:
1. Setting up WordPress in the local environment using Docker.
2. Running WPScan on the local environment with WordPress installed.
3. Checking the issues to be pointed out during the diagnosis based on the results of WPScan.
4. Implementing the necessary fixes for the identified “issues”.
5. Performing a follow-up WPScan to verify the effectiveness of the implemented fixes.”)
※WPScan是用Ruby编写的WordPress漏洞扫描工具。
※请不要将WPScan工具用于自己未管理或运营的网站,因其使用方式可能变成攻击工具。
我的环境(我的意图)
-
- Docker for Mac
-
- ターミナル
- テキストエディタ(VSCode)
使用Docker在本地环境搭建WordPress。
准备下面的yml文件。
※直接写入了密码,但是为了方便测试,采用了这种形式。
※实际上,最好使用env_file或者其他方式来管理密码等信息,而不是将其写入yml文件。
version: '3'
services:
wordpress:
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: mysql_user
WORDPRESS_DB_PASSWORD: mysql_pw
restart: always
depends_on:
- mysql
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root_pw
MYSQL_DATABASE: wordpress
MYSQL_USER: mysql_user
MYSQL_PASSWORD: mysql_pw
restart: always
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
在终端输入以下命令。
docker-compose up
虽然花费了一些时间,但可以明白从WordPress的最新图像中准备了许多东西,这让人感激地观看着Docker图像,谢谢。
当使用Web浏览器访问localhost:8080时,将显示WordPress的安装界面。
完成 WordPress 的安装和登录后,您可以进入 WordPress 的仪表盘。
既然如此,让我们从仪表盘中尝试发布一些新文章。
我刚才执行了docker-compose up,所以在容器运行期间无法输入其他命令。
如果在后台运行,就不会遇到这种情况,所以我打算从下次开始这样做。
首先,使用Ctrl+C停止正在运行的WordPress。
Stopping study_wordpress_1 ... done
Stopping study_mysql_1 ... done
停了容器后,我更新正在打开的浏览器中的WordPress,结果没有显示任何内容。
现在我要再次以后台运行的方式执行 docker-compose up -d。
与刚才不同,这次应该不会显示特定的执行状态,而是进入了可以输入命令的状态。
另外,您可以使用 docker-compose ps 命令来显示进程。
如下所示,如果状态显示为 Up,则表示容器正在运行,而当使用 docker-compose stop 命令停止容器时,状态将变为 Exit 0。
Name Command State Ports
---------------------------------------------------------------------------------
study_mysql_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
study_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8080->80/tcp
如果您使用 “docker-compose down” 命令删除容器,以下是相关信息,如果您是那种容易忘记自己的容器操作的人,建议您先用 “docker-compose ps” 命令确认一下。
Name Command State Ports
------------------------------
在本地环境中运行的WordPress上运行WPScan。
首先,通过执行ifconfig en0命令来确认本地网络的IP地址。inet之后的那个数字就是正在运行WordPress的本地环境的IP地址。
用以下命令启动WPScan。
docker run -it --rm wpscanteam/wpscan --url http://<ifconfigで確認したIP>:8080 -e vp --wp-content-dir wp-content
产生了以下这样的结果。(IP部分被隐去了,但保留了内部IP)
_______________________________________________________________
__ _______ _____
\ \ / / __ \ / ____|
\ \ /\ / /| |__) | (___ ___ __ _ _ __ ®
\ \/ \/ / | ___/ \___ \ / __|/ _` | '_ \
\ /\ / | | ____) | (__| (_| | | | |
\/ \/ |_| |_____/ \___|\__,_|_| |_|
WordPress Security Scanner by the WPScan Team
Version 3.4.0
Sponsored by Sucuri - https://sucuri.net
@_WPScan_, @ethicalhack3r, @erwan_lr, @_FireFart_
_______________________________________________________________
[+] URL: http://xxx.xx.xxx.xx:8080/
[+] Started: Wed Dec 5 08:46:06 2018
Interesting Finding(s):
[+] http://xxx.xx.xxx.xx:8080/
| Interesting Entries:
| - Server: Apache/2.4.25 (Debian)
| - X-Powered-By: PHP/7.2.12
| Found By: Headers (Passive Detection)
| Confidence: 100%
[+] http://xxx.xx.xxx.xx:8080/xmlrpc.php
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%
| References:
| - http://codex.wordpress.org/XML-RPC_Pingback_API
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_ghost_scanner
| - https://www.rapid7.com/db/modules/auxiliary/dos/http/wordpress_xmlrpc_dos
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_xmlrpc_login
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_pingback_access
[+] http://xxx.xx.xxx.xx:8080/readme.html
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%
[+] WordPress version 4.9.8 identified (Latest, released on 2018-08-02).
| Detected By: Emoji Settings (Passive Detection)
| - http://xxx.xx.xxx.xx:8080/, Match: 'wp-includes\/js\/wp-emoji-release.min.js?ver=4.9.8'
| Confirmed By: Meta Generator (Passive Detection)
| - http://xxx.xx.xxx.xx:8080/, Match: 'WordPress 4.9.8'
[i] The main theme could not be detected.
[+] Enumerating Vulnerable Plugins
[i] No plugins Found.
[+] Finished: Wed Dec 5 08:46:07 2018
[+] Requests Done: 20
[+] Cached Requests: 3
[+] Data Sent: 3.436 KB
[+] Data Received: 325.479 KB
[+] Memory used: 56.004 MB
[+] Elapsed time: 00:00:01
从WPScan的结果中,确认要在诊断时指出的事项。
我会逐个地看一下结果。
[+] http://xxx.xx.xxx.xx:8080/
| Interesting Entries:
| - Server: Apache/2.4.25 (Debian)
| - X-Powered-By: PHP/7.2.12
| Found By: Headers (Passive Detection)
| Confidence: 100%
这两点都表明了从头部获取到了”服务器信息已经公开”和”PHP版本信息已经公开”的问题,因此我们提出了指出。
作为对策,我们建议隐藏这两个版本信息。
另外,我们还需要确认这两个版本是否存在漏洞,如果使用的是有漏洞的版本,那么需要及时修复为最新版本,以免被攻击利用漏洞的可能性。
[+] http://xxx.xx.xxx.xx:8080/xmlrpc.php
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%
| References:
| - http://codex.wordpress.org/XML-RPC_Pingback_API
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_ghost_scanner
| - https://www.rapid7.com/db/modules/auxiliary/dos/http/wordpress_xmlrpc_dos
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_xmlrpc_login
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_pingback_access
[+] http://xxx.xx.xxx.xx:8080/readme.html
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%
这是一份报告,可以访问xmlrpc.php和readme.html。
xmlrpc.php是一種功能,可以讓您在不使用標準管理界面的情況下,通過API進行文章投稿。
參考資料:https://www.sasukepg.jp/wordpress/1917/
readme.html是一个包含WordPress版本等基本信息的文件。
如果不小心使用存在漏洞的WordPress版本,第三方就可以轻易地看到版本信息,并将其作为攻击的线索。
由于这些文件都不是必需的,建议将其删除。
[+] WordPress version 4.9.8 identified (Latest, released on 2018-08-02).
| Detected By: Emoji Settings (Passive Detection)
| - http://xxx.xx.xxx.xx:8080/, Match: 'wp-includes\/js\/wp-emoji-release.min.js?ver=4.9.8'
| Confirmed By: Meta Generator (Passive Detection)
| - http://xxx.xx.xxx.xx:8080/, Match: 'WordPress 4.9.8'
這是目前使用的WordPress版本是4.9.8,這是於2018年8月2日釋出的最新版本,可以從絵文字設定和元生成器中得知。由於隱藏使用的WordPress版本資訊可以減少對攻擊者的線索,所以我們希望保密此部分。
对于”指摘事项”进行修正处理。
对应内容如下所示。
-
- PHPのバージョン情報を隠す
-
- xmlrpc.php と readme.html を削除する
-
- WordPressのバージョン情報を隠す
- Apacheのバージョン情報を隠す
以下这些中,
-
- WordPressのバージョン情報を隠す
- Apacheのバージョン情報を隠す
由于找不到修正方法,所以我希望能在下一篇文章中写出来(我也会负责12/15的文章)…(´・ω・`)
隐藏PHP版本信息
创建下面的Dockerfile。
FROM wordpress:latest
#phpのバージョン情報を隠す
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
RUN sed -i -e "s|expose_php = On|expose_php = Off|" "$PHP_INI_DIR/php.ini"
删除 xmlrpc.php 和 readme.html
为了删除xmlrpc.php文件和readme.html文件,您需要在Dockerfile中添加以下内容。
#不要ファイルを削除する
RUN rm -rf /usr/src/wordpress/readme.html /usr/src/wordpress/xmlrpc.php
将yml文件修改为下面的内容。
version: '3'
services:
wordpress:
# image: wordpress:latest
build: .
ports:
- "8080:80"
environment:
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: mysql_user
WORDPRESS_DB_PASSWORD: mysql_pw
restart: always
depends_on:
- mysql
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root_pw
MYSQL_DATABASE: wordpress
MYSQL_USER: mysql_user
MYSQL_PASSWORD: mysql_pw
restart: always
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
再次对WPScan进行扫描(重新诊断),确认是否修复成功。
重新启动一次
由于创建了Dockerfile并在docker-compose.yml文件中指示其加载,为了使其生效,需要先启动一次容器并销毁整个容器卷。
使用docker-compose down -v命令将一并销毁所有卷。
Stopping study_wordpress_1 ... done
Stopping study_mysql_1 ... done
Removing study_wordpress_1 ... done
Removing study_mysql_1 ... done
Removing network study_default
Removing volume study_mysql_data
只需要一个选项:使用Dockerfile的设置通过docker-compose up –build -d命令构建容器。一些构建内容将被显示。
Successfully built d32116641adf
Successfully tagged study_wordpress:latest
Creating study_mysql_1 ... done
Creating study_wordpress_1 ... done
当显示为”建构成功”时。
请用浏览器再次访问 localhost:8080 并进行 WordPress 的安装。
重新运行WPScan
我会再次运行WPScan来确认是否已按照意图进行了修正。
docker run -it --rm wpscanteam/wpscan --url http://<ifconfigで確認したIP>:8080 -e vp --wp-content-dir wp-content
结果如下所示。
_______________________________________________________________
__ _______ _____
\ \ / / __ \ / ____|
\ \ /\ / /| |__) | (___ ___ __ _ _ __ ®
\ \/ \/ / | ___/ \___ \ / __|/ _` | '_ \
\ /\ / | | ____) | (__| (_| | | | |
\/ \/ |_| |_____/ \___|\__,_|_| |_|
WordPress Security Scanner by the WPScan Team
Version 3.4.0
Sponsored by Sucuri - https://sucuri.net
@_WPScan_, @ethicalhack3r, @erwan_lr, @_FireFart_
_______________________________________________________________
[+] URL: http://xxx.xx.xxx.xx:8080/
[+] Started: Wed Dec 5 10:41:36 2018
Interesting Finding(s):
[+] http://xxx.xx.xxx.xx:8080/
| Interesting Entry: Server: Apache/2.4.25 (Debian)
| Found By: Headers (Passive Detection)
| Confidence: 100%
[+] WordPress version 4.9.8 identified (Latest, released on 2018-08-02).
| Detected By: Emoji Settings (Passive Detection)
| - http://xxx.xx.xxx.xx:8080/, Match: 'wp-includes\/js\/wp-emoji-release.min.js?ver=4.9.8'
| Confirmed By: Meta Generator (Passive Detection)
| - http://xxx.xx.xxx.xx:8080/, Match: 'WordPress 4.9.8'
[i] The main theme could not be detected.
[+] Enumerating Vulnerable Plugins
[i] No plugins Found.
[+] Finished: Wed Dec 5 10:41:37 2018
[+] Requests Done: 22
[+] Cached Requests: 2
[+] Data Sent: 3.535 KB
[+] Data Received: 113.031 KB
[+] Memory used: 53.281 MB
[+] Elapsed time: 00:00:01
我成功地按照预期隐藏或删除了PHP版本信息以及xmlrpc.php和readme.html文件。
最后
我认为在WordPress上建设网站有多种方法,所以并不一定只能通过这篇文章提到的方法来保障安全性。
不过,通过阅读这篇文章,我希望你会增加一种选择,即在使用WordPress建站后尝试运行WPScan来确认是否需要采取相应安全措施。
我打算在12月15日的文章的前半提及一下 Apache 和 WordPress 的版本信息如何在 JavaScript 和元信息生成器中隐藏,如果我有时间进行验证的话…。゚(゚´Д`゚)゚。
下次我计划写一篇关于在这次创建的Docker+WordPress环境中使用Burp Suite Pro进行主动扫描,以便了解会出现哪些问题的文章。