challenge message to bytes
This commit is contained in:
parent
d30d257f40
commit
a9e17c39f6
@ -9,9 +9,6 @@ import (
|
||||
)
|
||||
|
||||
type Challenge struct {
|
||||
// All bytes of the message
|
||||
Bytes []byte
|
||||
|
||||
// sig - 8 bytes
|
||||
Signature []byte
|
||||
// message type - 4 bytes
|
||||
@ -52,7 +49,6 @@ type Challenge struct {
|
||||
Version *VersionStruct
|
||||
// payload - variable
|
||||
Payload []byte
|
||||
PayloadOffset int
|
||||
}
|
||||
|
||||
func ParseChallengeMessage(body []byte) (*Challenge, error) {
|
||||
@ -71,9 +67,7 @@ func ParseChallengeMessage(body []byte) (*Challenge, error) {
|
||||
var err error
|
||||
|
||||
challenge.TargetName, err = ReadStringPayload(12, body)
|
||||
if err != nil {
|
||||
return challenge, err
|
||||
}
|
||||
if err != nil { return nil, err }
|
||||
|
||||
challenge.NegotiateFlags = binary.LittleEndian.Uint32(body[20:24])
|
||||
|
||||
@ -82,9 +76,7 @@ func ParseChallengeMessage(body []byte) (*Challenge, error) {
|
||||
challenge.Reserved = body[32:40]
|
||||
|
||||
challenge.TargetInfoPayloadStruct, err = ReadBytePayload(40, body)
|
||||
if err != nil {
|
||||
return challenge, err
|
||||
}
|
||||
if err != nil { return nil, err }
|
||||
|
||||
challenge.TargetInfo = ReadAvPairs(challenge.TargetInfoPayloadStruct.Payload)
|
||||
|
||||
@ -92,18 +84,48 @@ func ParseChallengeMessage(body []byte) (*Challenge, error) {
|
||||
|
||||
if NTLMSSP_NEGOTIATE_VERSION.IsSet(challenge.NegotiateFlags) {
|
||||
challenge.Version, err = ReadVersionStruct(body[offset : offset+8])
|
||||
if err != nil {
|
||||
return challenge, err
|
||||
}
|
||||
if err != nil { return nil, err }
|
||||
offset = offset + 8
|
||||
}
|
||||
|
||||
challenge.Payload = body[offset:]
|
||||
challenge.PayloadOffset = offset
|
||||
|
||||
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 {
|
||||
payloadStructs := [...]*PayloadStruct{c.TargetName, c.TargetInfoPayloadStruct}
|
||||
|
||||
@ -123,7 +145,7 @@ func (c *Challenge) String() string {
|
||||
var buffer bytes.Buffer
|
||||
|
||||
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("\nServerChallenge: %s", hex.EncodeToString(c.ServerChallenge)))
|
||||
if c.Version != nil {
|
||||
|
Loading…
x
Reference in New Issue
Block a user