aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorLuca Deri <deri@ntop.org>2021-10-18 22:12:28 +0200
committerLuca Deri <deri@ntop.org>2021-10-18 22:12:28 +0200
commit7d3c3b23f8b9749690b8c5f345b7bc489b3666ac (patch)
tree5ea14ce668e2eb688bd5e2663f83b0aa6e25be88 /src/lib
parent9e97d20c25532f7e3ce6855d61494b09dcc2fcc4 (diff)
Implemented RDP over UDP dissection
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/protocols/rdp.c67
1 files changed, 54 insertions, 13 deletions
diff --git a/src/lib/protocols/rdp.c b/src/lib/protocols/rdp.c
index 6b3564e79..e7aa91173 100644
--- a/src/lib/protocols/rdp.c
+++ b/src/lib/protocols/rdp.c
@@ -27,6 +27,8 @@
#define NDPI_CURRENT_PROTO NDPI_PROTOCOL_RDP
+#define RDP_PORT 3389
+
#include "ndpi_api.h"
static void ndpi_int_rdp_add_connection(struct ndpi_detection_module_struct *ndpi_struct,
@@ -40,19 +42,58 @@ void ndpi_search_rdp(struct ndpi_detection_module_struct *ndpi_struct,
NDPI_LOG_DBG(ndpi_struct, "search RDP\n");
- if (packet->payload_packet_len > 10
- && get_u_int8_t(packet->payload, 0) > 0
- && get_u_int8_t(packet->payload, 0) < 4 && get_u_int16_t(packet->payload, 2) == ntohs(packet->payload_packet_len)
- && get_u_int8_t(packet->payload, 4) == packet->payload_packet_len - 5
- && get_u_int8_t(packet->payload, 5) == 0xe0
- && get_u_int16_t(packet->payload, 6) == 0 && get_u_int16_t(packet->payload, 8) == 0 && get_u_int8_t(packet->payload, 10) == 0) {
- NDPI_LOG_INFO(ndpi_struct, "found RDP\n");
- ndpi_int_rdp_add_connection(ndpi_struct, flow);
- ndpi_set_risk(ndpi_struct, flow, NDPI_DESKTOP_OR_FILE_SHARING_SESSION); /* Remote assistance */
- return;
- }
+ if (packet->tcp != NULL) {
+ if (packet->payload_packet_len > 10
+ && get_u_int8_t(packet->payload, 0) > 0
+ && get_u_int8_t(packet->payload, 0) < 4 && get_u_int16_t(packet->payload, 2) == ntohs(packet->payload_packet_len)
+ && get_u_int8_t(packet->payload, 4) == packet->payload_packet_len - 5
+ && get_u_int8_t(packet->payload, 5) == 0xe0
+ && get_u_int16_t(packet->payload, 6) == 0 && get_u_int16_t(packet->payload, 8) == 0 && get_u_int8_t(packet->payload, 10) == 0) {
+ NDPI_LOG_INFO(ndpi_struct, "found RDP\n");
+ rdp_found:
+ ndpi_int_rdp_add_connection(ndpi_struct, flow);
+ ndpi_set_risk(ndpi_struct, flow, NDPI_DESKTOP_OR_FILE_SHARING_SESSION); /* Remote assistance */
+ return;
+ }
- NDPI_EXCLUDE_PROTO(ndpi_struct, flow);
+ NDPI_EXCLUDE_PROTO(ndpi_struct, flow);
+ } else if(packet->udp != NULL) {
+ u_int16_t s_port = ntohs(packet->udp->source);
+ u_int16_t d_port = ntohs(packet->udp->dest);
+
+ if((packet->payload_packet_len >= 10) && ((s_port == RDP_PORT) || (d_port == RDP_PORT))) {
+ if(s_port == RDP_PORT) {
+ /* Server -> Client */
+ if(flow->l4.udp.rdp_from_srv_pkts == 0)
+ memcpy(flow->l4.udp.rdp_from_srv, packet->payload, 3), flow->l4.udp.rdp_from_srv_pkts = 1;
+ else {
+ if(memcmp(flow->l4.udp.rdp_from_srv, packet->payload, 3) != 0)
+ NDPI_EXCLUDE_PROTO(ndpi_struct, flow);
+ else {
+ flow->l4.udp.rdp_from_srv_pkts = 2 /* stage 2 */;
+
+ if(flow->l4.udp.rdp_to_srv_pkts == 2)
+ goto rdp_found;
+ }
+ }
+ } else {
+ /* Client -> Server */
+ if(flow->l4.udp.rdp_to_srv_pkts == 0)
+ memcpy(flow->l4.udp.rdp_to_srv, packet->payload, 3), flow->l4.udp.rdp_to_srv_pkts = 1;
+ else {
+ if(memcmp(flow->l4.udp.rdp_to_srv, packet->payload, 3) != 0)
+ NDPI_EXCLUDE_PROTO(ndpi_struct, flow);
+ else {
+ flow->l4.udp.rdp_to_srv_pkts = 2 /* stage 2 */;
+
+ if(flow->l4.udp.rdp_from_srv_pkts == 2)
+ goto rdp_found;
+ }
+ }
+ }
+ } else
+ NDPI_EXCLUDE_PROTO(ndpi_struct, flow);
+ }
}
@@ -61,7 +102,7 @@ void init_rdp_dissector(struct ndpi_detection_module_struct *ndpi_struct, u_int3
ndpi_set_bitmask_protocol_detection("RDP", ndpi_struct, detection_bitmask, *id,
NDPI_PROTOCOL_RDP,
ndpi_search_rdp,
- NDPI_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION,
+ NDPI_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION,
SAVE_DETECTION_BITMASK_AS_UNKNOWN,
ADD_TO_DETECTION_BITMASK);