Categories

Pythoninae vs. Elephantidae Amaurosis

No Gravatar

Golem berichtete am 02. August über eine neue OpenSource Entwicklung aus dem Hause Qualys, die es dem Nutzer ermöglicht anhand statischer Daten die eingesetzten Versionen von Webapplikationen zu ermitteln.

Der blinde Elefant (Elephantidae Amaurosis) wurde am 28. Juli das erste mal ins SourceForge SVN gestellt und gilt daher noch als sehr junges Produkt. Allerdings kann man sagen, dass es selbst in Revision 1 schon funktionstüchtig ist.
Ist man allerdings versucht dieses Fingerprinting Tool für WebApps mit dem aktuellen Backtrack4 zu verwenden kommen recht schnell herbe Enttäuschungen, weil es “einfach nicht geht”.

Ein aktuell gepatchtes BT4 bringt die Python Version 2.5.2 mit sich. Aktuell wird wohl eher die 2.7.x gehandelt und die Python 3.x steht quasi in den Startlöchern um zu den Distributionen zu kommen. Wer meiner Meinung nach sich mit Backtrack auseinandersetzt sollte zwangsläufig wissen was er tut, was er tat und was er machen kann. Jammernde Worte a la “Warum hat Backtrack noch kein aktuelleres Python?!?” oder “Hey BT, macht doch mal ein dpkg Paket fertig, weil ich mir nicht die Hände mit kompilieren schmutzig machen will” sind hier einfach ein paar Stufen zu weit unten und f@r @way from 31337.

Besorgt man sich nun die Quellen von BlindElephant, ich bevorzuge hier mal die schlichte SVN Methode, erhält man alles notwendige inkl. einer DAU-würdigen Hilfestellung wie man mit dem Elefanten umzugehen hat. Das Entrylevel ist damit schon schön niedrig angesetzt.

Mittels “svn checkout https://blindelephant.svn.sourceforge.net/svnroot/blindelephant” erhält man die entsprechende aktuelle Version der Quellen, die später dank Python nicht weiter beackert werden müssen.
Anschließend wechselt man ins SVN Verzeichniss “blindelephant/trunk/src/blindelephant” wo man nun erfolgreich die “BlindElephant.py” finden sollte.

root@bt:/tmp# cd blindelephant/trunk/src/blindelephant/
root@bt:/tmp/blindelephant/trunk/src/blindelephant# ls -la
total 84
drwxr-xr-x 4 root root  4096 Aug  3 11:21 .
drwxr-xr-x 4 root root  4096 Aug  3 11:21 ..
drwxr-xr-x 6 root root  4096 Aug  3 11:21 .svn
-rw-r--r-- 1 root root  2987 Aug  3 11:21 BlindElephant.py
-rw-r--r-- 1 root root 10120 Aug  3 11:21 Configuration.py
-rw-r--r-- 1 root root 11014 Aug  3 11:21 DifferencesTables.py
-rw-r--r-- 1 root root  1103 Aug  3 11:21 FileMassagers.py
-rw-r--r-- 1 root root 11219 Aug  3 11:21 FingerprintUtils.py
-rw-r--r-- 1 root root 15493 Aug  3 11:21 Fingerprinters.py
-rw-r--r-- 1 root root  1427 Aug  3 11:21 Loggers.py
-rw-r--r-- 1 root root  2813 Aug  3 11:21 Scanner.py
-rw-r--r-- 1 root root     0 Aug  3 11:21 __init__.py
drwxr-xr-x 5 root root  4096 Aug  3 11:21 dbs
root@bt:/tmp/blindelephant/trunk/src/blindelephant#

Ein beherztes “python -V” zeigt die aktuelle Python Version, aktuell also die 2.5.2. Probieren wir nun das Programm zu bemühen uns dienlich zu sein, sieht es zunächst nicht verkehrt aus:

python ./BlindElephant.py
Error: url and appName are required arguments unless using -l, -u, or -h
Usage: BlindElephant.py [options] url appName
Options:
 -h, --help            show this help message and exit
 -p PLUGINNAME, --pluginName=PLUGINNAME
 Fingerprint version of plugin (should apply to web app
 given in appname)
 -s, --skip            Skip fingerprinting webpp, just fingerprint plugin
 -n NUMPROBES, --numProbes=NUMPROBES
 Number of files to fetch (more may increase accuracy).
 Default: 15
 -w, --winnow          If more than one version are returned, use winnowing
 to attempt to narrow it down (up to numProbes
 additional requests).
 -l, --list            List supported webapps and plugins
 
Use "guess" as app or plugin name to attempt to attempt to
discover which supported apps/plugins are installed.

Was aber so nicht bleiben wir, wenn wir es in Aktion versetzen wollen:

python BlindElephant.py http://laws.qualys.com guess
Probing...
Traceback (most recent call last):
 File "BlindElephant.py", line 47, in <module>
 apps = g.guess_apps()
 File "/tmp/blindelephant/trunk/src/blindelephant/Fingerprinters.py", line 214, in guess_apps
 self.error_page_fingerprint = wafu.identify_error_page(self.url)
 File "/tmp/blindelephant/trunk/src/blindelephant/FingerprintUtils.py", line 58, in identify_error_page
 data = urlread_spoof_ua(url)
 File "/tmp/blindelephant/trunk/src/blindelephant/FingerprintUtils.py", line 241, in urlread_spoof_ua
 data = urllib2.urlopen(req, timeout=TIMEOUT).read()
TypeError: urlopen() got an unexpected keyword argument 'timeout'

Eine kurze Suche im Netz könnte den Researcher nun dazu bringen, dass die urlib2.urlopen Funktion von Python: a) eine Built-In Funktion ist und b) in Python 2.5.2 keinen Parameter “timeout” kennt und ihn daher auch nicht akkzeptiert, was hier zu einem Programmabbruch führt.

Nun denn, auf zu neuen Gefilden und installieren wir uns Noob-like die APT Pakete eines Python 3.0 mittels apt-get install python3.0-minimal um es mal mit einem aktuelleren Python zu testen…. NEIN! Don’t do! Not for this!!!
Erstens wollen wir doch keine Noobs sein. Zweitens installiert nicht einfach so Software auf “Gut Glück” und drittens liest man Artikel wie diesen erst zu Ende ;)

Hat man nicht die drei Dinge von gerade beachtet und doch sein sauberes BT mit Python3.0 beglückt ist das Problem nicht all zu groß. Python3.x installiert sich brav neben dem eigentlichen Python und ist anschließend über “python3.0 <pfad_zur_py_datei>” ausführbar.
Würde man es nun erneut probieren ernten wir einen neuen Fehler mit BlindElephant:

python3.0 BlindElephant.py http://laws.qualys.com guess
Traceback (most recent call last):
 File "BlindElephant.py", line 2, in <module>
 import Fingerprinters as wafp
 File "/tmp/blindelephant/trunk/src/blindelephant/Fingerprinters.py", line 73
 print "ver_list before winnowing:"
 ^
SyntaxError: invalid syntax

Sei’s drum – BlindElephant scheint ja noch in den Kinderschuhen zu stecken und “funktioniert halt einfach noch nicht”???
Schelm wer denkt, dass wir es dabei belassen. Wir haben hiermit soeben rausgefunden, dass die README vom BlindElephant nicht lügt und wir ein Python >= 2.6.x brauchen und das es noch nicht mit einem Python 3.x funktioniert.
Besorgen wir uns nun also ein Python, dass den Anforderungen entspricht und machen uns die Hände schmutzig ohne dabei das eigene System zu versaubeuteln.

Ein entsprechendes Python zwischen 2.6 und 3.x findet man unter http://www.python.org/download/. Dieses lässt sich via:

./configure --prefix=/opt/python2.7
make
make install

ins angegebene –prefix Verzeichniss installieren und anschließend auch dort ausführen, ohne die anderen Systemkomponenten zu beeinträchtigen:

root@bt:/tmp/blindelephant/trunk/src/blindelephant# /opt/python2.7/bin/python BlindElephant.py http://laws.qualys.com guess
Probing...
Possible apps:
movabletype

Auch ein blinder Elefant findet mal eine Erdnuss – am o. g. Beispiel ist also eine WebApp namens “movabletype” aktiv, die wir uns nun mit folgendem Aufruf näher angucken wollen um eine Versionsnummer zu finden:

root@bt:/tmp/blindelephant/trunk/src/blindelephant# /opt/python2.7/bin/python BlindElephant.py http://laws.qualys.com movabletype
Loaded /tmp/blindelephant/trunk/src/blindelephant/dbs/movabletype.pkl with 96 versions, 2229 differentiating paths, and 209 version groups.
Starting BlindElephant fingerprint for version of movabletype at http://laws.qualys.com
 
Hit http://laws.qualys.com/mt-static/mt.js
Possible versions based on result: 4.2-en, 4.21-en, 4.21-en, 4.21-en-COM, 4.22-en, 4.22-en, 4.22-en-COM, 4.23-en, 4.23-en, 4.23-en-COM, 4.24-en, 4.24-en, 4.24-en-COM
 
Hit http://laws.qualys.com/mt-static/js/tc/client.js
Possible versions based on result: 4.2-en, 4.21-en, 4.21-en, 4.21-en-COM, 4.22-en, 4.22-en, 4.22-en-COM, 4.23-en, 4.23-en, 4.23-en-COM, 4.24-en, 4.24-en, 4.24-en-COM
 
Hit http://laws.qualys.com/mt-static/css/main.css
Possible versions based on result: 4.2-en, 4.21-en, 4.21-en, 4.21-en-COM, 4.22-en, 4.22-en, 4.22-en-COM, 4.23-en, 4.23-en, 4.23-en-COM
 
Hit http://laws.qualys.com/tools/run-periodic-tasks
File produced no match. Error: Error code: 404 (Not Found)
 
Hit http://laws.qualys.com/mt-static/js/tc/tagcomplete.js
Possible versions based on result: 4.1-en, 4.1-en-CS, 4.2-en, 4.21-en, 4.21-en, 4.21-en-COM, 4.22-en, 4.22-en, 4.22-en-COM, 4.23-en, 4.23-en, 4.23-en-COM, 4.24-en, 4.24-en, 4.24-en-COM
 
Hit http://laws.qualys.com/mt-static/js/edit.js
Possible versions based on result: 4.1-en, 4.1-en-CS, 4.2-en, 4.21-en, 4.21-en, 4.21-en-COM, 4.22-en, 4.22-en, 4.22-en-COM, 4.23-en, 4.23-en, 4.23-en-COM, 4.24-en, 4.24-en, 4.24-en-COM
 
Hit http://laws.qualys.com/mt-static/js/tc/mixer/display.js
Possible versions based on result: 4.2-en, 4.21-en, 4.21-en, 4.21-en-COM, 4.22-en, 4.22-en, 4.22-en-COM, 4.23-en, 4.23-en, 4.23-en-COM, 4.24-en, 4.24-en, 4.24-en-COM
 
Hit http://laws.qualys.com/mt-static/js/archetype_editor.js
Possible versions based on result: 4.22-en, 4.22-en, 4.22-en-COM, 4.23-en, 4.23-en, 4.23-en-COM, 4.24-en, 4.24-en, 4.24-en-COM
 
Hit http://laws.qualys.com/mt-static/js/tc/mixer.js
Possible versions based on result: 4.1-en, 4.1-en-CS, 4.2-en, 4.21-en, 4.21-en, 4.21-en-COM, 4.22-en, 4.22-en, 4.22-en-COM, 4.23-en, 4.23-en, 4.23-en-COM, 4.24-en, 4.24-en, 4.24-en-COM
 
Hit http://laws.qualys.com/mt-static/js/tc/tableselect.js
Possible versions based on result: 4.1-en, 4.1-en-CS, 4.2-en, 4.21-en, 4.21-en, 4.21-en-COM, 4.22-en, 4.22-en, 4.22-en-COM, 4.23-en, 4.23-en, 4.23-en-COM, 4.24-en, 4.24-en, 4.24-en-COM
 
Hit http://laws.qualys.com/mt-static/js/tc/focus.js
Possible versions based on result: 4.1-en, 4.1-en-CS, 4.2-en, 4.21-en, 4.21-en, 4.21-en-COM, 4.22-en, 4.22-en, 4.22-en-COM, 4.23-en, 4.23-en, 4.23-en-COM, 4.24-en, 4.24-en, 4.24-en-COM
 
Hit http://laws.qualys.com/mt-static/js/tc.js
Possible versions based on result: 4.1-en, 4.1-en-CS, 4.2-en, 4.21-en, 4.21-en, 4.21-en-COM, 4.22-en, 4.22-en, 4.22-en-COM, 4.23-en, 4.23-en, 4.23-en-COM, 4.24-en, 4.24-en, 4.24-en-COM
 
Hit http://laws.qualys.com/mt-static/css/simple.css
Possible versions based on result: 4.2-en, 4.21-en, 4.21-en, 4.21-en-COM, 4.22-en, 4.22-en, 4.22-en-COM, 4.23-en, 4.23-en, 4.23-en-COM
 
Hit http://laws.qualys.com/mt-static/mt_ja.js
Possible versions based on result: 4.2-en, 4.22-en, 4.22-en, 4.22-en-COM, 4.23-en, 4.23-en, 4.23-en-COM, 4.23-en-OS, 4.24-en, 4.24-en, 4.24-en-COM
 
Hit http://laws.qualys.com/mt-static/js/tc/gestalt.js
Possible versions based on result: 4.1-en, 4.1-en-CS, 4.2-en, 4.21-en, 4.21-en, 4.21-en-COM, 4.22-en, 4.22-en, 4.22-en-COM, 4.23-en, 4.23-en, 4.23-en-COM, 4.24-en, 4.24-en, 4.24-en-COM
 
 
Fingerprinting resulted in:
4.22-en
4.22-en-COM
4.23-en
4.23-en-COM
 
 
Best Guess: 4.23-en-COM

Best Guess… lasst uns probieren raten durch Wissen zu ersetzen und den Elephanten etwas genauer hinsehen zu lassen. Die Option “-w” schiebt noch ein paar mehr Vergleiche mit in das Fingerprinting und kann, je nach eingesetztern WebApp erfolgsversprechender sein:

root@bt:/tmp/blindelephant/trunk/src/blindelephant# /opt/python2.7/bin/python BlindElephant.py -h
...
  -w, --winnow          If more than one version are returned, use winnowing
                        to attempt to narrow it down (up to numProbes
                        additional requests).
...

Viel Spaß beim Fingerprinten und beim Updaten eurer Webapplikationen.

TwitterTechnorati FavoritesLinkedInBlogger PostDeliciousDiggFacebookShare

No related posts.

Related posts brought to you by Yet Another Related Posts Plugin.

Comments are closed.