一次wpscan入侵的实践

wpscan,是Ruby编写的,用于扫描wordpress漏洞,wpscan的作用范围包括wordpress自身漏洞、主题、插件。

目的:查找wordpress网站漏洞

使用工具:百度搜索、wpscan、nmap、goby、burp

入侵流程

# 信息收集

百度搜索框中输入 title:wordpress

该操作会让你找到成千上万个使用wordpress开发的网站,选中一个目标网站A

# wpscan扫描

wpscan --url https://网站A  --enumerate t

该命令返回网站暴露的敏感连接,一个接一个尝试后,发现有一个模板报错页面,错误信息详细描述了报错的php脚本的具体位置,此处得到web根目录地址。

# nmap扫描开放端口

nmap -T4 -A -vV 网站A的ip

该命令返回详细的开放端口及对应服务,开放端口有21,22,80,443,发现22端口和21端口支持爆破登录。

# goby收集子域名

此处收获8个子域名,试探访问demo.网站A/curl,果然又是一个详细描述报错php脚本。
而且不仅错误描述详细同时又是一个上传页面,随便上传了a.ico文件后HTTP响应200,试探成功。
但是响应中未体现上传到哪个目录中,就不知道文件访问地址。
所以尝试使用 burp 对上传接口进行了拦截,也不确认拦截是否能得到想要的结果。
果然,上传接口的响应中详细提示了上传后保存文件的具体位置信息。
(浏览器访问上传页面,上传文件成功后之所以没能看到上传目录的描述,是因为上传成功后又跳到了其它页面。)
拿到上传目录后,浏览器请求 demo.网站A/上传目录/a.ico,果然访问成功,可见上传的文件未被重新命名。
又上传了info.php脚本,浏览器请求 demo.网站A/上传目录/info.php,果然成功,
可见该上传接口能做的事情太多,自行脑补吧……

# 尝试登录网站

https://网站A/wp-login.php

众所周知,wordpress的管理平台登录地址是 /wp-login.php。

浏览器访问了 网站A/wp-login.php,果然展示了管理员登录页面。

尝试使用了 admin, root, test 几个用户,提示"用户名无效"。

即然支持用户名和邮箱登录,那就把目标放在最有可能成功的邮箱上面,

在该网站的 [关于] 栏目找到了一个邮箱地址,输入邮箱后提示信息由"用户名无效"变为"输入的密码无效",

由此可见该邮箱有权限登录平台。发现可以使用一个用户名登录多次而且没有登录限制提示,可见此处支持爆破登录。

这个 wordpress 网站暴露的问题有 

 
 1 ssh爆破登录。
  如果密码足够长和复杂也没啥,或者服务器发现有ssh爆破时根据ssh登录失败次数做一些应对措施
  
 2 网站后台爆破登录。不知道wordpress是否有防止爆破登录的插件
 
 3 上传页面未授权对外访问。对该页面增加访问权限,如果使用不到该功能就直接删除
 
 4 php error详细描述。可以开启php error,但是要关闭debug
 
 5 旁注攻击。本例中 网站A未发现上传漏洞,但是子域名demo.网站A存在上传漏洞,
 由于demo.网站A与网站A同属一台服务器所以形成了旁注攻击,即通过攻击demo.网站A来达到攻击网站A的目的。

a.ico和info.php留下明显的访问痕迹,于是又上传个删除脚本用于删除a.ico和info.php文件和删除脚本文件。

一系列操作后,最终还是在nginx access日志、php error日志、业务日志留下了访问痕迹。

# wpscan 参数

$ wpscan -h                                                                                                                                                                                                                                                               1 ⨯
_______________________________________________________________
         __          _______   _____
         \ \        / /  __ \ / ____|
          \ \  /\  / /| |__) | (___   ___  __ _ _ __ ®
           \ \/  \/ / |  ___/ \___ \ / __|/ _` | '_ \
            \  /\  /  | |     ____) | (__| (_| | | | |
             \/  \/   |_|    |_____/ \___|\__,_|_| |_|

         WordPress Security Scanner by the WPScan Team
                         Version 3.8.14
       Sponsored by Automattic - https://automattic.com/
       @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________

Usage: wpscan [options]
        --url URL                                 The URL of the blog to scan
                                                  Allowed Protocols: http, https
                                                  Default Protocol if none provided: http
                                                  This option is mandatory unless update or help or hh or version is/are supplied
    -h, --help                                    Display the simple help and exit
        --hh                                      Display the full help and exit
        --version                                 Display the version and exit
    -v, --verbose                                 Verbose mode
        --[no-]banner                             Whether or not to display the banner
                                                  Default: true
    -o, --output FILE                             Output to FILE
    -f, --format FORMAT                           Output results in the format supplied
                                                  Available choices: cli-no-colour, cli-no-color, json, cli
        --detection-mode MODE                     Default: mixed
                                                  Available choices: mixed, passive, aggressive
        --user-agent, --ua VALUE
        --random-user-agent, --rua                Use a random user-agent for each scan
        --http-auth login:password
    -t, --max-threads VALUE                       The max threads to use
                                                  Default: 5
        --throttle MilliSeconds                   Milliseconds to wait before doing another web request. If used, the max threads will be set to 1.
        --request-timeout SECONDS                 The request timeout in seconds
                                                  Default: 60
        --connect-timeout SECONDS                 The connection timeout in seconds
                                                  Default: 30
        --disable-tls-checks                      Disables SSL/TLS certificate verification, and downgrade to TLS1.0+ (requires cURL 7.66 for the latter)
        --proxy protocol://IP:port                Supported protocols depend on the cURL installed
        --proxy-auth login:password
        --cookie-string COOKIE                    Cookie string to use in requests, format: cookie1=value1[; cookie2=value2]
        --cookie-jar FILE-PATH                    File to read and write cookies
                                                  Default: /tmp/wpscan/cookie_jar.txt
        --force                                   Do not check if the target is running WordPress or returns a 403
        --[no-]update                             Whether or not to update the Database
        --api-token TOKEN                         The WPScan API Token to display vulnerability data, available at https://wpscan.com/profile
        --wp-content-dir DIR                      The wp-content directory if custom or not detected, such as "wp-content"
        --wp-plugins-dir DIR                      The plugins directory if custom or not detected, such as "wp-content/plugins"
    -e, --enumerate [OPTS]                        Enumeration Process
                                                  Available Choices:
                                                   vp   Vulnerable plugins
                                                   ap   All plugins
                                                   p    Popular plugins
                                                   vt   Vulnerable themes
                                                   at   All themes
                                                   t    Popular themes
                                                   tt   Timthumbs
                                                   cb   Config backups
                                                   dbe  Db exports
                                                   u    User IDs range. e.g: u1-5
                                                        Range separator to use: '-'
                                                        Value if no argument supplied: 1-10
                                                   m    Media IDs range. e.g m1-15
                                                        Note: Permalink setting must be set to "Plain" for those to be detected
                                                        Range separator to use: '-'
                                                        Value if no argument supplied: 1-100
                                                  Separator to use between the values: ','
                                                  Default: All Plugins, Config Backups
                                                  Value if no argument supplied: vp,vt,tt,cb,dbe,u,m
                                                  Incompatible choices (only one of each group/s can be used):
                                                   - vp, ap, p
                                                   - vt, at, t
        --exclude-content-based REGEXP_OR_STRING  Exclude all responses matching the Regexp (case insensitive) during parts of the enumeration.
                                                  Both the headers and body are checked. Regexp delimiters are not required.
        --plugins-detection MODE                  Use the supplied mode to enumerate Plugins.
                                                  Default: passive
                                                  Available choices: mixed, passive, aggressive
        --plugins-version-detection MODE          Use the supplied mode to check plugins' versions.
                                                  Default: mixed
                                                  Available choices: mixed, passive, aggressive
    -P, --passwords FILE-PATH                     List of passwords to use during the password attack.
                                                  If no --username/s option supplied, user enumeration will be run.
    -U, --usernames LIST                          List of usernames to use during the password attack.
                                                  Examples: 'a1', 'a1,a2,a3', '/tmp/a.txt'
        --multicall-max-passwords MAX_PWD         Maximum number of passwords to send by request with XMLRPC multicall
                                                  Default: 500
        --password-attack ATTACK                  Force the supplied attack to be used rather than automatically determining one.
                                                  Available choices: wp-login, xmlrpc, xmlrpc-multicall
        --login-uri URI                           The URI of the login page if different from /wp-login.php
        --stealthy                                Alias for --random-user-agent --detection-mode passive --plugins-version-detection passive

[!] To see full list of options use --hh.


(完)