aboutsummaryrefslogtreecommitdiff
path: root/pkg
diff options
context:
space:
mode:
authorBryan McNulty <bryanmcnulty@protonmail.com>2025-04-17 12:43:02 -0500
committerBryan McNulty <bryanmcnulty@protonmail.com>2025-04-17 12:43:02 -0500
commitc3c2dda30081cda7b0cab820b2e3e15e3c895b77 (patch)
tree29301f2831e7d269604f68c49b7b64a4523b1953 /pkg
parent7afebcd5347a2b982d27ac59a59c85dcaf275311 (diff)
downloadgoexec-c3c2dda30081cda7b0cab820b2e3e15e3c895b77.tar.gz
goexec-c3c2dda30081cda7b0cab820b2e3e15e3c895b77.zip
Fix DCE proxy
Diffstat (limited to 'pkg')
-rw-r--r--pkg/goexec/dce/options.go181
1 files changed, 91 insertions, 90 deletions
diff --git a/pkg/goexec/dce/options.go b/pkg/goexec/dce/options.go
index e13ef43..720ea21 100644
--- a/pkg/goexec/dce/options.go
+++ b/pkg/goexec/dce/options.go
@@ -1,108 +1,109 @@
package dce
import (
- "context"
- "fmt"
- "github.com/FalconOpsLLC/goexec/pkg/goexec"
- "github.com/RedTeamPentesting/adauth/dcerpcauth"
- "github.com/oiweiwei/go-msrpc/dcerpc"
- "net"
+ "context"
+ "fmt"
+ "github.com/FalconOpsLLC/goexec/pkg/goexec"
+ "github.com/RedTeamPentesting/adauth/dcerpcauth"
+ "github.com/oiweiwei/go-msrpc/dcerpc"
+ "net"
)
type Options struct {
- goexec.ClientOptions
- goexec.AuthOptions
+ goexec.ClientOptions
+ goexec.AuthOptions
- // NoSign disables packet signing by omitting dcerpc.WithSign()
- NoSign bool `json:"no_sign" yaml:"no_sign"`
+ // NoSign disables packet signing by omitting dcerpc.WithSign()
+ NoSign bool `json:"no_sign" yaml:"no_sign"`
- // NoSeal disables packet stub encryption by omitting dcerpc.WithSeal()
- NoSeal bool `json:"no_seal" yaml:"no_seal"`
+ // NoSeal disables packet stub encryption by omitting dcerpc.WithSeal()
+ NoSeal bool `json:"no_seal" yaml:"no_seal"`
- // NoLog disables logging by omitting dcerpc.WithLogger(...)
- NoLog bool `json:"no_log" yaml:"no_log"`
+ // NoLog disables logging by omitting dcerpc.WithLogger(...)
+ NoLog bool `json:"no_log" yaml:"no_log"`
- // NoEpm disables DCE endpoint mapper communications
- NoEpm bool `json:"no_epm" yaml:"no_epm"`
+ // NoEpm disables DCE endpoint mapper communications
+ NoEpm bool `json:"no_epm" yaml:"no_epm"`
- // Endpoint stores the explicit DCE string binding to use
- Endpoint string `json:"endpoint,omitempty" yaml:"endpoint,omitempty"`
+ // Endpoint stores the explicit DCE string binding to use
+ Endpoint string `json:"endpoint,omitempty" yaml:"endpoint,omitempty"`
- // Filter stores the filter for returned endpoints from an endpoint mapper
- Filter string `json:"filter,omitempty" yaml:"filter,omitempty"`
+ // Filter stores the filter for returned endpoints from an endpoint mapper
+ Filter string `json:"filter,omitempty" yaml:"filter,omitempty"`
- netDialer goexec.Dialer
- dialer dcerpc.Dialer
- authOptions []dcerpc.Option
- DcerpcOptions []dcerpc.Option
- epmOptions []dcerpc.Option
- stringBindings []*dcerpc.StringBinding
+ netDialer goexec.Dialer
+ dialer dcerpc.Dialer
+ authOptions []dcerpc.Option
+ DcerpcOptions []dcerpc.Option
+ epmOptions []dcerpc.Option
+ stringBindings []*dcerpc.StringBinding
}
func (c *Client) Parse(ctx context.Context) (err error) {
- // Reset internals
- {
- c.netDialer = nil
- c.dialer = nil
- c.stringBindings = []*dcerpc.StringBinding{}
- c.authOptions = []dcerpc.Option{}
- c.DcerpcOptions = []dcerpc.Option{}
- c.epmOptions = []dcerpc.Option{
- dcerpc.WithSign(), // Require signing for EPM
- }
- }
-
- if !c.NoSeal {
- // Enable encryption
- c.DcerpcOptions = append(c.DcerpcOptions, dcerpc.WithSeal(), dcerpc.WithSecurityLevel(dcerpc.AuthLevelPktPrivacy))
- c.epmOptions = append(c.epmOptions, dcerpc.WithSeal(), dcerpc.WithSecurityLevel(dcerpc.AuthLevelPktPrivacy))
- }
- if !c.NoSign {
- // Enable signing
- c.DcerpcOptions = append(c.DcerpcOptions, dcerpc.WithSign())
- //c.epmOptions = append(c.epmOptions, dcerpc.WithSign())
- }
-
- // Parse DCERPC endpoint
- if c.Endpoint != "" {
- sb, err := dcerpc.ParseStringBinding(c.Endpoint)
- if err != nil {
- return err
- }
- c.stringBindings = append(c.stringBindings, sb)
- }
-
- // Parse EPM filter
- if c.Filter != "" {
- sb, err := dcerpc.ParseStringBinding(c.Filter)
- if err != nil {
- return err
- }
- c.stringBindings = append(c.stringBindings, sb)
- }
-
- if c.Proxy == "" {
- c.netDialer = &net.Dialer{} // FUTURE: additional dial c
-
- } else {
- // Parse proxy URL
- d, err := goexec.ParseProxyURI(c.Proxy)
- if err != nil {
- return err
- }
- var ok bool
- if c.dialer, ok = d.(dcerpc.Dialer); !ok {
- return fmt.Errorf("cannot cast %T to dcerpc.Dialer", d)
- }
- }
-
- // Parse authentication parameters
- if c.authOptions, err = dcerpcauth.AuthenticationOptions(ctx, c.Credential, c.Target, &dcerpcauth.Options{}); err != nil {
- return fmt.Errorf("parse auth c: %w", err)
- }
-
- c.Host = c.Target.AddressWithoutPort()
-
- return
+ // Reset internals
+ {
+ c.netDialer = nil
+ c.dialer = nil
+ c.stringBindings = []*dcerpc.StringBinding{}
+ c.authOptions = []dcerpc.Option{}
+ c.DcerpcOptions = []dcerpc.Option{}
+ c.epmOptions = []dcerpc.Option{
+ dcerpc.WithSign(), // Require signing for EPM
+ }
+ }
+
+ if !c.NoSeal {
+ // Enable encryption
+ c.DcerpcOptions = append(c.DcerpcOptions, dcerpc.WithSeal(), dcerpc.WithSecurityLevel(dcerpc.AuthLevelPktPrivacy))
+ c.epmOptions = append(c.epmOptions, dcerpc.WithSeal(), dcerpc.WithSecurityLevel(dcerpc.AuthLevelPktPrivacy))
+ }
+ if !c.NoSign {
+ // Enable signing
+ c.DcerpcOptions = append(c.DcerpcOptions, dcerpc.WithSign())
+ //c.epmOptions = append(c.epmOptions, dcerpc.WithSign())
+ }
+
+ // Parse DCERPC endpoint
+ if c.Endpoint != "" {
+ sb, err := dcerpc.ParseStringBinding(c.Endpoint)
+ if err != nil {
+ return err
+ }
+ c.stringBindings = append(c.stringBindings, sb)
+ }
+
+ // Parse EPM filter
+ if c.Filter != "" {
+ sb, err := dcerpc.ParseStringBinding(c.Filter)
+ if err != nil {
+ return err
+ }
+ c.stringBindings = append(c.stringBindings, sb)
+ }
+
+ if c.Proxy == "" {
+ c.netDialer = &net.Dialer{} // FUTURE: additional dial c
+
+ } else {
+ // Parse proxy URL
+ d, err := goexec.ParseProxyURI(c.Proxy)
+ if err != nil {
+ return err
+ }
+ var ok bool
+ if c.dialer, ok = d.(dcerpc.Dialer); !ok {
+ return fmt.Errorf("cannot cast %T to dcerpc.Dialer", d)
+ }
+ c.DcerpcOptions = append(c.DcerpcOptions, dcerpc.WithDialer(c.dialer))
+ }
+
+ // Parse authentication parameters
+ if c.authOptions, err = dcerpcauth.AuthenticationOptions(ctx, c.Credential, c.Target, &dcerpcauth.Options{}); err != nil {
+ return fmt.Errorf("parse auth c: %w", err)
+ }
+
+ c.Host = c.Target.AddressWithoutPort()
+
+ return
}