Windows RDP сессиясы үчүн кайсы даректи билдирет?
WTS API бир RDP сессиясы үчүн билдирилген кардар дарегин кайтарат, реестр болсо кайтарбайт. Туура сессия ID сурап, IPv4 же IPv6 туура декоддонуз.
RDP сессиясына кардар дареги керек, ал эми айкын булактар макул болушпайт. CLIENTNAME компьютердин атын берет, реестр башка сессиялардын маанилерин сактайт, ал эми сокеттин каршы тарабы кардар эмес, шлюз же NAT дареги болушу мүмкүн. Windows ар бир сессия үчүн билдирилген кардар дарегин чын эле сунуштайт, бирок туура сессияны сурап, жоопту туура декоддоо керек.
Издөөнү бир сессияга байлаңыз
Адамдан эмес, сессиядан баштаңыз. Windows RDP хосту бир эсеп үчүн бир нече сессияны кармай алат, ал эми кайра туташуудан мурун көрүлгөн дарек активдүү байланышка эми туура келбеши мүмкүн. Сессиянын ID син, колдонуучуну жана байкоо убактысын чогуу жазыңыз. Сессиянын ID си API күткөн ачкыч жана эки сессияны чаташтырбоочу маани да ошол.
Хостто орнотулган сессия куралдары эмне бар экенин тизмелейт; административдик көрүнүштү ага укугуңуз болгондо гана колдонуңуз. Тандалган ID ди суроодон дароо мурун ырастаңыз, анткени кайра колдонулган ID башка сессиянын дайындарын кайтарат.
qwinsta
Ошол ID үчүн WTSQuerySessionInformationW чакырыңыз
Terminal Services API суроого 14-маалымат классы менен жооп берет, WTSClientAddress. Windows то кичине ctypes каптамасы жетиштүү жана ал башка колдонуучунун hive ин окуудан сактайт. Төмөнкү код ачык сессия ID син кабыл алып, жергиликтүү хосттон сурайт.
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)
Жаңы эле текшерген бүтүн сандагы сессия ID син бериңиз жана жергиликтүү машина үчүн нөлдүк сервер дескрипторун сактаңыз. Ийгиликсиз чакырууну жок дарек катары эмес, ката катары кабыл алыңыз, анткени экөө ар башка тыянактарга алып барат. Башка колдонуучунун сессиясын суроо тиешелүү Query Information укугун талап кылат, ошондуктан куралды ad hoc укук көтөрүүнүн ордуна ошол укук берилген эсеп менен иштетиңиз. Кайтарылган буфер API ге таандык жана декоддоо ийгиликсиз болсо да бошотулушу керек.
Үй-бүлөнү декоддоп, анан буферди бошотуңуз
Түзүлүш IP сабы эмес. Анын үй-бүлө талаасы жыйырма дарек байтынын кантип окулаарын аныктайт: IPv4 эки жылышуудан башталат, ал эми IPv6 нөл жылышуудан башталат. Аныкталбаган дарек кардар аны билдирбегенин билдирет, бул бош сап менен бирдей эмес. Remote Desktop Gateway туташуулары дарек жеткиликсиз болгон учур катары документтелген, ошондуктан шлюз аркылуу өткөн сессия кардардын чыныгы дареги жөнүндө пайдалуу эч нерсе билдирбейт. Андан кийин корреляция шлюздун өз жазууларына өтүшү керек.
Оңдоо учурунда үй-бүлөнү даректин жанына басып чыгарыңыз, анткени экөөнүн ортосундагы дал келбестик ишенимдүү көрүнгөн, бирок туура эмес маанинин кадимки себеби. Буферди finally блогунда WTSFreeMemory аркылуу бошотуңуз, ошондо өзгөчөлүк аны агызбайт.
Билдирилген даректи далилден ажыратыңыз
Билдирилген кардар дареги — кардар сунуштаган билдирүү, ишенимдүү байкоо эмес. Ал TCP нин каршы тарабы эмес, VPN шлюзунун ижара таблицасы эмес жана кардардын ачык дареги эмес. Чыныгы суроо кайсы VPN ижарасы адамга таандык экенин билүү болсо, ошол эле убакта VPN серверинин аутентификацияланган сессия жазуусун корреляциялаңыз. Суроо кайсы булак угуучуга жеткенин билүү болсо, туташуу таблицасын же уруксат берилген сервер тараптагы журналдарды окуңуз.
Бул маанилерди каалаган колдоо куралында өзүнчө белгиленген абалда кармаңыз. Жок WTS натыйжасы башка сессиядан алынган каалаган реестр маанисине кайтпай, жок бойдон калышы керек. Сессиянын ID син даректин жанында журналга жазыңыз, анткени ошол эле колдонуучу кайра туташып, жаңы маани ала алат. Кардардын аты да, билдирилген дарек да кирүү берүү үчүн жетиштүү далил эмес.