amnesie 0.0.3 → 0.0.8

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 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