yawast 0.7.0.beta3 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +2 -1
- data/Dockerfile +42 -0
- data/README.md +2 -1
- data/lib/scanner/generic.rb +2 -0
- data/lib/scanner/plugins/applications/cms/wordpress.rb +99 -0
- data/lib/scanner/plugins/applications/generic/password_reset.rb +3 -1
- data/lib/scanner/ssl_labs.rb +1 -0
- data/lib/scanner/vuln_scan.rb +5 -0
- data/lib/shared/http.rb +2 -2
- data/lib/version.rb +1 -1
- data/test/data/wp-json-users.txt +1 -0
- data/test/data/wp-login-4.9.8.txt +61 -0
- data/test/data/wp-login-5.1.1.txt +80 -0
- data/test/test_app_cms_wp.rb +76 -0
- data/test/test_app_fw_rails.rb +1 -1
- data/test/test_ssl_sweet32.rb +21 -21
- metadata +13 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 0ae21762fe7abf26bd16283e6a104c1013c446b7
         | 
| 4 | 
            +
              data.tar.gz: 31549266d294f446a7e803e77cecd0e7e2bc999b
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 886b7a4bf891d77eeca0f65a50733eb43aa6414c9d4d38a52acc363c1d6184df4b02d1ebf957ffc9637cb32097b088ae95527a90dbbdad58431403d327ec63a4
         | 
| 7 | 
            +
              data.tar.gz: edd06c1933bda3b8643b9e6a06a8e690fa34f8136db9de5abdc446e08cc3fc766ffe8fc6f0ea514f76527630f718e35c30b9279a5dd6a01768d444cc05646e97
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            ## 0.7.0 -  | 
| 1 | 
            +
            ## 0.7.0 - 2019-04-19
         | 
| 2 2 |  | 
| 3 3 | 
             
            * [#38](https://github.com/adamcaudill/yawast/issues/38) - JSON Output Option via `--output=` (work in progress)
         | 
| 4 4 | 
             
            * [#133](https://github.com/adamcaudill/yawast/issues/133) - Include a Timestamp In Output
         | 
| @@ -16,6 +16,7 @@ | |
| 16 16 | 
             
            * [#156](https://github.com/adamcaudill/yawast/issues/156) - Check for Rails CVE-2019-5418
         | 
| 17 17 | 
             
            * [#157](https://github.com/adamcaudill/yawast/issues/157) - Add check for Nginx Status Page
         | 
| 18 18 | 
             
            * [#158](https://github.com/adamcaudill/yawast/issues/158) - Add check for Tomcat RCE CVE-2019-0232
         | 
| 19 | 
            +
            * [#161](https://github.com/adamcaudill/yawast/issues/161) - Add WordPress WP-JSON User Enumeration
         | 
| 19 20 | 
             
            * [#130](https://github.com/adamcaudill/yawast/issues/130) - Bug: HSTS Error leads to printing HTML
         | 
| 20 21 | 
             
            * [#132](https://github.com/adamcaudill/yawast/issues/132) - Bug: Typo in SSL Output
         | 
| 21 22 | 
             
            * [#142](https://github.com/adamcaudill/yawast/issues/142) - Bug: Error In Collecting DNS Information
         | 
    
        data/Dockerfile
    CHANGED
    
    | @@ -1,8 +1,50 @@ | |
| 1 1 | 
             
            FROM ruby:2.4-jessie
         | 
| 2 2 |  | 
| 3 | 
            +
            RUN apt-get update && apt-get install -y \
         | 
| 4 | 
            +
            	apt-transport-https \
         | 
| 5 | 
            +
            	ca-certificates \
         | 
| 6 | 
            +
            	curl \
         | 
| 7 | 
            +
            	wget \
         | 
| 8 | 
            +
            	gnupg \
         | 
| 9 | 
            +
            	unzip \
         | 
| 10 | 
            +
                --no-install-recommends \
         | 
| 11 | 
            +
            	&& curl -sSL https://dl.google.com/linux/linux_signing_key.pub | apt-key add - \
         | 
| 12 | 
            +
            	&& echo "deb https://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list \
         | 
| 13 | 
            +
            	&& apt-get update && apt-get install -y google-chrome-stable \
         | 
| 14 | 
            +
                fontconfig \
         | 
| 15 | 
            +
                fonts-ipafont-gothic \
         | 
| 16 | 
            +
                fonts-wqy-zenhei \
         | 
| 17 | 
            +
                fonts-thai-tlwg \
         | 
| 18 | 
            +
                fonts-kacst \
         | 
| 19 | 
            +
                fonts-noto \
         | 
| 20 | 
            +
                ttf-freefont \
         | 
| 21 | 
            +
                --no-install-recommends \
         | 
| 22 | 
            +
                && apt-get clean \
         | 
| 23 | 
            +
                && rm -rf /var/lib/apt/lists/*
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            RUN CHROME_STRING=$(/usr/bin/google-chrome-stable --version) \
         | 
| 26 | 
            +
              && CHROME_VERSION_STRING=$(echo "${CHROME_STRING}" | grep -oP "\d+\.\d+\.\d+\.\d+") \
         | 
| 27 | 
            +
              && CHROME_MAJOR_VERSION=$(echo "${CHROME_VERSION_STRING%%.*}") \
         | 
| 28 | 
            +
              && wget --no-verbose -O /tmp/LATEST_RELEASE "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROME_MAJOR_VERSION}" \
         | 
| 29 | 
            +
              && CD_VERSION=$(cat "/tmp/LATEST_RELEASE") \
         | 
| 30 | 
            +
              && rm /tmp/LATEST_RELEASE \
         | 
| 31 | 
            +
              && CHROME_DRIVER_VERSION="${CD_VERSION}" \
         | 
| 32 | 
            +
              && echo "Using chromedriver version: "$CD_VERSION \
         | 
| 33 | 
            +
              && echo "Using Chrome version:       "$CHROME_VERSION_STRING \
         | 
| 34 | 
            +
              && wget --no-verbose -O /tmp/chromedriver_linux64.zip https://chromedriver.storage.googleapis.com/$CD_VERSION/chromedriver_linux64.zip \
         | 
| 35 | 
            +
              && unzip /tmp/chromedriver_linux64.zip -d /usr/bin/ \
         | 
| 36 | 
            +
              && rm /tmp/chromedriver_linux64.zip \
         | 
| 37 | 
            +
              && chmod +x /usr/bin/chromedriver
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            RUN groupadd -r chrome && useradd -r -g chrome -G audio,video chrome \
         | 
| 40 | 
            +
                && mkdir -p /home/chrome && chown -R chrome:chrome /home/chrome \
         | 
| 41 | 
            +
            		&& mkdir -p /opt/google/chrome && chown -R chrome:chrome /opt/google/chrome
         | 
| 42 | 
            +
             | 
| 3 43 | 
             
            COPY . /data
         | 
| 4 44 | 
             
            WORKDIR /data
         | 
| 5 45 |  | 
| 46 | 
            +
            USER chrome
         | 
| 47 | 
            +
             | 
| 6 48 | 
             
            ENV LANG      C.UTF-8
         | 
| 7 49 | 
             
            ENV LANGUAGE  C.UTF-8
         | 
| 8 50 | 
             
            ENV LC_ALL    C.UTF-8
         | 
    
        data/README.md
    CHANGED
    
    | @@ -75,9 +75,10 @@ The following tests are performed: | |
| 75 75 | 
             
            * *(ASP.NET)* Presence of Trace.axd
         | 
| 76 76 | 
             
            * *(ASP.NET)* Presence of Elmah.axd
         | 
| 77 77 | 
             
            * *(ASP.NET)* Debugging Enabled
         | 
| 78 | 
            -
            * *(nginx)* Info Disclosure: Server version
         | 
| 79 78 | 
             
            * *(PHP)* Info Disclosure: PHP version
         | 
| 80 79 | 
             
            * *(Rails)* File Content Disclosure: CVE-2019-5418
         | 
| 80 | 
            +
            * *(WordPress)* Version detection
         | 
| 81 | 
            +
            * *(WordPress)* WP-JSON User Enumeration
         | 
| 81 82 |  | 
| 82 83 | 
             
            CMS Detection:
         | 
| 83 84 |  | 
    
        data/lib/scanner/generic.rb
    CHANGED
    
    | @@ -63,6 +63,8 @@ module Yawast | |
| 63 63 | 
             
                          Yawast::Utilities.puts_info 'NOTE: Server appears to be Cloudflare; WAF may be in place.'
         | 
| 64 64 | 
             
                          puts
         | 
| 65 65 | 
             
                        end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                        Yawast::Shared::Output.log_value 'server', server
         | 
| 66 68 | 
             
                      end
         | 
| 67 69 |  | 
| 68 70 | 
             
                      Yawast::Utilities.puts_warn "X-Powered-By Header Present: #{powered_by}" if powered_by != ''
         | 
| @@ -0,0 +1,99 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Yawast
         | 
| 4 | 
            +
              module Scanner
         | 
| 5 | 
            +
                module Plugins
         | 
| 6 | 
            +
                  module Applications
         | 
| 7 | 
            +
                    module CMS
         | 
| 8 | 
            +
                      class WordPress
         | 
| 9 | 
            +
                        # check to see if we can confirm the presence of WordPress
         | 
| 10 | 
            +
                        def self.identify(uri)
         | 
| 11 | 
            +
                          ret = nil
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                          # check for wp-login.php in the current directory
         | 
| 14 | 
            +
                          resp = identify_by_path uri, uri.path
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                          if resp.nil?
         | 
| 17 | 
            +
                            # if we don't get a hit at the current path, try under /blog/
         | 
| 18 | 
            +
                            resp = identify_by_path uri, uri.path + 'blog/'
         | 
| 19 | 
            +
                          end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                          unless resp.nil?
         | 
| 22 | 
            +
                            # confirmed hit
         | 
| 23 | 
            +
                            res = resp[:result]
         | 
| 24 | 
            +
                            ret = resp[:uri]
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                            # strip the file name from the path
         | 
| 27 | 
            +
                            ret.path = ret.path.sub! 'wp-login.php', ''
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                            css = res[:body].scan /login.min.css\?ver=\d+\.\d+\.?\d*/
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                            ver = 'Unknown'
         | 
| 32 | 
            +
                            if !css.count.zero?
         | 
| 33 | 
            +
                              ver = css[0].to_s.split('=')[1]
         | 
| 34 | 
            +
                            else
         | 
| 35 | 
            +
                              # the current method doesn't work, fall back to an older method
         | 
| 36 | 
            +
                              css = res[:body].scan /load-styles.php\?[\w\,\;\=\&\%]+;ver=\d+\.\d+\.?\d*/
         | 
| 37 | 
            +
                              ver = css[0].to_s.split('=')[-1] unless css.count.zero?
         | 
| 38 | 
            +
                            end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                            Yawast::Utilities.puts_info "Found WordPress v#{ver} at #{ret}"
         | 
| 41 | 
            +
                            Yawast::Shared::Output.log_value 'application', 'wordpress', 'uri', ret
         | 
| 42 | 
            +
                            Yawast::Shared::Output.log_value 'application', 'wordpress', 'version', ver
         | 
| 43 | 
            +
                            Yawast::Shared::Output.log_value 'application', 'wordpress', 'login_body', res[:body]
         | 
| 44 | 
            +
                          end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                          ret
         | 
| 47 | 
            +
                        end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                        def self.identify_by_path(uri, path)
         | 
| 50 | 
            +
                          login_uri = uri.copy
         | 
| 51 | 
            +
                          login_uri.path = path + 'wp-login.php'
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                          res = Yawast::Shared::Http.get_with_code login_uri
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                          if res[:code] == '200' && res[:body].include?('Powered by WordPress')
         | 
| 56 | 
            +
                            return {result: res, uri: login_uri}
         | 
| 57 | 
            +
                          else
         | 
| 58 | 
            +
                            return nil
         | 
| 59 | 
            +
                          end
         | 
| 60 | 
            +
                        end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                        def self.check_json_user_enum(uri)
         | 
| 63 | 
            +
                          Yawast::Shared::Output.log_hash 'vulnerabilities',
         | 
| 64 | 
            +
                                                          'wordpress_json_user_enum',
         | 
| 65 | 
            +
                                                          {vulnerable: false, users: nil}
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                          json_uri = uri.copy
         | 
| 68 | 
            +
                          json_uri.path = json_uri.path + 'wp-json/wp/v2/users'
         | 
| 69 | 
            +
                          res = Yawast::Shared::Http.get_with_code json_uri
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                          if res[:code] == '200' && res[:body].include?('slug')
         | 
| 72 | 
            +
                            # we have a likely hit
         | 
| 73 | 
            +
                            users = nil
         | 
| 74 | 
            +
                            begin
         | 
| 75 | 
            +
                              users = JSON.parse res[:body]
         | 
| 76 | 
            +
                            rescue # rubocop:disable Style/RescueStandardError, Lint/HandleExceptions
         | 
| 77 | 
            +
                              # don't care why it failed
         | 
| 78 | 
            +
                            end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                            unless users.nil?
         | 
| 81 | 
            +
                              Yawast::Shared::Output.log_hash 'vulnerabilities',
         | 
| 82 | 
            +
                                                              'wordpress_json_user_enum',
         | 
| 83 | 
            +
                                                              {vulnerable: true, users: users}
         | 
| 84 | 
            +
                              Yawast::Utilities.puts_warn "WordPress WP-JSON User Enumeration at #{json_uri}"
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                              users.each do |user|
         | 
| 87 | 
            +
                                Yawast::Utilities.puts_raw "ID: #{user['id']}\tUser Slug: '#{user['slug']}'\t\tUser Name: '#{user['name']}'"
         | 
| 88 | 
            +
                              end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                              puts
         | 
| 91 | 
            +
                            end
         | 
| 92 | 
            +
                          end
         | 
| 93 | 
            +
                        end
         | 
| 94 | 
            +
                      end
         | 
| 95 | 
            +
                    end
         | 
| 96 | 
            +
                  end
         | 
| 97 | 
            +
                end
         | 
| 98 | 
            +
              end
         | 
| 99 | 
            +
            end
         | 
| @@ -92,11 +92,13 @@ module Yawast | |
| 92 92 | 
             
                            end
         | 
| 93 93 | 
             
                          rescue ArgumentError => e
         | 
| 94 94 | 
             
                            Yawast::Utilities.puts_error "Unable to find a matching element to perform the User Enumeration via Password Reset Response test (#{e.message})"
         | 
| 95 | 
            +
                          rescue => e # rubocop:disable Style/RescueStandardError
         | 
| 96 | 
            +
                            Yawast::Utilities.puts_error "Failed to execute Password Reset Page User Enumeration: Error: #{e.message}"
         | 
| 95 97 | 
             
                          end
         | 
| 96 98 | 
             
                        end
         | 
| 97 99 |  | 
| 98 100 | 
             
                        def self.fill_form_get_body(uri, user, valid, log_output)
         | 
| 99 | 
            -
                          options = Selenium::WebDriver::Chrome::Options.new({args: ['headless', 'incognito']})
         | 
| 101 | 
            +
                          options = Selenium::WebDriver::Chrome::Options.new({args: ['headless', 'incognito', 'disable-dev-shm-usage', 'no-sandbox']})
         | 
| 100 102 |  | 
| 101 103 | 
             
                          # if we have a proxy set, use that
         | 
| 102 104 | 
             
                          if !Yawast.options.proxy.nil?
         | 
    
        data/lib/scanner/ssl_labs.rb
    CHANGED
    
    | @@ -391,6 +391,7 @@ module Yawast | |
| 391 391 | 
             
                      elsif proto['name'] == 'TLS' &&  proto['version'] == '1.3'
         | 
| 392 392 | 
             
                        # capture TLS 1.3 status
         | 
| 393 393 | 
             
                        tls13_enabled = true
         | 
| 394 | 
            +
                        Yawast::Utilities.puts_info "\t\t\t#{proto['name']} #{proto['version']}"
         | 
| 394 395 | 
             
                        Yawast::Shared::Output.log_hash 'vulnerabilities',
         | 
| 395 396 | 
             
                                                        'tls_tls13_not_enabled',
         | 
| 396 397 | 
             
                                                        {vulnerable: false}
         | 
    
        data/lib/scanner/vuln_scan.rb
    CHANGED
    
    | @@ -34,6 +34,11 @@ module Yawast | |
| 34 34 |  | 
| 35 35 | 
             
                    # check for framework specific issues
         | 
| 36 36 | 
             
                    Yawast::Scanner::Plugins::Applications::Framework::Rails.check_all uri, links
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    wordpress_uri = Yawast::Scanner::Plugins::Applications::CMS::WordPress.identify uri
         | 
| 39 | 
            +
                    unless wordpress_uri.nil?
         | 
| 40 | 
            +
                      Yawast::Scanner::Plugins::Applications::CMS::WordPress.check_json_user_enum wordpress_uri
         | 
| 41 | 
            +
                    end
         | 
| 37 42 | 
             
                  end
         | 
| 38 43 | 
             
                end
         | 
| 39 44 | 
             
              end
         | 
    
        data/lib/shared/http.rb
    CHANGED
    
    | @@ -45,8 +45,8 @@ module Yawast | |
| 45 45 | 
             
                      res = req.request_get(uri, get_headers(headers))
         | 
| 46 46 | 
             
                      body = res.read_body
         | 
| 47 47 | 
             
                      code = res.code
         | 
| 48 | 
            -
                    rescue # rubocop:disable Style/RescueStandardError | 
| 49 | 
            -
                       | 
| 48 | 
            +
                    rescue => e # rubocop:disable Style/RescueStandardError
         | 
| 49 | 
            +
                      Yawast::Utilities.puts_error "Error sending request to #{uri} - '#{e.message}'"
         | 
| 50 50 | 
             
                    end
         | 
| 51 51 |  | 
| 52 52 | 
             
                    {body: body, code: code}
         | 
    
        data/lib/version.rb
    CHANGED
    
    
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            [{"id":1,"name":"Adam Caudill","url":"https:\/\/adamcaudill.com","description":"","link":"https:\/\/underhandedcrypto.com\/author\/adam\/","slug":"adam","avatar_urls":{"24":"https:\/\/secure.gravatar.com\/avatar\/49e14cf9f67c48aad082dec4f106f19a?s=24&d=mm&r=g","48":"https:\/\/secure.gravatar.com\/avatar\/49e14cf9f67c48aad082dec4f106f19a?s=48&d=mm&r=g","96":"https:\/\/secure.gravatar.com\/avatar\/49e14cf9f67c48aad082dec4f106f19a?s=96&d=mm&r=g"},"meta":[],"_links":{"self":[{"href":"https:\/\/underhandedcrypto.com\/wp-json\/wp\/v2\/users\/1"}],"collection":[{"href":"https:\/\/underhandedcrypto.com\/wp-json\/wp\/v2\/users"}]}},{"id":2,"name":"Taylor Hornby","url":"https:\/\/defuse.ca\/","description":"","link":"https:\/\/underhandedcrypto.com\/author\/taylor\/","slug":"taylor","avatar_urls":{"24":"https:\/\/secure.gravatar.com\/avatar\/8b1f016c79a6b82740427da6fff77de2?s=24&d=mm&r=g","48":"https:\/\/secure.gravatar.com\/avatar\/8b1f016c79a6b82740427da6fff77de2?s=48&d=mm&r=g","96":"https:\/\/secure.gravatar.com\/avatar\/8b1f016c79a6b82740427da6fff77de2?s=96&d=mm&r=g"},"meta":[],"_links":{"self":[{"href":"https:\/\/underhandedcrypto.com\/wp-json\/wp\/v2\/users\/2"}],"collection":[{"href":"https:\/\/underhandedcrypto.com\/wp-json\/wp\/v2\/users"}]}}]
         | 
| @@ -0,0 +1,61 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            <!DOCTYPE html>
         | 
| 3 | 
            +
            <!--[if IE 8]>
         | 
| 4 | 
            +
            		<html xmlns="http://www.w3.org/1999/xhtml" class="ie8" lang="en-US">
         | 
| 5 | 
            +
            	<![endif]-->
         | 
| 6 | 
            +
            <!--[if !(IE 8) ]><!-->
         | 
| 7 | 
            +
            <html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
         | 
| 8 | 
            +
            <!--<![endif]-->
         | 
| 9 | 
            +
            <head>
         | 
| 10 | 
            +
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
         | 
| 11 | 
            +
            <title>Log In ‹ Underhanded Crypto Contest — WordPress</title>
         | 
| 12 | 
            +
            <link rel='dns-prefetch' href='//s.w.org' />
         | 
| 13 | 
            +
            <link rel='stylesheet' href='https://underhandedcrypto.com/wp-admin/load-styles.php?c=0&dir=ltr&load%5B%5D=dashicons,buttons,forms,l10n,login&ver=4.9.8' type='text/css' media='all' />
         | 
| 14 | 
            +
            <meta name='robots' content='noindex,follow' />
         | 
| 15 | 
            +
            <meta name="viewport" content="width=device-width" />
         | 
| 16 | 
            +
            <link rel="icon" href="https://underhandedcrypto.com/wp-content/uploads/2014/09/cropped-logo1-32x32.png" sizes="32x32" />
         | 
| 17 | 
            +
            <link rel="icon" href="https://underhandedcrypto.com/wp-content/uploads/2014/09/cropped-logo1-192x192.png" sizes="192x192" />
         | 
| 18 | 
            +
            <link rel="apple-touch-icon-precomposed" href="https://underhandedcrypto.com/wp-content/uploads/2014/09/cropped-logo1-180x180.png" />
         | 
| 19 | 
            +
            <meta name="msapplication-TileImage" content="https://underhandedcrypto.com/wp-content/uploads/2014/09/cropped-logo1-270x270.png" />
         | 
| 20 | 
            +
            </head>
         | 
| 21 | 
            +
            <body class="login login-action-login wp-core-ui  locale-en-us">
         | 
| 22 | 
            +
            <div id="login">
         | 
| 23 | 
            +
            <h1><a href="https://wordpress.org/" title="Powered by WordPress" tabindex="-1">Powered by WordPress</a></h1>
         | 
| 24 | 
            +
            <form name="loginform" id="loginform" action="https://underhandedcrypto.com/wp-login.php" method="post">
         | 
| 25 | 
            +
            <p>
         | 
| 26 | 
            +
            <label for="user_login">Username or Email Address<br />
         | 
| 27 | 
            +
            <input type="text" name="log" id="user_login" class="input" value="" size="20" /></label>
         | 
| 28 | 
            +
            </p>
         | 
| 29 | 
            +
            <p>
         | 
| 30 | 
            +
            <label for="user_pass">Password<br />
         | 
| 31 | 
            +
            <input type="password" name="pwd" id="user_pass" class="input" value="" size="20" /></label>
         | 
| 32 | 
            +
            </p>
         | 
| 33 | 
            +
            <p class="forgetmenot"><label for="rememberme"><input name="rememberme" type="checkbox" id="rememberme" value="forever" /> Remember Me</label></p>
         | 
| 34 | 
            +
            <p class="submit">
         | 
| 35 | 
            +
            <input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="Log In" />
         | 
| 36 | 
            +
            <input type="hidden" name="redirect_to" value="https://underhandedcrypto.com/wp-admin/" />
         | 
| 37 | 
            +
            <input type="hidden" name="testcookie" value="1" />
         | 
| 38 | 
            +
            </p>
         | 
| 39 | 
            +
            </form>
         | 
| 40 | 
            +
            <p id="nav">
         | 
| 41 | 
            +
            <a href="https://underhandedcrypto.com/wp-login.php?action=lostpassword">Lost your password?</a>
         | 
| 42 | 
            +
            </p>
         | 
| 43 | 
            +
            <script type="text/javascript">
         | 
| 44 | 
            +
            function wp_attempt_focus(){
         | 
| 45 | 
            +
            setTimeout( function(){ try{
         | 
| 46 | 
            +
            d = document.getElementById('user_login');
         | 
| 47 | 
            +
            d.focus();
         | 
| 48 | 
            +
            d.select();
         | 
| 49 | 
            +
            } catch(e){}
         | 
| 50 | 
            +
            }, 200);
         | 
| 51 | 
            +
            }
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            wp_attempt_focus();
         | 
| 54 | 
            +
            if(typeof wpOnload=='function')wpOnload();
         | 
| 55 | 
            +
            </script>
         | 
| 56 | 
            +
            <p id="backtoblog"><a href="https://underhandedcrypto.com/">← Back to Underhanded Crypto Contest</a></p>
         | 
| 57 | 
            +
            </div>
         | 
| 58 | 
            +
            <link rel='stylesheet' id='jetpack_css-css' href='https://underhandedcrypto.com/wp-content/plugins/jetpack/css/jetpack.css?ver=6.4.2' type='text/css' media='all' />
         | 
| 59 | 
            +
            <div class="clear"></div>
         | 
| 60 | 
            +
            </body>
         | 
| 61 | 
            +
            </html>
         | 
| @@ -0,0 +1,80 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            <!DOCTYPE html>
         | 
| 3 | 
            +
            	<!--[if IE 8]>
         | 
| 4 | 
            +
            		<html xmlns="http://www.w3.org/1999/xhtml" class="ie8" lang="en-US">
         | 
| 5 | 
            +
            	<![endif]-->
         | 
| 6 | 
            +
            	<!--[if !(IE 8) ]><!-->
         | 
| 7 | 
            +
            		<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
         | 
| 8 | 
            +
            	<!--<![endif]-->
         | 
| 9 | 
            +
            	<head>
         | 
| 10 | 
            +
            	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
         | 
| 11 | 
            +
            	<title>Log In ‹ Adam Caudill — WordPress</title>
         | 
| 12 | 
            +
            	<link rel='dns-prefetch' href='//s.w.org' />
         | 
| 13 | 
            +
            <link rel='stylesheet' id='dashicons-css'  href='https://adamcaudill.com/wp-includes/css/dashicons.min.css?ver=5.1.1' type='text/css' media='all' />
         | 
| 14 | 
            +
            <link rel='stylesheet' id='buttons-css'  href='https://adamcaudill.com/wp-includes/css/buttons.min.css?ver=5.1.1' type='text/css' media='all' />
         | 
| 15 | 
            +
            <link rel='stylesheet' id='forms-css'  href='https://adamcaudill.com/wp-admin/css/forms.min.css?ver=5.1.1' type='text/css' media='all' />
         | 
| 16 | 
            +
            <link rel='stylesheet' id='l10n-css'  href='https://adamcaudill.com/wp-admin/css/l10n.min.css?ver=5.1.1' type='text/css' media='all' />
         | 
| 17 | 
            +
            <link rel='stylesheet' id='login-css'  href='https://adamcaudill.com/wp-admin/css/login.min.css?ver=5.1.1' type='text/css' media='all' />
         | 
| 18 | 
            +
            	<meta name='robots' content='noindex,noarchive' />
         | 
| 19 | 
            +
            	<meta name='referrer' content='strict-origin-when-cross-origin' />
         | 
| 20 | 
            +
            		<meta name="viewport" content="width=device-width" />
         | 
| 21 | 
            +
            		</head>
         | 
| 22 | 
            +
            	<body class="login login-action-login wp-core-ui  locale-en-us">
         | 
| 23 | 
            +
            		<div id="login">
         | 
| 24 | 
            +
            		<h1><a href="https://wordpress.org/" title="Powered by WordPress">Powered by WordPress</a></h1>
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            	<form name="loginform" id="loginform" action="https://adamcaudill.com/wp-login.php" method="post">
         | 
| 27 | 
            +
            	<p>
         | 
| 28 | 
            +
            		<label for="user_login">Username or Email Address<br />
         | 
| 29 | 
            +
            		<input type="text" name="log" id="user_login" class="input" value="" size="20" autocapitalize="off" /></label>
         | 
| 30 | 
            +
            	</p>
         | 
| 31 | 
            +
            	<p>
         | 
| 32 | 
            +
            		<label for="user_pass">Password<br />
         | 
| 33 | 
            +
            		<input type="password" name="pwd" id="user_pass" class="input" value="" size="20" /></label>
         | 
| 34 | 
            +
            	</p>
         | 
| 35 | 
            +
            			<p>
         | 
| 36 | 
            +
            		<label title="If you don't have Google Authenticator enabled for your WordPress account, leave this field empty.">Google Authenticator code<span id="google-auth-info"></span><br />
         | 
| 37 | 
            +
            		<input type="text" name="googleotp" id="user_email" class="input" value="" size="20" style="ime-mode: inactive;" /></label>
         | 
| 38 | 
            +
            	</p>
         | 
| 39 | 
            +
            	<p class="forgetmenot"><label for="rememberme"><input name="rememberme" type="checkbox" id="rememberme" value="forever"  /> Remember Me</label></p>
         | 
| 40 | 
            +
            	<p class="submit">
         | 
| 41 | 
            +
            		<input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="Log In" />
         | 
| 42 | 
            +
            				<input type="hidden" name="redirect_to" value="https://adamcaudill.com/wp-admin/" />
         | 
| 43 | 
            +
            					<input type="hidden" name="testcookie" value="1" />
         | 
| 44 | 
            +
            	</p>
         | 
| 45 | 
            +
            	</form>
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            			<p id="nav">
         | 
| 48 | 
            +
            					<a href="https://adamcaudill.com/wp-login.php?action=lostpassword">Lost your password?</a>
         | 
| 49 | 
            +
            				</p>
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            	<script type="text/javascript">
         | 
| 52 | 
            +
            	function wp_attempt_focus(){
         | 
| 53 | 
            +
            	setTimeout( function(){ try{
         | 
| 54 | 
            +
            			d = document.getElementById('user_login');
         | 
| 55 | 
            +
            				d.focus();
         | 
| 56 | 
            +
            	d.select();
         | 
| 57 | 
            +
            	} catch(e){}
         | 
| 58 | 
            +
            	}, 200);
         | 
| 59 | 
            +
            	}
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            			wp_attempt_focus();
         | 
| 62 | 
            +
            			if(typeof wpOnload=='function')wpOnload();
         | 
| 63 | 
            +
            			</script>
         | 
| 64 | 
            +
             | 
| 65 | 
            +
            			<p id="backtoblog"><a href="https://adamcaudill.com/">
         | 
| 66 | 
            +
            		← Back to Adam Caudill	</a></p>
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            	</div>
         | 
| 69 | 
            +
             | 
| 70 | 
            +
             | 
| 71 | 
            +
             | 
| 72 | 
            +
            <script type="text/javascript">
         | 
| 73 | 
            +
            	try{
         | 
| 74 | 
            +
            		document.getElementById('user_email').setAttribute('autocomplete','off');
         | 
| 75 | 
            +
            	} catch(e){}
         | 
| 76 | 
            +
            </script>
         | 
| 77 | 
            +
            <link rel='stylesheet' id='jetpack_css-css'  href='https://adamcaudill.com/wp-content/plugins/jetpack/css/jetpack.css?ver=7.1.1' type='text/css' media='all' />
         | 
| 78 | 
            +
            	<div class="clear"></div>
         | 
| 79 | 
            +
            	</body>
         | 
| 80 | 
            +
            	</html>
         | 
| @@ -0,0 +1,76 @@ | |
| 1 | 
            +
            require 'webrick'
         | 
| 2 | 
            +
            require File.dirname(__FILE__) + '/../lib/yawast'
         | 
| 3 | 
            +
            require File.dirname(__FILE__) + '/base'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class TestAppCMSWordPress < Minitest::Test
         | 
| 6 | 
            +
              include TestBase
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              def test_identify_wp_551
         | 
| 9 | 
            +
                override_stdout
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                port = rand(60000) + 1024 # pick a random port number
         | 
| 12 | 
            +
                server = start_web_server File.dirname(__FILE__) + '/data/wp-login-5.1.1.txt', '', port
         | 
| 13 | 
            +
                uri = Yawast::Commands::Utils.extract_uri(["http://localhost:#{port}"])
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                error = nil
         | 
| 16 | 
            +
                begin
         | 
| 17 | 
            +
                  Yawast::Shared::Http.setup nil, nil
         | 
| 18 | 
            +
                  Yawast::Scanner::Plugins::Applications::CMS::WordPress.identify uri
         | 
| 19 | 
            +
                rescue => e
         | 
| 20 | 
            +
                  error = e.message
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                assert stdout_value.include?('Found WordPress v5.1.1'), "WordPress version not found: #{stdout_value}"
         | 
| 24 | 
            +
                assert error == nil, "Unexpected error: #{error}"
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                restore_stdout
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                server.exit
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              def test_identify_wp_498
         | 
| 32 | 
            +
                override_stdout
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                port = rand(60000) + 1024 # pick a random port number
         | 
| 35 | 
            +
                server = start_web_server File.dirname(__FILE__) + '/data/wp-login-4.9.8.txt', '', port
         | 
| 36 | 
            +
                uri = Yawast::Commands::Utils.extract_uri(["http://localhost:#{port}"])
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                error = nil
         | 
| 39 | 
            +
                begin
         | 
| 40 | 
            +
                  Yawast::Shared::Http.setup nil, nil
         | 
| 41 | 
            +
                  Yawast::Scanner::Plugins::Applications::CMS::WordPress.identify uri
         | 
| 42 | 
            +
                rescue => e
         | 
| 43 | 
            +
                  error = e.message
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                assert stdout_value.include?('Found WordPress v4.9.8'), "WordPress version not found: #{stdout_value}"
         | 
| 47 | 
            +
                assert error == nil, "Unexpected error: #{error}"
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                restore_stdout
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                server.exit
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
              def test_wp_json_enum
         | 
| 55 | 
            +
                override_stdout
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                port = rand(60000) + 1024 # pick a random port number
         | 
| 58 | 
            +
                server = start_web_server File.dirname(__FILE__) + '/data/wp-json-users.txt', '', port
         | 
| 59 | 
            +
                uri = Yawast::Commands::Utils.extract_uri(["http://localhost:#{port}"])
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                error = nil
         | 
| 62 | 
            +
                begin
         | 
| 63 | 
            +
                  Yawast::Shared::Http.setup nil, nil
         | 
| 64 | 
            +
                  Yawast::Scanner::Plugins::Applications::CMS::WordPress.check_json_user_enum uri
         | 
| 65 | 
            +
                rescue => e
         | 
| 66 | 
            +
                  error = e.message
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                assert stdout_value.include?('WordPress WP-JSON User Enumeration at'), "WordPress WP-JSON User Enum not found: #{stdout_value}"
         | 
| 70 | 
            +
                assert error == nil, "Unexpected error: #{error}"
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                restore_stdout
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                server.exit
         | 
| 75 | 
            +
              end
         | 
| 76 | 
            +
            end
         | 
    
        data/test/test_app_fw_rails.rb
    CHANGED
    
    
    
        data/test/test_ssl_sweet32.rb
    CHANGED
    
    | @@ -4,26 +4,26 @@ require File.dirname(__FILE__) + '/base' | |
| 4 4 | 
             
            class TestSharedHttp < Minitest::Test
         | 
| 5 5 | 
             
              include TestBase
         | 
| 6 6 |  | 
| 7 | 
            -
              def test_check_tdes
         | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
              end
         | 
| 17 | 
            -
             | 
| 18 | 
            -
              def test_session_count
         | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
              end
         | 
| 7 | 
            +
              # def test_check_tdes
         | 
| 8 | 
            +
              #   override_stdout
         | 
| 9 | 
            +
              #
         | 
| 10 | 
            +
              #   res = Yawast::Scanner::Plugins::SSL::Sweet32.check_tdes
         | 
| 11 | 
            +
              #
         | 
| 12 | 
            +
              #   assert stdout_value.include?('OpenSSL supports 3DES'), "Header line not found in #{stdout_value}"
         | 
| 13 | 
            +
              #   assert res, '3DES support check failed'
         | 
| 14 | 
            +
              #
         | 
| 15 | 
            +
              #   restore_stdout
         | 
| 16 | 
            +
              # end
         | 
| 17 | 
            +
              #
         | 
| 18 | 
            +
              # def test_session_count
         | 
| 19 | 
            +
              #   override_stdout
         | 
| 20 | 
            +
              #
         | 
| 21 | 
            +
              #   uri = URI::Parser.new.parse 'https://3des.badssl.com/'
         | 
| 22 | 
            +
              #   Yawast::Scanner::Plugins::SSL::Sweet32.get_tdes_session_msg_count uri, 1
         | 
| 23 | 
            +
              #
         | 
| 24 | 
            +
              #   assert stdout_value.include?('Connection not terminated after'), "SWEET32 warning not found in #{stdout_value}"
         | 
| 25 | 
            +
              #
         | 
| 26 | 
            +
              #   restore_stdout
         | 
| 27 | 
            +
              # end
         | 
| 28 28 |  | 
| 29 29 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: yawast
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.7.0 | 
| 4 | 
            +
              version: 0.7.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Adam Caudill
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2019-04- | 
| 11 | 
            +
            date: 2019-04-19 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: colorize
         | 
| @@ -225,6 +225,7 @@ files: | |
| 225 225 | 
             
            - lib/scanner/core.rb
         | 
| 226 226 | 
             
            - lib/scanner/generic.rb
         | 
| 227 227 | 
             
            - lib/scanner/plugins/applications/cms/generic.rb
         | 
| 228 | 
            +
            - lib/scanner/plugins/applications/cms/wordpress.rb
         | 
| 228 229 | 
             
            - lib/scanner/plugins/applications/framework/rails.rb
         | 
| 229 230 | 
             
            - lib/scanner/plugins/applications/generic/password_reset.rb
         | 
| 230 231 | 
             
            - lib/scanner/plugins/dns/caa.rb
         | 
| @@ -274,6 +275,10 @@ files: | |
| 274 275 | 
             
            - test/data/ssl_labs_info.json
         | 
| 275 276 | 
             
            - test/data/tomcat_release_notes.txt
         | 
| 276 277 | 
             
            - test/data/wordpress_readme_html.txt
         | 
| 278 | 
            +
            - test/data/wp-json-users.txt
         | 
| 279 | 
            +
            - test/data/wp-login-4.9.8.txt
         | 
| 280 | 
            +
            - test/data/wp-login-5.1.1.txt
         | 
| 281 | 
            +
            - test/test_app_cms_wp.rb
         | 
| 277 282 | 
             
            - test/test_app_fw_rails.rb
         | 
| 278 283 | 
             
            - test/test_cmd_util.rb
         | 
| 279 284 | 
             
            - test/test_directory_search.rb
         | 
| @@ -312,9 +317,9 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 312 317 | 
             
                  version: '0'
         | 
| 313 318 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 314 319 | 
             
              requirements:
         | 
| 315 | 
            -
              - - " | 
| 320 | 
            +
              - - ">="
         | 
| 316 321 | 
             
                - !ruby/object:Gem::Version
         | 
| 317 | 
            -
                  version:  | 
| 322 | 
            +
                  version: '0'
         | 
| 318 323 | 
             
            requirements: []
         | 
| 319 324 | 
             
            rubyforge_project: yawast
         | 
| 320 325 | 
             
            rubygems_version: 2.6.14
         | 
| @@ -343,6 +348,10 @@ test_files: | |
| 343 348 | 
             
            - test/data/ssl_labs_info.json
         | 
| 344 349 | 
             
            - test/data/tomcat_release_notes.txt
         | 
| 345 350 | 
             
            - test/data/wordpress_readme_html.txt
         | 
| 351 | 
            +
            - test/data/wp-json-users.txt
         | 
| 352 | 
            +
            - test/data/wp-login-4.9.8.txt
         | 
| 353 | 
            +
            - test/data/wp-login-5.1.1.txt
         | 
| 354 | 
            +
            - test/test_app_cms_wp.rb
         | 
| 346 355 | 
             
            - test/test_app_fw_rails.rb
         | 
| 347 356 | 
             
            - test/test_cmd_util.rb
         | 
| 348 357 | 
             
            - test/test_directory_search.rb
         |