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.

Artikli relatati