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