From 3817385bb293e66abbd11a8fcfb69a3a9b585ae9 Mon Sep 17 00:00:00 2001 From: Harmj0y Date: Tue, 24 Nov 2015 00:41:16 -0500 Subject: [PATCH] Fixed agent result caching bug (again) Fixed multiple agent-interaction bug that causes results to be displayed simultaneously --- lib/common/agents.py | 16 ++++++--- lib/common/empire.py | 81 ++++++++++++++++++++++++-------------------- 2 files changed, 55 insertions(+), 42 deletions(-) diff --git a/lib/common/agents.py b/lib/common/agents.py index a3f16b1..38dda6a 100644 --- a/lib/common/agents.py +++ b/lib/common/agents.py @@ -1159,22 +1159,28 @@ class Agents: counter = responsePackets[-1][1] + results = False + # validate the counter in the packet in the setcode.replace if counter and packets.validate_counter(counter): - # signal that this agent returned results - name = self.get_agent_name(sessionID) - dispatcher.send("[*] Agent "+str(name)+" returned results.", sender="Agents") - + results = True + # process each result packet for responsePacket in responsePackets: (responseName, counter, length, data) = responsePacket + # process the agent's response self.handle_agent_response(sessionID, responseName, data) + if results: + # signal that this agent returned results + name = self.get_agent_name(sessionID) + dispatcher.send("[*] Agent "+str(name)+" returned results.", sender="Agents") + # return a 200/valid return (200, "") - + else: dispatcher.send("[!] Invalid counter value from "+str(sessionID), sender="Agents") return (404, "") diff --git a/lib/common/empire.py b/lib/common/empire.py index 3e760cb..1a914ff 100644 --- a/lib/common/empire.py +++ b/lib/common/empire.py @@ -168,10 +168,8 @@ class MainMenu(cmd.Cmd): try: if self.menu_state == "Agents": self.do_agents("") - self.menu_state = "Main" elif self.menu_state == "Listeners": self.do_listeners("") - self.menu_state = "Main" else: # display the main title messages.title(VERSION) @@ -217,17 +215,14 @@ class MainMenu(cmd.Cmd): # exception used to signal jumping to "Main" menu except NavMain as e: self.menu_state = "Main" - continue # exception used to signal jumping to "Agents" menu except NavAgents as e: self.menu_state = "Agents" - continue # exception used to signal jumping to "Listeners" menu except NavListeners as e: self.menu_state = "Listeners" - continue # print a nicely formatted help menu @@ -300,47 +295,58 @@ class MainMenu(cmd.Cmd): def do_agents(self, line): "Jump to the Agents menu." - a = AgentsMenu(self) - a.cmdloop() + try: + a = AgentsMenu(self) + a.cmdloop() + except Exception as e: + raise e def do_listeners(self, line): "Interact with active listeners." - l = ListenerMenu(self) - l.cmdloop() + try: + l = ListenerMenu(self) + l.cmdloop() + except Exception as e: + raise e def do_usestager(self, line): "Use an Empire stager." - parts = line.split(" ") + try: + parts = line.split(" ") - if parts[0] not in self.stagers.stagers: - print helpers.color("[!] Error: invalid stager module") + if parts[0] not in self.stagers.stagers: + print helpers.color("[!] Error: invalid stager module") - elif len(parts) == 1: - l = StagerMenu(self, parts[0]) - l.cmdloop() - elif len(parts) == 2: - listener = parts[1] - if not self.listeners.is_listener_valid(listener): - print helpers.color("[!] Please enter a valid listener name or ID") - else: - self.stagers.set_stager_option('Listener', listener) + elif len(parts) == 1: l = StagerMenu(self, parts[0]) l.cmdloop() - else: - print helpers.color("[!] Error in MainMenu's do_userstager()") - + elif len(parts) == 2: + listener = parts[1] + if not self.listeners.is_listener_valid(listener): + print helpers.color("[!] Please enter a valid listener name or ID") + else: + self.stagers.set_stager_option('Listener', listener) + l = StagerMenu(self, parts[0]) + l.cmdloop() + else: + print helpers.color("[!] Error in MainMenu's do_userstager()") + + except Exception as e: + raise e def do_usemodule(self, line): "Use an Empire module." if line not in self.modules.modules: print helpers.color("[!] Error: invalid module") else: - l = ModuleMenu(self, line) - l.cmdloop() - + try: + l = ModuleMenu(self, line) + l.cmdloop() + except Exception as e: + raise e def do_searchmodule(self, line): "Search Empire module names/descriptions." @@ -1259,6 +1265,16 @@ class AgentMenu(cmd.Cmd): raise NavMain() + def do_listeners(self, line): + "Jump to the listeners menu." + raise NavListeners() + + + def do_agents(self, line): + "Jump to the Agents menu." + raise NavAgents() + + def do_help(self, *args): "Displays the help menu or syntax for particular commands." @@ -1363,6 +1379,7 @@ class AgentMenu(cmd.Cmd): msg = "Tasked agent to delay sleep/jitter " + str(delay) + "/" + str(jitter) self.mainMenu.agents.save_agent_log(self.sessionID, msg) + def do_lostlimit(self, line): "Task an agent to change the limit on lost agent detection" @@ -1843,16 +1860,6 @@ class AgentMenu(cmd.Cmd): self.mainMenu.do_creds(line) - def do_listeners(self, line): - "Jump to the listeners menu." - raise NavListeners() - - - def do_agents(self, line): - "Jump to the Agents menu." - raise NavAgents() - - def complete_psinject(self, text, line, begidx, endidx): "Tab-complete psinject option values."