mirror of https://github.com/n1nj4sec/pupy.git
windows/w: Print more info about sessions
This commit is contained in:
parent
2bad0e39db
commit
79fe03b52c
|
@ -1,7 +1,7 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
from pupylib.PupyModule import config, PupyModule, PupyArgumentParser
|
from pupylib.PupyModule import config, PupyModule, PupyArgumentParser
|
||||||
from pupylib.PupyOutput import Color
|
from pupylib.PupyOutput import Color, Table
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
@ -10,11 +10,16 @@ __class_name__="WModule"
|
||||||
|
|
||||||
ADMINS = (r'NT AUTHORITY\SYSTEM', 'root')
|
ADMINS = (r'NT AUTHORITY\SYSTEM', 'root')
|
||||||
|
|
||||||
|
|
||||||
@config(cat="admin")
|
@config(cat="admin")
|
||||||
class WModule(PupyModule):
|
class WModule(PupyModule):
|
||||||
""" list terminal sessions """
|
""" list terminal sessions """
|
||||||
|
|
||||||
dependencies = ['pupyps']
|
dependencies = {
|
||||||
|
'all': ['pupyps'],
|
||||||
|
'windows': ['pupwinutils.security']
|
||||||
|
}
|
||||||
|
|
||||||
is_module=False
|
is_module=False
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -22,6 +27,127 @@ class WModule(PupyModule):
|
||||||
cls.arg_parser = PupyArgumentParser(prog="w", description=cls.__doc__)
|
cls.arg_parser = PupyArgumentParser(prog="w", description=cls.__doc__)
|
||||||
|
|
||||||
def run(self, args):
|
def run(self, args):
|
||||||
|
if self.client.is_windows():
|
||||||
|
EnumerateWTS = self.client.remote(
|
||||||
|
'pupwinutils.security', 'EnumerateWTS')
|
||||||
|
|
||||||
|
try:
|
||||||
|
wts_sessions = EnumerateWTS()
|
||||||
|
|
||||||
|
cols = ['#']
|
||||||
|
|
||||||
|
sessions = wts_sessions.keys()
|
||||||
|
|
||||||
|
cols.extend(sessions)
|
||||||
|
|
||||||
|
records = []
|
||||||
|
|
||||||
|
session_colors = {}
|
||||||
|
|
||||||
|
state = {'#': 'State'}
|
||||||
|
user = {'#': 'User'}
|
||||||
|
client_info = {'#': 'Client'}
|
||||||
|
client_res = {'#': 'Res'}
|
||||||
|
time_info = {
|
||||||
|
k:{} for k in (
|
||||||
|
'LastInputTime', 'ConnectTime',
|
||||||
|
'DisconnectTime', 'LogonTime'
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
for session in sessions:
|
||||||
|
session_state = wts_sessions[session]['state']
|
||||||
|
session_info = wts_sessions[session]['info']
|
||||||
|
session_client = wts_sessions[session]['client']
|
||||||
|
|
||||||
|
current_time = datetime.now()
|
||||||
|
disconnect_time = None
|
||||||
|
current_time = None
|
||||||
|
input_time = None
|
||||||
|
|
||||||
|
if session_info['CurrentTime']:
|
||||||
|
current_time = datetime.utcfromtimestamp(
|
||||||
|
session_info['CurrentTime'])
|
||||||
|
|
||||||
|
for time_info_record in time_info:
|
||||||
|
value = session_info[time_info_record]
|
||||||
|
if value:
|
||||||
|
value = datetime.utcfromtimestamp(value)
|
||||||
|
if time_info_record == 'DisconnectTime':
|
||||||
|
disconnect_time = value
|
||||||
|
elif time_info_record == 'LastInputTime':
|
||||||
|
input_time = value
|
||||||
|
elif time_info_record == 'CurrentTime':
|
||||||
|
current_time = value
|
||||||
|
else:
|
||||||
|
value = ''
|
||||||
|
|
||||||
|
time_info[time_info_record][session] = value
|
||||||
|
|
||||||
|
if session_state == 'Disconnected':
|
||||||
|
color = 'grey'
|
||||||
|
elif session_state == 'Listen':
|
||||||
|
color = 'cyan'
|
||||||
|
elif session_state == 'Active':
|
||||||
|
idle = None
|
||||||
|
if input_time:
|
||||||
|
idle = (current_time - input_time).total_seconds()
|
||||||
|
|
||||||
|
if idle is not None and idle < 10 * 60:
|
||||||
|
color = 'cyan'
|
||||||
|
elif disconnect_time > current_time:
|
||||||
|
color = 'lightgrey'
|
||||||
|
|
||||||
|
session_colors[session] = color
|
||||||
|
|
||||||
|
view_port = ''
|
||||||
|
if session_client['HRes'] and session_client['VRes']:
|
||||||
|
view_port = '{}x{}'.format(
|
||||||
|
session_client['HRes'], session_client['VRes'])
|
||||||
|
|
||||||
|
client_line = ''
|
||||||
|
if session_client['ClientName'] and session_client['ClientProductId']:
|
||||||
|
client_line = '{}\\{}@{} ({}/{} {}.{})'.format(
|
||||||
|
session_client['Domain'], session_client['UserName'],
|
||||||
|
session_client['ClientAddress'],
|
||||||
|
session_client['ClientName'], session_client['DeviceIdD'],
|
||||||
|
session_client['ClientProductId'], session_client['ClientBuildNumber']
|
||||||
|
)
|
||||||
|
|
||||||
|
client_info[session] = Color(client_line, color)
|
||||||
|
client_res[session] = Color(view_port, color)
|
||||||
|
|
||||||
|
state[session] = Color(session_state, color)
|
||||||
|
|
||||||
|
username = session_info['UserName']
|
||||||
|
domain = session_info['Domain']
|
||||||
|
if username:
|
||||||
|
if domain:
|
||||||
|
username = domain + '\\' + username
|
||||||
|
|
||||||
|
user[session] = Color(username, color)
|
||||||
|
|
||||||
|
records.append(state)
|
||||||
|
records.append(user)
|
||||||
|
for time_info_type in time_info:
|
||||||
|
record = {'#': time_info_type}
|
||||||
|
record.update({
|
||||||
|
session:Color(
|
||||||
|
str(time_info[time_info_type][session]).rsplit('.')[0]
|
||||||
|
if time_info[time_info_type][session] else '',
|
||||||
|
session_colors[session]
|
||||||
|
) for session in sessions
|
||||||
|
})
|
||||||
|
records.append(record)
|
||||||
|
records.append(client_info)
|
||||||
|
records.append(client_res)
|
||||||
|
|
||||||
|
self.log(Table(records, cols))
|
||||||
|
return
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
try:
|
try:
|
||||||
users = self.client.remote('pupyps', 'users')
|
users = self.client.remote('pupyps', 'users')
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue