summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/rpc_epmapper.h4
-rw-r--r--source3/rpc_parse/parse_epmapper.c45
-rw-r--r--source3/rpcclient/cmd_epmapper.c5
3 files changed, 50 insertions, 4 deletions
diff --git a/source3/include/rpc_epmapper.h b/source3/include/rpc_epmapper.h
index 57ac8e2522..1b5b6b1876 100644
--- a/source3/include/rpc_epmapper.h
+++ b/source3/include/rpc_epmapper.h
@@ -30,7 +30,8 @@
#define EPM_FLOOR_RPC 0x0b /* tower is for connection-oriented rpc */
#define EPM_FLOOR_TCP 0x07 /* floor contains tcp port number */
#define EPM_FLOOR_IP 0x09 /* floor contains IP address */
-#define EPM_FLOOR_NMPIPES 0x10 /* floor contains remote named pipe name */
+#define EPM_FLOOR_NMPIPES 0x0f /* floor contains remote named pipe name */
+#define EPM_FLOOR_LRPC 0x10 /* floor contains local named pipe name */
#define EPM_FLOOR_NETBIOS 0x11 /* floor contains netbios address */
#define EPM_FLOOR_NETBEUI 0x12 /* floor contains netbeui address */
#define EPM_FLOOR_SOCKET 0x20
@@ -63,6 +64,7 @@ typedef struct
struct {
uint8 addr[4];
} ip;
+ char string[MAXHOSTNAMELEN+3]; /* hostname + \\ + null term */
} rhs;
} EPM_FLOOR;
diff --git a/source3/rpc_parse/parse_epmapper.c b/source3/rpc_parse/parse_epmapper.c
index 368ea319bd..2bdb755deb 100644
--- a/source3/rpc_parse/parse_epmapper.c
+++ b/source3/rpc_parse/parse_epmapper.c
@@ -29,6 +29,8 @@
BOOL epm_io_handle(const char *desc, EPM_HANDLE *handle, prs_struct *ps,
int depth)
{
+ if (!prs_align(ps))
+ return False;
if (!prs_uint8s(False, "data", ps, depth, handle->data,
sizeof(handle->data)))
@@ -67,6 +69,11 @@ NTSTATUS init_epm_floor(EPM_FLOOR *floor, uint8 protocol)
case EPM_FLOOR_IP:
floor->rhs.length = sizeof(floor->rhs.ip.addr);
break;
+ case EPM_FLOOR_NMPIPES:
+ case EPM_FLOOR_LRPC:
+ case EPM_FLOOR_NETBIOS:
+ floor->rhs.length = strlen(floor->rhs.string) + 1;
+ break;
default:
break;
}
@@ -114,6 +121,33 @@ NTSTATUS init_epm_floor_ip(EPM_FLOOR *floor, uint8 addr[4])
}
/*******************************************************************
+ inits an EPM_FLOOR structure for named pipe
+********************************************************************/
+NTSTATUS init_epm_floor_np(EPM_FLOOR *floor, const char *pipe_name)
+{
+ safe_strcpy(floor->rhs.string, pipe_name, sizeof(floor->rhs.string)-1);
+ return init_epm_floor(floor, EPM_FLOOR_NMPIPES);
+}
+
+/*******************************************************************
+ inits an EPM_FLOOR structure for named pipe
+********************************************************************/
+NTSTATUS init_epm_floor_lrpc(EPM_FLOOR *floor, const char *pipe_name)
+{
+ safe_strcpy(floor->rhs.string, pipe_name, sizeof(floor->rhs.string)-1);
+ return init_epm_floor(floor, EPM_FLOOR_LRPC);
+}
+
+/*******************************************************************
+ inits an EPM_FLOOR structure for named pipe
+********************************************************************/
+NTSTATUS init_epm_floor_nb(EPM_FLOOR *floor, char *host_name)
+{
+ safe_strcpy(floor->rhs.string, host_name, sizeof(floor->rhs.string)-1);
+ return init_epm_floor(floor, EPM_FLOOR_NETBIOS);
+}
+
+/*******************************************************************
reads and writes EPM_FLOOR.
********************************************************************/
BOOL epm_io_floor(const char *desc, EPM_FLOOR *floor,
@@ -156,6 +190,14 @@ BOOL epm_io_floor(const char *desc, EPM_FLOOR *floor,
sizeof(floor->rhs.ip.addr)))
return False;
break;
+ case EPM_FLOOR_NMPIPES:
+ case EPM_FLOOR_LRPC:
+ case EPM_FLOOR_NETBIOS:
+ if (!prs_uint8s(False, "string", ps, depth,
+ floor->rhs.string,
+ floor->rhs.length))
+ return False;
+ break;
default:
break;
}
@@ -227,9 +269,6 @@ BOOL epm_io_tower(const char *desc, EPM_TOWER *tower,
return False;
}
- if (!prs_uint8("unknown", ps, depth, &tower->unknown))
- return False;
-
return True;
}
diff --git a/source3/rpcclient/cmd_epmapper.c b/source3/rpcclient/cmd_epmapper.c
index 280188d875..e2eecb6f04 100644
--- a/source3/rpcclient/cmd_epmapper.c
+++ b/source3/rpcclient/cmd_epmapper.c
@@ -48,6 +48,11 @@ static NTSTATUS cmd_epm_map(struct cli_state *cli,
init_epm_floor_uuid(&floors[0], &if_uuid, 4);
init_epm_floor_uuid(&floors[1], &syn_uuid, 2);
init_epm_floor_rpc(&floors[2]);
+
+ /* sample for netbios named pipe query
+ init_epm_floor_np(&floors[3], "\\PIPE\\lsass");
+ init_epm_floor_nb(&floors[4], "\\\\psflinux");
+ */
init_epm_floor_tcp(&floors[3], 135);
init_epm_floor_ip(&floors[4], addr);
towers = talloc(mem_ctx, sizeof(EPM_TOWER));