windows/w: Print more info about sessions

This commit is contained in:
Oleksii Shevchuk 2019-04-11 23:24:16 +03:00
parent 2bad0e39db
commit 79fe03b52c
1 changed files with 128 additions and 2 deletions

View File

@ -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')