spamchronic 0.0.2 → 0.0.3
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.
- data/README.md +5 -5
- data/VERSION +1 -1
- data/bin/spamchronic +54 -0
- data/lib/mailpot/configuration.rb +25 -0
- data/lib/mailpot/mail.rb +15 -5
- data/lib/mailpot/smtp.rb +6 -3
- data/lib/mailpot.rb +7 -58
- metadata +72 -108
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
#
|
1
|
+
# Spam Chronic
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
Spam Chronic is a simple SMTP honeypot that will catch email and save it to a database
|
4
|
+
Spam Chronic works to gain some automatic analysis and probe detection
|
5
5
|
|
6
6
|
## Features
|
7
7
|
* Catches all email and stores it
|
@@ -10,5 +10,5 @@ MailPot works to gain some automatic analysis and probe detection
|
|
10
10
|
* Written in EventMachine
|
11
11
|
|
12
12
|
## How
|
13
|
-
1. `gem install
|
14
|
-
2. `
|
13
|
+
1. `gem install spamchronic`
|
14
|
+
2. `spamchronic`
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/bin/spamchronic
CHANGED
@@ -2,4 +2,58 @@
|
|
2
2
|
require "rubygems"
|
3
3
|
require "bundler/setup"
|
4
4
|
require 'mailpot'
|
5
|
+
Mailpot::Configuration.config do
|
6
|
+
parameter :smtp_ip, :smtp_port, :verbose, :daemon, :key_file, :banner
|
7
|
+
end
|
8
|
+
|
9
|
+
Mailpot::Configuration.config do
|
10
|
+
smtp_ip '127.0.0.1'
|
11
|
+
smtp_port '1025'
|
12
|
+
verbose false
|
13
|
+
daemon true
|
14
|
+
key_file '/etc/mailpot/keys.yml'
|
15
|
+
banner '{host} ESMTP'
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
opt_parse = OptionParser.new do |parser|
|
20
|
+
parser.banner = "Usage: mailpot [options]"
|
21
|
+
parser.version = File.open(File.expand_path("../../VERSION", __FILE__), 'rb') { |f| f.read }
|
22
|
+
|
23
|
+
parser.on("--ip IP", "Set the ip address of the smtp server") do |ip|
|
24
|
+
Mailpot::Configuration.config do
|
25
|
+
smtp_ip ip
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
parser.on("--keys KEYFILE", "Set the key file that contains AWS creds") do |f|
|
30
|
+
Mailpot::Configuration.config do
|
31
|
+
key_file f
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
parser.on("--port PORT", Integer, "Set the port of the smtp server") do |port|
|
36
|
+
Mailpot::Configuration.config do
|
37
|
+
smtp_port port
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
parser.on('-f', '--foreground', 'Run in forground') do
|
42
|
+
Mailpot::Configuration.config do
|
43
|
+
daemon ""
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
parser.on('-v', '--verbose', 'Be more verbose') do
|
48
|
+
Mailpot::Configuration.config do
|
49
|
+
verbose true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
parser.on('-h', '--help', 'Display help information') do
|
54
|
+
puts parser
|
55
|
+
exit!
|
56
|
+
end
|
57
|
+
end
|
58
|
+
opt_parse.parse!
|
5
59
|
Mailpot.run!
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "bundler/setup"
|
3
|
+
require 'active_support/all'
|
4
|
+
|
5
|
+
module Mailpot::Configuration
|
6
|
+
extend self
|
7
|
+
|
8
|
+
def parameter(*names)
|
9
|
+
names.each do |name|
|
10
|
+
attr_accessor name
|
11
|
+
|
12
|
+
# For each given symbol we generate accessor method that sets option's
|
13
|
+
# value being called with an argument, or returns option's current value
|
14
|
+
# when called without arguments
|
15
|
+
define_method name do |*values|
|
16
|
+
value = values.first
|
17
|
+
value ? self.send("#{name}=", value) : instance_variable_get("@#{name}")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def config(&block)
|
23
|
+
instance_eval &block
|
24
|
+
end
|
25
|
+
end
|
data/lib/mailpot/mail.rb
CHANGED
@@ -7,6 +7,7 @@ require 'digest/md5'
|
|
7
7
|
require 'aws'
|
8
8
|
require 'mail'
|
9
9
|
require 'net/smtp'
|
10
|
+
require 'json/pure'
|
10
11
|
|
11
12
|
module Mailpot::Mail
|
12
13
|
module_function
|
@@ -14,8 +15,9 @@ module_function
|
|
14
15
|
@initialized = false
|
15
16
|
# setup connections etc
|
16
17
|
def initialize
|
17
|
-
|
18
|
-
|
18
|
+
yml = File.open("#{Mailpot::Configuration.key_file}") do |f|
|
19
|
+
YAML::load(f)
|
20
|
+
end
|
19
21
|
@bucket = yml['bucket']
|
20
22
|
@queue = yml['queue']
|
21
23
|
@s3 = AWS::S3.new(yml)
|
@@ -41,10 +43,18 @@ module_function
|
|
41
43
|
end
|
42
44
|
|
43
45
|
def detect_probe(msg)
|
44
|
-
config = Mailpot.get_config
|
45
46
|
mail = Mail.new(msg[:source])
|
46
|
-
|
47
|
-
|
47
|
+
puts msg[:recipients].length
|
48
|
+
# Probes only have one recipient
|
49
|
+
if msg[:recipients].length > 1
|
50
|
+
return [false, false]
|
51
|
+
end
|
52
|
+
# probes are short
|
53
|
+
if msg[:source].length > 1024
|
54
|
+
return [false, false]
|
55
|
+
end
|
56
|
+
# ip address will be in the subject sometimes
|
57
|
+
if mail.subject.include? Mailpot::Configuration.smtp_ip
|
48
58
|
return [true, forward_probe(msg)]
|
49
59
|
end
|
50
60
|
return [false, false]
|
data/lib/mailpot/smtp.rb
CHANGED
@@ -13,8 +13,7 @@ class Mailpot::Smtp < EventMachine::Protocols::SmtpServer
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def get_server_greeting
|
16
|
-
|
17
|
-
yml = YAML.load_file c[:key_file]
|
16
|
+
yml = File.open(Mailpot::Configuration.key_file) { |f| YAML::load(f) }
|
18
17
|
host = get_server_domain
|
19
18
|
t = DateTime.now.strftime('%a, %d %b %Y %H:%M:%S %z')
|
20
19
|
banner = yml['banner']
|
@@ -24,7 +23,11 @@ class Mailpot::Smtp < EventMachine::Protocols::SmtpServer
|
|
24
23
|
end
|
25
24
|
|
26
25
|
def get_server_domain
|
27
|
-
|
26
|
+
begin
|
27
|
+
Socket.gethostbyname(Socket.gethostname).first
|
28
|
+
rescue Exception => e
|
29
|
+
puts e.inspect
|
30
|
+
end
|
28
31
|
end
|
29
32
|
|
30
33
|
def receive_sender(sender)
|
data/lib/mailpot.rb
CHANGED
@@ -8,70 +8,19 @@ require 'rbconfig'
|
|
8
8
|
module Mailpot extend ActiveSupport::Autoload
|
9
9
|
autoload :Smtp
|
10
10
|
autoload :Mail
|
11
|
+
autoload :Configuration
|
11
12
|
|
12
13
|
module_function
|
13
|
-
|
14
|
-
@@defaults = {
|
15
|
-
:smtp_ip => '127.0.0.1',
|
16
|
-
:smtp_port => '1025',
|
17
|
-
:verbose => false,
|
18
|
-
:daemon => true,
|
19
|
-
:key_file => '/etc/mailpot/keys.yml',
|
20
|
-
:banner => '{host} ESMTP'
|
21
|
-
}
|
22
|
-
|
23
|
-
def parse! arguments=ARGV, defaults=@@defaults
|
24
|
-
@@defaults.dup.tap do |options|
|
25
|
-
OptionParser.new do |parser|
|
26
|
-
parser.banner = "Usage: mailpot [options]"
|
27
|
-
parser.version = File.read(File.expand_path("../../VERSION", __FILE__))
|
28
|
-
|
29
|
-
parser.on("--ip IP", "Set the ip address of the smtp server") do |ip|
|
30
|
-
options[:smtp_ip] = ip
|
31
|
-
end
|
32
|
-
|
33
|
-
parser.on("--keys KEYFILE", "Set the key file that contains AWS creds") do |f|
|
34
|
-
options[:key_file] = f
|
35
|
-
end
|
36
|
-
|
37
|
-
parser.on("--port PORT", Integer, "Set the port of the smtp server") do |port|
|
38
|
-
options[:smtp_port] = port
|
39
|
-
end
|
40
|
-
|
41
|
-
parser.on('-f', '--foreground', 'Run in forground') do
|
42
|
-
options[:daemon] = false
|
43
|
-
end
|
44
|
-
|
45
|
-
parser.on('-v', '--verbose', 'Be more verbose') do
|
46
|
-
options[:verbose] = true
|
47
|
-
end
|
48
|
-
|
49
|
-
parser.on('-h', '--help', 'Display help information') do
|
50
|
-
puts parser
|
51
|
-
exit!
|
52
|
-
end
|
53
|
-
end.parse!
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def get_config
|
58
|
-
options &&= @@defaults.merge options
|
59
|
-
options ||= parse!
|
60
|
-
end
|
61
14
|
|
62
|
-
def run!
|
63
|
-
#options &&= @@defaults.merge options
|
64
|
-
#options ||= parse!
|
65
|
-
#@config = options
|
66
|
-
options = get_config
|
15
|
+
def run!
|
67
16
|
puts "Starting MailPot"
|
68
17
|
EventMachine.run do
|
69
|
-
rescue_port
|
70
|
-
EventMachine.start_server
|
71
|
-
puts "==> smtp://#{
|
18
|
+
rescue_port Mailpot::Configuration.smtp_port do
|
19
|
+
EventMachine.start_server Mailpot::Configuration.smtp_ip, Mailpot::Configuration.smtp_port, Smtp
|
20
|
+
puts "==> smtp://#{Mailpot::Configuration.smtp_ip}:#{Mailpot::Configuration.smtp_port}"
|
72
21
|
end
|
73
|
-
|
74
|
-
if
|
22
|
+
puts "Daemon #{Mailpot::Configuration.daemon}"
|
23
|
+
if Mailpot::Configuration.daemon === true
|
75
24
|
EventMachine.next_tick do
|
76
25
|
puts "*** Mailpot now runs as a daemon by default"
|
77
26
|
Process.daemon
|
metadata
CHANGED
@@ -1,160 +1,124 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: spamchronic
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 2
|
10
|
-
version: 0.0.2
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Matt Jezorek
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-02-17 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: activesupport
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &81440310 !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
18
|
+
requirements:
|
26
19
|
- - ~>
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 3
|
31
|
-
- 0
|
32
|
-
version: "3.0"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.0'
|
33
22
|
type: :runtime
|
34
|
-
version_requirements: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: eventmachine
|
37
23
|
prerelease: false
|
38
|
-
|
24
|
+
version_requirements: *81440310
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: eventmachine
|
27
|
+
requirement: &81430870 !ruby/object:Gem::Requirement
|
39
28
|
none: false
|
40
|
-
requirements:
|
29
|
+
requirements:
|
41
30
|
- - ~>
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
segments:
|
45
|
-
- 0
|
46
|
-
- 12
|
47
|
-
version: "0.12"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0.12'
|
48
33
|
type: :runtime
|
49
|
-
version_requirements: *id002
|
50
|
-
- !ruby/object:Gem::Dependency
|
51
|
-
name: aws-sdk
|
52
34
|
prerelease: false
|
53
|
-
|
35
|
+
version_requirements: *81430870
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: aws-sdk
|
38
|
+
requirement: &81430460 !ruby/object:Gem::Requirement
|
54
39
|
none: false
|
55
|
-
requirements:
|
56
|
-
- -
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
|
59
|
-
segments:
|
60
|
-
- 0
|
61
|
-
version: "0"
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
62
44
|
type: :runtime
|
63
|
-
version_requirements: *id003
|
64
|
-
- !ruby/object:Gem::Dependency
|
65
|
-
name: mail
|
66
45
|
prerelease: false
|
67
|
-
|
46
|
+
version_requirements: *81430460
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: mail
|
49
|
+
requirement: &81429640 !ruby/object:Gem::Requirement
|
68
50
|
none: false
|
69
|
-
requirements:
|
70
|
-
- -
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
|
73
|
-
segments:
|
74
|
-
- 0
|
75
|
-
version: "0"
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
76
55
|
type: :runtime
|
77
|
-
version_requirements: *id004
|
78
|
-
- !ruby/object:Gem::Dependency
|
79
|
-
name: rake
|
80
56
|
prerelease: false
|
81
|
-
|
57
|
+
version_requirements: *81429640
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: rake
|
60
|
+
requirement: &81429150 !ruby/object:Gem::Requirement
|
82
61
|
none: false
|
83
|
-
requirements:
|
84
|
-
- -
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
|
87
|
-
segments:
|
88
|
-
- 0
|
89
|
-
version: "0"
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
90
66
|
type: :development
|
91
|
-
version_requirements: *id005
|
92
|
-
- !ruby/object:Gem::Dependency
|
93
|
-
name: rdoc
|
94
67
|
prerelease: false
|
95
|
-
|
68
|
+
version_requirements: *81429150
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rdoc
|
71
|
+
requirement: &81428640 !ruby/object:Gem::Requirement
|
96
72
|
none: false
|
97
|
-
requirements:
|
98
|
-
- -
|
99
|
-
- !ruby/object:Gem::Version
|
100
|
-
|
101
|
-
segments:
|
102
|
-
- 0
|
103
|
-
version: "0"
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
104
77
|
type: :development
|
105
|
-
|
106
|
-
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *81428640
|
80
|
+
description: ! " MailPot is a simple SMTP server honeypot that will catch emails
|
81
|
+
and store\n them in S3 and then pop a message into SQS for later processing\n"
|
107
82
|
email: mjezorek@gmail.com
|
108
|
-
executables:
|
83
|
+
executables:
|
109
84
|
- spamchronic
|
110
85
|
extensions: []
|
111
|
-
|
112
|
-
extra_rdoc_files:
|
86
|
+
extra_rdoc_files:
|
113
87
|
- README.md
|
114
88
|
- LICENSE
|
115
|
-
files:
|
89
|
+
files:
|
116
90
|
- README.md
|
117
91
|
- LICENSE
|
118
92
|
- VERSION
|
119
93
|
- bin/spamchronic
|
94
|
+
- lib/mailpot.rb
|
120
95
|
- lib/mailpot/events.rb
|
121
96
|
- lib/mailpot/mail.rb
|
122
97
|
- lib/mailpot/smtp.rb
|
123
|
-
- lib/mailpot.rb
|
98
|
+
- lib/mailpot/configuration.rb
|
124
99
|
homepage: http://mattjezorek.com/
|
125
100
|
licenses: []
|
126
|
-
|
127
101
|
post_install_message:
|
128
102
|
rdoc_options: []
|
129
|
-
|
130
|
-
require_paths:
|
103
|
+
require_paths:
|
131
104
|
- lib
|
132
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
133
106
|
none: false
|
134
|
-
requirements:
|
135
|
-
- -
|
136
|
-
- !ruby/object:Gem::Version
|
137
|
-
hash: 57
|
138
|
-
segments:
|
139
|
-
- 1
|
140
|
-
- 8
|
141
|
-
- 7
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
142
110
|
version: 1.8.7
|
143
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
144
112
|
none: false
|
145
|
-
requirements:
|
146
|
-
- -
|
147
|
-
- !ruby/object:Gem::Version
|
148
|
-
|
149
|
-
segments:
|
150
|
-
- 0
|
151
|
-
version: "0"
|
113
|
+
requirements:
|
114
|
+
- - ! '>='
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
152
117
|
requirements: []
|
153
|
-
|
154
118
|
rubyforge_project:
|
155
|
-
rubygems_version: 1.
|
119
|
+
rubygems_version: 1.8.10
|
156
120
|
signing_key:
|
157
121
|
specification_version: 3
|
158
|
-
summary: Runs an SMTP Server and catches emails, will pass probes when identified
|
122
|
+
summary: Runs an SMTP Server and catches emails, will pass probes when identified
|
123
|
+
as a probe
|
159
124
|
test_files: []
|
160
|
-
|