msg_basic_setup1.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. package smb
  2. import (
  3. "encoding/asn1"
  4. "encoding/binary"
  5. "errors"
  6. "fmt"
  7. "log"
  8. "math/rand"
  9. "time"
  10. "imuslab.com/smb/driver/mod/gss"
  11. "imuslab.com/smb/driver/mod/ntlmssp"
  12. "imuslab.com/smb/driver/mod/smb/encoder"
  13. )
  14. type SessionSetup1Request struct {
  15. Header
  16. StructureSize uint16
  17. Flags byte
  18. SecurityMode byte
  19. Capabilities uint32
  20. Channel uint32
  21. SecurityBufferOffset uint16 `smb:"offset:SecurityBlob"`
  22. SecurityBufferLength uint16 `smb:"len:SecurityBlob"`
  23. PreviousSessionID uint64
  24. SecurityBlob *gss.NegTokenInit
  25. }
  26. type SessionSetup1Response struct {
  27. Header
  28. StructureSize uint16
  29. Flags uint16
  30. SecurityBufferOffset uint16 `smb:"offset:SecurityBlob"`
  31. SecurityBufferLength uint16 `smb:"len:SecurityBlob"`
  32. SecurityBlob *gss.NegTokenResp
  33. }
  34. func (r *SessionSetup1Request) challengeData() ntlmssp.Challenge {
  35. ServerChallenge := rand.Uint64()
  36. challenge := ntlmssp.NewChallenge(ServerChallenge)
  37. challenge.TargetName = encoder.ToUnicode("testGoGo")
  38. if true {
  39. type AvPair struct {
  40. AvID uint16
  41. AvLen uint16 `smb:"len:Value"`
  42. Value []byte
  43. }
  44. // var infos []ntlmssp.AvPair
  45. var infos ntlmssp.AvPairSlice
  46. ft := uint64(time.Now().UnixNano()) / 100
  47. timestamp := make([]byte, 8)
  48. binary.LittleEndian.PutUint64(timestamp, ft)
  49. infos = append(infos, ntlmssp.AvPair{
  50. AvID: ntlmssp.MsvAvTimestamp,
  51. AvLen: 8,
  52. Value: timestamp,
  53. })
  54. infos = append(infos, ntlmssp.AvPair{
  55. AvID: ntlmssp.MsvAvEOL,
  56. AvLen: 8,
  57. Value: timestamp,
  58. })
  59. challenge.TargetInfo = &infos
  60. }
  61. return challenge
  62. }
  63. func (data *SessionSetup1Request) ServerAction(ctx *DataCtx) (interface{}, error) {
  64. resp1 := SessionSetup1Response{
  65. SecurityBlob: &gss.NegTokenResp{},
  66. }
  67. resp1.Header = data.Header
  68. resp1.Header.Credits = 33
  69. resp1.Header.Status = StatusLogonFailure
  70. resp1.Header.SessionID = ctx.session.sessionID
  71. resp1.StructureSize = 9
  72. resp1.SecurityBufferOffset = 0x48
  73. resp1.Header.Flags = SMB2_FLAGS_RESPONSE
  74. log.Println("G1")
  75. var ntlmsspneg ntlmssp.Negotiate
  76. if err := encoder.Unmarshal(data.SecurityBlob.Data.MechToken, &ntlmsspneg); err != nil {
  77. return ERR(data.Header, STATUS_INVALID_PARAMETER)
  78. }
  79. // logx.Printf("domain name: %v", ntlmsspneg.DomainName)
  80. // logx.Printf("domain name: %v", ntlmsspneg.Workstation)
  81. log.Println("G2")
  82. if false {
  83. negotiateFlagmltmsspmsNEGOTIATELMKEY := 1 << 7
  84. fmt.Println(ntlmsspneg.NegotiateFlags)
  85. if int(ntlmsspneg.NegotiateFlags)&negotiateFlagmltmsspmsNEGOTIATELMKEY == negotiateFlagmltmsspmsNEGOTIATELMKEY {
  86. log.Println("GOT ERROR ")
  87. return &resp1, nil
  88. // return errors.New("Only NTLM v2 is supported, but server requested v1 (mltmsspms_NEGOTIATE_LM_KEY)")
  89. }
  90. }
  91. log.Println("G3")
  92. // ServerChallenge := rand.Uint64()
  93. // ctx.session.ServerChallenge = ServerChallenge
  94. // challenge := ntlmssp.NewChallenge(ServerChallenge)
  95. // challenge.TargetName = encoder.ToUnicode("testGoGo")
  96. challenge := data.challengeData()
  97. if true {
  98. type AvPair struct {
  99. AvID uint16
  100. AvLen uint16 `smb:"len:Value"`
  101. Value []byte
  102. }
  103. // var infos []ntlmssp.AvPair
  104. var infos ntlmssp.AvPairSlice
  105. ft := uint64(time.Now().UnixNano()) / 100
  106. timestamp := make([]byte, 8)
  107. binary.LittleEndian.PutUint64(timestamp, ft)
  108. infos = append(infos, ntlmssp.AvPair{
  109. AvID: ntlmssp.MsvAvTimestamp,
  110. AvLen: 8,
  111. Value: timestamp,
  112. })
  113. infos = append(infos, ntlmssp.AvPair{
  114. AvID: ntlmssp.MsvAvEOL,
  115. AvLen: 0,
  116. })
  117. challenge.TargetInfo = &infos
  118. }
  119. ctx.session.ServerChallenge = challenge.ServerChallenge
  120. challengeData, err := encoder.Marshal(&challenge)
  121. if err != nil {
  122. return ERR(data.Header, STATUS_INVALID_PARAMETER)
  123. }
  124. resp1.SecurityBlob = &gss.NegTokenResp{
  125. NegResult: asn1.Enumerated(gss.Accept_incomplete),
  126. ResponseToken: challengeData,
  127. SupportedMech: myMech(),
  128. }
  129. resp1.Header.Status = StatusMoreProcessingRequired
  130. return &resp1, nil
  131. }
  132. func (requestSetUp1 *SessionSetup1Request) ClientAction(s *SessionC, setupResponse1 *SessionSetup1Response) error {
  133. if setupResponse1.Header.Status != StatusMoreProcessingRequired {
  134. // https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb/115b551a-dcd7-4ff2-8c59-a334b92e01c0
  135. status, _ := StatusMap[setupResponse1.Header.Status]
  136. return errors.New(fmt.Sprintf("NT Status Error: %s\n", status))
  137. }
  138. s.sessionID = setupResponse1.Header.SessionID
  139. challenge := ntlmssp.NewChallenge(0)
  140. resp := setupResponse1.SecurityBlob
  141. if err := encoder.Unmarshal(resp.ResponseToken, &challenge); err != nil {
  142. s.Debug("", err)
  143. return err
  144. }
  145. s.Challenge = challenge
  146. return nil
  147. }
  148. func (s *SessionC) NewSessionSetup1Request(mechType gss.MechTypeOid) SessionSetup1Request {
  149. log.Println("HEREGGGG")
  150. header := s.newHeader(CommandSessionSetup)
  151. log.Println("HERE?")
  152. ntlmsspneg := ntlmssp.NewNegotiate(s.options.Domain, s.options.Workstation)
  153. data, err := encoder.Marshal(ntlmsspneg)
  154. if err != nil {
  155. panic(-1)
  156. }
  157. negInit, _ := gss.NewNegTokenInit(mechType)
  158. negInit.Data.MechToken = data
  159. switch mechType {
  160. case gss.NtLmSSPMechTypeOid:
  161. }
  162. return SessionSetup1Request{
  163. Header: header,
  164. StructureSize: 25,
  165. Flags: 0x00,
  166. SecurityMode: byte(SecurityModeSigningEnabled),
  167. SecurityBufferOffset: 88,
  168. SecurityBlob: negInit,
  169. Capabilities: 0,
  170. Channel: 0,
  171. SecurityBufferLength: 0,
  172. PreviousSessionID: 0,
  173. }
  174. }