1# SPDX-License-Identifier: GPL-2.0-only
2# This file is part of Scapy
3# See https://scapy.net/ for more information
4# Copyright (C) Gabriel Potter
5
6"""
7Very partial RPC definitions for the following interfaces:
8- srvsvc (v3.0): 4B324FC8-1670-01D3-1278-5A47BF6EE188
9"""
10
11import uuid
12
13from scapy.fields import StrFixedLenField
14from scapy.layers.dcerpc import (
15 register_dcerpc_interface,
16 DceRpcOp,
17 NDRConfPacketListField,
18 NDRConfVarStrNullFieldUtf16,
19 NDRFullPointerField,
20 NDRIntField,
21 NDRPacket,
22 NDRPacketField,
23 NDRUnionField,
24)
25
26
27class LPSHARE_INFO_1(NDRPacket):
28 ALIGNMENT = (4, 8)
29 fields_desc = [
30 NDRFullPointerField(
31 NDRConfVarStrNullFieldUtf16("shi1_netname", ""), deferred=True
32 ),
33 NDRIntField("shi1_type", 0),
34 NDRFullPointerField(
35 NDRConfVarStrNullFieldUtf16("shi1_remark", ""), deferred=True
36 ),
37 ]
38
39
40class SHARE_INFO_1_CONTAINER(NDRPacket):
41 ALIGNMENT = (4, 8)
42 fields_desc = [
43 NDRIntField("EntriesRead", None, size_of="Buffer"),
44 NDRFullPointerField(
45 NDRConfPacketListField(
46 "Buffer",
47 [LPSHARE_INFO_1()],
48 LPSHARE_INFO_1,
49 count_from=lambda pkt: pkt.EntriesRead,
50 ),
51 deferred=True,
52 ),
53 ]
54
55
56class LPSHARE_ENUM_STRUCT(NDRPacket):
57 ALIGNMENT = (4, 8)
58 fields_desc = [
59 NDRIntField("Level", 0),
60 NDRUnionField(
61 [
62 (
63 NDRFullPointerField(
64 NDRPacketField(
65 "ShareInfo",
66 SHARE_INFO_1_CONTAINER(),
67 SHARE_INFO_1_CONTAINER,
68 ),
69 deferred=True,
70 ),
71 (
72 (lambda pkt: getattr(pkt, "Level", None) == 1),
73 (lambda _, val: val.tag == 1),
74 ),
75 ),
76 ],
77 StrFixedLenField("ShareInfo", "", length=0),
78 align=(4, 8),
79 switch_fmt=("L", "L"),
80 ),
81 ]
82
83
84class NetrShareEnum_Request(NDRPacket):
85 fields_desc = [
86 NDRFullPointerField(NDRConfVarStrNullFieldUtf16("ServerName", "")),
87 NDRPacketField("InfoStruct", LPSHARE_ENUM_STRUCT(), LPSHARE_ENUM_STRUCT),
88 NDRIntField("PreferedMaximumLength", 0),
89 NDRFullPointerField(NDRIntField("ResumeHandle", 0)),
90 ]
91
92
93class NetrShareEnum_Response(NDRPacket):
94 fields_desc = [
95 NDRPacketField("InfoStruct", LPSHARE_ENUM_STRUCT(), LPSHARE_ENUM_STRUCT),
96 NDRIntField("TotalEntries", 0),
97 NDRFullPointerField(NDRIntField("ResumeHandle", 0)),
98 NDRIntField("status", 0),
99 ]
100
101
102class NetrShareGetInfo_Request(NDRPacket):
103 fields_desc = [
104 NDRFullPointerField(NDRConfVarStrNullFieldUtf16("ServerName", "")),
105 NDRConfVarStrNullFieldUtf16("NetName", ""),
106 NDRIntField("Level", 0),
107 ]
108
109
110class NetrShareGetInfo_Response(NDRPacket):
111 fields_desc = [
112 NDRUnionField(
113 [
114 (
115 NDRFullPointerField(
116 NDRPacketField("ShareInfo", LPSHARE_INFO_1(), LPSHARE_INFO_1)
117 ),
118 (
119 (lambda pkt: getattr(pkt, "Level", None) == 1),
120 (lambda _, val: val.tag == 1),
121 ),
122 ),
123 ],
124 StrFixedLenField("ShareInfo", "", length=0),
125 align=(4, 8),
126 switch_fmt=("L", "L"),
127 ),
128 NDRIntField("status", 0),
129 ]
130
131
132class LPSERVER_INFO_101(NDRPacket):
133 ALIGNMENT = (4, 8)
134 fields_desc = [
135 NDRIntField("sv101_platform_id", 0),
136 NDRFullPointerField(
137 NDRConfVarStrNullFieldUtf16("sv101_name", ""), deferred=True
138 ),
139 NDRIntField("sv101_version_major", 0),
140 NDRIntField("sv101_version_minor", 0),
141 NDRIntField("sv101_type", 0),
142 NDRFullPointerField(
143 NDRConfVarStrNullFieldUtf16("sv101_comment", ""), deferred=True
144 ),
145 ]
146
147
148class NetrServerGetInfo_Request(NDRPacket):
149 fields_desc = [
150 NDRFullPointerField(NDRConfVarStrNullFieldUtf16("ServerName", "")),
151 NDRIntField("Level", 0),
152 ]
153
154
155class NetrServerGetInfo_Response(NDRPacket):
156 fields_desc = [
157 NDRUnionField(
158 [
159 (
160 NDRFullPointerField(
161 NDRPacketField(
162 "ServerInfo", LPSERVER_INFO_101(), LPSERVER_INFO_101
163 )
164 ),
165 (
166 (lambda pkt: getattr(pkt, "Level", None) == 101),
167 (lambda _, val: val.tag == 101),
168 ),
169 ),
170 ],
171 StrFixedLenField("ServerInfo", "", length=0),
172 align=(4, 8),
173 switch_fmt=("L", "L"),
174 ),
175 NDRIntField("status", 0),
176 ]
177
178
179SRVSVC_OPNUMS = {
180 15: DceRpcOp(NetrShareEnum_Request, NetrShareEnum_Response),
181 16: DceRpcOp(NetrShareGetInfo_Request, NetrShareGetInfo_Response),
182 21: DceRpcOp(NetrServerGetInfo_Request, NetrServerGetInfo_Response),
183}
184register_dcerpc_interface(
185 name="srvsvc",
186 uuid=uuid.UUID("4B324FC8-1670-01D3-1278-5A47BF6EE188"),
187 version="3.0",
188 opnums=SRVSVC_OPNUMS,
189)