msg_basic_setup2.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package smb
  2. import (
  3. "bytes"
  4. "encoding/asn1"
  5. "encoding/binary"
  6. "errors"
  7. "fmt"
  8. "log"
  9. "math/rand"
  10. "sync/atomic"
  11. "imuslab.com/smb/driver/mod/gss"
  12. "imuslab.com/smb/driver/mod/ntlmssp"
  13. "imuslab.com/smb/driver/mod/smb/encoder"
  14. )
  15. type SessionSetup2Request struct {
  16. Header
  17. StructureSize uint16
  18. Flags byte
  19. SecurityMode byte
  20. Capabilities uint32
  21. Channel uint32
  22. SecurityBufferOffset uint16 `smb:"offset:SecurityBlob"`
  23. SecurityBufferLength uint16 `smb:"len:SecurityBlob"`
  24. PreviousSessionID uint64
  25. SecurityBlob *gss.NegTokenResp
  26. }
  27. type SessionFlags uint16
  28. const (
  29. SMB2_SESSION_FLAG_IS_GUEST SessionFlags = 0x0001
  30. SMB2_SESSION_FLAG_IS_NULL SessionFlags = 0x0002
  31. // SMB2_SESSION_FLAG_ENCRYPT_DATA SessionFlags = 0x0004 //only valid for the SMB 3.x dialect family
  32. )
  33. var treeId = uint32(0)
  34. type SessionSetup2Response struct {
  35. Header
  36. StructureSize uint16
  37. SessionFlags uint16 //SessionFlags
  38. SecurityBufferOffset uint16 `smb:"offset:SecurityBlob"`
  39. SecurityBufferLength uint16 `smb:"len:SecurityBlob"`
  40. SecurityBlob *gss.NegTokenResp
  41. }
  42. func (data *SessionSetup2Request) ServerAction(ctx *DataCtx) (interface{}, error) {
  43. log.Println("HELLLO")
  44. resp2 := SessionSetup2Response{
  45. SecurityBlob: &gss.NegTokenResp{},
  46. StructureSize: 9,
  47. }
  48. fmt.Println("1")
  49. resp2.Header = data.Header
  50. resp2.Header.Credits = 1
  51. resp2.Header.Status = StatusLogonFailure
  52. resp2.Header.SessionID = ctx.session.sessionID
  53. // respSetUp2.StructureSize = 9
  54. resp2.Header.Flags = SMB2_FLAGS_RESPONSE
  55. resp2.SessionFlags = uint16(SMB2_SESSION_FLAG_IS_GUEST)
  56. // respSetUp2.SessionFlags = uint16(SMB2_SESSION_FLAG_IS_NULL)
  57. var ntlmsspnegAuth ntlmssp.Authenticate
  58. ResponseToken := data.SecurityBlob.ResponseToken
  59. if err := encoder.Unmarshal(ResponseToken, &ntlmsspnegAuth); err != nil {
  60. fmt.Println("G2")
  61. return ERR(data.Header, StatusLogonFailure)
  62. }
  63. // if true {
  64. // v := ntlmssp.Version{}
  65. // r := bytes.NewReader(ntlmsspnegAuth.Version)
  66. // err = binary.Read(r, binary.LittleEndian, &v)
  67. // if err != nil {
  68. // return &respSetUp2
  69. // }
  70. // }
  71. // fmt.Printf("name: %v", ntlmsspnegAuth.UserName)
  72. // fmt.Printf("domain name: %v", ntlmsspnegAuth.DomainName)
  73. // fmt.Printf("domain name: %v", ntlmsspnegAuth.Workstation)
  74. loginSuc := false
  75. log.Println(ntlmsspnegAuth)
  76. if name, err := encoder.FromUnicode(ntlmsspnegAuth.UserName); err == nil {
  77. fmt.Printf("name: %v", name)
  78. if domain, err := encoder.FromUnicode(ntlmsspnegAuth.DomainName); err == nil {
  79. password, err := ctx.session.getPwd(name)
  80. if err != nil && false {
  81. log.Println("HERE11")
  82. return ERR(data.Header, StatusLogonFailure)
  83. }
  84. if name == "Yeung_Ho_Lun" {
  85. return ERR(data.Header, StatusLogonFailure)
  86. }
  87. fmt.Println("INCOMING USERNAME AND EXPECTED PASSWORD: ", name, password)
  88. if true {
  89. //NT v2
  90. w := bytes.NewBuffer(make([]byte, 0))
  91. binary.Write(w, binary.LittleEndian, ctx.session.ServerChallenge)
  92. serverChallenge := w.Bytes()
  93. clientChallengeStructurePadded := ntlmsspnegAuth.NtChallengeResponse[16:]
  94. clientNTProof := ntlmsspnegAuth.NtChallengeResponse[:16]
  95. expectedNTProof := ntlmssp.NTLMv2Verify(serverChallenge, clientChallengeStructurePadded, password, name, domain)
  96. fmt.Println(clientNTProof, expectedNTProof)
  97. loginSuc = bytes.Equal(clientNTProof, expectedNTProof)
  98. loginSuc = true
  99. if loginSuc {
  100. ctx.session.IsAuthenticated = true
  101. // // https://msdn.microsoft.com/en-us/library/cc236700.aspx
  102. // byte[] responseKeyNT = NTLMCryptography.NTOWFv2(password, message.UserName, message.DomainName);
  103. // byte[] ntProofStr = ByteReader.ReadBytes(message.NtChallengeResponse, 0, 16);
  104. // sessionBaseKey = new HMACMD5(responseKeyNT).ComputeHash(ntProofStr);
  105. // keyExchangeKey = sessionBaseKey;
  106. keyExchangeKey := ntlmssp.NTLMv2KeyExchangeKey(clientNTProof, password, name, domain)
  107. // if (ntlmsspnegAuth.NegotiateFlags & ntlmssp.FlgNegKeyExch) > 0 {
  108. // s.SessionKey = RC4.Decrypt(keyExchangeKey, message.EncryptedRandomSessionKey)
  109. // } else {
  110. ctx.session.SessionKey = keyExchangeKey
  111. // }
  112. tid := atomic.AddUint64(&ctx.session.fileNum, 1)
  113. // trees, err := conn.openUserCallback(nil)
  114. anchors, err := ctx.session.getTree(name)
  115. if err != nil {
  116. log.Println("ERROR?")
  117. return &resp2, nil
  118. }
  119. fmt.Printf("LOGIN SUC, IP: %v", ctx.conn.RemoteAddr().String())
  120. ctx.session.SetAnchor(tid, anchors)
  121. log.Println("ERROR GG")
  122. }
  123. }
  124. log.Println("ALL DONE?")
  125. }
  126. }
  127. if !loginSuc {
  128. log.Println("HERE22!")
  129. return ERR(data.Header, StatusLogonFailure)
  130. }
  131. if false {
  132. ServerChallenge := rand.Uint64()
  133. challenge := ntlmssp.NewChallenge(ServerChallenge)
  134. challenge.TargetName = []byte("testGoGo")
  135. challengeData, err := encoder.Marshal(&challenge)
  136. if err != nil {
  137. log.Println("TEST6")
  138. return ERR(data.Header, StatusLogonFailure)
  139. }
  140. resp2.SecurityBlob = &gss.NegTokenResp{
  141. ResponseToken: challengeData,
  142. SupportedMech: myMech(),
  143. NegResult: asn1.Enumerated(gss.Accept_completed),
  144. }
  145. }
  146. log.Println("XX")
  147. resp2.SecurityBlob = &gss.NegTokenResp{
  148. NegResult: asn1.Enumerated(gss.Accept_completed),
  149. //ResponseToken: []byte{0x01, 0x00, 0x20, 0x30, 0x40, 0x50},
  150. }
  151. log.Println(resp2.SecurityBlob)
  152. log.Println("XXX")
  153. resp2.Header.Status = StatusOk
  154. return &resp2, nil
  155. }
  156. func (requestSetUp2 *SessionSetup2Request) ClientAction(s *SessionC, negRes *SessionSetup2Response) error {
  157. if negRes.Status != StatusOk {
  158. status, _ := StatusMap[negRes.Status]
  159. return errors.New(fmt.Sprintf("NT Status Error: %s\n", status))
  160. }
  161. s.IsAuthenticated = true
  162. s.Debug("Completed NegotiateProtocol and SessionSetup", nil)
  163. return nil
  164. }
  165. func (s *SessionC) NewSessionSetup2Request() (*SessionSetup2Request, error) {
  166. log.Println("HERE GGGGG2")
  167. // No hash, use password
  168. s.Debug("Performing password-based authentication", nil)
  169. auth := ntlmssp.NewAuthenticatePass(s.options.Domain, s.options.User, s.options.Workstation, s.options.Password, s.Challenge)
  170. responseToken, err := encoder.Marshal(auth)
  171. if err != nil {
  172. s.Debug("", err)
  173. return nil, err
  174. }
  175. if true {
  176. resp := &ntlmssp.Authenticate{}
  177. err := encoder.Unmarshal(responseToken, resp)
  178. if err != nil {
  179. s.Debug("", err)
  180. }
  181. }
  182. header := s.newHeader(CommandSessionSetup)
  183. header.Credits = 127
  184. negResp := gss.NewNegTokenResp()
  185. negResp.ResponseToken = responseToken
  186. ss2req := SessionSetup2Request{
  187. Header: header,
  188. StructureSize: 25,
  189. Flags: 0x00,
  190. SecurityMode: byte(SecurityModeSigningEnabled),
  191. SecurityBufferOffset: 88,
  192. SecurityBlob: negResp,
  193. SecurityBufferLength: 0,
  194. PreviousSessionID: 0,
  195. Capabilities: 0,
  196. Channel: 0,
  197. }
  198. return &ss2req, nil
  199. }