blob: ffe9669cb6a78b6c643077193ed449bb0d3a3850 [file] [log] [blame]
From e60fdcffd2bbb41c587828b97d077d8d6a2c70b9 Mon Sep 17 00:00:00 2001
From: Denton Gentry <dgentry@google.com>
Date: Sun, 4 May 2014 21:49:41 -0700
Subject: [PATCH] SSDP fingerprinting support
The SERVER identification in SSDP could be useful for
client OS fingerprinting. Have minissdpd store the server
entries, and add a new query type (type 5) over the unix
domain socket to retrieve them.
---
minissdpd.c | 28 +++++++++++++++++++++++-----
1 file changed, 23 insertions(+), 5 deletions(-)
diff --git a/minissdpd.c b/minissdpd.c
index 520a6c5..dccb694 100644
--- a/minissdpd.c
+++ b/minissdpd.c
@@ -51,11 +51,13 @@ struct header {
#define HEADER_NT 0
#define HEADER_USN 1
#define HEADER_LOCATION 2
+#define HEADER_SERVER 3
+#define HEADER_MAX 4
struct device {
struct device * next;
time_t t; /* validity time */
- struct header headers[3]; /* NT, USN and LOCATION headers */
+ struct header headers[HEADER_MAX]; /* NT, USN, LOCATION, SERVER hdrs */
char data[];
};
@@ -131,7 +133,7 @@ updateDevice(const struct header * headers, time_t t)
char * pc;
int i;
p = malloc( sizeof(struct device)
- + headers[0].l+headers[1].l+headers[2].l );
+ + headers[0].l+headers[1].l+headers[2].l+headers[3].l );
if(!p) {
syslog(LOG_ERR, "updateDevice(): cannot allocate memory");
return -1;
@@ -139,7 +141,7 @@ updateDevice(const struct header * headers, time_t t)
p->next = devlist;
p->t = t;
pc = p->data;
- for(i = 0; i < 3; i++)
+ for(i = 0; i < HEADER_MAX; i++)
{
p->headers[i].p = pc;
p->headers[i].l = headers[i].l;
@@ -330,7 +332,7 @@ ParseSSDPPacket(int s, const char * p, ssize_t n,
const char * lineend;
const char * nameend;
const char * valuestart;
- struct header headers[3];
+ struct header headers[HEADER_MAX];
int i, r = 0;
int methodlen;
int nts = -1;
@@ -392,6 +394,8 @@ ParseSSDPPacket(int s, const char * p, ssize_t n,
else if(m==11 && 0==strncasecmp(valuestart, "ssdp:update", 11))
nts = NTS_SSDP_UPDATE;
}
+ else if(l==6 && 0==strncasecmp(linestart, "server", 6))
+ i = HEADER_SERVER;
else if(l==8 && 0==strncasecmp(linestart, "location", 8))
i = HEADER_LOCATION;
else if(l==13 && 0==strncasecmp(linestart, "cache-control", 13)) {
@@ -569,6 +573,7 @@ void processRequest(struct reqelem * req)
case 1:
case 2:
case 3:
+ case 5:
while(d && (nrep < 255)) {
if(d->t < t) {
syslog(LOG_INFO, "outdated device");
@@ -598,6 +603,19 @@ void processRequest(struct reqelem * req)
memcpy(rp, d->headers[HEADER_USN].p, d->headers[HEADER_USN].l);
rp += d->headers[HEADER_USN].l;
nrep++;
+ } else if (type==5) {
+ /* response :
+ * 1 - Location
+ * 2 - server */
+ m = d->headers[HEADER_LOCATION].l;
+ CODELENGTH(m, rp);
+ memcpy(rp, d->headers[HEADER_LOCATION].p, d->headers[HEADER_LOCATION].l);
+ rp += d->headers[HEADER_LOCATION].l;
+ m = d->headers[HEADER_SERVER].l;
+ CODELENGTH(m, rp);
+ memcpy(rp, d->headers[HEADER_SERVER].p, d->headers[HEADER_SERVER].l);
+ rp += d->headers[HEADER_SERVER].l;
+ nrep++;
}
}
d = d->next;
--
1.9.1.423.g4596e3a