Liema indirizz jirrapporta Windows għal sessjoni RDP?
Il-API WTS tirritorna indirizz tal-klijent irrappurtat għal sessjoni RDP waħda, u r-reġistru le. Staqsi l-ID tas-sessjoni t-tajba u iddekodifika IPv4 jew IPv6 b’mod korrett.
Sessjoni RDP teħtieġ indirizz tal-klijent, u s-sorsi ovvji ma jaqblux. CLIENTNAME jagħti isem tal-kompjuter, ir-reġistru jżomm valuri minn sessjonijiet oħra, u l-parti l-oħra tas-socket tista’ tkun indirizz ta’ gateway jew NAT minflok il-klijent. Windows tabilħaqq jesponi indirizz tal-klijent irrappurtat għal kull sessjoni, imma trid tistaqsi s-sessjoni t-tajba u tiddekodifika t-tweġiba b’mod korrett.
Ankra t-tfittxija ma’ sessjoni waħda
Ibda bis-sessjoni, mhux bil-persuna. Host RDP ta’ Windows jista’ jġorr diversi sessjonijiet għal kont wieħed, u indirizz li ntwera qabel qabda mill-ġdid jista’ ma jibqax jaqbel mal-ħolqa attiva. Innota l-ID tas-sessjoni, l-utent u l-ħin tal-osservazzjoni flimkien. L-ID tas-sessjoni hija l-muftieħ li tistenna l-API, u hija l-valur li jżomm żewġ sessjonijiet milli jiġu mħawda.
Fuq il-host, l-għodod tas-sessjoni installati jelenkaw dak li jeżisti; uża l-veduta amministrattiva biss meta jkollok dritt għaliha. Ikkonferma l-ID magħżula eżatt qabel il-mistoqsija, għax ID riċiklat irodd id-dejta ta’ sessjoni oħra.
qwinsta
Sejjaħ WTSQuerySessionInformationW għal dik l-ID
Il-API tat-Terminal Services twieġeb il-mistoqsija bil-klassi tal-informazzjoni 14, WTSClientAddress. Wrapper żgħir ta’ ctypes biżżejjed fuq Windows, u jevita li jaqra l-hive ta’ utent ieħor. Il-kodiċi hawn taħt jieħu ID tas-sessjoni espliċita u jistaqsi lill-host lokali.
import ctypes
import ipaddress
import socket
from ctypes import wintypes
class WTS_CLIENT_ADDRESS(ctypes.Structure):
_fields_ = [("AddressFamily", wintypes.DWORD),
("Address", ctypes.c_ubyte * 20)]
wts = ctypes.WinDLL("Wtsapi32", use_last_error=True)
query = wts.WTSQuerySessionInformationW
query.argtypes = [wintypes.HANDLE, wintypes.DWORD, ctypes.c_int,
ctypes.POINTER(ctypes.c_void_p), ctypes.POINTER(wintypes.DWORD)]
query.restype = wintypes.BOOL
free = wts.WTSFreeMemory
free.argtypes = [ctypes.c_void_p]
def client_address(session_id):
buf = ctypes.c_void_p()
size = wintypes.DWORD()
if not query(None, session_id, 14, ctypes.byref(buf), ctypes.byref(size)):
raise ctypes.WinError(ctypes.get_last_error())
try:
if size.value < ctypes.sizeof(WTS_CLIENT_ADDRESS):
raise RuntimeError("short WTS buffer")
value = ctypes.cast(buf, ctypes.POINTER(WTS_CLIENT_ADDRESS)).contents
raw = bytes(value.Address)
if value.AddressFamily == socket.AF_INET:
addr = ipaddress.ip_address(raw[2:6])
elif value.AddressFamily == socket.AF_INET6:
addr = ipaddress.ip_address(raw[:16])
else:
return None
return None if addr.is_unspecified else str(addr)
finally:
free(buf)
Għaddi l-ID tas-sessjoni bħala numru sħiħ li għadek kemm ivverifikajt, u żomm il-manku tas-server null għall-magna lokali. Ittratta sejħa li falliet bħala żball u mhux bħala indirizz nieqes, għax it-tnejn iwasslu għal konklużjonijiet differenti. Mistoqsija dwar sessjoni ta’ utent ieħor teħtieġ il-permess Query Information xieraq, għalhekk ħaddem l-għodda taħt kont li ngħata dan il-permess minflok ma tgħolli l-privileġġi ad hoc. Il-buffer irritornat jappartjeni lill-API u għandu jiġi rilaxxat ukoll meta d-dekodifika tfalli.
Iddekodifika l-familja, imbagħad irrilaxxa l-buffer
L-istruttura mhijiex string IP. Il-qasam tal-familja jiddeċiedi kif jinqraw l-għoxrin byte tal-indirizz: IPv4 jibda fl-offset tnejn, filwaqt li IPv6 jibda fl-offset żero. L-indirizz mhux speċifikat ifisser li l-klijent ma rrappurtax wieħed, li mhux l-istess bħal string vojt. Konnessjonijiet Remote Desktop Gateway huma dokumentati bħala każ fejn l-indirizz mhux disponibbli, għalhekk sessjoni permezz ta’ gateway ma tirrappurtax xejn utli dwar l-indirizz reali tal-klijent. Imbagħad il-korrelazzjoni trid tmur għar-rekords tal-gateway stess.
Ipprintja l-familja ħdejn l-indirizz waqt id-debugging, għax diskrepanza bejn it-tnejn hija l-kawża tas-soltu ta’ valur plawżibbli imma żbaljat. Irrilaxxa l-buffer b’WTSFreeMemory f’blokk finally sabiex eċċezzjoni ma tnixxihx.
Issepara l-indirizz irrappurtat mill-prova
Indirizz tal-klijent irrappurtat huwa dikjarazzjoni li tipprovdi l-klijent, mhux osservazzjoni affidabbli. Mhuwiex il-parti l-oħra tat-TCP, mhijiex it-tabella tal-kiri tal-gateway VPN, u mhuwiex l-indirizz pubbliku tal-klijent. Meta l-mistoqsija vera hija liema kiri VPN jappartjeni lil persuna, korrela r-rekord tas-sessjoni awtentikat tas-server VPN fl-istess ħin. Meta l-mistoqsija hija liema sors wasal għas-semmiegħ, aqra t-tabella tal-konnessjonijiet jew il-logs permessi fuq in-naħa tas-server.
Żomm dawn il-valuri ttikkettati b’mod separat fi kwalunkwe għodda ta’ appoġġ. Riżultat WTS nieqes għandu jibqa’ nieqes minflok ma jaqa’ lura għal valur tar-reġistru arbitrarju minn sessjoni oħra. Irreġistra l-ID tas-sessjoni ħdejn l-indirizz, għax l-istess utent jista’ jerġa’ jikkonnettja u jirċievi valur ġdid. La l-isem tal-klijent u lanqas l-indirizz irrappurtat mhumiex prova suffiċjenti biex tingħata aċċess.