amnesie 0.0.3 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7406851da95a1f380d2ad273a5386ecaf28fd6695347b5891d5dcba27bef4f81
4
- data.tar.gz: e8ebf031381c63faa622524cca82164ea738efadcabdb88adea7b9aef0e702ec
3
+ metadata.gz: 11732d798fc4f5b255df8da77dce5585e801790ce0c0b4b50f6323495b6055b7
4
+ data.tar.gz: dd548f98938363b93bdcdc77e3e8772dec636832f39668e64aefbbc430c9414e
5
5
  SHA512:
6
- metadata.gz: fb59d06668aca29674020a415570dfee42df193facddc1b8dde571ffcf2ea24731dd359ea5e2624b6441956d159b3be0bc81363e73ef814fb6faa0e852f698dc
7
- data.tar.gz: 914d52375535c0bdb3e0e5861e646d13d1b18e891d7c3e5e17018b94aa4fc5f9a07852efde1b940db7433b8c2be06118930fd4f43a12e35d76a30ecc3ba2123f
6
+ metadata.gz: 109de0795c5ae684624a8f2fd86759fe23fdaa1d360e6616e5d565fe7b59fef76d103a06aaca45803acf2a1d3ff763cf9638c8dc9654dba90b5e05c5c08a8277
7
+ data.tar.gz: f7d40849705a4cd1095b5310d69d6cae33152edd502c1270d9d64ba0342a766c362fef499c40688e53913b0cafb5380c243a69452e4c05efd541e16655ffaacd
Binary file
data.tar.gz.sig CHANGED
Binary file
data/.gitignore CHANGED
@@ -1,5 +1,6 @@
1
1
  *.gem
2
2
  *.rbc
3
+ *.swp
3
4
  /.config
4
5
  /coverage/
5
6
  /InstalledFiles
@@ -1,3 +1,29 @@
1
+ ## 0.0.8, release 2020-09-22
2
+ * Enhance code
3
+ * Update the class MAC, more ruby like
4
+ * Use securerandom (>= ruby2.5)
5
+
6
+ ## 0.0.7, release 2020-05-29
7
+ * Shortcut action for service (e/d)
8
+ * Correct permission on amnesie-mac@.service
9
+ * Enhance lib/amnesie/helper
10
+
11
+ ## 0.0.6, release 2020-05-20
12
+ * Init a doc with RDoc.
13
+ * Add -i|--init to start init process properly.
14
+ * Add dhcpcd to the mac@.service, dhclient doesn't seem necessary.
15
+ * Correct the mac@.service.
16
+
17
+ ## 0.0.5, release 2020-05-19
18
+ * Create a amnesie-mac@.service (work only if the gem is install system-wide)
19
+ * Add -p|--persist
20
+ * Replace Makefile by a Rakefile
21
+
22
+ ## 0.0.4, release 2020-05-16
23
+ * Debian10 need to reload ifup@card-name too
24
+ * Correct path where search dhclient (/bin,/sbin)
25
+ * Enhance stuff for kill and reload dhclient (tested on debian 10)
26
+
1
27
  ## 0.0.3, release 2020-05-15
2
28
  * Add stuff for kill and reload dhclient (tested on debian 10)
3
29
 
data/README.md CHANGED
@@ -10,7 +10,7 @@ Inspiration come from a post found on [Qubes-OS](https://www.qubes-os.org/doc/an
10
10
  ## Install
11
11
  Amnesie is cryptographically signed, so add my public key (if you haven’t already) as a trusted certificate.
12
12
 
13
- $ gem cert --add <(curl -Ls https://raw.githubusercontent.com/szorfein/spior/master/certs/szorfein.pem)
13
+ $ gem cert --add <(curl -Ls https://raw.githubusercontent.com/szorfein/amnesie/master/certs/szorfein.pem)
14
14
 
15
15
  And install the gem
16
16
 
@@ -28,10 +28,14 @@ To change the MAC address for eth0:
28
28
 
29
29
  $ amnesie -n eth0 -m
30
30
 
31
+ Create or Disable all systemd services for a network card:
32
+
33
+ $ amnesie -p -n wlp2s0
34
+
31
35
  ## Left Over
32
36
 
33
37
  ### Issues
34
- For any questions, comments, feedback or issues, submit a [new issue](https://github.com/szorfein/spior/issues/new).
38
+ For any questions, comments, feedback or issues, submit a [new issue](https://github.com/szorfein/amnesie/issues/new).
35
39
 
36
40
  ### links
37
41
  + https://rubyreferences.github.io/rubyref
data/Rakefile CHANGED
@@ -1,10 +1,21 @@
1
1
  # https://github.com/seattlerb/minitest#running-your-tests-
2
2
  require "rake/testtask"
3
+ require File.dirname(__FILE__) + "/lib/amnesie/version"
3
4
 
4
5
  Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
7
- t.test_files = FileList["test/test_*.rb"]
6
+ t.libs << "test"
7
+ t.libs << "lib"
8
+ t.test_files = FileList["test/test_*.rb"]
9
+ end
10
+
11
+ # rake gem:build
12
+ namespace :gem do
13
+ desc "build the gem"
14
+ task :build do
15
+ Dir["amnesie*.gem"].each {|f| File.unlink(f) }
16
+ system("gem build amnesie.gemspec")
17
+ system("gem install amnesie-#{Amnesie::VERSION}.gem -P MediumSecurity")
18
+ end
8
19
  end
9
20
 
10
21
  task :default => :test
@@ -1,6 +1,8 @@
1
+ require File.dirname(__FILE__) + "/lib/amnesie/version"
2
+
1
3
  Gem::Specification.new do |s|
2
4
  s.name = "amnesie"
3
- s.version = "0.0.3"
5
+ s.version = Amnesie::VERSION
4
6
  s.summary = "A tool to make your computer amnesic"
5
7
  s.description = <<-EOF
6
8
  A tool to make your computer amnesic"
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'amnesie/runner'
3
+ require 'amnesie'
4
4
 
5
- runner = Amnesie::Runner.new(ARGV)
6
- runner.run
5
+ Amnesie::Main.new(ARGV)
@@ -0,0 +1,66 @@
1
+ require_relative 'amnesie/options'
2
+ require_relative 'amnesie/persist'
3
+ require_relative 'amnesie/process'
4
+ require_relative 'amnesie/network'
5
+ require_relative 'amnesie/mac'
6
+ require_relative 'amnesie/helpers'
7
+
8
+ module Amnesie
9
+ def self.random_mac(network)
10
+ mac = Amnesie::MAC.new(network)
11
+ mac.set_addr
12
+ puts "New MAC for " + mac.to_s
13
+ end
14
+
15
+ def self.services(network)
16
+ persist = Amnesie::Persist.new(network)
17
+ if ! persist.mac_exist?
18
+ puts "Create service..."
19
+ persist.services
20
+ elsif persist.mac_exist?
21
+ persist.update_mac
22
+ end
23
+ persist.menu_mac
24
+ puts persist.to_s
25
+ end
26
+
27
+ def self.random_mac_and_kill(network)
28
+ process = Amnesie::Process.new(network)
29
+ mac = Amnesie::MAC.new(network)
30
+
31
+ process.kill
32
+ mac.down
33
+ mac.set_addr
34
+ puts "New MAC for " + mac.to_s
35
+ mac.up
36
+ process.restart
37
+
38
+ end
39
+
40
+ class Main
41
+ def initialize(argv)
42
+ @argv = argv
43
+ run
44
+ end
45
+
46
+ private
47
+
48
+ def run
49
+ options = Options.new(@argv)
50
+ network = options.net_dev ? Network.new(options.net_dev) : Network.new()
51
+
52
+ if options.init
53
+ Amnesie.random_mac(network.card)
54
+ exit
55
+ end
56
+
57
+ if options.persist
58
+ Amnesie.services(network.card)
59
+ end
60
+
61
+ if options.mac
62
+ Amnesie.random_mac_and_kill(network.card)
63
+ end
64
+ end
65
+ end
66
+ end
@@ -1,8 +1,10 @@
1
+ require 'fileutils'
2
+ require 'tempfile'
3
+
1
4
  module Helpers
2
5
  class Exec
3
6
  def initialize(name)
4
- @search_uid=`id -u`.chomp
5
- @search_uid ||= 1000 unless $?.success?
7
+ @search_uid= Process::Sys.getuid
6
8
  @name = name
7
9
  end
8
10
 
@@ -16,4 +18,54 @@ module Helpers
16
18
  end
17
19
  end
18
20
  end
21
+
22
+ class NewFile
23
+ def initialize(string, name, dest = "/tmp")
24
+ @string = string
25
+ @name = name
26
+ @dest = dest + "/" + @name
27
+ end
28
+
29
+ def add
30
+ @mv = Helpers::Exec.new("mv")
31
+ tmp = Tempfile.new(@name)
32
+ File.open(tmp.path, 'w') do |file|
33
+ file.puts @string
34
+ end
35
+ @mv.run("#{tmp.path} #{@dest}")
36
+ end
37
+
38
+ def perm(user, perm)
39
+ chown = Helpers::Exec.new("chown")
40
+ chmod = Helpers::Exec.new("chmod")
41
+ chown.run("#{user}:#{user} #{@dest}")
42
+ chmod.run("#{perm} #{@dest}")
43
+ end
44
+ end
45
+
46
+ class NewSystemd < NewFile
47
+ def initialize(string, name)
48
+ super
49
+ @systemd_dir = search_systemd_dir
50
+ @dest = @systemd_dir + "/" + @name
51
+ end
52
+
53
+ def add
54
+ @systemctl = Helpers::Exec.new("systemctl")
55
+ super
56
+ @systemctl.run("daemon-reload")
57
+ end
58
+
59
+ private
60
+ def search_systemd_dir
61
+ if Dir.exist? "/lib/systemd/system"
62
+ "/lib/systemd/system"
63
+ elsif Dir.exist? "/usr/lib/systemd/system"
64
+ "/usr/lib/systemd/system"
65
+ else
66
+ raise "No directory systemd found"
67
+ exit
68
+ end
69
+ end
70
+ end
19
71
  end
@@ -1,47 +1,50 @@
1
- require_relative 'helpers'
1
+ require 'securerandom'
2
2
 
3
3
  module Amnesie
4
4
  class MAC
5
5
  def initialize(card)
6
6
  @card = card
7
7
  @ip = Helpers::Exec.new("ip")
8
+ save_origin
9
+ new_mac
8
10
  end
9
11
 
10
- # TODO yep...
11
- def rand
12
- first=`printf ""; dd bs=1 count=1 if=/dev/urandom 2>/dev/null | hexdump -v -e '/1 "%02X"'`
13
- last=`printf ""; dd bs=1 count=5 if=/dev/urandom 2>/dev/null | hexdump -v -e '/1 ":%02X"'`
14
- mac="#{first}#{last}"
15
- lastfive=`echo #{mac} | cut -d: -f 2-6`.chomp
16
- firstbyte=`echo #{mac} | cut -d: -f 1`.chomp
17
- firstbyte=`printf '%02X' $(( 0x#{firstbyte} & 254 | 2))`
18
- @mac="#{firstbyte}:#{lastfive}"
12
+ def set_addr
13
+ @ip.run("link set dev #{@card} address #{@mac}")
14
+ end
15
+
16
+ def down
17
+ @ip.run("link set dev #{@card} down")
18
+ end
19
+
20
+ def up
21
+ @ip.run("link set dev #{@card} up")
19
22
  end
20
23
 
21
24
  def to_s
22
- rand
23
25
  @card + " " + @mac
24
26
  end
25
27
 
26
- def search_curr_mac
27
- @curr = `ip addr show dev #{@card} | grep -i ether | awk '{print $2}'`
28
+ private
29
+
30
+ def new_mac
31
+ first = SecureRandom.hex(1)
32
+ last = SecureRandom.hex(5)
33
+ lastfive = last.split(//).each_slice(2).to_a.map(&:join).join(':')
34
+ firstbyte = `printf '%02X' $(( 0x#{first} & 254 | 2))`
35
+ @mac = "#{firstbyte}:#{lastfive}".downcase
28
36
  end
29
37
 
38
+ def search_curr_mac
39
+ @curr = `ip addr show dev #{@card} | grep -i ether | awk '{print $2}'`.chomp
40
+ end
41
+
30
42
  def save_origin
43
+ return if File.exist? "/tmp/mac_#{@card}"
31
44
  search_curr_mac
32
- txt="/tmp/mac_#{@card}"
33
- if not File.exist?(txt)
34
- file = File.open(txt, 'a+')
35
- file.puts(@curr)
36
- file.close
37
- puts "Origin saved"
38
- end
39
- end
40
-
41
- def apply
42
- @ip.run("link set dev #{@card} down")
43
- @ip.run("link set dev #{@card} address #{@mac}")
44
- @ip.run("link set dev #{@card} up")
45
+ filename="/tmp/mac_#{@card}"
46
+ File.write(filename, @curr)
47
+ puts "Origin saved"
45
48
  end
46
49
  end
47
50
  end
@@ -2,21 +2,31 @@ require 'optparse'
2
2
 
3
3
  module Amnesie
4
4
  class Options
5
- attr_reader :mac, :netcard
5
+ attr_reader :init, :mac, :net_dev, :persist
6
6
 
7
7
  def initialize(argv)
8
8
  parse(argv)
9
9
  end
10
10
 
11
+ private
12
+
11
13
  def parse(argv)
12
14
  OptionParser.new do |opts|
13
15
 
14
- opts.on("-m", "--mac", "What is my MAC address?") do
16
+ opts.on("-i", "--init", "Used with init process (systemd, etc...)") do
17
+ @init = true
18
+ end
19
+
20
+ opts.on("-m", "--mac", "Forge a random MAC address.") do
15
21
  @mac = true
16
22
  end
17
23
 
18
24
  opts.on("-n", "--net-card NAME", "The name of the card to use") do |net|
19
- @netcard = net
25
+ @net_dev = net
26
+ end
27
+
28
+ opts.on("-p", "--persist", "Enable systemd service") do |net|
29
+ @persist = true
20
30
  end
21
31
 
22
32
  opts.on("-h", "--help", "Show this message") do
@@ -0,0 +1,92 @@
1
+ require 'fileutils'
2
+ require 'tempfile'
3
+ require 'tty-which'
4
+
5
+ module Amnesie
6
+ class Persist
7
+ def initialize(card)
8
+ @card = card
9
+ @systemd_dir = search_systemd_dir
10
+ @systemctl = Helpers::Exec.new("systemctl")
11
+ end
12
+
13
+ def mac_exist?
14
+ File.exist? "#{@systemd_dir}/amnesie-mac@.service"
15
+ end
16
+
17
+ def to_s
18
+ @systemd_dir
19
+ end
20
+
21
+ def mac_service
22
+ dhcp=''
23
+ if TTY::Which.exist?('dhcpcd')
24
+ dhcp='dhcpcd.service'
25
+ end
26
+ @string=<<EOF
27
+ [Unit]
28
+ Description=Spoof MAC Address on %I
29
+ Wants=network-pre.target
30
+ Before=network-pre.target #{dhcp}
31
+ BindsTo=sys-subsystem-net-devices-%i.device
32
+ After=sys-subsystem-net-devices-%i.device
33
+
34
+ [Service]
35
+ Type=oneshot
36
+ ExecStart=/usr/bin/env bash -lc "amnesie -i -m -n %I"
37
+ TimeoutSec=30
38
+
39
+ [Install]
40
+ WantedBy=multi-user.target
41
+ EOF
42
+ end
43
+
44
+ def services
45
+ mac_service
46
+ new_service = Helpers::NewSystemd.new(@string, "amnesie-mac@.service")
47
+ new_service.add
48
+ new_service.perm("root", "644")
49
+ end
50
+
51
+ def update_mac
52
+ print "Found a old amnesie-mac@.service, update? (y|n) "
53
+ answer = gets.chomp
54
+ case answer
55
+ when /^y|^Y/
56
+ services
57
+ end
58
+ end
59
+
60
+ def menu_mac
61
+ print "Action on amnesie-mac@.service for #{@card} (enable/disable) ? (e/d) "
62
+ answer = gets.chomp
63
+ case answer
64
+ when /^e|^E/
65
+ mac_enable
66
+ when /^d|^D/
67
+ mac_disable
68
+ end
69
+ end
70
+
71
+ private
72
+
73
+ def mac_enable
74
+ @systemctl.run("enable amnesie-mac@#{@card}.service")
75
+ end
76
+
77
+ def mac_disable
78
+ @systemctl.run("disable amnesie-mac@#{@card}.service")
79
+ end
80
+
81
+ def search_systemd_dir
82
+ if Dir.exist? "/lib/systemd/system"
83
+ "/lib/systemd/system"
84
+ elsif Dir.exist? "/usr/lib/systemd/system"
85
+ "/usr/lib/systemd/system"
86
+ else
87
+ raise "No directory systemd found"
88
+ exit
89
+ end
90
+ end
91
+ end
92
+ end
@@ -1,11 +1,10 @@
1
1
  require 'tty-which'
2
- require_relative 'helpers'
3
2
 
4
3
  module Amnesie
5
4
  class Process
6
5
  def initialize(card)
7
6
  @systemctl = Helpers::Exec.new("systemctl")
8
- @pkill = Helpers::Exec.new("pkill")
7
+ @kill = Helpers::Exec.new("kill")
9
8
  @rm = Helpers::Exec.new("rm")
10
9
  @card = card
11
10
  end
@@ -25,15 +24,16 @@ module Amnesie
25
24
 
26
25
  def kill_dhcpcd
27
26
  return if not TTY::Which.exist?('dhcpcd')
28
- `pgrep -x dhcpcd`
29
- @pkill.run("dhcpcd") if $?.success?
27
+ pids=`pgrep -i dhcpcd`.chomp
28
+ kill_pids(pids) if $?.success?
30
29
  puts "Killed dhcpcd"
31
30
  end
32
31
 
33
32
  def kill_dhclient
34
- return if not TTY::Which.exist?('dhclient')
35
- `pgrep -x dhclient`
36
- @pkill.run("dhclient") if $?.success?
33
+ return if not TTY::Which.exist?('dhclient', paths: ['/sbin'])
34
+ pids=`pgrep -i dhclient`.chomp
35
+ kill_pids(pids) if $?.success?
36
+
37
37
  @rm.run("/run/dhclient.#{@card}.pid") if File.exist? "/run/dhclient.#{@card}.pid"
38
38
  @rm.run("/var/lib/dhcp/dhclient.#{@card}.leases") if File.exist? "/var/lib/dhcp/dhclient.#{@card}.leases"
39
39
  puts "Killed dhclient"
@@ -51,10 +51,14 @@ module Amnesie
51
51
  end
52
52
 
53
53
  def restart_dhclient
54
- return if not TTY::Which.exist?('dhclient')
54
+ return if not TTY::Which.exist?('dhclient', paths: ['/sbin'])
55
55
  dhclient = Helpers::Exec.new("dhclient")
56
56
  # command tested on debian, not try on another system yet...
57
57
  dhclient.run("-4 -v -i -pf /run/dhclient.#{@card}.pid -lf /var/lib/dhcp/dhclient.#{@card}.leases -I -df /var/lib/dhcp/dhclient6.#{@card}.leases #{@card}")
58
+ if TTY::Which.exist?('systemctl')
59
+ `systemctl is-active ifup@#{@card}`
60
+ @systemctl.run("restart ifup@#{@card}") if $?.success?
61
+ end
58
62
  puts "Restarted dhclient"
59
63
  end
60
64
 
@@ -66,5 +70,12 @@ module Amnesie
66
70
  puts "Restarted tor"
67
71
  end
68
72
  end
73
+
74
+ def kill_pids(pids)
75
+ pids.lines.each { |p|
76
+ ps = p.gsub(/\n/, '')
77
+ @kill.run("-9 #{ps}")
78
+ }
79
+ end
69
80
  end
70
81
  end
@@ -0,0 +1,3 @@
1
+ module Amnesie
2
+ VERSION = '0.0.8'.freeze
3
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amnesie
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - szorfein
@@ -35,7 +35,7 @@ cert_chain:
35
35
  J/zT/q2Ac7BWpSLbv6p9lChBiEnD9j24x463LR5QQjDNS5SsjzRQfFuprsa9Nqf2
36
36
  Tw==
37
37
  -----END CERTIFICATE-----
38
- date: 2020-05-15 00:00:00.000000000 Z
38
+ date: 2020-09-22 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: rake
@@ -132,12 +132,14 @@ files:
132
132
  - Rakefile
133
133
  - amnesie.gemspec
134
134
  - bin/amnesie
135
+ - lib/amnesie.rb
135
136
  - lib/amnesie/helpers.rb
136
137
  - lib/amnesie/mac.rb
137
138
  - lib/amnesie/network.rb
138
139
  - lib/amnesie/options.rb
140
+ - lib/amnesie/persist.rb
139
141
  - lib/amnesie/process.rb
140
- - lib/amnesie/runner.rb
142
+ - lib/amnesie/version.rb
141
143
  - test/test_mac.rb
142
144
  homepage: https://github.com/szorfein/amnesie
143
145
  licenses:
@@ -161,7 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
163
  - !ruby/object:Gem::Version
162
164
  version: '0'
163
165
  requirements: []
164
- rubygems_version: 3.1.2
166
+ rubygems_version: 3.1.3
165
167
  signing_key:
166
168
  specification_version: 4
167
169
  summary: A tool to make your computer amnesic
metadata.gz.sig CHANGED
Binary file
@@ -1,31 +0,0 @@
1
- require_relative 'options'
2
- require_relative 'mac'
3
- require_relative 'process'
4
- require_relative 'network'
5
-
6
- module Amnesie
7
- class Runner
8
-
9
- def initialize(argv)
10
- @options = Options.new(argv)
11
- @network = false
12
- end
13
- def run
14
- if @options.mac then
15
- if not @network
16
- @network = Amnesie::Network.new(@options.netcard)
17
- end
18
- puts @network.card
19
- process = Amnesie::Process.new(@network.card)
20
- card = Amnesie::MAC.new(@network.card)
21
-
22
- process.kill
23
- card.save_origin
24
- card.rand
25
- card.apply
26
- puts card.to_s
27
- process.restart
28
- end
29
- end
30
- end
31
- end