import
time
import
struct
import
socket
import
select
import
concurrent.futures
import
ipaddress
subnet
=
"192.168.112.0/20"
thread_pool_size
=
200
port_range
=
[
135
,
445
,
3306
,
3389
,
6379
,
22
]
def
scan_port(ip, port):
try
:
sock
=
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(
1
)
result
=
sock.connect_ex((ip, port))
if
result
=
=
0
:
return
str
(ip)
+
":"
+
str
(port)
except
:
pass
finally
:
if
sock:
sock.close()
def
scan_subnet(subnet):
with concurrent.futures.ThreadPoolExecutor(max_workers
=
thread_pool_size) as executor:
futures
=
[executor.submit(scan_port, ip, port)
for
ip
in
subnet
for
port
in
port_range]
concurrent.futures.wait(futures)
for
future
in
concurrent.futures.as_completed(futures):
port
=
future.result()
if
port
is
not
None
:
print
(port)
def
chesksum(data):
n
=
len
(data)
m
=
n
%
2
sum
=
0
for
i
in
range
(
0
, n
-
m ,
2
):
sum
+
=
(data[i])
+
((data[i
+
1
]) <<
8
)
if
m:
sum
+
=
(data[
-
1
])
sum
=
(
sum
>>
16
)
+
(
sum
&
0xffff
)
sum
+
=
(
sum
>>
16
)
answer
=
~
sum
&
0xffff
answer
=
answer >>
8
| (answer <<
8
&
0xff00
)
return
answer
def
request_ping(data_type,data_code,data_checksum,data_ID,data_Sequence,payload_body):
icmp_packet
=
struct.pack(
'>BBHHH32s'
,data_type,data_code,data_checksum,data_ID,data_Sequence,payload_body)
icmp_chesksum
=
chesksum(icmp_packet)
icmp_packet
=
struct.pack(
'>BBHHH32s'
,data_type,data_code,icmp_chesksum,data_ID,data_Sequence,payload_body)
return
icmp_packet
def
raw_socket(dst_addr,icmp_packet):
rawsocket
=
socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.getprotobyname(
"icmp"
))
send_request_ping_time
=
time.time()
rawsocket.sendto(icmp_packet,(dst_addr,
80
))
return
send_request_ping_time,rawsocket,dst_addr
def
reply_ping(send_request_ping_time,rawsocket,data_Sequence,timeout
=
2
):
while
True
:
started_select
=
time.time()
what_ready
=
select.select([rawsocket], [], [], timeout)
wait_for_time
=
(time.time()
-
started_select)
if
what_ready[
0
]
=
=
[]:
return
-
1
time_received
=
time.time()
received_packet, addr
=
rawsocket.recvfrom(
1024
)
icmpHeader
=
received_packet[
20
:
28
]
type
, code, checksum, packet_id, sequence
=
struct.unpack(
">BBHHH"
, icmpHeader
)
if
type
=
=
0
and
sequence
=
=
data_Sequence:
return
time_received
-
send_request_ping_time
timeout
=
timeout
-
wait_for_time
if
timeout <
=
0
:
return
-
1
def
ping(host):
data_type
=
8
data_code
=
0
data_checksum
=
0
data_ID
=
0
data_Sequence
=
1
payload_body
=
b
'abcdefghijklmnopqrstuvwabcdefghi'
icmp_packet
=
request_ping(data_type,data_code,data_checksum,data_ID,data_Sequence,payload_body)
send_request_ping_time,rawsocket,addr
=
raw_socket(host,icmp_packet)
times
=
reply_ping(send_request_ping_time,rawsocket,data_Sequence)
if
times >
0
:
return
host
else
:
pass
def
StartPing(subnet):
ips
=
[
str
(ip)
for
ip
in
list
(ipaddress.IPv4Network(subnet).hosts())]
print
(ips)
with concurrent.futures.ThreadPoolExecutor(max_workers
=
thread_pool_size) as executor:
futures
=
[executor.submit(ping, ip)
for
ip
in
ips]
concurrent.futures.wait(futures)
iplist
=
[]
for
future
in
concurrent.futures.as_completed(futures):
ip
=
future.result()
if
ip
is
not
None
:
iplist.append(ip)
scan_subnet(iplist)
if
__name__
=
=
"__main__"
:
StartPing(subnet)