teamcymru 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f81d63bbaa1697e14e0f5a3d38b11de442bafc35
4
+ data.tar.gz: daa6ff74ea7d82f3afbe2be651e1a7f45700746e
5
+ SHA512:
6
+ metadata.gz: e540639d106916688115a2f72da46acac7b5bb2279551d2590906f38e43becd640e756a8116958c791c8f9d374190074ce21e79ac275734cf1ba95beaeba5272
7
+ data.tar.gz: c8ccbe8d09d0500a60e631e543bba0c3ba3495a0f36cb7e6d8f33acbf45198b84ad316bcef839e22f02baf564ba43428dee458bf2c0f74565a211cfc041f5ba6
checksums.yaml.gz.sig ADDED
Binary file
data.tar.gz.sig ADDED
@@ -0,0 +1,2 @@
1
+ �H�ܷ\�R0)<�進:�zo��C����h���C��}�e��L���j����(�~)�Vu���qo����֟wLWV�����ny��D-�
2
+ �l��6l������� +(P�w�`�}������(]���.�Z�1eL2��I������os�}K�
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in teamcymru.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 chrislee35
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,43 @@
1
+ # Teamcymru
2
+
3
+ The team-cymru gem connects to several of Team Cymru's public services: bogon lists, IP to ASN mappings, and malware hash checking.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'teamcymru'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install teamcymru
18
+
19
+ ## Usage
20
+
21
+ c = TeamCymru::ASNClient.new
22
+ res = c.lookup("130.207.244.251").to_s => "2637 | 130.207.244.251 | 130.207.0.0/16 | US | arin | 1988-10-10 | | GEORGIA-TECH - Georgia Institute of Technology"
23
+
24
+ c = TeamCymru::Bogon.new
25
+ c.bogon?("127.0.4.1") => true
26
+
27
+ c = TeamCymru::Malware.new
28
+ c.lookup("cbed16069043a0bf3c92fff9a99cccdc") => MalwareResult instance, .hash will be the hash, .timestamp will be the result time, and .percent_detect will be the percent of AV that detects the sample
29
+
30
+ c = TeamCymru::TwitterFeed.new
31
+ c.messages.each do |date, tweet|
32
+ puts date
33
+ puts tweet
34
+ puts
35
+ end
36
+
37
+ ## Contributing
38
+
39
+ 1. Fork it
40
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
41
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
42
+ 4. Push to the branch (`git push origin my-new-feature`)
43
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+
4
+ require 'rake/testtask'
5
+
6
+ Rake::TestTask.new do |t|
7
+ t.libs << 'lib'
8
+ t.test_files = FileList['test/test_*.rb']
9
+ t.verbose = true
10
+ end
11
+
12
+ task :default => :test
data/bin/cymru_asn ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ require 'teamcymru'
3
+
4
+ c = TeamCymru::ASNClient.new
5
+ if ARGV.length > 0
6
+ ARGV.each do |ipdata|
7
+ puts c.lookup(ipdata)
8
+ end
9
+ else
10
+ $stdin.each_line do |ipdata|
11
+ puts c.lookup(ipdata.chomp)
12
+ end
13
+ end
data/bin/cymru_bogon ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ require 'teamcymru'
3
+
4
+ c = TeamCymru::Bogon.new
5
+ if ARGV.length > 0
6
+ ARGV.each do |ipdata|
7
+ puts ipdata+" "+c.bogon?(ipdata).to_s
8
+ end
9
+ else
10
+ $stdin.each_line do |ipdata|
11
+ puts ipdata.chomp+" "+c.bogon?(ipdata.chomp).to_s
12
+ end
13
+ end
data/bin/cymru_malware ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ require 'teamcymru'
3
+
4
+ c = TeamCymru::Malware.new
5
+ if ARGV.length > 0
6
+ ARGV.each do |hash|
7
+ puts c.lookup(hash)
8
+ end
9
+ else
10
+ $stdin.each_line do |hash|
11
+ puts c.lookup(hash.chomp)
12
+ end
13
+ end
data/bin/cymru_twitter ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ require 'teamcymru'
3
+ require 'configparser'
4
+
5
+ config = ConfigParser.new("#{ENV['HOME']}/.teamcymru")
6
+ config = {
7
+ :consumer_key => config['teamcymru']['consumer_key'],
8
+ :consumer_secret => config['teamcymru']['consumer_secret'],
9
+ :oauth_token => config['teamcymru']['oauth_token'],
10
+ :oauth_token_secret => config['teamcymru']['oauth_token_secret']
11
+ }
12
+ c = TeamCymru::TwitterFeed.new(config)
13
+ c.messages.each do |msg|
14
+ puts msg[0]
15
+ puts msg[1]
16
+ puts
17
+ end
data/lib/teamcymru.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "teamcymru/version"
2
+ require "teamcymru/asnclient"
3
+ require 'teamcymru/bogon'
4
+ require 'teamcymru/malware'
5
+ require 'teamcymru/twitterfeed'
@@ -0,0 +1,77 @@
1
+ require 'ipaddr'
2
+ require 'cache' # gem's name is ruby-cache
3
+ require 'structformatter'
4
+
5
+ module TeamCymru
6
+ class ASNRecord < Struct.new(:asn, :ip, :cidr, :cc, :nic, :alloc, :data, :org)
7
+ def to_s
8
+ "#{self.asn.ljust(8)}| #{self.ip.ljust(17)}| #{self.cidr.ljust(20)}| #{self.cc.ljust(3)}| #{self.nic.ljust(9)}| #{self.alloc.ljust(11)}| #{self.data} | #{self.org}"
9
+ end
10
+ def ASNRecord::from_s(str)
11
+ args = str.chomp.split(/\|/).map{|x| x.strip}
12
+ if args.length == 7
13
+ args.insert(6,'')
14
+ elsif args.length == 5 # used for AS lookups
15
+ args.insert(2,'')
16
+ args.insert(2,'')
17
+ args.insert(6,'')
18
+ end
19
+ ASNRecord.new(*args)
20
+ end
21
+ def cached=(cached)
22
+ @cached = cached
23
+ end
24
+ def from_cache?
25
+ @cached || false
26
+ end
27
+ end
28
+
29
+ class ASNClient
30
+ def initialize(server='whois.cymru.com', port=43)
31
+ @server = server
32
+ @port = port
33
+ @cache = Cache.new(nil,nil,10000,24*60*60)
34
+ end
35
+
36
+ def lookup(iplines)
37
+ t = TCPSocket.new(@server,@port)
38
+ t.puts("begin")
39
+ t.puts("verbose")
40
+ t.readline
41
+ oneshot = false
42
+ if iplines.class == String
43
+ iplines = [iplines]
44
+ oneshot = true
45
+ end
46
+ recs = []
47
+ iplines.each do |ipdata|
48
+ ip,data = ipdata.split(/ /,2)
49
+ rec = nil
50
+ @cache.each_key do |cidr|
51
+ if cidr.include?(ip)
52
+ rec = @cache[cidr]
53
+ rec.ip = ip
54
+ rec.data = data
55
+ rec.cached = true
56
+ break
57
+ end
58
+ end
59
+ unless rec
60
+ t.puts(ipdata)
61
+ t.flush
62
+ l = t.readline
63
+ rec = ASNRecord.from_s(l)
64
+ cidr = IPAddr.new(rec.cidr) if rec.cidr != ''
65
+ if cidr
66
+ @cache[cidr] = rec
67
+ end
68
+ end
69
+ recs << rec
70
+ end
71
+ t.puts("end")
72
+ t.close
73
+ return recs[0] if oneshot
74
+ recs
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,46 @@
1
+ # Uses Team Cymru's DNS-based bogon lookup system to determine
2
+ # if a given IP is routed or not.
3
+ #
4
+ # Author:: Chris Lee (rubygems@chrislee.dhs.org)
5
+
6
+ require 'resolv'
7
+ module TeamCymru
8
+ # This class implements the lookup of bogon via DNS
9
+ class Bogon
10
+ @@bogon = 'bogons.cymru.com'
11
+ @@v4fullbogon = 'v4.fullbogons.cymru.com'
12
+ @@v6fullbogon = 'v6.fullbogons.cymru.com'
13
+
14
+ # tests if the given ip is a bogon
15
+ # fullbogon flag selects which bogon list to use
16
+ # see http://www.team-cymru.org/Services/Bogons/dns.html for more details
17
+ def bogon?(ip,fullbogon=true)
18
+ # detect if this is ipv4 or ipv6 or bad
19
+ begin
20
+ ip = IPAddr.new(ip)
21
+ if ip.ipv6? and fullbogon
22
+ label = ip.to_string.gsub(/:/,'').split(//).reverse.join(".")+"."+@@v6fullbogon
23
+ elsif ip.ipv4? and fullbogon
24
+ label = ip.to_s.split(/\./).reverse.join(".")+"."+@@v4fullbogon
25
+ elsif ip.ipv4? and not fullbogon
26
+ label = ip.to_s.split(/\./).reverse.join(".")+"."+@@bogon
27
+ else
28
+ puts "Unsupported combination: ipv4=#{ip.ipv4?} and fullbogon=#{fullbogon}"
29
+ return false
30
+ end
31
+ addr = Resolv.getaddress(label)
32
+ if addr
33
+ return true
34
+ else
35
+ return false
36
+ end
37
+ rescue ArgumentError => e
38
+ puts e
39
+ return false
40
+ rescue Resolv::ResolvError
41
+ return false
42
+ end
43
+ end
44
+ alias :lookup :bogon?
45
+ end
46
+ end
@@ -0,0 +1,33 @@
1
+ require 'socket'
2
+ require 'structformatter'
3
+
4
+ module TeamCymru
5
+ class MalwareResult < Struct.new(:hash, :timestamp, :percent_detect)
6
+ def initialize(hash, timestamp, percent_detect)
7
+ self.hash = hash
8
+ self.timestamp = Time.at(timestamp.to_i)
9
+ self.percent_detect = (percent_detect == "NO_DATA") ? 0 : percent_detect.to_i
10
+ end
11
+ end
12
+
13
+ class Malware
14
+ def initialize(server='hash.cymru.com', port=43)
15
+ @server = server
16
+ @port = port
17
+ end
18
+
19
+ def lookup(hashes)
20
+ if hashes.class == Array
21
+ hashes = hashes.join("\n")
22
+ end
23
+ res = []
24
+ t = TCPSocket.new(@server,@port)
25
+ t.write("begin\nverbose\n#{hashes}\nend\n")
26
+ t.each_line do |l|
27
+ next if l =~ /^#/
28
+ res << MalwareResult.new(*(l.chomp.split(/\s+/,3)))
29
+ end
30
+ res
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,23 @@
1
+ require 'twitter'
2
+
3
+ module TeamCymru
4
+ class TwitterFeed
5
+ attr_reader :messages
6
+ def initialize(config)
7
+ @twitname = "teamcymru"
8
+ @messages = []
9
+ @client = Twitter::Client.new(config)
10
+ @client.user_timeline(@twitname).each do |m|
11
+ @messages << [m.created_at,m.text]
12
+ end
13
+ end
14
+
15
+ def refresh
16
+ @messages = []
17
+ @client.user_timeline(@twitname).each do |m|
18
+ @messages << [m.created_at,m.text]
19
+ end
20
+ @messages
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module TeamCymru
2
+ VERSION = "1.0.0"
3
+ end
data/teamcymru.gemspec ADDED
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'teamcymru/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "teamcymru"
8
+ spec.version = TeamCymru::VERSION
9
+ spec.authors = ["chrislee35"]
10
+ spec.email = ["rubygems@chrislee.dhs.org"]
11
+ spec.description = %q{Team Cymru provides a variety of services for network and security operators. This Rubygem tries to wrap several of these services into a Ruby API.}
12
+ spec.summary = %q{Queries Team Cymru's ASN, Malware, and FullBogon services}
13
+ spec.homepage = "http://github.com/chrislee35/teamcymru"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency "structformatter", "~> 0.0.1"
22
+ spec.add_runtime_dependency "twitter", "~> 4.7.0"
23
+ spec.add_runtime_dependency "ruby-cache", ">= 0.3.0"
24
+ spec.add_runtime_dependency "json", ">= 1.4.3"
25
+ spec.add_runtime_dependency "configparser", "~> 0.1.1"
26
+ spec.add_development_dependency "bundler", "~> 1.3"
27
+ spec.add_development_dependency "rake"
28
+
29
+ spec.signing_key = "#{File.dirname(__FILE__)}/../gem-private_key.pem"
30
+ spec.cert_chain = ["#{File.dirname(__FILE__)}/../gem-public_cert.pem"]
31
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'test/unit'
2
+ require File.expand_path('../../lib/teamcymru.rb', __FILE__)
@@ -0,0 +1,59 @@
1
+ unless Kernel.respond_to?(:require_relative)
2
+ module Kernel
3
+ def require_relative(path)
4
+ require File.join(File.dirname(caller[0]), path.to_str)
5
+ end
6
+ end
7
+ end
8
+
9
+ require_relative 'helper'
10
+ require 'configparser'
11
+
12
+ class TestTeamCymru < Test::Unit::TestCase
13
+ def test_performs_ASN_queries
14
+ c = TeamCymru::ASNClient.new
15
+ res = c.lookup("130.207.244.251")
16
+ assert_equal("2637 | 130.207.244.251 | 130.207.0.0/16 | US | arin | 1988-10-10 | | GEORGIA-TECH - Georgia Institute of Technology",res.to_s)
17
+ assert(! res.from_cache?)
18
+ # this should pull from cache
19
+ res = c.lookup("130.207.244.252")
20
+ assert_equal("2637 | 130.207.244.252 | 130.207.0.0/16 | US | arin | 1988-10-10 | | GEORGIA-TECH - Georgia Institute of Technology",res.to_s)
21
+ assert(res.from_cache?)
22
+ end
23
+
24
+ def test_lookup_bogons
25
+ c = TeamCymru::Bogon.new
26
+ assert(c.bogon?("127.0.5.27"))
27
+ assert(c.bogon?("2001:DB8:FEEB:DEEF::242"))
28
+ assert(! c.bogon?("130.207.244.251"))
29
+ assert(! c.bogon?("2a00:1450:8003::93"))
30
+ end
31
+
32
+ def test_lookup_malware_hashes
33
+ c = TeamCymru::Malware.new
34
+ hashes = ["7697561ccbbdd1661c25c86762117613","cbed16069043a0bf3c92fff9a99cccdc"]
35
+ res = c.lookup(hashes)
36
+ assert_equal("7697561ccbbdd1661c25c86762117613",res[0].hash)
37
+ assert_equal(0,res[0].percent_detect)
38
+ assert_equal("cbed16069043a0bf3c92fff9a99cccdc",res[1].hash)
39
+ assert(res[1].percent_detect > 50)
40
+ end
41
+
42
+ def test_display_twitter_feed
43
+ if(File.exists?("#{ENV['HOME']}/.teamcymru"))
44
+ config = ConfigParser.new("#{ENV['HOME']}/.teamcymru")
45
+ config = {
46
+ :consumer_key => config['teamcymru']['consumer_key'],
47
+ :consumer_secret => config['teamcymru']['consumer_secret'],
48
+ :oauth_token => config['teamcymru']['oauth_token'],
49
+ :oauth_token_secret => config['teamcymru']['oauth_token_secret']
50
+ }
51
+ c = TeamCymru::TwitterFeed.new(config)
52
+ msg = c.messages[0]
53
+ assert_equal(2, msg.length)
54
+ assert_equal(Time, msg[0].class)
55
+ assert_equal(String, msg[1].class)
56
+ assert((Time.now - msg[0]) < (30*24*60*60))
57
+ end
58
+ end
59
+ end
metadata ADDED
@@ -0,0 +1,189 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: teamcymru
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - chrislee35
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDYjCCAkqgAwIBAgIBADANBgkqhkiG9w0BAQUFADBXMREwDwYDVQQDDAhydWJ5
14
+ Z2VtczEYMBYGCgmSJomT8ixkARkWCGNocmlzbGVlMRMwEQYKCZImiZPyLGQBGRYD
15
+ ZGhzMRMwEQYKCZImiZPyLGQBGRYDb3JnMB4XDTEzMDUyMjEyNTk0N1oXDTE0MDUy
16
+ MjEyNTk0N1owVzERMA8GA1UEAwwIcnVieWdlbXMxGDAWBgoJkiaJk/IsZAEZFghj
17
+ aHJpc2xlZTETMBEGCgmSJomT8ixkARkWA2RoczETMBEGCgmSJomT8ixkARkWA29y
18
+ ZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANcPrx8BZiWIR9xWWG8I
19
+ tqR538tS1t+UJ4FZFl+1vrtU9TiuWX3Vj37TwUpa2fFkziK0n5KupVThyEhcem5m
20
+ OGRjvgrRFbWQJSSscIKOpwqURHVKRpV9gVz/Hnzk8S+xotUR1Buo3Ugr+I1jHewD
21
+ Cgr+y+zgZbtjtHsJtsuujkOcPhEjjUinj68L9Fz9BdeJQt+IacjwAzULix6jWCht
22
+ Uc+g+0z8Esryca2G6I1GsrgX6WHw8dykyQDT9dCtS2flCOwSC1R0K5T/xHW54f+5
23
+ wcw8mm53KLNe+tmgVC6ZHyME+qJsBnP6uxF0aTEnGA/jDBQDhQNTF0ZP/abzyTsL
24
+ zjUCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFO8w
25
+ +aeP7T6kVJblCg6eusOII9DfMA0GCSqGSIb3DQEBBQUAA4IBAQBCQyRJLXsBo2Fy
26
+ 8W6e/W4RemQRrlAw9DK5O6U71JtedVob2oq+Ob+zmS+PifE2+L+3RiJ2H6VTlOzi
27
+ x+A061MUXhGraqVq4J2FC8kt4EQywAD0P0Ta5GU24CGSF08Y3GkJy1Sa4XqTC2YC
28
+ o51s7JP+tkCCtpVYSdzJhTllieRAWBpGV1dtaoeUKE6tYPMBkosxSRcVGczk/Sc3
29
+ 7eQCpexYy9JlUBI9u3BqIY9E+l+MSn8ihXSPmyK0DgrhaCu+voaSFVOX6Y+B5qbo
30
+ jLXMQu2ZgISYwXNjNbGVHehut82U7U9oiHoWcrOGazaRUmGO9TXP+aJLH0gw2dcK
31
+ AfMglXPi
32
+ -----END CERTIFICATE-----
33
+ date: 2013-06-06 00:00:00.000000000 Z
34
+ dependencies:
35
+ - !ruby/object:Gem::Dependency
36
+ name: structformatter
37
+ requirement: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ version: 0.0.1
42
+ type: :runtime
43
+ prerelease: false
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ~>
47
+ - !ruby/object:Gem::Version
48
+ version: 0.0.1
49
+ - !ruby/object:Gem::Dependency
50
+ name: twitter
51
+ requirement: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: 4.7.0
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: 4.7.0
63
+ - !ruby/object:Gem::Dependency
64
+ name: ruby-cache
65
+ requirement: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - '>='
68
+ - !ruby/object:Gem::Version
69
+ version: 0.3.0
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - '>='
75
+ - !ruby/object:Gem::Version
76
+ version: 0.3.0
77
+ - !ruby/object:Gem::Dependency
78
+ name: json
79
+ requirement: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - '>='
82
+ - !ruby/object:Gem::Version
83
+ version: 1.4.3
84
+ type: :runtime
85
+ prerelease: false
86
+ version_requirements: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '>='
89
+ - !ruby/object:Gem::Version
90
+ version: 1.4.3
91
+ - !ruby/object:Gem::Dependency
92
+ name: configparser
93
+ requirement: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ~>
96
+ - !ruby/object:Gem::Version
97
+ version: 0.1.1
98
+ type: :runtime
99
+ prerelease: false
100
+ version_requirements: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ~>
103
+ - !ruby/object:Gem::Version
104
+ version: 0.1.1
105
+ - !ruby/object:Gem::Dependency
106
+ name: bundler
107
+ requirement: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ~>
110
+ - !ruby/object:Gem::Version
111
+ version: '1.3'
112
+ type: :development
113
+ prerelease: false
114
+ version_requirements: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ~>
117
+ - !ruby/object:Gem::Version
118
+ version: '1.3'
119
+ - !ruby/object:Gem::Dependency
120
+ name: rake
121
+ requirement: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ type: :development
127
+ prerelease: false
128
+ version_requirements: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ description: Team Cymru provides a variety of services for network and security operators. This
134
+ Rubygem tries to wrap several of these services into a Ruby API.
135
+ email:
136
+ - rubygems@chrislee.dhs.org
137
+ executables:
138
+ - cymru_asn
139
+ - cymru_bogon
140
+ - cymru_malware
141
+ - cymru_twitter
142
+ extensions: []
143
+ extra_rdoc_files: []
144
+ files:
145
+ - .gitignore
146
+ - Gemfile
147
+ - LICENSE.txt
148
+ - README.md
149
+ - Rakefile
150
+ - bin/cymru_asn
151
+ - bin/cymru_bogon
152
+ - bin/cymru_malware
153
+ - bin/cymru_twitter
154
+ - lib/teamcymru.rb
155
+ - lib/teamcymru/asnclient.rb
156
+ - lib/teamcymru/bogon.rb
157
+ - lib/teamcymru/malware.rb
158
+ - lib/teamcymru/twitterfeed.rb
159
+ - lib/teamcymru/version.rb
160
+ - teamcymru.gemspec
161
+ - test/helper.rb
162
+ - test/test_team-cymru.rb
163
+ homepage: http://github.com/chrislee35/teamcymru
164
+ licenses:
165
+ - MIT
166
+ metadata: {}
167
+ post_install_message:
168
+ rdoc_options: []
169
+ require_paths:
170
+ - lib
171
+ required_ruby_version: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - '>='
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ required_rubygems_version: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '>='
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ requirements: []
182
+ rubyforge_project:
183
+ rubygems_version: 2.0.3
184
+ signing_key:
185
+ specification_version: 4
186
+ summary: Queries Team Cymru's ASN, Malware, and FullBogon services
187
+ test_files:
188
+ - test/helper.rb
189
+ - test/test_team-cymru.rb
metadata.gz.sig ADDED
Binary file