Differences between version 2 and previous revision of CyberLeo/Scraps/cocknocker.
Other diffs: Previous Major Revision, Previous Author
| Newer page: | version 2 | Last edited on Tuesday, 29 May 2012 7:10:38 | by CyberLeo | Revert |
| Older page: | version 1 | Last edited on Tuesday, 29 May 2012 7:05:47 | by CyberLeo | Revert |
@@ -2,9 +2,9 @@
require 'openssl'
require 'socket'
require 'zlib'
-bad
_ports
= [ 0, 25, 135, 139, 445 ]
+BAD
_PORTS
= [ 0, 25, 135, 139, 445 ]
def packet(generation, ip, time)
a = [ generation ]
a.concat(ip.split('.').map(&:to_i))
@@ -39,20 +39,24 @@
def check(packet, bad_ports)
bad_ports - packet == bad_ports
end
-key = OpenSSL::PKey::RSA.new
(192
)
-ip = '127.0.0.1'
-
time = Time.now.to_i
+def knock
(ip, key
)
+
time = Time.now.to_i
+ generation = 0
+ packet = nil
+ until packet && check(packet, BAD_PORTS)
+ packet = fmt(encrypt(packet(generation, ip, time), key))
+ generation += 1
+ end
-packet
= nil
-generation = 0
-until
packet && check(packet, bad_ports)
- packet = fmt
(encrypt(packet(generation
, ip, time), key)
)
- generation += 1
+ sock
= UDPSocket.new
+
packet.each {|port|
+ sock.send
('', 0
, ip, port
)
+ }
end
-sock
= UDPSocket
.new
-packet.each {|port|
- sock.send('', 0,
'10
.0.0.1', port
)
-}
+key
= OpenSSL::PKey::RSA
.new(192)
+ip =
'127
.0.0.1'
+
+knock(ip
)
</code>
version 2
require 'openssl'
require 'socket'
require 'zlib'
BAD_PORTS = [ 0, 25, 135, 139, 445 ]
def packet(generation, ip, time)
a = [ generation ]
a.concat(ip.split('.').map(&:to_i))
a << time
p = a.pack('C5N')
a << Zlib.crc32(p)
a.pack('C5NN')
end
def encrypt(packet, key)
key.private_encrypt(packet)
end
def fmt(packet)
out = []
idx = 0
stack = packet.unpack('C*')
while a = stack.shift
b = stack.shift
c = stack.shift
one = ( a << 4 ) + ( b & 0xf )
two = ( ( b & 0x0f ) << 8 ) + c
out << ( ( one << 4 ) + idx )
idx += 1
out << ( ( two << 4 ) + idx )
idx += 1
end
out
end
# Returns true if the packet contains no bad ports; false if it does
def check(packet, bad_ports)
bad_ports - packet == bad_ports
end
def knock(ip, key)
time = Time.now.to_i
generation = 0
packet = nil
until packet && check(packet, BAD_PORTS)
packet = fmt(encrypt(packet(generation, ip, time), key))
generation += 1
end
sock = UDPSocket.new
packet.each {|port|
sock.send('', 0, ip, port)
}
end
key = OpenSSL::PKey::RSA.new(192)
ip = '127.0.0.1'
knock(ip)
