From 6eef1176808b7d2db9c835d377a8f7dbbf14da2c Mon Sep 17 00:00:00 2001 From: moloch-- <875022+moloch--@users.noreply.github.com> Date: Fri, 15 May 2020 20:10:42 -0500 Subject: [PATCH] now tracking sliver/master, added wrappers for stager APIs --- .gitmodules | 4 ++-- README.md | 2 +- sliver | 2 +- src/client.ts | 63 +++++++++++++++++++++++++++++++++++++++++++++++---- 4 files changed, 62 insertions(+), 9 deletions(-) diff --git a/.gitmodules b/.gitmodules index dc92af2..6748f31 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,5 +1,5 @@ [submodule "sliver"] path = sliver - url = https://github.com/BishopFox/sliver + url = https://github.com/BishopFox/sliver.git [submodule "Submod"] - branch = grpc + branch = master diff --git a/README.md b/README.md index eddef1e..347c1bd 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ For best compatibility use Node v14+ this package is available via npm: ```typescript import { SliverClient, ParseConfigFile } from 'sliver-script' -(async function () { +(async function() { const config = await ParseConfigFile('./moloch_localhost.cfg') const client = new SliverClient(config) diff --git a/sliver b/sliver index e72730e..5041aa1 160000 --- a/sliver +++ b/sliver @@ -1 +1 @@ -Subproject commit e72730ed9466bdbe6c55240e4d417b9db9a120dd +Subproject commit 5041aa19e0c21c1de9987c6030164f840174ee0f diff --git a/src/client.ts b/src/client.ts index 1e8ac96..e9f2f68 100644 --- a/src/client.ts +++ b/src/client.ts @@ -13,6 +13,13 @@ import { SliverClientConfig } from './config'; const TIMEOUT = 30; // Default timeout in seconds +// Exported/simplified tunnel interfaces +export interface Tunnel { + stdout: Observable + stdin: Observer +} + + export class InteractiveSession { private _rpc: rpcpb.SliverRPCClient; @@ -343,7 +350,7 @@ export class InteractiveSession { }); } - shell(path: string, pty: boolean, timeout = TIMEOUT): Promise { + shell(path: string, pty: boolean, timeout = TIMEOUT): Promise { return new Promise((resolve, reject) => { const tunnel = new sliverpb.Tunnel(); @@ -365,9 +372,13 @@ export class InteractiveSession { if (err || shell === undefined) { return reject(err); } - - const stdout = new Observable(); + const stdout = new Observable(producer => { + this._tunnelStream.on('data', (tunnelData: sliverpb.TunnelData) => { + producer.next(Buffer.from(tunnelData.getData_asU8())); + }); + }); + const stdin: Observer = { next: (raw: Buffer) => { const data = new sliverpb.TunnelData(); @@ -376,12 +387,15 @@ export class InteractiveSession { data.setData(raw); this._tunnelStream.write(data); }, - complete: () => { + complete: () => { this._rpc.closeTunnel(rpcTunnel, () => {}) }, + error: (err) => { + console.error(err); this._rpc.closeTunnel(rpcTunnel, () => {}) }, - error: () => {}, }; + resolve({stdin: stdin, stdout: stdout}); + }); }); @@ -594,6 +608,45 @@ export class SliverClient { }); } + startTCPStagerListener(host: string, port: number, data: Buffer): Promise { + return new Promise((resolve, reject) => { + const req = new clientpb.StagerListenerReq(); + req.setProtocol(clientpb.StageProtocol.TCP); + req.setHost(host); + req.setPort(port); + req.setData(data); + this.rpc.startTCPStagerListener(req, (err, tcpListener) => { + err ? reject(err) : resolve(tcpListener); + }); + }); + } + + startHTTPStagerListener(host: string, port: number, data: Buffer): Promise { + return new Promise((resolve, reject) => { + const req = new clientpb.StagerListenerReq(); + req.setProtocol(clientpb.StageProtocol.HTTP); + req.setHost(host); + req.setPort(port); + req.setData(data); + this.rpc.startHTTPStagerListener(req, (err, httpListener) => { + err ? reject(err) : resolve(httpListener); + }); + }); + } + + startHTTPSStagerListener(host: string, port: number, data: Buffer): Promise { + return new Promise((resolve, reject) => { + const req = new clientpb.StagerListenerReq(); + req.setProtocol(clientpb.StageProtocol.HTTPS); + req.setHost(host); + req.setPort(port); + req.setData(data); + this.rpc.startHTTPStagerListener(req, (err, httpsListener) => { + err ? reject(err) : resolve(httpsListener); + }); + }); + } + // ---- Implants ---- generate(config: clientpb.ImplantConfig): Promise {