Shodan query i terminalen
Under julledigheten fick jag lite tid över att leka lite mer med python vilket resulterade i att jag skrev ett litet program som kan utföra sökningar mot Shodan och sedan parsar ut ip nummerna och sparar dessa i en log vilken senare kan användas i till exempel metasploit.
Problem uppstog dock när jag skulle hitta på ett sätt att avsluta programet.
I version 1.0 så har jag löst det genom att page räknas upp med 1 varje för var sida och avslutas då page är mindre än 10, då Shodan bara har info på de 5-6 första sidorna i dagsläget trots att det finns flera sidor att blädra till. Inge vacker lösning så tips mottages.
#!/usr/bin/python
import urllib2, sys, re
from BeautifulSoup import BeautifulSoup
def info():
help = '''
ShodanScanner v.1.0 h-kan@h-kan.com
USAGE: ./shodanscanner -q -f
Ex: ./shodanscanner -q apache+2.2.1 -f scan.log
This scan for apache servers and save the IP's into scan.log.
More advanced query's could be used like
- apache+2.2.11 Search for apache servers running version 2.2.11
- +country:SE Search for servers located in sweden
- +hostname:.se Search for servers with ".se" in hostname
- +port:22 Search for servers with service running on port 22
'''
print help
def crawler(page):
try:
sock = urllib2.urlopen("http://shodan.surtri.com/?q=%s&page=%i"%(args1,page))
homepage = sock.read()
htmlDom = BeautifulSoup(homepage)
links = htmlDom.findAll('a', {'href': True})
return links
except:
print "[-] Connection Failed"
sys.exit(0)
if __name__ == "__main__":
page = 1
if len(sys.argv) != 5:
info()
print "usage: %s -q -f "%sys.argv[0]
sys.exit(0)
else:
if sys.argv[1].lower() == "-q":
args1 = sys.argv[2]
if sys.argv[3].lower() == "-f":
args2 = sys.argv[4]
log = open(args2,"a")
print "[+] Searching query: %s"%args1
log.write("[+] Searching query: %s"%args1)
log.close()
print "[+] please wait ..."
while page <=10:
data = crawler(page)
for link in data:
log = open(args2,"a")
if re.search("http://",link['href']):
link = link['href'].replace("http://","")
print "%s"%link
log.write("%s\n"%link)
log.close()
page += 1