Prep for hkexsh alternate op mode via symlink/exe name: hkexcp - a secure remote file copier

This commit is contained in:
Russ Magee 2018-07-18 22:32:49 -07:00
parent f9fba3227b
commit f48b0c17ed
3 changed files with 39 additions and 20 deletions

1
hkexsh/hkexcp Symbolic link
View File

@ -0,0 +1 @@
hkexsh

48
hkexsh/hkexsh.go Normal file → Executable file
View File

@ -72,6 +72,10 @@ func main() {
var hAlg string var hAlg string
var server string var server string
var cmdStr string var cmdStr string
var copySrc string
var copyDst string
var altUser string var altUser string
var authCookie string var authCookie string
var chaffEnabled bool var chaffEnabled bool
@ -79,27 +83,49 @@ func main() {
var chaffFreqMax uint var chaffFreqMax uint
var chaffBytesMax uint var chaffBytesMax uint
var op []byte
isInteractive := false isInteractive := false
flag.BoolVar(&vopt, "v", false, "show version") flag.BoolVar(&vopt, "v", false, "show version")
flag.BoolVar(&dbg, "d", false, "debug logging")
flag.StringVar(&cAlg, "c", "C_AES_256", "cipher [\"C_AES_256\" | \"C_TWOFISH_128\" | \"C_BLOWFISH_64\"]") flag.StringVar(&cAlg, "c", "C_AES_256", "cipher [\"C_AES_256\" | \"C_TWOFISH_128\" | \"C_BLOWFISH_64\"]")
flag.StringVar(&hAlg, "h", "H_SHA256", "hmac [\"H_SHA256\"]") flag.StringVar(&hAlg, "m", "H_SHA256", "hmac [\"H_SHA256\"]")
flag.StringVar(&server, "s", "localhost:2000", "server hostname/address[:port]") flag.StringVar(&server, "s", "localhost:2000", "server hostname/address[:port]")
flag.StringVar(&cmdStr, "x", "", "command to run (default empty - interactive shell)")
flag.StringVar(&altUser, "u", "", "specify alternate user") flag.StringVar(&altUser, "u", "", "specify alternate user")
flag.StringVar(&authCookie, "a", "", "auth cookie") flag.StringVar(&authCookie, "a", "", "auth cookie")
flag.BoolVar(&chaffEnabled, "cE", true, "enabled chaff pkts (default true)") flag.BoolVar(&chaffEnabled, "e", true, "enabled chaff pkts (default true)")
flag.UintVar(&chaffFreqMin, "cfm", 100, "chaff pkt freq min (msecs)") flag.UintVar(&chaffFreqMin, "f", 100, "chaff pkt freq min (msecs)")
flag.UintVar(&chaffFreqMax, "cfM", 5000, "chaff pkt freq max (msecs)") flag.UintVar(&chaffFreqMax, "F", 5000, "chaff pkt freq max (msecs)")
flag.UintVar(&chaffBytesMax, "cbM", 64, "chaff pkt size max (bytes)") flag.UintVar(&chaffBytesMax, "B", 64, "chaff pkt size max (bytes)")
flag.BoolVar(&dbg, "d", false, "debug logging")
// Find out what program we are (shell or copier)
myPath := strings.Split(os.Args[0], string(os.PathSeparator))
if myPath[len(myPath)-1] != "hkexcp" {
// hkexsh accepts a command (-x) but not
// a srcpath (-r) or dstpath (-t)
flag.StringVar(&cmdStr, "x", "", "command to run (default empty - interactive shell)")
flag.Parse() flag.Parse()
} else {
// hkexcp accepts srcpath (-r) and dstpath (-t), but not
// a command (-x)
flag.StringVar(&copySrc, "r", "", "copy srcpath")
flag.StringVar(&copyDst, "t", "", "copy dstpath")
}
if flag.NFlag() == 0 {
flag.Usage()
os.Exit(0)
}
if vopt { if vopt {
fmt.Printf("version v%s\n", version) fmt.Printf("version v%s\n", version)
os.Exit(0) os.Exit(0)
} }
if len(cmdStr) != 0 && (len(copySrc) != 0 || len(copyDst) != 0) {
log.Fatal("incompatible options -- either cmd (-x) or copy ops (-r,-t), but not both")
}
if dbg { if dbg {
log.SetOutput(os.Stdout) log.SetOutput(os.Stdout)
} else { } else {
@ -136,17 +162,9 @@ func main() {
uname = altUser uname = altUser
} }
var op []byte
if len(cmdStr) == 0 { if len(cmdStr) == 0 {
op = []byte{'s'} op = []byte{'s'}
isInteractive = true isInteractive = true
} else if cmdStr == "-" {
op = []byte{'c'}
cmdStdin, err := ioutil.ReadAll(os.Stdin)
if err != nil {
panic(err)
}
cmdStr = strings.Trim(string(cmdStdin), "\r\n")
} else { } else {
op = []byte{'c'} op = []byte{'c'}
// non-interactive cmds may complete quickly, so chaff earlier/faster // non-interactive cmds may complete quickly, so chaff earlier/faster

8
hkexshd/hkexshd.go Normal file → Executable file
View File

@ -202,10 +202,10 @@ func main() {
flag.BoolVar(&vopt, "v", false, "show version") flag.BoolVar(&vopt, "v", false, "show version")
flag.StringVar(&laddr, "l", ":2000", "interface[:port] to listen") flag.StringVar(&laddr, "l", ":2000", "interface[:port] to listen")
flag.BoolVar(&chaffEnabled, "cE", true, "enabled chaff pkts") flag.BoolVar(&chaffEnabled, "e", true, "enabled chaff pkts")
flag.UintVar(&chaffFreqMin, "cfm", 100, "chaff pkt freq min (msecs)") flag.UintVar(&chaffFreqMin, "f", 100, "chaff pkt freq min (msecs)")
flag.UintVar(&chaffFreqMax, "cfM", 5000, "chaff pkt freq max (msecs)") flag.UintVar(&chaffFreqMax, "F", 5000, "chaff pkt freq max (msecs)")
flag.UintVar(&chaffBytesMax, "cbM", 64, "chaff pkt size max (bytes)") flag.UintVar(&chaffBytesMax, "B", 64, "chaff pkt size max (bytes)")
flag.BoolVar(&dbg, "d", false, "debug logging") flag.BoolVar(&dbg, "d", false, "debug logging")
flag.Parse() flag.Parse()