• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Erfahrungsbericht] Joomla Adminbereich wird angegriffen

framp

Moderator
Teammitglied
Seit letzter Nacht stelle ich einen erhöhten Zugriff auf meine Webseite vermittels libwww fest - speziell auf den Logonbereich als Admin. Durch einen dummen Fehler meinerseits :eek:ps: war dieser nicht mehr zusätzlich durch eine exotische Userid sowie ein sicheres Passwort geschützt. D.h. es hat sich offensichtlich in windeseile im Netz rumgesprochen, dass mein Adminbereich für BruteForce Passwordangriffe offen ist. Dummerweise wähle ich immer sichere PWDs und niemand ist reingekommen :D .

Es zeigt sich also dass es immer wichtig ist die Besuche auf der Webseite zu beobachten und auf Auffälligkeiten zu untersuchen als auch immer sichere Passwörter zu benutzen.
 
Kannst Du mal ein paar Zahlen nennen, damit man einen Eindruck vom Umfang der Angriffsversuche bekommt? Nur mal interessehalber...
 

harley

Hacker
Da ich nebenbei auch mitschreiben lasse, hier beispielhaft ein paar Zahlen von einer meiner kleinen Seiten:

Seit 2007 insgesamt 3698 Versuche. (Die Zahl ist etwas ungenau, da ich ab und zu auch mal aussortiert habe. Auch sind gerade in den ersten Jahren auch Fehlversuche von Suchmaschinen aufgezeichnet.)
2007: 964 (viele dieser Zahlen beruhen nicht auf Angriffen.)
2008: 293
2009: 1093
2010: 1348

Im letzten halben Jahr verzeichne ich einen verstärkten Versuch über Skripte und Standardpfade von bekannten CMS etc. auf Hintertüren zuzugreifen. Die größten und hartnäckigsten Versuche kamen Ende Oktober (jeweils bis ca. 100 verschiedene Pfade). Wer Interesse an weiteren Daten (Pfade etc.) hat, kann sich ja melden.

Micha :-D
 
OP
framp

framp

Moderator
Teammitglied
Vom 22 bis 24.12.2010 gezählt nach TopLevelDomain
Code:
select count(*) from jos_jstats_ipaddresses as ip,jos_jstats_visits as vi where ip.id = vi.ip_id and vi.year = 2010 and vi.month=12 and vi.day in (22,23,24) and ip.browser like '%libwww%' group by tld
Code:
au	2
br	2
nl	3
pk	5
pl	3
tr	1
tv	10
tw	4
us	43
Über die gesamte Zeit. Deutlich der Anstieg im Dezember dieses Jahres
Code:
select vi.month,vi.year,count(*) from jos_jstats_ipaddresses as ip,jos_jstats_visits as vi where ip.id = vi.ip_id and ip.browser like '%libwww%' group by month,year order by year,month
Code:
month 	year 	count(*)
1 	2010 	10
2 	2010 	8
3 	2010 	8
4 	2010 	11
5 	2010 	11
6 	2010 	43
7 	2010 	37
8 	2010 	35
9 	2010 	37
10 	2010 	12
11 	2010 	8
12 	2010 	272
Der Dezember pro Tag: Deutlich zu sehen, dass nach dem 24 keine Zugriffe mehr da sind, da jetzt libwww Zugriffe gänzlich ausgesperrt sind.
Code:
select vi.day,vi.month,vi.year,count(*) from jos_jstats_ipaddresses as ip,jos_jstats_visits as vi where ip.id = vi.ip_id and vi.year = 2010 and vi.month=12 and ip.browser like '%libwww%' group by day,month,year order by year,month,day
Code:
day 	month 	year 	count(*)
1 	12 	2010 	1
7 	12 	2010 	2
9 	12 	2010 	2
12 	12 	2010 	2
14 	12 	2010 	11
15 	12 	2010 	5
16 	12 	2010 	1
18 	12 	2010 	43
19 	12 	2010 	76
20 	12 	2010 	30
21 	12 	2010 	26
22 	12 	2010 	20
23 	12 	2010 	41
24 	12 	2010 	12
 
OP
framp

framp

Moderator
Teammitglied
Habe die Statistiken oben noch durch weitere QueryResults erweitert. Früher hatte ich libwww nur auf die AdminSeiten rejected, deshalb zeigen sich schon vorher immer wieder libwww Zugriffe. Wann genau der zusätzliche PWD Schutz des Adminbereichs rausfiel weiss ich nicht.Sieht aber so aus als wäre das irgendwann Anfang Dez gewesen. Nach dem 24ten ist Schluss, da ich libwww Zugriffe jetzt auf sämtlichen Seiten mit 401 (Access denied) rejecte.
Code:
RewriteCond %{HTTP_USER_AGENT} libwww-perl.*
RewriteRule .* – [F,L]
 
Vielen Dank, framp! Mir ging es tatsächlich nur um den quantitativen Parameter.

Finde ich schon ziemlich interessant, so eine Aufstellung - derlei sollten sich Einsteiger mal ganz genau ansehen, damit sie erkennen, wie wichtig eine (nach besten Wissen und Können) lückenlose Absicherung ist.
 
OP
framp

framp

Moderator
Teammitglied
gropiuskalle schrieb:
...Finde ich schon ziemlich interessant, so eine Aufstellung - derlei sollten sich Einsteiger mal ganz genau ansehen, damit sie erkennen, wie wichtig eine (nach besten Wissen und Können) lückenlose Absicherung ist.
Aus diesem Grunde habe ich die sql Queries mit hinterlegt ;) . So kann jeder, sofern er joomlaStats benutzt, schnell mal solche Reports ziehen und nachsehen was so läuft in seinem Joomla. Ist allerdings zur regelmäßigen Kontrolle zu aufwendig. Mir ist es nur dadurch aufgefallen, dass plötzlich ein signifikanter Anstieg der Zugriffszahlen pro Tag stattfand. Im Nachhinein läßt sich mit den Queries sehr gut sehen, dass es am 18ten angefangen hat. Da war der Anstieg aber noch nicht so extrem, dass ich stutzig wurde.
 
OP
framp

framp

Moderator
Teammitglied
tomte schrieb:
Und was machst du dagegen?
3 Dinge:
1) Der AdminBereich wird per .htaccess mit einer exotischen Userid sowie sicherem Passwort geschützt. Also muss man sich 2 Mal authentifizieren um in den Adminbereich zu kommen
2) In .htaccess die o.g. Rukes aufgenommen. Damit werden jegliche libwww Requests rejected
3) Regelmäßig die WebseitenZugriffszahlen auf Ausreisser begutachten
 
OP
framp

framp

Moderator
Teammitglied
tomte schrieb:
Und was machst du dagegen?
Bislang habe ich immer mal wieder online in Joomla nachgesehen. Deine Frage hat mich dazu gebracht ein kleines Python Script zu schreiben welches das erledigt wenn es lokal ausgeführt wird. Das erspart mir den manuellen Logon ins Joomla und die Navigation darin. Ist nur ein kurzer CodeSnippet der improved werden kann - aber sicherlich auch für andere Joomlabetreiber hilfreich. Die LogonParameter sind noch entsprechend anzupassen.
Code:
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Query and check if libwww accesses were detected on a joomla based website.
# Requirement: joomlaStats installed
#
# 12/27/2010 framp at linux-tips-and-tricks dot de
#

import MySQLdb
import sys

LIMIT=0
alert=False
maximum=0

try:
    conn = MySQLdb.connect (host = "host",user = "user",passwd = "password",db = "database")
    cursor = conn.cursor ()
    cursor.execute ("""SELECT year, month,day, count(*) as Count 
                    FROM jos_jstats_ipaddresses AS a
                    LEFT JOIN jos_jstats_visits AS c ON a.id = c.ip_id
                    where a.useragent like '%libwww%'
                    group by year,month,day
                    order by year desc,month desc, day desc                  
                    limit 0,30""")
    row = cursor.fetchall()    
    conn.close ()
    
    for r in row:
        (year,month,day,count) = r
        print "%2d.%2d.%4d - %d" % (day,month,year,count)
        if count > LIMIT:
            alert=True
            if count > maximum:
                maximum=count    
    
except MySQLdb.Error, e:
    print "Error %d: %s" % (e.args[0], e.args[1])    
    sys.exit (1)
    
if alert:
    exceed=maximum-LIMIT
    print "!!! libwww threshold of %d exceeded by %d!!!" % (LIMIT,exceed)
 
Oben