The surfattack.py looks good, since most all of it is procedural so nothing really to improve.
The icmpscan is where I am going to give input on. First, there is too many if/elis/else in there. They can be avoided if you constrain the user input. You can check the switches/flags users input with sys.argv
I am speaking mostly with how they give the ip and subnet. Make them separate regardless of cider or full mask. That would reduce the checking of what they put in with a few lines of code.
I did look over the code, and I could re-write it in my own image, but I only did one piece of it to show how I would have done it.
def NumberOfHosts(subnet):
if '.' in subnet:
lsub = subnet.split('.')
hostCount = 0
for octet in lsub:
if octet != '255':
#since we only care how many 0's are in the subnet
# we can use the built-in count()
hostCount += list(bin(int(octet))[2:]).count('0')
return 2**hostCount
#the rest looked fine
x = NumberOfHosts('255.255.255.224')
print x
If sys.argv was used to begin with, the function would take the second element anyway so further checks of validity would not be needed.
Hope I helped. Great work btw, keep it up.