I was contemplating whether i should post this or not since it's not exactly a hacking tool but i figured since it was fun to build i might as well share it. vBulBot automates posting on a vBulletin forum. As such it is able to post predefined messages in rapid succession in random threads throughout the forum you are targeting.

Since this started out more or less as a personal side-project, user-friendliness wasn't high on the priority list. That being said, i might add some functionality in the future to allow for a greater degree of control over the program.

This was written in Python2.7 and you will need the module called Mechanize for this to work. Below is the relevant code.

import os
import sys
import random
import mechanize
import time
import string

# Mechanize browser and set user agent
br = mechanize.Browser()
br.addheaders = [('user-agent', '  Mozilla/5.0 (X11; U; Linux i686; en-US; rv: Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3'),
('accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')]

def login():
    print "[+]Logging in."
        except Exception as e:
            print "\nCould not open target URL, please reference the error message below: "
            print e
    # Select first form(login form) and set values to the credentials -
    # of the account made in advance for spamming purposes
    br.form = list(br.forms())[0]
    br["vb_login_username"] = "username"
    br["vb_login_password"] = "password"
    # Submit values for username and password fields
    response = br.submit()

    print "\n[+]Response:"
    print response
    print "[+]Selecting random URL by page/thread ID"
    # Call function to start posting

# Function to generate a random string of digits to replace the original page/thread ID
def digit_generator(size=5, chars=string.digits):
    return ''.join(random.choice(chars) for _ in range(size))

def post():    
    while True:
            random_url = "http://www.exampleforums.org/forums/operating-systems/linux-1" + digit_generator(5, "0987654321") + ".html"
            print "[+]Selected URL:"
            print random_url

            # Reset 'random_url' value to null
            random_url = ""
            # Select 'vbform' which is the name of the quick reply form -
            # if not present we've either been banned or are otherwise -
            # unable to post in this thread
                print "\n[!]Could not find quick reply form. Unable to post on page"
                print "\n[+]Consider inspecting selected URL manually in your browser"
                choice = raw_input("Retry? Y/n: ")
                if "y" in choice:
                    print "\nRetrying"
                elif "n" in choice:
                    print "\nQuitting"
                    print "\nUnhandled option, quitting"
            print "\nPosting message"
            # Message to spam
            br["message"] = "Spam goes here"
            # Set values for checkbox control where needed
                br[quickreply] = 1
                br[forcepost] = 1
            response = br.submit()
            print "\n[+]Response: "
            print response
            print "[+]Message was posted succesfully"
            # Handle CTRL+C
        except KeyboardInterrupt:
            print "\n[!]CTRL+C Caught, quitting"


Feel free to download/clone vBulBot directly from my repo at github. Detailed instructions on how to use the program can be found in the README.md. If you're interested.
That's very neat! Does this work for all versions of vBulletin?
(03-13-2016, 04:05 AM)Insider Wrote: That's very neat! Does this work for all versions of vBulletin?

So far it's been tested on vBulletin 4, but if i remember correctly the naming conventions for the forms stay largely the same.

Now it would be pretty easy to load up the interpreter + Mechanize module or make a small test script and visit say a vBulletin 5 forum and have Mechanize list the form names on the page it opens. Like so:

import mechanize

br = mechanize.Browser()

br.open("vBul5 url goes here")

for form in br.forms():
    print "Form name:", form.name
    print form

But the same basic procedure could be done for any forum as long as you can figure out the form names in advance or enumerate them programmatically within your script.