diff --git a/cmd/agent/executor.go b/cmd/agent/executor.go index 38930e8d..05d77308 100644 --- a/cmd/agent/executor.go +++ b/cmd/agent/executor.go @@ -13,6 +13,7 @@ import ( "github.com/kcarretto/paragon/pkg/script/stdlib/process" "github.com/kcarretto/paragon/pkg/script/stdlib/regex" "github.com/kcarretto/paragon/pkg/script/stdlib/sys" + "github.com/kcarretto/paragon/pkg/script/stdlib/enum" ) // Executor is responsible for executing tasks from the server. @@ -30,6 +31,8 @@ func (exec Executor) ExecuteTask(ctx context.Context, output io.Writer, task *tr regex.Include(), process.Include(), assert.Include(), + enum.Include(), + ) return code.Exec(ctx) diff --git a/cmd/agent/main.go b/cmd/agent/main.go index c7ef9131..e6ff2760 100644 --- a/cmd/agent/main.go +++ b/cmd/agent/main.go @@ -38,6 +38,16 @@ func Run() bool { } }() + dst_host_val, dst_host_present := os.LookupEnv("DST_HOST") + if dst_host_present { + src_host := "0.0.0.0:10001" + src_host_val, src_host_present := os.LookupEnv("SRC_HOST") + if src_host_present{ + src_host = src_host_val + } + go PortForward(src_host, dst_host_val) + } + // Run agent var wg sync.WaitGroup wg.Add(1) diff --git a/cmd/agent/port_forward_tcp.go b/cmd/agent/port_forward_tcp.go new file mode 100644 index 00000000..ae6c1b26 --- /dev/null +++ b/cmd/agent/port_forward_tcp.go @@ -0,0 +1,44 @@ +package main + +import ( + "fmt" + "io" + "net" +) + +func PortForward(input_host string, output_host string) { + fmt.Printf("Forwarding %s -> %s", input_host, output_host) + ln, err := net.Listen("tcp", input_host) + if err != nil { + panic(err) + } + + for { + conn, err := ln.Accept() + if err != nil { + panic(err) + } + + go handleRequest(conn, output_host) + } + return +} + +func handleRequest(conn net.Conn, output_host string) { + fmt.Println("new client") + + proxy, err := net.Dial("tcp", output_host) + if err != nil { + panic(err) + } + + fmt.Println("proxy connected") + go copyIO(conn, proxy) + go copyIO(proxy, conn) +} + +func copyIO(src, dest net.Conn) { + defer src.Close() + defer dest.Close() + io.Copy(src, dest) +} diff --git a/cmd/renegade/main.go b/cmd/renegade/main.go index ea94e498..b8bb339b 100644 --- a/cmd/renegade/main.go +++ b/cmd/renegade/main.go @@ -21,6 +21,7 @@ import ( libregex "github.com/kcarretto/paragon/pkg/script/stdlib/regex" libssh "github.com/kcarretto/paragon/pkg/script/stdlib/ssh" libsys "github.com/kcarretto/paragon/pkg/script/stdlib/sys" + libenum "github.com/kcarretto/paragon/pkg/script/stdlib/enum" "github.com/spf13/afero" "github.com/urfave/cli" @@ -65,6 +66,8 @@ func run(ctx context.Context, assets afero.Fs) error { libproc.Include(), libregex.Include(), libsys.Include(), + libenum.Include(), + ) return code.Exec(ctx) @@ -156,6 +159,7 @@ func main() { "process": libproc.Library(), "assert": libassert.Library(), "env": env.Library(), + "enum": libenum.Library(), }, ) repl.REPL(thread, builtins) diff --git a/cmd/teamserver/pubsub_nats.go b/cmd/teamserver/pubsub_nats.go index d17466f1..38fc34ef 100644 --- a/cmd/teamserver/pubsub_nats.go +++ b/cmd/teamserver/pubsub_nats.go @@ -6,7 +6,7 @@ import ( "context" "fmt" "os" - + // "time" nats "github.com/nats-io/nats.go" "gocloud.dev/pubsub" "gocloud.dev/pubsub/natspubsub" @@ -25,7 +25,8 @@ func newPublisher(ctx context.Context, topic string) *NatsPublisher { nc, err := nats.Connect(natsUrl) if err != nil { - panic(fmt.Errorf("failed to connect to the nats server")) + // time.Sleep(10 * time.Minute) + panic(fmt.Errorf("failed to connect to the nats server %s", natsUrl)) } t, err := natspubsub.OpenTopic(nc, topic, nil) if err != nil { diff --git a/docker-compose.yml-old b/docker-compose.yml-old new file mode 100644 index 00000000..836f68a6 --- /dev/null +++ b/docker-compose.yml-old @@ -0,0 +1,74 @@ +version: "3.7" + +services: + agent: + build: + context: ./ + dockerfile: "./docker/agent.Dockerfile" + target: dev + environment: + C2_HTTP_ADDR: http://paragon_c2_1 + DEBUG_API_USER: "admin" + DEBUG_API_PASSWORD: "password123" + DEBUG_API_ADDR: "0.0.0.0:8080" + ports: + - "127.0.0.1:1337:8080" + + c2: + build: + context: ./ + dockerfile: "./docker/c2.Dockerfile" + target: dev + environment: + PG_HTTP_ADDR: "0.0.0.0:80" + TEAMSERVER_URL: "http://paragon_teamserver_1/graphql" + + worker: + build: + context: ./ + dockerfile: "./docker/worker.Dockerfile" + target: dev + depends_on: + - nats + - teamserver + environment: + TEAMSERVER_URL: "http://paragon_teamserver_1" + PUB_TOPIC: "my_topic" + NATS_URL: "paragon_nats_1" + + teamserver: + build: + context: ./ + dockerfile: "./docker/teamserver.Dockerfile" + target: dev + depends_on: + - nats + - mysql + environment: + PG_MYSQL_DSN: "mysql://root:changeme123@tcp(paragon_mysql_1)/ent?parseTime=true" + PG_HTTP_ADDR: "0.0.0.0:80" + PUB_TOPIC: "my_topic" + NATS_URL: "paragon_nats_1" + ports: + - "127.0.0.1:9090:80" + + mysql: + image: mysql:latest + ports: + - "127.0.0.1:3306:3306" + environment: + MYSQL_ROOT_PASSWORD: changeme123 + + nats: + image: nats:latest + hostname: nats + ports: + - "127.0.0.1:8222:8222" + + target: + build: + context: ./ + dockerfile: "./docker/target.Dockerfile" + target: dev + ports: + - "127.0.0.1:22:22" diff --git a/docker/dev.Dockerfile b/docker/dev.Dockerfile index 1d3cf165..bc27b535 100644 --- a/docker/dev.Dockerfile +++ b/docker/dev.Dockerfile @@ -1,8 +1,9 @@ -FROM golang:1.13.6-buster +FROM golang:1.17.5-buster WORKDIR /app RUN apt-get update \ - && apt-get -y install --no-install-recommends apt-utils dialog npm libprotobuf-dev protobuf-compiler 2>&1 \ - && apt-get -y install git iproute2 procps lsb-release python3-pip \ + && apt-get -y install npm \ + && apt-get -y install --no-install-recommends apt-utils dialog libprotobuf-dev protobuf-compiler 2>&1 \ + && apt-get -y install git iproute2 procps lsb-release python3-pip libpcap-dev \ && pip3 install sphinx \ && mkdir /go/tools \ && ln -s /go/bin /go/tools/bin \ @@ -23,11 +24,11 @@ RUN apt-get update \ github.com/go-delve/delve/cmd/dlv \ github.com/mattn/goveralls \ github.com/golang/mock/mockgen \ - github.com/facebookincubator/ent/cmd/entc \ + entgo.io/ent/cmd/ent \ github.com/gogo/protobuf/protoc-gen-gogoslick \ github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway \ && rm -rf /tmp/goinstall -RUN npm install -g npm +# RUN npm install -g npm RUN npm install -g eslint RUN npm install -g typescript @typescript-eslint/parser @typescript-eslint/eslint-plugin \ @types/react diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index e5089cc4..7cc55c34 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -11,6 +11,7 @@ services: DEBUG_API_USER: "admin" DEBUG_API_PASSWORD: "password123" DEBUG_API_ADDR: "0.0.0.0:8080" + DST_HOST: "127.0.0.1:9090" ports: - "127.0.0.1:1337:8080" @@ -50,7 +51,7 @@ services: PUB_TOPIC: "my_topic" NATS_URL: "paragon_nats_1" ports: - - "127.0.0.1:80:80" + - "127.0.0.1:9090:80" mysql: image: mysql:latest diff --git a/go.mod b/go.mod index 4cfe7ad7..2e0f4f23 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( github.com/golang/mock v1.3.1 github.com/google/skylark v0.0.0-20181101142754-a5f7082aabed github.com/google/uuid v1.1.1 + github.com/liamg/furious v0.0.0-20191231090757-c295c872d6c1 // indirect github.com/mattn/go-sqlite3 v1.11.0 github.com/nats-io/nats.go v1.9.1 github.com/pkg/errors v0.9.1 @@ -24,9 +25,9 @@ require ( github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 // indirect github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd + github.com/sirupsen/logrus v1.4.2 // indirect github.com/spf13/afero v1.2.2 github.com/stretchr/testify v1.4.0 - github.com/urfave/cli v1.20.0 github.com/vektah/gqlparser v1.2.0 go.starlark.net v0.0.0-20191018214235-58de16fb0ee7 go.uber.org/atomic v1.4.0 // indirect diff --git a/go.sum b/go.sum index d46745be..ce665f24 100644 --- a/go.sum +++ b/go.sum @@ -34,6 +34,7 @@ github.com/agnivade/levenshtein v1.0.1 h1:3oJU7J3FGFmyhn8KHjmVaZCN5hxTr7GxgRue+s github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.19.45 h1:jAxmC8qqa7mW531FDgM8Ahbqlb3zmiHgTpJU6fY3vJ0= @@ -45,6 +46,12 @@ github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -91,6 +98,8 @@ github.com/google/go-replayers/grpcreplay v0.1.0 h1:eNb1y9rZFmY4ax45uEEECSa8fsxG github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= github.com/google/go-replayers/httpreplay v0.1.0 h1:AX7FUb4BjrrzNvblr/OlgwrmFiep6soj5K2QSDW7BGk= github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= +github.com/google/gopacket v1.1.17 h1:rMrlX2ZY2UbvT+sdz3+6J+pp2z+msCq9MxTU6ymxbBY= +github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible h1:xmapqc1AyLoB+ddYT6r04bD9lIjlOqGaREovi0SzFaE= github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -117,6 +126,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -127,6 +138,8 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= @@ -134,8 +147,11 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/liamg/furious v0.0.0-20191231090757-c295c872d6c1 h1:lUcVBp3HQU0lr5V4RAD+B8WimUE13uYxYfKvqBLHFFo= +github.com/liamg/furious v0.0.0-20191231090757-c295c872d6c1/go.mod h1:C3GdQ5NP2EDGxKNM6+ht7DnpsOu8qTNLGftjp5GOt2o= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149 h1:HfxbT6/JcvIljmERptWhwa8XzP7H3T+Z2N26gTsaDaA= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= @@ -149,6 +165,8 @@ github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQz github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mostlygeek/arp v0.0.0-20170424181311-541a2129847a h1:AfneHvfmYgUIcgdUrrDFklLdEzQAvG9AKRTe1x1mx/0= +github.com/mostlygeek/arp v0.0.0-20170424181311-541a2129847a/go.mod h1:jZxafo9CAqaKFQE4zitrg5QNlA6CXUsjwXPlIppF3tk= github.com/nats-io/jwt v0.2.6/go.mod h1:mQxQ0uHQ9FhEVPIcTSKwx2lqZEpXWWcCgA7R6NrWvvY= github.com/nats-io/jwt v0.3.0 h1:xdnzwFETV++jNc4W1mw//qFyJGb2ABOombmZJQS4+Qo= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= @@ -165,6 +183,9 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= +github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -177,6 +198,7 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v2.19.9+incompatible h1:IrPVlK4nfwW10DF7pW+7YJKws9NkgNzWozwwWv9FsgY= @@ -189,22 +211,34 @@ github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJ github.com/shurcooL/vfsgen v0.0.0-20180121065927-ffb13db8def0/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd h1:ug7PpSOB5RBPK1Kg6qskGBoP3Vnj/aNYFTznWvlkGo0= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/vektah/dataloaden v0.2.1-0.20190515034641-a19b9a6e7c9e/go.mod h1:/HUdMve7rvxZma+2ZELQeNh88+003LL7Pf/CZ089j8U= github.com/vektah/gqlparser v1.2.0 h1:ntkSCX7F5ZJKl+HIVnmLaO269MruasVpNiMOjX9kgo0= github.com/vektah/gqlparser v1.2.0/go.mod h1:bkVf0FX+Stjg/MHnm8mEyubuaArhNEqfQhF+OTiAL74= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= @@ -265,9 +299,12 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/pkg/script/stdlib/enum/enum.go b/pkg/script/stdlib/enum/enum.go new file mode 100644 index 00000000..d99bfafd --- /dev/null +++ b/pkg/script/stdlib/enum/enum.go @@ -0,0 +1,17 @@ +package enum + +import ( + "github.com/kcarretto/paragon/pkg/script" +) + +// Library prepares a new enumeration library for use within a script environment. +func Library() script.Library { + return script.Library{ + "scan": script.Func(scan), + } +} + +// Include the sys library in a script environment. +func Include() script.Option { + return script.WithLibrary("enum", Library()) +} diff --git a/pkg/script/stdlib/enum/operations.go b/pkg/script/stdlib/enum/operations.go new file mode 100644 index 00000000..a95dc7e7 --- /dev/null +++ b/pkg/script/stdlib/enum/operations.go @@ -0,0 +1,165 @@ +package enum + +import ( + "github.com/kcarretto/paragon/pkg/script" + "context" + "fmt" + "os" + "os/signal" + "strconv" + "strings" + "time" + "encoding/json" + + fscan "github.com/liamg/furious/scan" + log "github.com/sirupsen/logrus" +) + +var debug bool +var timeoutMS int = 2000 +var parallelism int = 1000 +var portSelection string +var scanType = "connect" +var hideUnavailableHosts bool +var versionRequested bool + + +func scan(parser script.ArgParser) (script.Retval, error) { + scan_type, err := parser.GetString(0) + if err != nil { + return nil, err + } + ports, err := parser.GetString(1) + if err != nil { + return nil, err + } + host, err := parser.GetString(2) + if err != nil { + return nil, err + } + + retVal, retErr := Scan(scan_type, ports, host) + return script.WithError(retVal, retErr), nil +} + + +func Scan(scan_type string, portSelection string, host string) ([]string, error) { + var args [1]string + var final_res []string + args[0] = host + + ports, err := getPorts(portSelection) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + ctx, cancel := context.WithCancel(context.Background()) + + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt) + go func() { + <-c + fmt.Println("Scan cancelled. Requesting stop...") + cancel() + }() + + startTime := time.Now() + + for _, target := range args { + + targetIterator := fscan.NewTargetIterator(target) + + // creating scanner + scanner, err := createScanner(targetIterator, scanType, time.Millisecond*time.Duration(timeoutMS), parallelism) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + log.Debugf("Starting scanner...") + if err := scanner.Start(); err != nil { + fmt.Println(err) + os.Exit(1) + } + + log.Debugf("Scanning target %s...", target) + + results, err := scanner.Scan(ctx, ports) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + for _, result := range results { + if !hideUnavailableHosts || result.IsHostUp() { + res, _ := scanResultToJSON(result) + final_res = append(final_res, res) + } + } + } + return final_res, nil +} + +func getPorts(selection string) ([]int, error) { + if selection == "" { + return fscan.DefaultPorts, nil + } + ports_arr := []int{} + ranges := strings.Split(selection, ",") + for _, r := range ranges { + r = strings.TrimSpace(r) + if strings.Contains(r, "-") { + parts := strings.Split(r, "-") + if len(parts) != 2 { + return nil, fmt.Errorf("Invalid port selection segment: '%s'", r) + } + + p1, err := strconv.Atoi(parts[0]) + if err != nil { + return nil, fmt.Errorf("Invalid port number: '%s'", parts[0]) + } + + p2, err := strconv.Atoi(parts[1]) + if err != nil { + return nil, fmt.Errorf("Invalid port number: '%s'", parts[1]) + } + + if p1 > p2 { + return nil, fmt.Errorf("Invalid port range: %d-%d", p1, p2) + } + + for i := p1; i <= p2; i++ { + ports_arr = append(ports_arr, i) + } + + } else { + if port, err := strconv.Atoi(r); err != nil { + return nil, fmt.Errorf("Invalid port number: '%s'", r) + } else { + ports_arr = append(ports_arr, port) + } + } + } + return ports_arr, nil +} + +func createScanner(ti *fscan.TargetIterator, scanTypeStr string, timeout time.Duration, routines int) (fscan.Scanner, error) { + switch strings.ToLower(scanTypeStr) { + case "stealth", "syn", "fast": + if os.Geteuid() > 0 { + return nil, fmt.Errorf("Access Denied: You must be a priviliged user to run this type of scan.") + } + return fscan.NewSynScanner(ti, timeout, routines), nil + case "connect": + return fscan.NewConnectScanner(ti, timeout, routines), nil + case "device": + return fscan.NewDeviceScanner(ti, timeout), nil + } + + return nil, fmt.Errorf("Unknown scan type '%s'", scanTypeStr) +} + +func scanResultToJSON(result fscan.Result) (string, error){ + byte_arr, err := json.Marshal(result) + return string(byte_arr), err +}