challenge message to bytes
This commit is contained in:
		
							parent
							
								
									d30d257f40
								
							
						
					
					
						commit
						a9e17c39f6
					
				| @ -9,9 +9,6 @@ import ( | |||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type Challenge struct { | type Challenge struct { | ||||||
| 	// All bytes of the message |  | ||||||
| 	Bytes []byte |  | ||||||
| 
 |  | ||||||
| 	// sig - 8 bytes | 	// sig - 8 bytes | ||||||
| 	Signature []byte | 	Signature []byte | ||||||
| 	// message type - 4 bytes | 	// message type - 4 bytes | ||||||
| @ -52,7 +49,6 @@ type Challenge struct { | |||||||
| 	Version *VersionStruct | 	Version *VersionStruct | ||||||
| 	// payload - variable | 	// payload - variable | ||||||
| 	Payload       []byte | 	Payload       []byte | ||||||
| 	PayloadOffset int |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func ParseChallengeMessage(body []byte) (*Challenge, error) { | func ParseChallengeMessage(body []byte) (*Challenge, error) { | ||||||
| @ -71,9 +67,7 @@ func ParseChallengeMessage(body []byte) (*Challenge, error) { | |||||||
| 	var err error | 	var err error | ||||||
| 
 | 
 | ||||||
| 	challenge.TargetName, err = ReadStringPayload(12, body) | 	challenge.TargetName, err = ReadStringPayload(12, body) | ||||||
| 	if err != nil { | 	if err != nil { return nil, err } | ||||||
| 		return challenge, err |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	challenge.NegotiateFlags = binary.LittleEndian.Uint32(body[20:24]) | 	challenge.NegotiateFlags = binary.LittleEndian.Uint32(body[20:24]) | ||||||
| 
 | 
 | ||||||
| @ -82,9 +76,7 @@ func ParseChallengeMessage(body []byte) (*Challenge, error) { | |||||||
| 	challenge.Reserved = body[32:40] | 	challenge.Reserved = body[32:40] | ||||||
| 
 | 
 | ||||||
| 	challenge.TargetInfoPayloadStruct, err = ReadBytePayload(40, body) | 	challenge.TargetInfoPayloadStruct, err = ReadBytePayload(40, body) | ||||||
| 	if err != nil { | 	if err != nil { return nil, err } | ||||||
| 		return challenge, err |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	challenge.TargetInfo = ReadAvPairs(challenge.TargetInfoPayloadStruct.Payload) | 	challenge.TargetInfo = ReadAvPairs(challenge.TargetInfoPayloadStruct.Payload) | ||||||
| 
 | 
 | ||||||
| @ -92,18 +84,48 @@ func ParseChallengeMessage(body []byte) (*Challenge, error) { | |||||||
| 
 | 
 | ||||||
| 	if NTLMSSP_NEGOTIATE_VERSION.IsSet(challenge.NegotiateFlags) { | 	if NTLMSSP_NEGOTIATE_VERSION.IsSet(challenge.NegotiateFlags) { | ||||||
| 		challenge.Version, err = ReadVersionStruct(body[offset : offset+8]) | 		challenge.Version, err = ReadVersionStruct(body[offset : offset+8]) | ||||||
| 		if err != nil { | 	  if err != nil { return nil, err } | ||||||
| 			return challenge, err |  | ||||||
| 		} |  | ||||||
| 		offset = offset + 8 | 		offset = offset + 8 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	challenge.Payload = body[offset:] | 	challenge.Payload = body[offset:] | ||||||
| 	challenge.PayloadOffset = offset |  | ||||||
| 
 | 
 | ||||||
| 	return challenge, nil | 	return challenge, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (c *Challenge) Bytes() []byte { | ||||||
|  | 	payloadLen := int(c.TargetName.Len + c.TargetInfoPayloadStruct.Len) | ||||||
|  | 	messageLen := 8 + 4 + 12 + 4 + 8 + 8 + 12 + 8 | ||||||
|  | 	payloadOffset := uint32(messageLen) | ||||||
|  | 
 | ||||||
|  | 	messageBytes := make([]byte, 0, messageLen+payloadLen) | ||||||
|  | 	buffer := bytes.NewBuffer(messageBytes) | ||||||
|  | 
 | ||||||
|  | 	buffer.Write(c.Signature) | ||||||
|  | 	binary.Write(buffer, binary.LittleEndian, c.MessageType) | ||||||
|  |    | ||||||
|  | 	c.TargetName.Offset = payloadOffset | ||||||
|  | 	payloadOffset += uint32(c.TargetName.Len) | ||||||
|  | 	buffer.Write(c.TargetName.Bytes()) | ||||||
|  | 
 | ||||||
|  | 	binary.Write(buffer, binary.LittleEndian, c.NegotiateFlags) | ||||||
|  | 	buffer.Write(c.ServerChallenge) | ||||||
|  |   buffer.Write(make([]byte, 8)) | ||||||
|  | 
 | ||||||
|  |   c.TargetInfoPayloadStruct.Offset = payloadOffset | ||||||
|  |   payloadOffset += uint32(c.TargetInfoPayloadStruct.Len) | ||||||
|  |   buffer.Write(c.TargetInfoPayloadStruct.Bytes()) | ||||||
|  |   if(c.Version != nil) { | ||||||
|  |     buffer.Write(c.Version.Bytes()) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | 	// Write out the payloads | ||||||
|  | 	buffer.Write(c.TargetName.Payload) | ||||||
|  | 	buffer.Write(c.TargetInfoPayloadStruct.Payload) | ||||||
|  | 
 | ||||||
|  | 	return buffer.Bytes() | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (c *Challenge) getLowestPayloadOffset() int { | func (c *Challenge) getLowestPayloadOffset() int { | ||||||
| 	payloadStructs := [...]*PayloadStruct{c.TargetName, c.TargetInfoPayloadStruct} | 	payloadStructs := [...]*PayloadStruct{c.TargetName, c.TargetInfoPayloadStruct} | ||||||
| 
 | 
 | ||||||
| @ -123,7 +145,7 @@ func (c *Challenge) String() string { | |||||||
| 	var buffer bytes.Buffer | 	var buffer bytes.Buffer | ||||||
| 
 | 
 | ||||||
| 	buffer.WriteString("Challenge NTLM Message") | 	buffer.WriteString("Challenge NTLM Message") | ||||||
| 	buffer.WriteString(fmt.Sprintf("\nPayload Offset: %d Lowest: %d Length: %d", c.PayloadOffset, c.getLowestPayloadOffset(), len(c.Payload))) | 	buffer.WriteString(fmt.Sprintf("\nPayload Offset: %d Length: %d", c.getLowestPayloadOffset(), len(c.Payload))) | ||||||
| 	buffer.WriteString(fmt.Sprintf("\nTargetName: %s", c.TargetName.String())) | 	buffer.WriteString(fmt.Sprintf("\nTargetName: %s", c.TargetName.String())) | ||||||
| 	buffer.WriteString(fmt.Sprintf("\nServerChallenge: %s", hex.EncodeToString(c.ServerChallenge))) | 	buffer.WriteString(fmt.Sprintf("\nServerChallenge: %s", hex.EncodeToString(c.ServerChallenge))) | ||||||
| 	if c.Version != nil { | 	if c.Version != nil { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user