1
1
# -*- coding: binary -*-
2
2
require 'msf/core'
3
3
require 'msf/core/exploit/mssql_commands'
4
- require 'rex/proto/ntlm/crypt'
5
- require 'rex/proto/ntlm/constants'
6
- require 'rex/proto/ntlm/utils'
7
- require 'rex/proto/ntlm/exceptions'
8
4
9
5
10
6
module Msf
@@ -21,14 +17,6 @@ module Exploit::Remote::MSSQL
21
17
include Exploit ::Remote ::Tcp
22
18
include Exploit ::Remote ::NTLM ::Client
23
19
24
- #
25
- # Constants
26
- #
27
- NTLM_CRYPT = Rex ::Proto ::NTLM ::Crypt
28
- NTLM_CONST = Rex ::Proto ::NTLM ::Constants
29
- NTLM_UTILS = Rex ::Proto ::NTLM ::Utils
30
- NTLM_XCEPT = Rex ::Proto ::NTLM ::Exceptions
31
-
32
20
# Encryption
33
21
ENCRYPT_OFF = 0x00 #Encryption is available but off.
34
22
ENCRYPT_ON = 0x01 #Encryption is available and on.
@@ -394,10 +382,7 @@ def mssql_login(user='sa', pass='', db='')
394
382
return false
395
383
end
396
384
397
- $stderr. puts 'login'
398
-
399
385
if datastore [ 'USE_WINDOWS_AUTHENT' ]
400
- $stderr. puts 'windows auth'
401
386
402
387
idx = 0
403
388
pkt = ''
@@ -436,12 +421,15 @@ def mssql_login(user='sa', pass='', db='')
436
421
domain_name = datastore [ 'DOMAIN' ]
437
422
438
423
ntlm_client = ::Net ::NTLM ::Client . new (
439
- opts [ 'username' ] ,
440
- opts [ 'password' ] ,
424
+ user ,
425
+ pass ,
441
426
workstation : workstation_name ,
442
427
domain : domain_name ,
443
428
)
444
- ntlmsspblob = ntlm_client . init_context
429
+ type1 = ntlm_client . init_context
430
+ # SQL 2012, at least, does not support KEY_EXCHANGE
431
+ type1 . flag &= ~ ::Net ::NTLM ::FLAGS [ :KEY_EXCHANGE ]
432
+ ntlmsspblob = type1 . serialize
445
433
446
434
idx = pkt . size + 50 # lengths below
447
435
@@ -492,56 +480,36 @@ def mssql_login(user='sa', pass='', db='')
492
480
# has a strange behavior that differs from the specifications
493
481
# upon receiving the ntlm_negociate request it send an ntlm_challenge but the status flag of the tds packet header
494
482
# is set to STATUS_NORMAL and not STATUS_END_OF_MESSAGE, then internally it waits for the ntlm_authentification
495
- resp = mssql_send_recv ( pkt , 15 , false )
483
+ resp = mssql_send_recv ( pkt , 15 , false )
496
484
497
- # Get default data
498
- begin
499
- blob_data = NTLM_UTILS . parse_ntlm_type_2_blob ( resp )
500
- # a domain.length < 3 will hit this
501
- rescue NTLM_XCEPT ::NTLMMissingChallenge
485
+ unless resp . include? ( "NTLMSSP" )
502
486
info = { :errors => [ ] }
503
487
mssql_parse_reply ( resp , info )
504
488
mssql_print_reply ( info )
505
489
return false
506
490
end
507
- challenge_key = blob_data [ :challenge_key ]
508
- _server_ntlmssp_flags = blob_data [ :server_ntlmssp_flags ] #else should raise an error
509
- #netbios name
510
- default_name = blob_data [ :default_name ] || ''
511
- #netbios domain
512
- default_domain = blob_data [ :default_domain ] || ''
513
- #dns name
514
- dns_host_name = blob_data [ :dns_host_name ] || ''
515
- #dns domain
516
- dns_domain_name = blob_data [ :dns_domain_name ] || ''
517
- #Client time
518
- chall_MsvAvTimestamp = blob_data [ :chall_MsvAvTimestamp ] || ''
519
-
520
- spnopt = { :use_spn => datastore [ 'NTLM::SendSPN' ] , :name => self . rhost }
521
-
522
- resp_lm , resp_ntlm , _client_challenge , _ntlm_cli_challenge = NTLM_UTILS . create_lm_ntlm_responses ( user , pass , challenge_key ,
523
- domain_name , default_name , default_domain ,
524
- dns_host_name , dns_domain_name , chall_MsvAvTimestamp ,
525
- spnopt , ntlm_options )
526
-
527
- ntlmssp = NTLM_UTILS . make_ntlmssp_blob_auth ( domain_name , workstation_name , user , resp_lm , resp_ntlm , '' , ntlmssp_flags )
491
+
492
+ # Get default data
493
+ resp = resp [ 3 ..-1 ]
494
+ type3 = ntlm_client . init_context ( [ resp ] . pack ( 'm' ) )
495
+ type3_blob = type3 . serialize
528
496
529
497
# Create an SSPIMessage
530
498
idx = 0
531
499
pkt = ''
532
500
pkt_hdr = ''
533
- pkt_hdr = [
534
- TYPE_SSPI_MESSAGE , #type
535
- STATUS_END_OF_MESSAGE , #status
536
- 0x0000 , #length
537
- 0x0000 , # SPID
538
- 0x01 , # PacketID
539
- 0x00 #Window
540
- ]
501
+ pkt_hdr = [
502
+ TYPE_SSPI_MESSAGE , #type
503
+ STATUS_END_OF_MESSAGE , #status
504
+ 0x0000 , #length
505
+ 0x0000 , # SPID
506
+ 0x01 , # PacketID
507
+ 0x00 #Window
508
+ ]
541
509
542
- pkt_hdr [ 2 ] = ntlmssp . length + 8
510
+ pkt_hdr [ 2 ] = type3_blob . length + 8
543
511
544
- pkt = pkt_hdr . pack ( "CCnnCC" ) + ntlmssp
512
+ pkt = pkt_hdr . pack ( "CCnnCC" ) + type3_blob
545
513
546
514
resp = mssql_send_recv ( pkt )
547
515
@@ -984,7 +952,7 @@ def mssql_parse_info(data, info)
984
952
#
985
953
def mssql_parse_login_ack ( data , info )
986
954
len = data . slice! ( 0 , 2 ) . unpack ( 'v' ) [ 0 ]
987
- buff = data . slice! ( 0 , len )
955
+ _buff = data . slice! ( 0 , len )
988
956
info [ :login_ack ] = true
989
957
end
990
958
end
0 commit comments