interactsh 0.9.3 → 0.9.4

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/interactsh.rb +89 -89
  3. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6feebc6e3116675ca85a30c2f576d8a7f6eabd9d6becdf255eb36b9a9fe8bf60
4
- data.tar.gz: ba28a91c6fce3329f2995be8cfc46ac17c42aaa8485457891cb07d630c9ac22c
3
+ metadata.gz: 03cb293a428605a5f9bd9bf8ae807d3305e0021f88e32897ff43a296f4b452f2
4
+ data.tar.gz: 26f3566ad591699653cd710963b1b78e8ff47ca0238aa949889515af3a0301e2
5
5
  SHA512:
6
- metadata.gz: caa7e51f65571b0357aa8a6e231fd546809782a0134cbcc5d05172881dd704052e616267ed8b2298b05418929b3c60d3ea8c33fb67e13bb0624072b32d38581c
7
- data.tar.gz: 96215db908a3feefe6b9fd9f6de54d853f88fa977bceec2a7090821c3052c29fd0370d5d77176c3f406628aa58da4587ccbf4296487f8b82b6ec581247b1cadb
6
+ metadata.gz: 9149747761e02c6bcd2b9a79e8ad69aeb25061e1c8e3c1e95d8b76fef505923ca988ef7000cd58b254914a8be8563c15a594b3293df77e0e8c08225bb424b112
7
+ data.tar.gz: a6c35ba927bd659c5f35156af3d6bacf86a98985d70e30b94f495587fe0351c412b757c7755d9303ee29bef21f77ab3f91e26f97a86feba12c7c5b08587d5643
data/lib/interactsh.rb CHANGED
@@ -1,89 +1,89 @@
1
- # frozen_string_literal: true
2
-
3
- require 'openssl'
4
- require 'stringio'
5
- require 'jose'
6
- require 'securerandom'
7
- require 'base64'
8
- require 'json'
9
- require 'ruby_xid'
10
- require 'typhoeus'
11
-
12
- # InteractSH Ruby Library
13
- class Interactsh
14
- attr_reader :public_key_encoded, :secret, :server, :random_data, :rsa, :token
15
-
16
- def initialize(server = 'interact.sh', token = nil)
17
- @rsa = OpenSSL::PKey::RSA.new(2048)
18
- @public_key = @rsa.public_key.to_pem
19
- @public_key_encoded = Base64.encode64(@public_key)
20
-
21
- @secret = SecureRandom.uuid
22
- @random_data = Array.new(13) { (Array('a'..'z') + Array(0..9)).sample }.join
23
-
24
- @server = server
25
- @token = token
26
- end
27
-
28
- def new_domain
29
- correlation_id = Xid.new.to_s
30
- register(correlation_id)
31
-
32
- "#{correlation_id}#{random_data}.#{server}"
33
- end
34
-
35
- def poll(host)
36
- correlation_id = host[0..19]
37
- headers = {}
38
- headers['Authorization'] = token if token
39
-
40
- response = Typhoeus.get(File.join(server, "/poll?id=#{correlation_id}&secret=#{secret}"), headers: headers)
41
- unless response&.code == 200
42
- puts '[!] Interactsh - Problem with data recovery'
43
- return
44
- end
45
-
46
- datas = JSON.parse(response.body)
47
- parse_poll_datas(datas)
48
- end
49
-
50
- private
51
-
52
- def parse_poll_datas(datas)
53
- decoded_datas = []
54
-
55
- unless datas.empty?
56
- datas['data'].each do |enc_data|
57
- decoded_datas << decrypt_data(datas['aes_key'], enc_data)
58
- end
59
- end
60
-
61
- decoded_datas
62
- end
63
-
64
- def register(correlation_id)
65
- data = { "public-key": public_key_encoded, "secret-key": secret, "correlation-id": correlation_id }.to_json
66
-
67
- headers = { 'Content-Type' => 'application/json' }
68
- headers['Authorization'] = token if token
69
-
70
- response = Typhoeus.post(File.join(server, '/register'), body: data, headers: headers)
71
- return if response.code == 200
72
-
73
- puts '[!] Interactsh - Problem with domain registration'
74
- end
75
-
76
- def decrypt_data(aes_key, enc_data)
77
- pkey = OpenSSL::PKey::RSA.new(rsa)
78
- encrypted_aes_key = Base64.urlsafe_decode64(aes_key)
79
- decrypted_aes_key = JOSE::JWA::PKCS1.rsaes_oaep_decrypt(OpenSSL::Digest::SHA256, encrypted_aes_key, pkey)
80
-
81
- secretdata = Base64.decode64(enc_data)
82
- decipher = OpenSSL::Cipher.new('aes-256-cfb')
83
- decipher.decrypt
84
- decipher.key = decrypted_aes_key
85
-
86
- # The data minus the size of the IV
87
- JSON.parse((decipher.update(secretdata) + decipher.final)[16..])
88
- end
89
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'openssl'
4
+ require 'stringio'
5
+ require 'jose'
6
+ require 'securerandom'
7
+ require 'base64'
8
+ require 'json'
9
+ require 'ruby_xid'
10
+ require 'typhoeus'
11
+
12
+ # InteractSH Ruby Library
13
+ class Interactsh
14
+ attr_reader :public_key_encoded, :secret, :server, :random_data, :rsa, :token
15
+
16
+ def initialize(server = 'interact.sh', token = nil)
17
+ @rsa = OpenSSL::PKey::RSA.new(2048)
18
+ @public_key = @rsa.public_key.to_pem
19
+ @public_key_encoded = Base64.encode64(@public_key)
20
+
21
+ @secret = SecureRandom.uuid
22
+ @random_data = Array.new(13) { (Array('a'..'z') + Array(0..9)).sample }.join
23
+
24
+ @server = server
25
+ @token = token
26
+ end
27
+
28
+ def new_domain
29
+ correlation_id = Xid.new.to_s
30
+ register(correlation_id)
31
+
32
+ "#{correlation_id}#{random_data}.#{server}"
33
+ end
34
+
35
+ def poll(host)
36
+ correlation_id = host[0..19]
37
+ headers = {}
38
+ headers['Authorization'] = token if token
39
+
40
+ response = Typhoeus.get(File.join(server, "/poll?id=#{correlation_id}&secret=#{secret}"), headers: headers)
41
+ unless response&.code == 200
42
+ puts '[!] Interactsh - Problem with data recovery'
43
+ return
44
+ end
45
+
46
+ datas = JSON.parse(response.body)
47
+ parse_poll_datas(datas)
48
+ end
49
+
50
+ private
51
+
52
+ def parse_poll_datas(datas)
53
+ decoded_datas = []
54
+
55
+ unless datas.empty?
56
+ datas['data'].each do |enc_data|
57
+ decoded_datas << decrypt_data(datas['aes_key'], enc_data)
58
+ end
59
+ end
60
+
61
+ decoded_datas
62
+ end
63
+
64
+ def register(correlation_id)
65
+ data = { "public-key": public_key_encoded, "secret-key": secret, "correlation-id": correlation_id }.to_json
66
+
67
+ headers = { 'Content-Type' => 'application/json' }
68
+ headers['Authorization'] = token if token
69
+
70
+ response = Typhoeus.post(File.join(server, '/register'), body: data, headers: headers)
71
+ return if response.code == 200
72
+
73
+ puts '[!] Interactsh - Problem with domain registration'
74
+ end
75
+
76
+ def decrypt_data(aes_key, enc_data)
77
+ pkey = OpenSSL::PKey::RSA.new(rsa)
78
+ encrypted_aes_key = Base64.urlsafe_decode64(aes_key)
79
+ decrypted_aes_key = JOSE::JWA::PKCS1.rsaes_oaep_decrypt(OpenSSL::Digest::SHA256, encrypted_aes_key, pkey)
80
+
81
+ secretdata = Base64.decode64(enc_data)
82
+ decipher = OpenSSL::Cipher.new('aes-256-cfb')
83
+ decipher.decrypt
84
+ decipher.key = decrypted_aes_key
85
+
86
+ # The data minus the size of the IV
87
+ JSON.parse((decipher.update(secretdata) + decipher.final)[16..])
88
+ end
89
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: interactsh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 0.9.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua MARTINELLE
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-12 00:00:00.000000000 Z
11
+ date: 2024-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jose
@@ -92,7 +92,7 @@ extensions: []
92
92
  extra_rdoc_files: []
93
93
  files:
94
94
  - lib/interactsh.rb
95
- homepage: https://rubygems.org/gems/interactsh
95
+ homepage: https://github.com/JoshuaMart/Interactsh-Library
96
96
  licenses:
97
97
  - MIT
98
98
  metadata: {}
@@ -111,7 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
111
  - !ruby/object:Gem::Version
112
112
  version: '0'
113
113
  requirements: []
114
- rubygems_version: 3.1.2
114
+ rubygems_version: 3.4.19
115
115
  signing_key:
116
116
  specification_version: 4
117
117
  summary: Interactsh Ruby Library