amnesie 0.0.4 → 0.0.9
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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.gitignore +1 -0
- data/CHANGELOG.md +27 -0
- data/README.md +12 -6
- data/Rakefile +14 -3
- data/amnesie.gemspec +4 -1
- data/bin/amnesie +2 -3
- data/lib/amnesie.rb +99 -0
- data/lib/amnesie/config.rb +34 -0
- data/lib/amnesie/helpers.rb +54 -3
- data/lib/amnesie/host.rb +16 -0
- data/lib/amnesie/mac.rb +29 -26
- data/lib/amnesie/network.rb +15 -19
- data/lib/amnesie/options.rb +22 -5
- data/lib/amnesie/persist.rb +18 -0
- data/lib/amnesie/persist/iwd.rb +34 -0
- data/lib/amnesie/persist/systemd.rb +88 -0
- data/lib/amnesie/persist/wpa_supplicant.rb +41 -0
- data/lib/amnesie/process.rb +15 -8
- data/lib/amnesie/version.rb +3 -0
- data/lib/nito.rb +11 -0
- data/lib/nito/cat.rb +21 -0
- data/lib/nito/cp.rb +35 -0
- data/lib/nito/hostname.rb +24 -0
- data/lib/nito/mkdir.rb +19 -0
- data/lib/nito/pass.rb +14 -0
- data/lib/nito/sed.rb +25 -0
- data/lib/nito/sudo.rb +16 -0
- metadata +33 -4
- metadata.gz.sig +0 -0
- data/lib/amnesie/runner.rb +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fee6ddb83b07b28a9196dfddbef713a7f3a6f9a5d32129e7f0952e65c4ed9857
|
4
|
+
data.tar.gz: 8e31162f07c03bb4fda8f9774d940adee9df0f9764002176a6c67f0b6687ab88
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5db556f79185ecd0098584d9ad2862d97f659461918beb39f625da1b4d804b5af5fe5c7cbd2d5245fe96280deaa5f5abb0dc2c362f73b59c0385c8d66ab4cb2f
|
7
|
+
data.tar.gz: 928261af07f2fc37e8f6801dc7b3480ee76854231b08e3ac45d8668fef917d145997788d8ccd87929b81c9eea409a7fdbffe47ec37d7c832f22039dab01d29bb
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,30 @@
|
|
1
|
+
## 0.0.9, release 2020-11-06
|
2
|
+
* Support for iwd
|
3
|
+
* Support for wpa_supplicant
|
4
|
+
* Config file (per user in ~/.config/amnesie/ or system wide /etc/amnesie/)
|
5
|
+
* Can generate a random hostname between 8-25 characters
|
6
|
+
|
7
|
+
## 0.0.8, release 2020-09-22
|
8
|
+
* Enhance code
|
9
|
+
* Update the class MAC, more ruby like
|
10
|
+
* Use securerandom (>= ruby2.5)
|
11
|
+
|
12
|
+
## 0.0.7, release 2020-05-29
|
13
|
+
* Shortcut action for service (e/d)
|
14
|
+
* Correct permission on amnesie-mac@.service
|
15
|
+
* Enhance lib/amnesie/helper
|
16
|
+
|
17
|
+
## 0.0.6, release 2020-05-20
|
18
|
+
* Init a doc with RDoc.
|
19
|
+
* Add -i|--init to start init process properly.
|
20
|
+
* Add dhcpcd to the mac@.service, dhclient doesn't seem necessary.
|
21
|
+
* Correct the mac@.service.
|
22
|
+
|
23
|
+
## 0.0.5, release 2020-05-19
|
24
|
+
* Create a amnesie-mac@.service (work only if the gem is install system-wide)
|
25
|
+
* Add -p|--persist
|
26
|
+
* Replace Makefile by a Rakefile
|
27
|
+
|
1
28
|
## 0.0.4, release 2020-05-16
|
2
29
|
* Debian10 need to reload ifup@card-name too
|
3
30
|
* Correct path where search dhclient (/bin,/sbin)
|
data/README.md
CHANGED
@@ -2,15 +2,13 @@
|
|
2
2
|
A tool to make your computer amnesic.
|
3
3
|
|
4
4
|
Inspiration come from a post found on [Qubes-OS](https://www.qubes-os.org/doc/anonymizing-your-mac-address/) and the [Whonix](https://www.whonix.org/) project.
|
5
|
-
+ Anonymizing
|
6
|
-
+ Randomize all Ethernet and Wifi connections
|
5
|
+
+ Anonymizing MAC Address (wifi, ethernet)
|
7
6
|
+ Randomize your hostname
|
8
|
-
+ [Boot Clock Randomization](https://www.whonix.org/wiki/Boot_Clock_Randomization)
|
9
7
|
|
10
8
|
## Install
|
11
9
|
Amnesie is cryptographically signed, so add my public key (if you haven’t already) as a trusted certificate.
|
12
10
|
|
13
|
-
$ gem cert --add <(curl -Ls https://raw.githubusercontent.com/szorfein/
|
11
|
+
$ gem cert --add <(curl -Ls https://raw.githubusercontent.com/szorfein/amnesie/master/certs/szorfein.pem)
|
14
12
|
|
15
13
|
And install the gem
|
16
14
|
|
@@ -24,14 +22,22 @@ To be able to use the `persist mode` (with systemd for now), the gem should be i
|
|
24
22
|
If you can, i recommend that you create a package for your distribution.
|
25
23
|
|
26
24
|
## Usage
|
27
|
-
To change the MAC address
|
25
|
+
To change the MAC address only on `eth0`:
|
28
26
|
|
29
27
|
$ amnesie -n eth0 -m
|
30
28
|
|
29
|
+
Create or Disable all systemd services for a network card:
|
30
|
+
|
31
|
+
$ amnesie -p
|
32
|
+
|
33
|
+
Forge a random hostname with `-H`
|
34
|
+
|
35
|
+
$ amnesie -H
|
36
|
+
|
31
37
|
## Left Over
|
32
38
|
|
33
39
|
### Issues
|
34
|
-
For any questions, comments, feedback or issues, submit a [new issue](https://github.com/szorfein/
|
40
|
+
For any questions, comments, feedback or issues, submit a [new issue](https://github.com/szorfein/amnesie/issues/new).
|
35
41
|
|
36
42
|
### links
|
37
43
|
+ 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
|
-
|
6
|
-
|
7
|
-
|
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
|
data/amnesie.gemspec
CHANGED
@@ -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 =
|
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"
|
@@ -34,4 +36,5 @@ Gem::Specification.new do |s|
|
|
34
36
|
s.add_runtime_dependency('interfacez', '1.0.3')
|
35
37
|
s.add_runtime_dependency('nomansland', '0.0.2')
|
36
38
|
s.add_runtime_dependency('tty-which', '0.4.2')
|
39
|
+
s.add_runtime_dependency('highline', '2.0.3')
|
37
40
|
end
|
data/bin/amnesie
CHANGED
data/lib/amnesie.rb
ADDED
@@ -0,0 +1,99 @@
|
|
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/host'
|
7
|
+
require_relative 'amnesie/config'
|
8
|
+
require_relative 'amnesie/helpers'
|
9
|
+
|
10
|
+
module Amnesie
|
11
|
+
|
12
|
+
OPTIONS = {
|
13
|
+
mac: true,
|
14
|
+
hostname: false,
|
15
|
+
card_match: /^en/
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
def self.random_mac(network)
|
19
|
+
mac = Amnesie::MAC.new(network)
|
20
|
+
mac.set_addr
|
21
|
+
puts "New MAC for " + mac.to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
# For wifi card, no need systemd
|
25
|
+
def self.persist_wifi
|
26
|
+
if TTY::Which.exist?('iwctl')
|
27
|
+
Amnesie::Persist::Iwd.new
|
28
|
+
elsif TTY::Which.exist?('wpa_supplicant')
|
29
|
+
Amnesie::Persist::WpaSupplicant.new
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.services(network)
|
34
|
+
# For ethernet card
|
35
|
+
if TTY::Which.exist?('systemctl') && network.match(/^en/)
|
36
|
+
persist = Amnesie::Persist::Systemd.new(network)
|
37
|
+
if ! persist.mac_exist?
|
38
|
+
puts "Create service..."
|
39
|
+
persist.services
|
40
|
+
elsif persist.mac_exist?
|
41
|
+
puts "service exist"
|
42
|
+
persist.update_mac
|
43
|
+
end
|
44
|
+
persist.menu_mac
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.random_mac_and_kill(network)
|
49
|
+
process = Amnesie::Process.new(network)
|
50
|
+
mac = Amnesie::MAC.new(network)
|
51
|
+
|
52
|
+
process.kill
|
53
|
+
mac.down
|
54
|
+
mac.set_addr
|
55
|
+
puts "New MAC for " + mac.to_s
|
56
|
+
mac.up
|
57
|
+
process.restart
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
class Main
|
62
|
+
def initialize(argv)
|
63
|
+
@argv = argv
|
64
|
+
run
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def run
|
70
|
+
options = Options.new(@argv)
|
71
|
+
networks = Network.new(options.card_match, options.net_dev).search
|
72
|
+
puts "cards #{networks}"
|
73
|
+
|
74
|
+
if options.init
|
75
|
+
networks.each { |net|
|
76
|
+
Amnesie.random_mac(net)
|
77
|
+
}
|
78
|
+
end
|
79
|
+
|
80
|
+
if options.persist
|
81
|
+
networks.each { |net|
|
82
|
+
Amnesie.services(net)
|
83
|
+
}
|
84
|
+
Amnesie.persist_wifi
|
85
|
+
exit
|
86
|
+
end
|
87
|
+
|
88
|
+
if options.mac
|
89
|
+
networks.each { |net|
|
90
|
+
Amnesie.random_mac_and_kill(net)
|
91
|
+
}
|
92
|
+
end
|
93
|
+
|
94
|
+
if options.hostname
|
95
|
+
Amnesie::Host.new
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Amnesie
|
4
|
+
class Config
|
5
|
+
def initialize
|
6
|
+
@file = File.join(find_conf)
|
7
|
+
#puts "Config file in #{@file}"
|
8
|
+
end
|
9
|
+
|
10
|
+
def load
|
11
|
+
if !File.exist? @file
|
12
|
+
puts "[+] Config file created at #{@file}"
|
13
|
+
save
|
14
|
+
end
|
15
|
+
YAML.load_file @file
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def find_conf
|
21
|
+
if !ENV["HOME"] || ENV["HOME"] == '/root'
|
22
|
+
"/etc/conf.d/amnesie.yaml"
|
23
|
+
else
|
24
|
+
"#{ENV['HOME']}/.config/amnesie/amnesie.yaml"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def save
|
29
|
+
dir = File.dirname @file
|
30
|
+
Nito::Mkdir.new(dir)
|
31
|
+
File.open(@file, 'w') { |f| YAML::dump(OPTIONS, f) }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/amnesie/helpers.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'tempfile'
|
3
|
+
|
1
4
|
module Helpers
|
2
5
|
class Exec
|
3
6
|
def initialize(name)
|
4
|
-
@search_uid
|
5
|
-
@search_uid ||= 1000 unless $?.success?
|
7
|
+
@search_uid = Process::Sys.getuid
|
6
8
|
@name = name
|
7
9
|
end
|
8
10
|
|
9
11
|
def run(args)
|
10
|
-
if @search_uid ==
|
12
|
+
if @search_uid == 0 then
|
11
13
|
#puts "found root - uid #{@search_uid}"
|
12
14
|
system(@name + " " + args)
|
13
15
|
else
|
@@ -16,4 +18,53 @@ 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 "Systemd is no found..."
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
19
70
|
end
|
data/lib/amnesie/host.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
|
3
|
+
module Amnesie
|
4
|
+
class Host
|
5
|
+
def initialize
|
6
|
+
@nb = rand(8..25)
|
7
|
+
@hostname = SecureRandom.alphanumeric(@ng)
|
8
|
+
Nito::Hostname.new(@hostname)
|
9
|
+
puts to_s
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_s
|
13
|
+
"Your hostname will become #{@hostname}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/amnesie/mac.rb
CHANGED
@@ -1,47 +1,50 @@
|
|
1
|
-
|
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
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
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
|
-
|
27
|
-
|
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
|
-
|
33
|
-
|
34
|
-
|
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
|
data/lib/amnesie/network.rb
CHANGED
@@ -2,43 +2,39 @@ require 'interfacez'
|
|
2
2
|
|
3
3
|
module Amnesie
|
4
4
|
class Network
|
5
|
-
|
6
|
-
|
7
|
-
def initialize(name = false)
|
5
|
+
def initialize(card_match, name = nil)
|
6
|
+
@card_match = card_match
|
8
7
|
@name = name
|
8
|
+
@devs = []
|
9
9
|
@check = false
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
def search
|
13
|
+
if @name
|
14
|
+
verify_card
|
15
|
+
@devs << @name
|
16
|
+
else
|
17
|
+
search_cards
|
18
|
+
@devs
|
16
19
|
end
|
17
|
-
@name
|
18
20
|
end
|
19
21
|
|
20
22
|
private
|
21
23
|
|
22
24
|
def verify_card
|
23
|
-
return if @check or not @name
|
24
25
|
Interfacez.all do |interface|
|
25
26
|
if interface == @name then
|
26
27
|
@check = true
|
27
28
|
end
|
28
29
|
end
|
29
|
-
if
|
30
|
-
|
30
|
+
if !@check then
|
31
|
+
raise ArgumentError, "Interface no found" if !@check
|
31
32
|
end
|
32
33
|
end
|
33
34
|
|
34
|
-
def
|
35
|
-
|
36
|
-
|
37
|
-
print interface + " "
|
38
|
-
end
|
39
|
-
printf "\nWhat is the name of the card to be used? "
|
40
|
-
@name = gets.chomp
|
41
|
-
verify_card
|
35
|
+
def search_cards
|
36
|
+
Interfacez.all do |interface|
|
37
|
+
@devs << interface if interface.match(@card_match)
|
42
38
|
end
|
43
39
|
end
|
44
40
|
end
|
data/lib/amnesie/options.rb
CHANGED
@@ -2,21 +2,39 @@ require 'optparse'
|
|
2
2
|
|
3
3
|
module Amnesie
|
4
4
|
class Options
|
5
|
-
attr_reader :mac, :
|
5
|
+
attr_reader :init, :mac, :net_dev, :persist, :hostname, :card_match
|
6
6
|
|
7
7
|
def initialize(argv)
|
8
|
+
@default = Config.new.load
|
9
|
+
@mac = @default[:mac]
|
10
|
+
@hostname = @default[:hostname]
|
11
|
+
@card_match = @default[:card_match]
|
8
12
|
parse(argv)
|
9
13
|
end
|
10
14
|
|
15
|
+
private
|
16
|
+
|
11
17
|
def parse(argv)
|
12
18
|
OptionParser.new do |opts|
|
13
19
|
|
14
|
-
opts.on("-
|
20
|
+
opts.on("-i", "--init", "When used with a init process (systemd, etc...)") do
|
21
|
+
@init = true
|
22
|
+
end
|
23
|
+
|
24
|
+
opts.on("-m", "--mac", "Forge a random MAC address.") do
|
15
25
|
@mac = true
|
16
26
|
end
|
17
27
|
|
18
|
-
opts.on("-n", "--net-card NAME", "
|
19
|
-
@
|
28
|
+
opts.on("-n", "--net-card NAME", "Card to use, default use card_match from the config file.") do |net|
|
29
|
+
@net_dev = net
|
30
|
+
end
|
31
|
+
|
32
|
+
opts.on("-p", "--persist", "Enable systemd service") do |net|
|
33
|
+
@persist = true
|
34
|
+
end
|
35
|
+
|
36
|
+
opts.on("-H", "--hostname", "Generate a new random hostname") do |host|
|
37
|
+
@hostname = true
|
20
38
|
end
|
21
39
|
|
22
40
|
opts.on("-h", "--help", "Show this message") do
|
@@ -25,7 +43,6 @@ module Amnesie
|
|
25
43
|
end
|
26
44
|
|
27
45
|
begin
|
28
|
-
argv = ["-h"] if argv.empty?
|
29
46
|
opts.parse!(argv)
|
30
47
|
rescue OptionParser::ParseError => e
|
31
48
|
STDERR.puts e.message, "\n", opts
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Amnesie
|
2
|
+
module Persist
|
3
|
+
def self.grep?(file, regex)
|
4
|
+
is_found = false
|
5
|
+
return is_found if ! File.exist? file
|
6
|
+
File.open(file) do |f|
|
7
|
+
f.each do |line|
|
8
|
+
is_found = true if line.match(regex)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
is_found
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
require_relative 'persist/iwd'
|
17
|
+
require_relative 'persist/wpa_supplicant'
|
18
|
+
require_relative 'persist/systemd'
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'nito'
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
module Amnesie
|
5
|
+
module Persist
|
6
|
+
class Iwd
|
7
|
+
def initialize
|
8
|
+
@tmp = Tempfile.new("main.conf")
|
9
|
+
apply
|
10
|
+
end
|
11
|
+
|
12
|
+
def apply
|
13
|
+
File.write(@tmp, iwd_conf)
|
14
|
+
if ! File.exist? "/etc/iwd/main.conf" ||
|
15
|
+
! grep?("/etc/iwd/main.conf", /AddressRandomization/)
|
16
|
+
puts "Add iwd/main.conf"
|
17
|
+
Nito::Cp.new(@tmp.path, "/etc/iwd/main.conf")
|
18
|
+
else
|
19
|
+
puts "MAC random on iwd seem enable."
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def iwd_conf
|
26
|
+
<<EOF
|
27
|
+
[General]
|
28
|
+
AddressRandomization=network
|
29
|
+
AddressRandomizationRange=full
|
30
|
+
EOF
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Amnesie
|
2
|
+
module Persist
|
3
|
+
class Systemd
|
4
|
+
def initialize(card = nil)
|
5
|
+
@card = card
|
6
|
+
@systemd_dir = search_systemd_dir
|
7
|
+
@systemctl = Helpers::Exec.new("systemctl")
|
8
|
+
end
|
9
|
+
|
10
|
+
def mac_exist?
|
11
|
+
File.exist? "#{@systemd_dir}/amnesie-mac@.service"
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_s
|
15
|
+
@systemd_dir
|
16
|
+
end
|
17
|
+
|
18
|
+
def services
|
19
|
+
mac_service
|
20
|
+
new_service = Helpers::NewSystemd.new(@string, "amnesie-mac@.service")
|
21
|
+
new_service.add
|
22
|
+
new_service.perm("root", "644")
|
23
|
+
end
|
24
|
+
|
25
|
+
def update_mac
|
26
|
+
print "Found a old amnesie-mac@.service, update? (y|n) "
|
27
|
+
answer = gets.chomp
|
28
|
+
case answer
|
29
|
+
when /^y|^Y/
|
30
|
+
services
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def menu_mac
|
35
|
+
print "Action on amnesie-mac@.service for #{@card} (enable/disable) ? (e/d) "
|
36
|
+
answer = gets.chomp
|
37
|
+
case answer
|
38
|
+
when /^e|^E/
|
39
|
+
mac_enable
|
40
|
+
when /^d|^D/
|
41
|
+
mac_disable
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def mac_enable
|
48
|
+
@systemctl.run("enable amnesie-mac@#{@card}.service")
|
49
|
+
end
|
50
|
+
|
51
|
+
def mac_disable
|
52
|
+
@systemctl.run("disable amnesie-mac@#{@card}.service")
|
53
|
+
end
|
54
|
+
|
55
|
+
def search_systemd_dir
|
56
|
+
if Dir.exist? "/lib/systemd/system"
|
57
|
+
"/lib/systemd/system"
|
58
|
+
elsif Dir.exist? "/usr/lib/systemd/system"
|
59
|
+
"/usr/lib/systemd/system"
|
60
|
+
else
|
61
|
+
raise "No directory systemd found"
|
62
|
+
exit
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def mac_service
|
67
|
+
dhcp = TTY::Which.exist?("dhcpcd") ? 'dhcpcd.service' : ''
|
68
|
+
@string=<<EOF
|
69
|
+
[Unit]
|
70
|
+
Description=Spoof MAC Address on %I
|
71
|
+
Wants=network-pre.target
|
72
|
+
Before=network-pre.target #{dhcp}
|
73
|
+
BindsTo=sys-subsystem-net-devices-%i.device
|
74
|
+
After=sys-subsystem-net-devices-%i.device
|
75
|
+
|
76
|
+
[Service]
|
77
|
+
Type=oneshot
|
78
|
+
ExecStart=/usr/bin/env bash -lc "amnesie -i -n %I"
|
79
|
+
ExecReload=/usr/bin/env bash -lc "amnesie -m -n %I"
|
80
|
+
TimeoutSec=30
|
81
|
+
|
82
|
+
[Install]
|
83
|
+
WantedBy=multi-user.target
|
84
|
+
EOF
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'nito'
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
module Amnesie
|
5
|
+
module Persist
|
6
|
+
class WpaSupplicant
|
7
|
+
def initialize
|
8
|
+
@cards = Network.new(/wl^/, nil).search
|
9
|
+
@tmp = Tempfile.new("main.conf")
|
10
|
+
apply_cards
|
11
|
+
end
|
12
|
+
|
13
|
+
def apply_cards
|
14
|
+
@cards.each { |card|
|
15
|
+
apply(card)
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def apply(card)
|
22
|
+
file = "/etc/wpa_supplicant/wpa_supplicant-#{card}.conf"
|
23
|
+
if ! File.exist? file ||
|
24
|
+
! grep?(file, /gas_rand_mac/)
|
25
|
+
puts "Add #{file}"
|
26
|
+
Nito::Cat.new(file, wpa_conf)
|
27
|
+
else
|
28
|
+
puts "MAC random on wpa_supplicant seem enable."
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def wpa_conf
|
33
|
+
<<EOF
|
34
|
+
mac_addr=1
|
35
|
+
preassoc_mac_addr=1
|
36
|
+
gas_rand_mac_addr=1
|
37
|
+
EOF
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/amnesie/process.rb
CHANGED
@@ -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
|
-
@
|
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
|
-
|
29
|
-
|
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', paths: ['/
|
35
|
-
|
36
|
-
|
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,7 +51,7 @@ module Amnesie
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def restart_dhclient
|
54
|
-
return if not TTY::Which.exist?('dhclient', paths: ['/
|
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}")
|
@@ -70,5 +70,12 @@ module Amnesie
|
|
70
70
|
puts "Restarted tor"
|
71
71
|
end
|
72
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
|
73
80
|
end
|
74
81
|
end
|
data/lib/nito.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require_relative 'nito/pass'
|
2
|
+
require_relative 'nito/sudo'
|
3
|
+
require_relative 'nito/cp'
|
4
|
+
require_relative 'nito/cat'
|
5
|
+
require_relative 'nito/sed'
|
6
|
+
require_relative 'nito/hostname'
|
7
|
+
require_relative 'nito/mkdir'
|
8
|
+
|
9
|
+
module Nito
|
10
|
+
ID = `id -u`.chomp.freeze
|
11
|
+
end
|
data/lib/nito/cat.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Nito
|
2
|
+
class Cat
|
3
|
+
def initialize(conf, string)
|
4
|
+
@conf = conf
|
5
|
+
@string = string
|
6
|
+
write_file
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
def write_file
|
11
|
+
tmp = Tempfile.new(@conf)
|
12
|
+
if File.exist? @conf
|
13
|
+
File.open(@conf).each { |l|
|
14
|
+
File.write(tmp, l, mode: 'a')
|
15
|
+
}
|
16
|
+
end
|
17
|
+
File.write(tmp, @string, mode: 'a')
|
18
|
+
Nito::Cp.new(tmp.path, @conf)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/nito/cp.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Nito
|
4
|
+
class Cp
|
5
|
+
#@@pass = nil
|
6
|
+
|
7
|
+
def initialize(src, dst, perm = 0644)
|
8
|
+
@src = src
|
9
|
+
@dst = dst
|
10
|
+
@perm = perm
|
11
|
+
if ID == "0"
|
12
|
+
root
|
13
|
+
else
|
14
|
+
#@@pass = Pass.new if ! @@pass
|
15
|
+
sudo
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def root
|
22
|
+
FileUtils.copy_file(@src, @dst)
|
23
|
+
FileUtils.chmod(@perm, @dst)
|
24
|
+
end
|
25
|
+
|
26
|
+
def sudo
|
27
|
+
#Sudo.run("cp #{@src} #{@dst}", @@pass.secret)
|
28
|
+
Sudo.run("cp #{@src} #{@dst}")
|
29
|
+
perm = sprintf "%o", @perm
|
30
|
+
#puts "Applying perm #{perm}"
|
31
|
+
#Sudo.run("chmod #{perm} #{@dst}", @@pass.secret)
|
32
|
+
Sudo.run("chmod #{perm} #{@dst}")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
3
|
+
module Nito
|
4
|
+
class Hostname
|
5
|
+
def initialize(hostname)
|
6
|
+
@hostname = hostname
|
7
|
+
@hostname_file = '/etc/hostname'
|
8
|
+
@hosts_file = '/etc/hosts'
|
9
|
+
new
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def new
|
15
|
+
tmp = Tempfile.new('hostname')
|
16
|
+
File.write(tmp, @hostname)
|
17
|
+
Nito::Cp.new(tmp.path, @hostname_file)
|
18
|
+
reg_1 = /^127.0.0.1[\s]+localhost/
|
19
|
+
reg_2 = /^::1[\s]+localhost/
|
20
|
+
Nito::Sed.new(@hosts_file, reg_1, "127.0.0.1 localhost #{@hostname}")
|
21
|
+
Nito::Sed.new(@hosts_file, reg_2, "::1 localhost #{@hostname}")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/nito/mkdir.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Nito
|
4
|
+
class Mkdir
|
5
|
+
def initialize(dir)
|
6
|
+
@dir = dir
|
7
|
+
mkdir
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
def mkdir
|
12
|
+
begin
|
13
|
+
FileUtils.mkdir_p @dir if ! Dir.exist? @dir
|
14
|
+
rescue Errno::EACCES
|
15
|
+
FileUtils.mkdir_p @dir if ! Dir.exist? @dir
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/nito/pass.rb
ADDED
data/lib/nito/sed.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
3
|
+
module Nito
|
4
|
+
class Sed
|
5
|
+
def initialize(file, regex, change)
|
6
|
+
@file = file
|
7
|
+
@regex = regex
|
8
|
+
@change = change
|
9
|
+
apply
|
10
|
+
end
|
11
|
+
|
12
|
+
def apply
|
13
|
+
raise ArgumentError "No file #{@file} exist" if ! File.exist? @file
|
14
|
+
tmp = Tempfile.new('sed')
|
15
|
+
File.open(@file).each { |l|
|
16
|
+
if l.match(@regex)
|
17
|
+
File.write(tmp, "#{@change}\n", mode: 'a')
|
18
|
+
else
|
19
|
+
File.write(tmp, l, mode: 'a')
|
20
|
+
end
|
21
|
+
}
|
22
|
+
Nito::Cp.new(tmp.path, @file)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/nito/sudo.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
module Nito
|
2
|
+
module Sudo
|
3
|
+
def self.run(command, input = nil)
|
4
|
+
#IO.popen("sudo -S #{command}", 'r+') do |io|
|
5
|
+
IO.popen("sudo #{command}", 'r+') do |io|
|
6
|
+
begin
|
7
|
+
io.puts input
|
8
|
+
io.close_write
|
9
|
+
io.read
|
10
|
+
rescue Interrupt
|
11
|
+
puts "\nInterrupt"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
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.
|
4
|
+
version: 0.0.9
|
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-
|
38
|
+
date: 2020-11-06 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: rake
|
@@ -113,6 +113,20 @@ dependencies:
|
|
113
113
|
- - '='
|
114
114
|
- !ruby/object:Gem::Version
|
115
115
|
version: 0.4.2
|
116
|
+
- !ruby/object:Gem::Dependency
|
117
|
+
name: highline
|
118
|
+
requirement: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - '='
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: 2.0.3
|
123
|
+
type: :runtime
|
124
|
+
prerelease: false
|
125
|
+
version_requirements: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - '='
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: 2.0.3
|
116
130
|
description: ' A tool to make your computer amnesic"
|
117
131
|
|
118
132
|
'
|
@@ -132,12 +146,27 @@ files:
|
|
132
146
|
- Rakefile
|
133
147
|
- amnesie.gemspec
|
134
148
|
- bin/amnesie
|
149
|
+
- lib/amnesie.rb
|
150
|
+
- lib/amnesie/config.rb
|
135
151
|
- lib/amnesie/helpers.rb
|
152
|
+
- lib/amnesie/host.rb
|
136
153
|
- lib/amnesie/mac.rb
|
137
154
|
- lib/amnesie/network.rb
|
138
155
|
- lib/amnesie/options.rb
|
156
|
+
- lib/amnesie/persist.rb
|
157
|
+
- lib/amnesie/persist/iwd.rb
|
158
|
+
- lib/amnesie/persist/systemd.rb
|
159
|
+
- lib/amnesie/persist/wpa_supplicant.rb
|
139
160
|
- lib/amnesie/process.rb
|
140
|
-
- lib/amnesie/
|
161
|
+
- lib/amnesie/version.rb
|
162
|
+
- lib/nito.rb
|
163
|
+
- lib/nito/cat.rb
|
164
|
+
- lib/nito/cp.rb
|
165
|
+
- lib/nito/hostname.rb
|
166
|
+
- lib/nito/mkdir.rb
|
167
|
+
- lib/nito/pass.rb
|
168
|
+
- lib/nito/sed.rb
|
169
|
+
- lib/nito/sudo.rb
|
141
170
|
- test/test_mac.rb
|
142
171
|
homepage: https://github.com/szorfein/amnesie
|
143
172
|
licenses:
|
@@ -161,7 +190,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
161
190
|
- !ruby/object:Gem::Version
|
162
191
|
version: '0'
|
163
192
|
requirements: []
|
164
|
-
rubygems_version: 3.
|
193
|
+
rubygems_version: 3.0.3
|
165
194
|
signing_key:
|
166
195
|
specification_version: 4
|
167
196
|
summary: A tool to make your computer amnesic
|
metadata.gz.sig
CHANGED
Binary file
|
data/lib/amnesie/runner.rb
DELETED
@@ -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
|