bettercap 1.6.1 → 1.6.2
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/README.md +33 -34
 - data/bin/bettercap +1 -1
 - data/lib/bettercap/context.rb +1 -1
 - data/lib/bettercap/discovery/agents/mdns.rb +61 -0
 - data/lib/bettercap/discovery/agents/upnp.rb +60 -0
 - data/lib/bettercap/discovery/agents/wsd.rb +75 -0
 - data/lib/bettercap/firewalls/linux.rb +0 -4
 - data/lib/bettercap/logger.rb +63 -34
 - data/lib/bettercap/network/network.rb +1 -1
 - data/lib/bettercap/options/core_options.rb +1 -1
 - data/lib/bettercap/proxy/http/modules/redirect.rb +1 -1
 - data/lib/bettercap/proxy/http/proxy.rb +1 -9
 - data/lib/bettercap/proxy/http/sslstrip/strip.rb +5 -5
 - data/lib/bettercap/sniffer/parsers/asterisk.rb +37 -0
 - data/lib/bettercap/sniffer/parsers/bfd.rb +159 -0
 - data/lib/bettercap/sniffer/parsers/dhcp.rb +23 -23
 - data/lib/bettercap/sniffer/parsers/dict.rb +13 -11
 - data/lib/bettercap/sniffer/parsers/hsrp.rb +262 -0
 - data/lib/bettercap/sniffer/parsers/https.rb +17 -19
 - data/lib/bettercap/sniffer/parsers/mpd.rb +12 -10
 - data/lib/bettercap/sniffer/parsers/nntp.rb +5 -1
 - data/lib/bettercap/sniffer/parsers/post.rb +8 -9
 - data/lib/bettercap/sniffer/parsers/radius.rb +410 -0
 - data/lib/bettercap/sniffer/parsers/redis.rb +15 -13
 - data/lib/bettercap/sniffer/parsers/rlogin.rb +20 -19
 - data/lib/bettercap/sniffer/parsers/snmp.rb +16 -17
 - data/lib/bettercap/sniffer/parsers/snpp.rb +13 -11
 - data/lib/bettercap/sniffer/parsers/teamtalk.rb +41 -0
 - data/lib/bettercap/sniffer/parsers/teamviewer.rb +8 -8
 - data/lib/bettercap/sniffer/parsers/url.rb +6 -6
 - data/lib/bettercap/sniffer/parsers/whatsapp.rb +6 -7
 - data/lib/bettercap/sniffer/parsers/wol.rb +68 -0
 - data/lib/bettercap/spoofers/arp.rb +3 -3
 - data/lib/bettercap/spoofers/hsrp.rb +351 -0
 - data/lib/bettercap/spoofers/mac.rb +126 -0
 - data/lib/bettercap/version.rb +1 -1
 - metadata +13 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: b7b14d5a93e46311f7abcb2a9bb1ae008ead71ea
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: c9a0bc4f745b7b37d8d5313048a554a6d24c0895
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 3b64319b9bc5243c6976e341a3d8f62867224c8c3dd0a85511c76133e3798660d19c10e8285ebb0c966fe4f3468328e766ba4a9f42310550b939ca2056f524d8
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 925bb24ab784ee2e4ce4644eab36d658a48b313b825a3aa7f7262503f5e20d6ca9c0e3beac1c7a3ec69bbbea317be7849b73fcf3928e2918c969f8de4f98c9ae
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -1,8 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            **bettercap** is a complete, modular, portable and easily extensible **MITM** tool and framework with every kind of diagnostic
         
     | 
| 
       2 
2 
     | 
    
         
             
            and offensive feature you could need in order to perform a man in the middle attack.
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
     | 
    
         
            -
            Before submitting issues, please read the relevant [section](https://www.bettercap.org/docs/contribute/) in the documentation.
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
4 
     | 
    
         
             
            <table>
         
     | 
| 
       7 
5 
     | 
    
         
             
                <tr>
         
     | 
| 
       8 
6 
     | 
    
         
             
                    <th>Version</th>
         
     | 
| 
         @@ -17,16 +15,9 @@ Before submitting issues, please read the relevant [section](https://www.betterc 
     | 
|
| 
       17 
15 
     | 
    
         
             
                    <td><a href="https://www.bettercap.org/">https://www.bettercap.org/</a></td>
         
     | 
| 
       18 
16 
     | 
    
         
             
                </tr>
         
     | 
| 
       19 
17 
     | 
    
         
             
                <tr>
         
     | 
| 
       20 
     | 
    
         
            -
                    <th> 
     | 
| 
       21 
     | 
    
         
            -
                    <td><a href="https://www.bettercap.org/blog/">https://www.bettercap.org/blog/</a></td>
         
     | 
| 
       22 
     | 
    
         
            -
                <tr>
         
     | 
| 
       23 
     | 
    
         
            -
                    <th>Github</th>
         
     | 
| 
      
 18 
     | 
    
         
            +
                    <th>GitHub</th>
         
     | 
| 
       24 
19 
     | 
    
         
             
                    <td><a href="https://github.com/evilsocket/bettercap">https://github.com/evilsocket/bettercap</a></td>
         
     | 
| 
       25 
20 
     | 
    
         
             
                 <tr/>
         
     | 
| 
       26 
     | 
    
         
            -
                <tr>
         
     | 
| 
       27 
     | 
    
         
            -
                    <th>Documentation</th>
         
     | 
| 
       28 
     | 
    
         
            -
                    <td><a href="https://www.bettercap.org/docs/">https://www.bettercap.org/docs/</a></td>
         
     | 
| 
       29 
     | 
    
         
            -
                </tr>
         
     | 
| 
       30 
21 
     | 
    
         
             
                <tr>
         
     | 
| 
       31 
22 
     | 
    
         
             
                    <th>Code Documentation</th>
         
     | 
| 
       32 
23 
     | 
    
         
             
                    <td>
         
     | 
| 
         @@ -46,16 +37,8 @@ Before submitting issues, please read the relevant [section](https://www.betterc 
     | 
|
| 
       46 
37 
     | 
    
         
             
                    <td><a href="https://twitter.com/bettercap">@bettercap</a></td>
         
     | 
| 
       47 
38 
     | 
    
         
             
                </tr>
         
     | 
| 
       48 
39 
     | 
    
         
             
                <tr>
         
     | 
| 
       49 
     | 
    
         
            -
                    <th> 
     | 
| 
       50 
     | 
    
         
            -
                    <td>
         
     | 
| 
       51 
     | 
    
         
            -
                      <a href="https://gitter.im/evilsocket/bettercap" target="_blank">
         
     | 
| 
       52 
     | 
    
         
            -
                        <img src="https://badges.gitter.im/evilsocket/bettercap.svg"/>
         
     | 
| 
       53 
     | 
    
         
            -
                      </a>
         
     | 
| 
       54 
     | 
    
         
            -
                    </td>
         
     | 
| 
       55 
     | 
    
         
            -
                </tr>
         
     | 
| 
       56 
     | 
    
         
            -
                <tr>
         
     | 
| 
       57 
     | 
    
         
            -
                    <th>Copyright</th>
         
     | 
| 
       58 
     | 
    
         
            -
                    <td>2015-2016 Simone Margaritelli</td>
         
     | 
| 
      
 40 
     | 
    
         
            +
                    <th>Copyleft</th>
         
     | 
| 
      
 41 
     | 
    
         
            +
                    <td>Simone Margaritelli</td>
         
     | 
| 
       59 
42 
     | 
    
         
             
                </tr>
         
     | 
| 
       60 
43 
     | 
    
         
             
                <tr>
         
     | 
| 
       61 
44 
     | 
    
         
             
                    <th>License</th>
         
     | 
| 
         @@ -68,33 +51,49 @@ Installation 
     | 
|
| 
       68 
51 
     | 
    
         | 
| 
       69 
52 
     | 
    
         
             
            **Dependencies**
         
     | 
| 
       70 
53 
     | 
    
         | 
| 
       71 
     | 
    
         
            -
            All dependencies will be automatically installed through the  
     | 
| 
       72 
     | 
    
         
            -
            dependency in order to make everything work 
     | 
| 
      
 54 
     | 
    
         
            +
            All dependencies will be automatically installed through the RubyGems system but in some cases you might need to install some system
         
     | 
| 
      
 55 
     | 
    
         
            +
            dependency in order to make everything work.
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
            **On OSX** (install brew and xcode tools first):
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
            ```shell
         
     | 
| 
      
 60 
     | 
    
         
            +
            brew install libpcap
         
     | 
| 
      
 61 
     | 
    
         
            +
            ```
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
            **On Linux**:
         
     | 
| 
       73 
64 
     | 
    
         | 
| 
       74 
     | 
    
         
            -
             
     | 
| 
      
 65 
     | 
    
         
            +
            ```shell
         
     | 
| 
      
 66 
     | 
    
         
            +
            sudo apt-get install build-essential ruby-dev libpcap-dev net-tools
         
     | 
| 
      
 67 
     | 
    
         
            +
            ```
         
     | 
| 
       75 
68 
     | 
    
         | 
| 
       76 
69 
     | 
    
         
             
            This should solve issues such as [this one](https://github.com/evilsocket/bettercap/issues/22) or [this one](https://github.com/evilsocket/bettercap/issues/100).
         
     | 
| 
       77 
70 
     | 
    
         | 
| 
       78 
     | 
    
         
            -
            **Stable Release ( 
     | 
| 
      
 71 
     | 
    
         
            +
            **Stable Release (RubyGems)**
         
     | 
| 
       79 
72 
     | 
    
         | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
      
 73 
     | 
    
         
            +
            ```shell
         
     | 
| 
      
 74 
     | 
    
         
            +
            gem install bettercap
         
     | 
| 
      
 75 
     | 
    
         
            +
            ```
         
     | 
| 
       81 
76 
     | 
    
         | 
| 
       82 
77 
     | 
    
         
             
            **From Source**
         
     | 
| 
       83 
78 
     | 
    
         | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
       86 
     | 
    
         
            -
             
     | 
| 
       87 
     | 
    
         
            -
             
     | 
| 
      
 79 
     | 
    
         
            +
            ```shell
         
     | 
| 
      
 80 
     | 
    
         
            +
            git clone https://github.com/evilsocket/bettercap
         
     | 
| 
      
 81 
     | 
    
         
            +
            cd bettercap
         
     | 
| 
      
 82 
     | 
    
         
            +
            gem build bettercap.gemspec
         
     | 
| 
      
 83 
     | 
    
         
            +
            sudo gem install bettercap*.gem
         
     | 
| 
      
 84 
     | 
    
         
            +
            ```
         
     | 
| 
       88 
85 
     | 
    
         | 
| 
       89 
86 
     | 
    
         
             
            **Installation on Kali Linux**
         
     | 
| 
       90 
87 
     | 
    
         | 
| 
       91 
88 
     | 
    
         
             
            Kali Linux has bettercap packaged and added to the **kali-rolling** repositories. To install bettercap and all dependencies in one fell swoop on the latest version of Kali Linux:
         
     | 
| 
       92 
     | 
    
         
            -
             
     | 
| 
       93 
     | 
    
         
            -
             
     | 
| 
       94 
     | 
    
         
            -
             
     | 
| 
       95 
     | 
    
         
            -
             
     | 
| 
      
 89 
     | 
    
         
            +
               
         
     | 
| 
      
 90 
     | 
    
         
            +
            ```shell
         
     | 
| 
      
 91 
     | 
    
         
            +
            apt-get update
         
     | 
| 
      
 92 
     | 
    
         
            +
            apt-get dist-upgrade
         
     | 
| 
      
 93 
     | 
    
         
            +
            apt-get install bettercap
         
     | 
| 
      
 94 
     | 
    
         
            +
            ```
         
     | 
| 
       96 
95 
     | 
    
         | 
| 
       97 
96 
     | 
    
         
             
            Documentation and Examples
         
     | 
| 
       98 
97 
     | 
    
         
             
            ============
         
     | 
| 
       99 
98 
     | 
    
         | 
| 
       100 
     | 
    
         
            -
            Please refer to the [official website](https://www.bettercap.org/ 
     | 
| 
      
 99 
     | 
    
         
            +
            Please refer to the [official website](https://www.bettercap.org/).
         
     | 
    
        data/bin/bettercap
    CHANGED
    
    
    
        data/lib/bettercap/context.rb
    CHANGED
    
    
| 
         @@ -0,0 +1,61 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: UTF-8
         
     | 
| 
      
 2 
     | 
    
         
            +
            =begin
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            BETTERCAP
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            Author : Simone 'evilsocket' Margaritelli
         
     | 
| 
      
 7 
     | 
    
         
            +
            Email  : evilsocket@gmail.com
         
     | 
| 
      
 8 
     | 
    
         
            +
            Blog   : https://www.evilsocket.net/
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            mDNS DNS-SD broadcast discovery agent:
         
     | 
| 
      
 11 
     | 
    
         
            +
              Author : Brendan Coles
         
     | 
| 
      
 12 
     | 
    
         
            +
              Email  : bcoles[at]gmail.com
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            This project is released under the GPL 3 license.
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            =end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            # Send a broadcast mDNS query trying to fill the ARP table.
         
     | 
| 
      
 19 
     | 
    
         
            +
            module BetterCap
         
     | 
| 
      
 20 
     | 
    
         
            +
            module Discovery
         
     | 
| 
      
 21 
     | 
    
         
            +
            module Agents
         
     | 
| 
      
 22 
     | 
    
         
            +
            # Class responsible for sending mDNS broadcast queries to the network.
         
     | 
| 
      
 23 
     | 
    
         
            +
            class Mdns
         
     | 
| 
      
 24 
     | 
    
         
            +
              # Create a thread which will send an mDNS broadcast query
         
     | 
| 
      
 25 
     | 
    
         
            +
              # in order to populate the ARP cache with active targets.
         
     | 
| 
      
 26 
     | 
    
         
            +
              # http://www.multicastdns.org/
         
     | 
| 
      
 27 
     | 
    
         
            +
              # http://www.ietf.org/rfc/rfc6762.txt
         
     | 
| 
      
 28 
     | 
    
         
            +
              # https://en.wikipedia.org/wiki/Multicast_DNS
         
     | 
| 
      
 29 
     | 
    
         
            +
              # https://en.wikipedia.org/wiki/Zero-configuration_networking#DNS-SD_with_multicast
         
     | 
| 
      
 30 
     | 
    
         
            +
              def initialize( ctx, address = nil )
         
     | 
| 
      
 31 
     | 
    
         
            +
                pkt = PacketFu::UDPPacket.new
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                pkt.eth_saddr = ctx.iface.mac
         
     | 
| 
      
 34 
     | 
    
         
            +
                pkt.eth_daddr = '01:00:5e:00:00:fb'
         
     | 
| 
      
 35 
     | 
    
         
            +
                pkt.ip_saddr  = ctx.iface.ip
         
     | 
| 
      
 36 
     | 
    
         
            +
                pkt.ip_daddr  = '224.0.0.251'
         
     | 
| 
      
 37 
     | 
    
         
            +
                pkt.udp_src   = (rand((2 ** 16) - 1024) + 1024).to_i
         
     | 
| 
      
 38 
     | 
    
         
            +
                pkt.udp_dst   = 5353
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                query = "\x09_services\x07_dns-sd\x04_udp\x05local"
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                payload =  "\x00\x01" # Transaction ID
         
     | 
| 
      
 43 
     | 
    
         
            +
                payload << "\x00\x00" # Flags
         
     | 
| 
      
 44 
     | 
    
         
            +
                payload << "\x00\x01" # Number of questions
         
     | 
| 
      
 45 
     | 
    
         
            +
                payload << "\x00\x00" # Number of answers
         
     | 
| 
      
 46 
     | 
    
         
            +
                payload << "\x00\x00" # Number of authority resource records
         
     | 
| 
      
 47 
     | 
    
         
            +
                payload << "\x00\x00" # Number of additional resource records
         
     | 
| 
      
 48 
     | 
    
         
            +
                payload << query      # Query
         
     | 
| 
      
 49 
     | 
    
         
            +
                payload << "\x00"     # Terminator
         
     | 
| 
      
 50 
     | 
    
         
            +
                payload << "\x00\x0c" # Type (PTR)
         
     | 
| 
      
 51 
     | 
    
         
            +
                payload << "\x00\x01" # Class
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                pkt.payload = payload
         
     | 
| 
      
 54 
     | 
    
         
            +
                pkt.recalc
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                ctx.packets.push(pkt)
         
     | 
| 
      
 57 
     | 
    
         
            +
              end
         
     | 
| 
      
 58 
     | 
    
         
            +
            end
         
     | 
| 
      
 59 
     | 
    
         
            +
            end
         
     | 
| 
      
 60 
     | 
    
         
            +
            end
         
     | 
| 
      
 61 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,60 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: UTF-8
         
     | 
| 
      
 2 
     | 
    
         
            +
            =begin
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            BETTERCAP
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            Author : Simone 'evilsocket' Margaritelli
         
     | 
| 
      
 7 
     | 
    
         
            +
            Email  : evilsocket@gmail.com
         
     | 
| 
      
 8 
     | 
    
         
            +
            Blog   : https://www.evilsocket.net/
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            UPnP SSDP broadcast discovery agent:
         
     | 
| 
      
 11 
     | 
    
         
            +
              Author : Brendan Coles
         
     | 
| 
      
 12 
     | 
    
         
            +
              Email  : bcoles[at]gmail.com
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            This project is released under the GPL 3 license.
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            =end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            # Send a broadcast UPnP query trying to fill the ARP table.
         
     | 
| 
      
 19 
     | 
    
         
            +
            module BetterCap
         
     | 
| 
      
 20 
     | 
    
         
            +
            module Discovery
         
     | 
| 
      
 21 
     | 
    
         
            +
            module Agents
         
     | 
| 
      
 22 
     | 
    
         
            +
            # Class responsible for sending UPnP SSDP broadcast queries to the network.
         
     | 
| 
      
 23 
     | 
    
         
            +
            class Upnp
         
     | 
| 
      
 24 
     | 
    
         
            +
              # Create a thread which will send a UPnP SSDP M-SEARCH broadcast query
         
     | 
| 
      
 25 
     | 
    
         
            +
              # in order to populate the ARP cache with active targets.
         
     | 
| 
      
 26 
     | 
    
         
            +
              # https://tools.ietf.org/html/draft-cai-ssdp-v1-03#section-4
         
     | 
| 
      
 27 
     | 
    
         
            +
              # https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol
         
     | 
| 
      
 28 
     | 
    
         
            +
              # https://en.wikipedia.org/wiki/Zero-configuration_networking#SSDP
         
     | 
| 
      
 29 
     | 
    
         
            +
              def initialize( ctx, address = nil )
         
     | 
| 
      
 30 
     | 
    
         
            +
                host = '239.255.255.250'
         
     | 
| 
      
 31 
     | 
    
         
            +
                port = 1900
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                pkt = PacketFu::UDPPacket.new
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                pkt.eth_saddr = ctx.iface.mac
         
     | 
| 
      
 36 
     | 
    
         
            +
                pkt.eth_daddr = '01:00:5e:7f:ff:fa'
         
     | 
| 
      
 37 
     | 
    
         
            +
                pkt.ip_saddr  = ctx.iface.ip
         
     | 
| 
      
 38 
     | 
    
         
            +
                pkt.ip_daddr  = host
         
     | 
| 
      
 39 
     | 
    
         
            +
                pkt.udp_src   = (rand((2 ** 16) - 1024) + 1024).to_i
         
     | 
| 
      
 40 
     | 
    
         
            +
                pkt.udp_dst   = port
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                query = []
         
     | 
| 
      
 43 
     | 
    
         
            +
                query << 'M-SEARCH * HTTP/1.1'
         
     | 
| 
      
 44 
     | 
    
         
            +
                query << "Host: #{host}:#{port}"
         
     | 
| 
      
 45 
     | 
    
         
            +
                query << 'Man: ssdp:discover'
         
     | 
| 
      
 46 
     | 
    
         
            +
                query << 'ST: ssdp:all'          # Search Target
         
     | 
| 
      
 47 
     | 
    
         
            +
                query << 'MX: 2'                 # Delay response (2 seconds)
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                payload = query.join("\r\n").to_s
         
     | 
| 
      
 50 
     | 
    
         
            +
                payload << "\r\n"
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                pkt.payload = payload
         
     | 
| 
      
 53 
     | 
    
         
            +
                pkt.recalc
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                ctx.packets.push(pkt)
         
     | 
| 
      
 56 
     | 
    
         
            +
              end
         
     | 
| 
      
 57 
     | 
    
         
            +
            end
         
     | 
| 
      
 58 
     | 
    
         
            +
            end
         
     | 
| 
      
 59 
     | 
    
         
            +
            end
         
     | 
| 
      
 60 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,75 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: UTF-8
         
     | 
| 
      
 2 
     | 
    
         
            +
            =begin
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            BETTERCAP
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            Author : Simone 'evilsocket' Margaritelli
         
     | 
| 
      
 7 
     | 
    
         
            +
            Email  : evilsocket@gmail.com
         
     | 
| 
      
 8 
     | 
    
         
            +
            Blog   : https://www.evilsocket.net/
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            WS-Discovery broadcast discovery agent:
         
     | 
| 
      
 11 
     | 
    
         
            +
              Author : Brendan Coles
         
     | 
| 
      
 12 
     | 
    
         
            +
              Email  : bcoles[at]gmail.com
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            This project is released under the GPL 3 license.
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            =end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            # Send a broadcast WS-Discovery query trying to fill the ARP table.
         
     | 
| 
      
 19 
     | 
    
         
            +
            module BetterCap
         
     | 
| 
      
 20 
     | 
    
         
            +
            module Discovery
         
     | 
| 
      
 21 
     | 
    
         
            +
            module Agents
         
     | 
| 
      
 22 
     | 
    
         
            +
            # Class responsible for sending WS-Discovery broadcast queries to the network.
         
     | 
| 
      
 23 
     | 
    
         
            +
            class Wsd
         
     | 
| 
      
 24 
     | 
    
         
            +
              # Create a thread which will send a WS-Discovery broadcast query
         
     | 
| 
      
 25 
     | 
    
         
            +
              # in order to populate the ARP cache with active targets.
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
              # References:
         
     | 
| 
      
 28 
     | 
    
         
            +
              # - https://msdn.microsoft.com/en-us/library/windows/desktop/bb513684(v=vs.85).aspx
         
     | 
| 
      
 29 
     | 
    
         
            +
              # - http://specs.xmlsoap.org/ws/2005/04/discovery/ws-discovery.pdf
         
     | 
| 
      
 30 
     | 
    
         
            +
              # - https://en.wikipedia.org/wiki/Web_Services_for_Devices
         
     | 
| 
      
 31 
     | 
    
         
            +
              # - https://en.wikipedia.org/wiki/WS-Discovery
         
     | 
| 
      
 32 
     | 
    
         
            +
              # - https://en.wikipedia.org/wiki/Zero-configuration_networking#WS-Discovery
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
              def initialize( ctx, address = nil )
         
     | 
| 
      
 35 
     | 
    
         
            +
                pkt = PacketFu::UDPPacket.new
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                pkt.eth_saddr = ctx.iface.mac
         
     | 
| 
      
 38 
     | 
    
         
            +
                pkt.eth_daddr = '01:00:5e:7f:ff:fa'
         
     | 
| 
      
 39 
     | 
    
         
            +
                pkt.ip_saddr  = ctx.iface.ip
         
     | 
| 
      
 40 
     | 
    
         
            +
                pkt.ip_daddr  = '239.255.255.250'
         
     | 
| 
      
 41 
     | 
    
         
            +
                pkt.udp_src   = (rand((2 ** 16) - 1024) + 1024).to_i
         
     | 
| 
      
 42 
     | 
    
         
            +
                pkt.udp_dst   = 3702
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                uuid = SecureRandom.uuid
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                payload = '<?xml version="1.0" encoding="utf-8" ?>'
         
     | 
| 
      
 47 
     | 
    
         
            +
                payload << '<soap:Envelope'
         
     | 
| 
      
 48 
     | 
    
         
            +
                payload << ' xmlns:soap="http://www.w3.org/2003/05/soap-envelope"'
         
     | 
| 
      
 49 
     | 
    
         
            +
                payload << ' xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"'
         
     | 
| 
      
 50 
     | 
    
         
            +
                payload << ' xmlns:wsd="http://schemas.xmlsoap.org/ws/2005/04/discovery"'
         
     | 
| 
      
 51 
     | 
    
         
            +
                payload << ' xmlns:wsdp="http://schemas.xmlsoap.org/ws/2006/02/devprof">'
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                payload << '<soap:Header>'
         
     | 
| 
      
 54 
     | 
    
         
            +
                # WS-Discovery
         
     | 
| 
      
 55 
     | 
    
         
            +
                payload << '<wsa:To>urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To>'
         
     | 
| 
      
 56 
     | 
    
         
            +
                # Action (Probe)
         
     | 
| 
      
 57 
     | 
    
         
            +
                payload << "<wsa:Action>http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action>"
         
     | 
| 
      
 58 
     | 
    
         
            +
                # Message identifier (unique GUID)
         
     | 
| 
      
 59 
     | 
    
         
            +
                payload << "<wsa:MessageID>urn:uuid:#{uuid}</wsa:MessageID>"
         
     | 
| 
      
 60 
     | 
    
         
            +
                payload << '</soap:Header>'
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                payload << '<soap:Body>'
         
     | 
| 
      
 63 
     | 
    
         
            +
                payload << '<wsd:Probe/>' # WS-Discovery type (blank)
         
     | 
| 
      
 64 
     | 
    
         
            +
                payload << '</soap:Body>'
         
     | 
| 
      
 65 
     | 
    
         
            +
                payload << '</env:Envelope>'
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                pkt.payload = payload
         
     | 
| 
      
 68 
     | 
    
         
            +
                pkt.recalc
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                ctx.packets.push(pkt)
         
     | 
| 
      
 71 
     | 
    
         
            +
              end
         
     | 
| 
      
 72 
     | 
    
         
            +
            end
         
     | 
| 
      
 73 
     | 
    
         
            +
            end
         
     | 
| 
      
 74 
     | 
    
         
            +
            end
         
     | 
| 
      
 75 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -75,8 +75,6 @@ class Linux < Base 
     | 
|
| 
       75 
75 
     | 
    
         
             
                  # Ipv6 uses a different ip + port representation
         
     | 
| 
       76 
76 
     | 
    
         
             
                  cal_dst_address = "[#{r.dst_address}]"
         
     | 
| 
       77 
77 
     | 
    
         
             
                end
         
     | 
| 
       78 
     | 
    
         
            -
                # post route
         
     | 
| 
       79 
     | 
    
         
            -
                Shell.execute("#{table} -t nat -I POSTROUTING -s 0/0 -j MASQUERADE")
         
     | 
| 
       80 
78 
     | 
    
         
             
                # accept all
         
     | 
| 
       81 
79 
     | 
    
         
             
                Shell.execute("#{table} -P FORWARD ACCEPT")
         
     | 
| 
       82 
80 
     | 
    
         
             
                # add redirection
         
     | 
| 
         @@ -92,8 +90,6 @@ class Linux < Base 
     | 
|
| 
       92 
90 
     | 
    
         
             
                  # Ipv6 uses a different ip + port representation
         
     | 
| 
       93 
91 
     | 
    
         
             
                  cal_dst_address = "[#{r.dst_address}]"
         
     | 
| 
       94 
92 
     | 
    
         
             
                end
         
     | 
| 
       95 
     | 
    
         
            -
                # remove post route
         
     | 
| 
       96 
     | 
    
         
            -
                Shell.execute("#{table} -t nat -D POSTROUTING -s 0/0 -j MASQUERADE")
         
     | 
| 
       97 
93 
     | 
    
         
             
                # remove redirection
         
     | 
| 
       98 
94 
     | 
    
         
             
                Shell.execute("#{table} -t nat -D PREROUTING -i #{r.interface} -p #{r.protocol} #{r.src_address.nil? ? '' : "-d #{r.src_address}"} --dport #{r.src_port} -j DNAT --to #{cal_dst_address}:#{r.dst_port}")
         
     | 
| 
       99 
95 
     | 
    
         
             
              end
         
     | 
    
        data/lib/bettercap/logger.rb
    CHANGED
    
    | 
         @@ -13,6 +13,53 @@ This project is released under the GPL 3 license. 
     | 
|
| 
       13 
13 
     | 
    
         
             
            module BetterCap
         
     | 
| 
       14 
14 
     | 
    
         
             
            # Class responsible for console and file logging.
         
     | 
| 
       15 
15 
     | 
    
         
             
            module Logger
         
     | 
| 
      
 16 
     | 
    
         
            +
              L_RAW = 0
         
     | 
| 
      
 17 
     | 
    
         
            +
              L_DBG = 1
         
     | 
| 
      
 18 
     | 
    
         
            +
              L_INF = 2
         
     | 
| 
      
 19 
     | 
    
         
            +
              L_WRN = 3
         
     | 
| 
      
 20 
     | 
    
         
            +
              L_ERR = 4
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              class Entry
         
     | 
| 
      
 23 
     | 
    
         
            +
                def initialize( ts, level, message )
         
     | 
| 
      
 24 
     | 
    
         
            +
                  @timestamp = ts
         
     | 
| 
      
 25 
     | 
    
         
            +
                  @level = level
         
     | 
| 
      
 26 
     | 
    
         
            +
                  @message = message
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                def create
         
     | 
| 
      
 30 
     | 
    
         
            +
                  case @level
         
     | 
| 
      
 31 
     | 
    
         
            +
                    when Logger::L_RAW
         
     | 
| 
      
 32 
     | 
    
         
            +
                      formatted_message( @message, nil )
         
     | 
| 
      
 33 
     | 
    
         
            +
                    when Logger::L_DBG
         
     | 
| 
      
 34 
     | 
    
         
            +
                      formatted_message( @message, 'D' ).light_black
         
     | 
| 
      
 35 
     | 
    
         
            +
                    when Logger::L_INF
         
     | 
| 
      
 36 
     | 
    
         
            +
                      formatted_message( @message, 'I' )
         
     | 
| 
      
 37 
     | 
    
         
            +
                    when Logger::L_WRN
         
     | 
| 
      
 38 
     | 
    
         
            +
                      formatted_message( @message, 'W' ).yellow
         
     | 
| 
      
 39 
     | 
    
         
            +
                    when Logger::L_ERR
         
     | 
| 
      
 40 
     | 
    
         
            +
                      formatted_message( @message, 'E' ).red
         
     | 
| 
      
 41 
     | 
    
         
            +
                  end
         
     | 
| 
      
 42 
     | 
    
         
            +
                end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                private
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                # Format +message+ for the given +message_type+.
         
     | 
| 
      
 47 
     | 
    
         
            +
                def formatted_message(message, message_type)
         
     | 
| 
      
 48 
     | 
    
         
            +
                  # raw message?
         
     | 
| 
      
 49 
     | 
    
         
            +
                  if message_type.nil?
         
     | 
| 
      
 50 
     | 
    
         
            +
                    if @timestamp and !message.strip.empty?
         
     | 
| 
      
 51 
     | 
    
         
            +
                      "[#{Time.now}] #{message}"
         
     | 
| 
      
 52 
     | 
    
         
            +
                    else
         
     | 
| 
      
 53 
     | 
    
         
            +
                      message
         
     | 
| 
      
 54 
     | 
    
         
            +
                    end
         
     | 
| 
      
 55 
     | 
    
         
            +
                  elsif @timestamp
         
     | 
| 
      
 56 
     | 
    
         
            +
                    "[#{Time.now}] [#{message_type}] #{message}"
         
     | 
| 
      
 57 
     | 
    
         
            +
                  else
         
     | 
| 
      
 58 
     | 
    
         
            +
                    "[#{message_type}] #{message}"
         
     | 
| 
      
 59 
     | 
    
         
            +
                  end
         
     | 
| 
      
 60 
     | 
    
         
            +
                end
         
     | 
| 
      
 61 
     | 
    
         
            +
              end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
       16 
63 
     | 
    
         
             
              class << self
         
     | 
| 
       17 
64 
     | 
    
         
             
                @@ctx       = nil
         
     | 
| 
       18 
65 
     | 
    
         
             
                @@queue     = Queue.new
         
     | 
| 
         @@ -39,48 +86,45 @@ module Logger 
     | 
|
| 
       39 
86 
     | 
    
         
             
                        "Message   : #{e.message}\n" +
         
     | 
| 
       40 
87 
     | 
    
         
             
                        "Backtrace :\n\n    #{e.backtrace.join("\n    ")}\n"
         
     | 
| 
       41 
88 
     | 
    
         | 
| 
       42 
     | 
    
         
            -
                   
     | 
| 
       43 
     | 
    
         
            -
                    self.warn(msg)
         
     | 
| 
       44 
     | 
    
         
            -
                  else
         
     | 
| 
       45 
     | 
    
         
            -
                    self.debug(msg)
         
     | 
| 
       46 
     | 
    
         
            -
                  end
         
     | 
| 
      
 89 
     | 
    
         
            +
                  self.debug(msg)
         
     | 
| 
       47 
90 
     | 
    
         
             
                end
         
     | 
| 
       48 
91 
     | 
    
         | 
| 
       49 
92 
     | 
    
         
             
                # Log an error +message+.
         
     | 
| 
       50 
93 
     | 
    
         
             
                def error(message)
         
     | 
| 
       51 
     | 
    
         
            -
                  @@queue.push  
     | 
| 
      
 94 
     | 
    
         
            +
                  @@queue.push Logger::Entry.new( @@timestamp, Logger::L_ERR, message )
         
     | 
| 
       52 
95 
     | 
    
         
             
                end
         
     | 
| 
       53 
96 
     | 
    
         | 
| 
       54 
97 
     | 
    
         
             
                # Log an information +message+.
         
     | 
| 
       55 
98 
     | 
    
         
             
                def info(message)
         
     | 
| 
       56 
     | 
    
         
            -
                  @@queue.push(  
     | 
| 
      
 99 
     | 
    
         
            +
                  @@queue.push( Logger::Entry.new( @@timestamp, Logger::L_INF, message ) ) unless @silent
         
     | 
| 
       57 
100 
     | 
    
         
             
                end
         
     | 
| 
       58 
101 
     | 
    
         | 
| 
       59 
102 
     | 
    
         
             
                # Log a warning +message+.
         
     | 
| 
       60 
103 
     | 
    
         
             
                def warn(message)
         
     | 
| 
       61 
     | 
    
         
            -
                  @@queue.push  
     | 
| 
      
 104 
     | 
    
         
            +
                  @@queue.push Logger::Entry.new( @@timestamp, Logger::L_WRN, message )
         
     | 
| 
       62 
105 
     | 
    
         
             
                end
         
     | 
| 
       63 
106 
     | 
    
         | 
| 
       64 
107 
     | 
    
         
             
                # Log a debug +message+.
         
     | 
| 
       65 
108 
     | 
    
         
             
                def debug(message)
         
     | 
| 
       66 
109 
     | 
    
         
             
                  if @@debug and not @@silent
         
     | 
| 
       67 
     | 
    
         
            -
                    @@queue.push  
     | 
| 
      
 110 
     | 
    
         
            +
                    @@queue.push Logger::Entry.new( @@timestamp, Logger::L_DBG, message )
         
     | 
| 
       68 
111 
     | 
    
         
             
                  end
         
     | 
| 
       69 
112 
     | 
    
         
             
                end
         
     | 
| 
       70 
113 
     | 
    
         | 
| 
       71 
114 
     | 
    
         
             
                # Log a +message+ as it is.
         
     | 
| 
       72 
115 
     | 
    
         
             
                def raw(message)
         
     | 
| 
       73 
     | 
    
         
            -
                  @@queue.push(  
     | 
| 
      
 116 
     | 
    
         
            +
                  @@queue.push( Logger::Entry.new( @@timestamp, Logger::L_RAW, message ) ) unless @silent
         
     | 
| 
       74 
117 
     | 
    
         
             
                end
         
     | 
| 
       75 
118 
     | 
    
         | 
| 
       76 
119 
     | 
    
         
             
                # Wait for the messages queue to be empty.
         
     | 
| 
       77 
120 
     | 
    
         
             
                def wait!
         
     | 
| 
       78 
121 
     | 
    
         
             
                  while not @@queue.empty?
         
     | 
| 
       79 
     | 
    
         
            -
                     
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
                      sleep 0.3
         
     | 
| 
      
 122 
     | 
    
         
            +
                    msg = @@queue.pop(true) rescue nil
         
     | 
| 
      
 123 
     | 
    
         
            +
                    if msg
         
     | 
| 
      
 124 
     | 
    
         
            +
                      emit msg.create
         
     | 
| 
       83 
125 
     | 
    
         
             
                    end
         
     | 
| 
      
 126 
     | 
    
         
            +
             
     | 
| 
      
 127 
     | 
    
         
            +
                    sleep(0.3) if msg.nil?
         
     | 
| 
       84 
128 
     | 
    
         
             
                  end
         
     | 
| 
       85 
129 
     | 
    
         
             
                end
         
     | 
| 
       86 
130 
     | 
    
         | 
| 
         @@ -89,15 +133,16 @@ module Logger 
     | 
|
| 
       89 
133 
     | 
    
         
             
                # Main logger logic.
         
     | 
| 
       90 
134 
     | 
    
         
             
                def worker
         
     | 
| 
       91 
135 
     | 
    
         
             
                  loop do
         
     | 
| 
       92 
     | 
    
         
            -
                     
     | 
| 
       93 
     | 
    
         
            -
                    if @@ctx.nil? or @@ctx.running
         
     | 
| 
      
 136 
     | 
    
         
            +
                    msg = @@queue.pop(true) rescue nil
         
     | 
| 
      
 137 
     | 
    
         
            +
                    if msg and ( @@ctx.nil? or @@ctx.running )
         
     | 
| 
       94 
138 
     | 
    
         
             
                      begin
         
     | 
| 
       95 
     | 
    
         
            -
                        emit  
     | 
| 
      
 139 
     | 
    
         
            +
                        emit msg.create
         
     | 
| 
       96 
140 
     | 
    
         
             
                      rescue Exception => e
         
     | 
| 
       97 
     | 
    
         
            -
                        Logger.warn "Logger error: #{e.message}"
         
     | 
| 
       98 
141 
     | 
    
         
             
                        Logger.exception e
         
     | 
| 
       99 
142 
     | 
    
         
             
                      end
         
     | 
| 
       100 
143 
     | 
    
         
             
                    end
         
     | 
| 
      
 144 
     | 
    
         
            +
             
     | 
| 
      
 145 
     | 
    
         
            +
                    sleep(0.3) if msg.nil?
         
     | 
| 
       101 
146 
     | 
    
         
             
                  end
         
     | 
| 
       102 
147 
     | 
    
         
             
                end
         
     | 
| 
       103 
148 
     | 
    
         | 
| 
         @@ -110,22 +155,6 @@ module Logger 
     | 
|
| 
       110 
155 
     | 
    
         
             
                    f.close
         
     | 
| 
       111 
156 
     | 
    
         
             
                  end
         
     | 
| 
       112 
157 
     | 
    
         
             
                end
         
     | 
| 
       113 
     | 
    
         
            -
             
     | 
| 
       114 
     | 
    
         
            -
                # Format +message+ for the given +message_type+.
         
     | 
| 
       115 
     | 
    
         
            -
                def formatted_message(message, message_type)
         
     | 
| 
       116 
     | 
    
         
            -
                  # raw message?
         
     | 
| 
       117 
     | 
    
         
            -
                  if message_type.nil?
         
     | 
| 
       118 
     | 
    
         
            -
                    if @@timestamp and !message.strip.empty?
         
     | 
| 
       119 
     | 
    
         
            -
                      "[#{Time.now}] #{message}"
         
     | 
| 
       120 
     | 
    
         
            -
                    else
         
     | 
| 
       121 
     | 
    
         
            -
                      message
         
     | 
| 
       122 
     | 
    
         
            -
                    end
         
     | 
| 
       123 
     | 
    
         
            -
                  elsif @@timestamp
         
     | 
| 
       124 
     | 
    
         
            -
                    "[#{Time.now}] [#{message_type}] #{message}"
         
     | 
| 
       125 
     | 
    
         
            -
                  else
         
     | 
| 
       126 
     | 
    
         
            -
                    "[#{message_type}] #{message}"
         
     | 
| 
       127 
     | 
    
         
            -
                  end
         
     | 
| 
       128 
     | 
    
         
            -
                end
         
     | 
| 
       129 
158 
     | 
    
         
             
              end
         
     | 
| 
       130 
159 
     | 
    
         
             
            end
         
     | 
| 
       131 
160 
     | 
    
         
             
            end
         
     |