Add script to intelligently bruteforce the entire userlist via the user search engine
parent
9816272d6e
commit
b7bbf8cfe6
@ -0,0 +1,126 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import webshotslib, argparse
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description='Finds usernames for Webshots')
|
||||||
|
|
||||||
|
parser.add_argument('--resume', dest='resume', action='store', default='%',
|
||||||
|
help='position to resume from')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
options = vars(args)
|
||||||
|
|
||||||
|
users = []
|
||||||
|
|
||||||
|
alphabet = "-0123456789abcdefghijklmnopqrstuvwxyz!"
|
||||||
|
alphabet_length = len(alphabet)
|
||||||
|
|
||||||
|
current_index = 0
|
||||||
|
current_character_index = []
|
||||||
|
|
||||||
|
current_character_index.insert(0, 0)
|
||||||
|
|
||||||
|
done = False
|
||||||
|
users_count = 0
|
||||||
|
users_last_save = 0
|
||||||
|
thousands_last_save = 0
|
||||||
|
request_count = 0
|
||||||
|
|
||||||
|
if options['resume'] != "%":
|
||||||
|
# Resuming is requested, let's load the old user list first.
|
||||||
|
user_list = open("users4.txt", "r")
|
||||||
|
users = user_list.readlines()
|
||||||
|
user_list.close()
|
||||||
|
|
||||||
|
users_count = len(users)
|
||||||
|
users_last_save = users_count
|
||||||
|
thousands_last_save = users_count / 1000
|
||||||
|
|
||||||
|
# Set the current state to the requested resume point
|
||||||
|
if options['resume'].endswith("%"):
|
||||||
|
options['resume'] = options['resume'][:-1]
|
||||||
|
|
||||||
|
current_index = len(options['resume']) - 1
|
||||||
|
|
||||||
|
current_character_index = []
|
||||||
|
|
||||||
|
for character in options['resume']:
|
||||||
|
current_character_index.append(alphabet.index(character))
|
||||||
|
|
||||||
|
print "Resuming from %s%% - loaded %d users ..." % ("".join([alphabet[value] for value in current_character_index]), users_count)
|
||||||
|
else:
|
||||||
|
# Do an initial query for all the special character stuff
|
||||||
|
results, count = webshotslib.search_query("%")
|
||||||
|
|
||||||
|
# Append all users to the user list
|
||||||
|
for user in results:
|
||||||
|
if user not in users:
|
||||||
|
users.append(user)
|
||||||
|
users_count += 1
|
||||||
|
|
||||||
|
while done == False:
|
||||||
|
query = "".join([alphabet[value] for value in current_character_index])
|
||||||
|
request_count += 1
|
||||||
|
results, count = webshotslib.search_query(query)
|
||||||
|
|
||||||
|
# Append all new users to the user list
|
||||||
|
for user in results:
|
||||||
|
if user not in users:
|
||||||
|
users.append(user)
|
||||||
|
users_count += 1
|
||||||
|
|
||||||
|
# Save the users to a file if we've had another 1000 (approximately)
|
||||||
|
if users_count % 1000 < 100 and users_last_save != users_count and thousands_last_save != users_count / 1000:
|
||||||
|
print "\nSaving %d users to file..." % users_count
|
||||||
|
userfile = open("users4.txt", "w")
|
||||||
|
userfile.write("\n".join(users))
|
||||||
|
userfile.close()
|
||||||
|
users_last_save = users_count
|
||||||
|
thousands_last_save = users_count / 1000
|
||||||
|
elif request_count % 100 == 0:
|
||||||
|
print "Users found so far: %s" % users_count
|
||||||
|
|
||||||
|
# Decide what to do now
|
||||||
|
if count < 100:
|
||||||
|
# End of this query reached
|
||||||
|
while True:
|
||||||
|
if current_index >= 0:
|
||||||
|
if current_character_index[current_index] < alphabet_length - 1:
|
||||||
|
# More characters available, move on to the next character
|
||||||
|
current_character_index[current_index] += 1
|
||||||
|
print "\rMoving to next character, searching at %s%% ..." % "".join([alphabet[value] for value in current_character_index]),
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
# Ran out of characters, move up a level
|
||||||
|
current_character_index.pop()
|
||||||
|
current_index -= 1
|
||||||
|
print "\nMoved up a level, searching at %s%% ..." % "".join([alphabet[value] for value in current_character_index])
|
||||||
|
else:
|
||||||
|
done = True
|
||||||
|
print "\nDone!"
|
||||||
|
exit(0)
|
||||||
|
|
||||||
|
elif results[-1].lower().startswith(query):
|
||||||
|
# Not specific enough, we need to go a level deeper
|
||||||
|
current_index += 1
|
||||||
|
current_character_index.insert(current_index, 0)
|
||||||
|
print "\nIncreasing depth, searching at %s%% ..." % "".join([alphabet[value] for value in current_character_index])
|
||||||
|
else:
|
||||||
|
# Re-search with the current depth, with the start of the last result
|
||||||
|
next_character = results[-1][current_index:current_index + 1].lower()
|
||||||
|
|
||||||
|
try:
|
||||||
|
current_character_index[current_index] = alphabet.index(next_character)
|
||||||
|
except ValueError, e:
|
||||||
|
# The next character is not in our list of characters, so we will append it to the alphabet.
|
||||||
|
alphabet.append(next_character)
|
||||||
|
alphabet_length = len(alphabet)
|
||||||
|
print "\nAdded character %s to alphabet ..." % next_character
|
||||||
|
|
||||||
|
print "\rContinuing search at %s%% ..." % "".join([alphabet[value] for value in current_character_index]),
|
||||||
|
|
||||||
|
# Final save
|
||||||
|
print "\nFinal save to file: %d users" % users_count
|
||||||
|
userfile = open("users4.txt", "w")
|
||||||
|
userfile.write("\n".join(users))
|
||||||
|
userfile.close()
|
Loading…
Reference in New Issue