interactsh 0.9.2 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/interactsh.rb +79 -83
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b34b1f28ac601af7b3d0e6f6fbe9cc952f8ac86aa4b56f4b58eac7403a46fad1
4
- data.tar.gz: 78d1933787518e693380db20df67b3049a9e948a5d2cd1348be294ecbbf5d670
3
+ metadata.gz: 6feebc6e3116675ca85a30c2f576d8a7f6eabd9d6becdf255eb36b9a9fe8bf60
4
+ data.tar.gz: ba28a91c6fce3329f2995be8cfc46ac17c42aaa8485457891cb07d630c9ac22c
5
5
  SHA512:
6
- metadata.gz: 8490d216a0037495457c5f170dbea3ca77330fad9d311de87d97ad89c36594e22c10ec9e79b4a7af9eef3cf12e01482541be7621a392e39fa6c9f6654ffedf8d
7
- data.tar.gz: b62e3f53d773bb04f771064a6b1502454b11f3bf494661d27c7afde90aa41f3a43996f0c30518569cb79a38efffbcf3ef0ad1f817be848c85f72fe96bea63179
6
+ metadata.gz: caa7e51f65571b0357aa8a6e231fd546809782a0134cbcc5d05172881dd704052e616267ed8b2298b05418929b3c60d3ea8c33fb67e13bb0624072b32d38581c
7
+ data.tar.gz: 96215db908a3feefe6b9fd9f6de54d853f88fa977bceec2a7090821c3052c29fd0370d5d77176c3f406628aa58da4587ccbf4296487f8b82b6ec581247b1cadb
data/lib/interactsh.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'openssl'
2
4
  require 'stringio'
3
5
  require 'jose'
@@ -7,87 +9,81 @@ require 'json'
7
9
  require 'ruby_xid'
8
10
  require 'typhoeus'
9
11
 
12
+ # InteractSH Ruby Library
10
13
  class Interactsh
11
- attr_reader :public_key_encoded, :secret, :correlation_id, :server, :random_data, :rsa, :token
12
-
13
- def initialize(server = 'interact.sh', token = nil)
14
- @rsa = OpenSSL::PKey::RSA.new(2048)
15
- @public_key = @rsa.public_key.to_pem
16
- @public_key_encoded = Base64.encode64(@public_key)
17
-
18
- @secret = SecureRandom.uuid
19
- @correlation_id = Xid.new.to_s
20
- @random_data = Array.new(13) { (Array('a'..'z') + Array(0..9)).sample }.join
21
-
22
- @server = server
23
- @token = token
24
-
25
- register
26
- end
27
-
28
- def get_domain
29
- "#{correlation_id}#{random_data}.#{server}"
30
- end
31
-
32
- def poll
33
- headers = { }
34
- headers['Authorization'] = token if token
35
-
36
- response = Typhoeus.get(
37
- File.join(server, "/poll?id=#{correlation_id}&secret=#{secret}"),
38
- headers: headers
39
- )
40
- decoded_datas = []
41
-
42
- if response&.code == 200
43
- datas = JSON.parse(response.body)
44
- unless datas.empty?
45
- datas["data"].each do |enc_data|
46
- decoded_datas << decrypt_data(datas["aes_key"], enc_data)
47
- end
48
- end
49
- else
50
- puts "[!] Interactsh - Problem with data recovery"
51
- return
52
- end
53
-
54
- decoded_datas
55
- end
56
-
57
- private
58
-
59
- def register
60
- data = {
61
- "public-key": public_key_encoded,
62
- "secret-key": secret,
63
- "correlation-id": correlation_id
64
- }.to_json
65
-
66
- headers = { 'Content-Type' => 'application/json' }
67
- headers['Authorization'] = token if token
68
-
69
- response = Typhoeus.post(
70
- File.join(server, '/register'),
71
- body: data,
72
- headers: headers
73
- )
74
-
75
- unless response.code == 200
76
- puts "[!] Interactsh - Problem with domain registration"
77
- end
78
- end
79
-
80
- def decrypt_data(aes_key, enc_data)
81
- pkey = OpenSSL::PKey::RSA.new(rsa)
82
- encrypted_aes_key = Base64.urlsafe_decode64(aes_key)
83
- decrypted_aes_key = JOSE::JWA::PKCS1::rsaes_oaep_decrypt(OpenSSL::Digest::SHA256, encrypted_aes_key, pkey)
84
-
85
- secretdata = Base64::decode64(enc_data)
86
- decipher = OpenSSL::Cipher::Cipher.new('aes-256-cfb')
87
- decipher.decrypt
88
- decipher.key = decrypted_aes_key
89
-
90
- # The data minus the size of the IV
91
- JSON.parse((decipher.update(secretdata) + decipher.final)[16..])
92
- end
93
- end
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.2
4
+ version: 0.9.3
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-09-13 00:00:00.000000000 Z
11
+ date: 2022-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jose