mirror of
https://github.com/GhostPack/Rubeus
synced 2026-06-08 11:10:41 +00:00
140 lines
4.3 KiB
C#
Executable File
140 lines
4.3 KiB
C#
Executable File
using Rubeus.Domain;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Text;
|
|
|
|
namespace Rubeus
|
|
{
|
|
public class Program
|
|
{
|
|
// global that specifies if ticket output should be wrapped or not
|
|
public static bool wrapTickets = true;
|
|
|
|
public static bool Debug = false;
|
|
|
|
private static void FileExecute(string commandName, Dictionary<string, string> parsedArgs)
|
|
{
|
|
// execute w/ stdout/err redirected to a file
|
|
|
|
string file = parsedArgs["/consoleoutfile"];
|
|
|
|
TextWriter realStdOut = Console.Out;
|
|
TextWriter realStdErr = Console.Error;
|
|
|
|
using (StreamWriter writer = new StreamWriter(file, true))
|
|
{
|
|
writer.AutoFlush = true;
|
|
Console.SetOut(writer);
|
|
Console.SetError(writer);
|
|
|
|
MainExecute(commandName, parsedArgs);
|
|
|
|
Console.Out.Flush();
|
|
Console.Error.Flush();
|
|
}
|
|
Console.SetOut(realStdOut);
|
|
Console.SetError(realStdErr);
|
|
}
|
|
|
|
private static void MainExecute(string commandName, Dictionary<string,string> parsedArgs)
|
|
{
|
|
// main execution logic
|
|
|
|
Info.ShowLogo();
|
|
|
|
try
|
|
{
|
|
// print unicode char properly if there's a console
|
|
if(IsConsolePresent()) Console.OutputEncoding = Encoding.UTF8;
|
|
|
|
var commandFound = new CommandCollection().ExecuteCommand(commandName, parsedArgs);
|
|
|
|
// show the usage if no commands were found for the command name
|
|
if (commandFound == false)
|
|
Info.ShowUsage();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Console.WriteLine("\r\n[!] Unhandled Rubeus exception:\r\n");
|
|
Console.WriteLine(e);
|
|
}
|
|
}
|
|
|
|
public static string MainString(string command)
|
|
{
|
|
// helper that executes an input string command and returns results as a string
|
|
// useful for PSRemoting execution
|
|
|
|
string[] args = command.Split();
|
|
|
|
var parsed = ArgumentParser.Parse(args);
|
|
if (parsed.ParsedOk == false)
|
|
{
|
|
Info.ShowLogo();
|
|
Info.ShowUsage();
|
|
return "Error parsing arguments: ${command}";
|
|
}
|
|
|
|
var commandName = args.Length != 0 ? args[0] : "";
|
|
|
|
TextWriter realStdOut = Console.Out;
|
|
TextWriter realStdErr = Console.Error;
|
|
TextWriter stdOutWriter = new StringWriter();
|
|
TextWriter stdErrWriter = new StringWriter();
|
|
Console.SetOut(stdOutWriter);
|
|
Console.SetError(stdErrWriter);
|
|
|
|
MainExecute(commandName, parsed.Arguments);
|
|
|
|
Console.Out.Flush();
|
|
Console.Error.Flush();
|
|
Console.SetOut(realStdOut);
|
|
Console.SetError(realStdErr);
|
|
|
|
string output = "";
|
|
output += stdOutWriter.ToString();
|
|
output += stdErrWriter.ToString();
|
|
|
|
return output;
|
|
}
|
|
|
|
private static bool IsConsolePresent()
|
|
{
|
|
return Interop.GetConsoleWindow() != IntPtr.Zero;
|
|
}
|
|
|
|
public static void Main(string[] args)
|
|
{
|
|
// try to parse the command line arguments, show usage on failure and then bail
|
|
var parsed = ArgumentParser.Parse(args);
|
|
if (parsed.ParsedOk == false) {
|
|
Info.ShowLogo();
|
|
Info.ShowUsage();
|
|
return;
|
|
}
|
|
|
|
var commandName = args.Length != 0 ? args[0] : "";
|
|
|
|
if (parsed.Arguments.ContainsKey("/nowrap"))
|
|
{
|
|
wrapTickets = false;
|
|
}
|
|
|
|
if (parsed.Arguments.ContainsKey("/debug"))
|
|
{
|
|
Debug = true;
|
|
}
|
|
|
|
if (parsed.Arguments.ContainsKey("/consoleoutfile")) {
|
|
// redirect output to a file specified
|
|
FileExecute(commandName, parsed.Arguments);
|
|
}
|
|
else
|
|
{
|
|
MainExecute(commandName, parsed.Arguments);
|
|
}
|
|
}
|
|
}
|
|
}
|