Add script to intelligently bruteforce the entire userlist via the user search engine

master
Sven Slootweg 12 years ago
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…
Cancel
Save