Bing has a pretty cool IP advanced search operator. It can be used to detect shared hosting. It is quite annoying to type in each IP manually when you have to check several IPs (e.g. corporate IP network). The following script will scan an entire range of IPs. The examples below (Google IPs 74.125.39.103 to 74.125.39.106) give some pretty interesting results…
def printBingSharedHosting(ip_start, ip_end):
import urllib2
import re
bing_url = 'http://www.bing.com/search?q=ip%3A'
no_results_string = "No results"
def bing_shared_hosting_get_matches(response):
regex = '<h3><a\shref="(.*?)"\sonmousedown="'
mo = re.finditer(regex, response)
urls = []
for i in mo:
urls.extend(i.groups())
return urls
def bing_shared_hosting_query_bing(ip_str):
body = urllib2.urlopen(bing_url+ip_str).read()
if not no_results_string in body:
for i in bing_shared_hosting_get_matches(body):
result(ip_str+" : "+i)
else:
error("Bing page did not show '"+no_results_string+"' for ip: "+ip_str)
info("Starting bing shared hosting search. I'm not printing anything until i find something")
info("This method is only searching through the first result page of bing!")
for ip in getIpRangeList(ip_start, ip_end):
bing_shared_hosting_query_bing(ip)
def getIpRangeList(ip_start, ip_end):
result_list = []
one, two, three, four = ip_start.split('.')
one, two, three, four = (int(one), int(two), int(three), int(four))
end_one, end_two, end_three, end_four = ip_end.split('.')
end_one, end_two, end_three, end_four = (int(end_one), int(end_two), int(end_three), int(end_four))
while one <= end_one:
end_two_tmp = end_two
if not one == end_one:
end_two_tmp = 255
while two <= end_two_tmp:
end_three_tmp = end_three
if not two == end_two:
end_three_tmp = 255
while three <= end_three_tmp:
end_four_tmp = end_four
if not three == end_three:
end_four_tmp = 255
while four <= end_four_tmp:
result_list.append("%i.%i.%i.%i"%(one, two, three, four))
#debug(str(one)+" "+str(two)+" "+str(three)+" "+str(four))
four += 1
four = 0
three += 1
three = 0
two += 1
two = 0
one += 1
return result_list
def error(*text):
print "[PY-ERROR] "+str(" ".join(str(i) for i in text))
if SLEEP_TIME_ON_ERROR > 0:
sleep(SLEEP_TIME_ON_ERROR)
def result(*text):
print "[PY-RESULT] "+str(" ".join(str(i) for i in text))
def info(*text):
print "[PY-INFO] "+str(" ".join(str(i) for i in text))
def debug(*text):
print "[PY-DEBUG] "+str(" ".join(str(i) for i in text))
printBingSharedHosting("74.125.39.103", "74.125.39.106")
I admit, the getIpRangeList function could be a little bit more elegant, but I didn’t want to use an external library, didn’t find any suitable code snippet and in the end, it does its job.