

{"id":11865,"date":"2019-02-03T15:32:48","date_gmt":"2019-02-03T20:32:48","guid":{"rendered":"https:\/\/rud.is\/b\/?p=11865"},"modified":"2019-02-03T21:14:59","modified_gmt":"2019-02-04T02:14:59","slug":"send-udp-probes-with-payloads-and-receive-process-responses-in-r","status":"publish","type":"post","link":"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/","title":{"rendered":"Send UDP Probes (with payloads) and Receive\/Process Responses in R"},"content":{"rendered":"<p>We worked pretty hard over at $DAYJOB on helping to quantify and remediate a fairly <a href=\"https:\/\/blog.rapid7.com\/2019\/02\/01\/ubiquiti-discovery-service-exposures\/\">significant configuration weakness in Ubiquiti network work gear attached to the internet<\/a>.<\/p>\n<p>Ubiquiti network gear &mdash; routers, switches, wireless access points, etc. &mdash; are enterprise grade components and are a joy to work with. Our home network is liberally populated with this gear. Ubiquiti nodes have a &#8220;discovery service&#8221; so they can be identified and brought under management of a controller. About half-a-million folks neglected to either join a controller or just left the discovery service running and accessible via the internet interface. ?<\/p>\n<p>We use a myriad of tech to perform discovery and content scans on the internet, everything from <a href=\"https:\/\/zmap.io\/\">zmap<\/a> to Python and other bits in-between. It&#8217;s super easy to craft a quick UDP client in Ruby or Python to talk to nodes that speak UDP and get a response. Unfortunately, R only has built-in <code>connection<\/code> support for TCP communications. This makes a ton of sense given how R came to be and the primary uses of it for the bulk of its existence. I wanted to be able to test my own, non-internet-exposed Ubiquiti gear and do it from R, thus begat the <a href=\"https:\/\/git.sr.ht\/~hrbrmstr\/udpprobe\"><code>udpprobe<\/code>?<\/a> package.<\/p>\n<p>You can install it via your social coding platform of choice (after checking out the source code since you shouldn&#8217;t blindly trust any internet git repo):<\/p>\n<pre><code class=\"language-r\">devtools::install_git(\"https:\/\/git.sr.ht\/~hrbrmstr\/udpprobe\")\n# or\ndevtools::install_gitlab(\"hrbrmstr\/udpprobe\")\n# or\ndevtools::install_github(\"hrbrmstr\/udpprobe\")\n<\/code><\/pre>\n<p>Some <strong>good news<\/strong> for you <em>Windows<\/em> folks is that it <em>actually works on your legacy OS as well<\/em>!<\/p>\n<h3>What can one do with this package?<\/h3>\n<p>I&#8217;m glad you asked.<\/p>\n<p>We&#8217;ll get to the Ubiquiti portion in a bit. First, we&#8217;ll hand craft the payload for a DNS lookup for the address of <code>example.com<\/code>. You make thousands of DNS lookups every day but likely never poked at what they really look like. These lookups are still generally performed over UDP and the protocol and record formats are [thoroughly documented]. Here&#8217;s what that <code>A<\/code> record request for <code>example.com<\/code> looks like:<\/p>\n<pre><code class=\"language-r\">library(udpprobe)\n\nc(\n  0xaa, 0xaa, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, \n  0x00, 0x00, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, \n  0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01\n) -&gt; dns_req\n<\/code><\/pre>\n<p>The string <code>example.com<\/code> is <code>0x65 0x78 0x61 0x6d 0x70 0x6c 0x65 0x2e 0x63 0x6f 0x6d<\/code> and you can find it at position 14 in the raw vector (<em>technically<\/em> it&#8217;s still a numeric vector but I made it in hex so it&#8217;s easier to refer to it that way). Right after it is a terminator then a 2 byte sequence to tell the DNS server we&#8217;re looking for an <code>A<\/code> record. Let&#8217;s make Google do some work:<\/p>\n<pre><code class=\"language-r\">(resp &lt;- udp_send_payload(\"8.8.8.8\", 53, dns_req))\n##  [1] aa aa 81 80 00 01 00 01 00 00 00 00 07 65 78 61 6d 70\n## [19] 6c 65 03 63 6f 6d 00 00 01 00 01 c0 0c 00 01 00 01 00\n## [37] 00 0c 47 00 04 5d b8 d8 22\n<\/code><\/pre>\n<p>You should be able to find <code>example.com<\/code> in there again if you look closely. We&#8217;ll assume the response was OK and yank out the IP address it sent back:<\/p>\n<pre><code class=\"language-r\">paste0(as.integer(tail(resp, 4)), collapse = \".\")\n## [1] \"93.184.216.34\"\n<\/code><\/pre>\n<p>and, verify it with Jeroen&#8217;s spiffy <code>curl<\/code> package:<\/p>\n<pre><code class=\"language-r\">curl::nslookup(\"example.com\")\n## [1] \"93.184.216.34\"\n<\/code><\/pre>\n<h3>Having some fun with Ubiquiti kit<\/h3>\n<p>If you read the aforelinked blog post you&#8217;d know that to talk to Ubiquiti gear we need to send <code>0x01 0x00 0x00 0x00<\/code> to UDP port 10001. Since I plan on expanding the <code>ubpprobe<\/code> package to include helper functions for standard probes, we&#8217;ll use the singular one provided so far to talk to a known exposed system. Rather than give you the IP address I&#8217;ve stored it in an environment variable:<\/p>\n<pre><code class=\"language-r\">(x &lt;- ubnt_discovery_probe(Sys.getenv(\"UBNT_TEST_HOST\")))\n##   [1] 01 00 00 a0 02 00 0a dc 9f db 3a 5f 09 8a ff bd a9 02\n##  [19] 00 0a dc 9f db 3b 5f 09 c0 a8 02 01 01 00 06 dc 9f db\n##  [37] 3a 5f 09 0a 00 04 00 01 cb 0d 0b 00 15 39 36 39 20 2d\n##  [55] 20 4a 75 76 65 6e 61 6c 20 52 69 62 65 69 72 6f 0c 00\n##  [73] 03 4c 4d 35 0d 00 11 4e 45 54 53 55 50 45 52 2d 53 49\n##  [91] 51 55 45 49 52 41 0e 00 01 02 03 00 22 58 4d 2e 61 72\n## [109] 37 32 34 30 2e 76 35 2e 36 2e 35 2e 32 39 30 33 33 2e\n## [127] 31 36 30 35 31 35 2e 32 31 31 39 10 00 02 e8 a5 14 00\n## [145] 13 4e 61 6e 6f 53 74 61 74 69 6f 6e 20 4c 6f 63 6f 20\n## [163] 4d 35\n<\/code><\/pre>\n<p>That shortcut function just calls:<\/p>\n<pre><code class=\"language-r\">udp_send_payload(Sys.getenv(\"UBNT_TEST_HOST\"), 10001L, c(0x01, 0x00, 0x00, 0x00))\n<\/code><\/pre>\n<p>Unlike DNS, the Ubiquiti response payload is not formally documented, but folks on the Ubiquiti forums figured most of it out and we added some additional coverage for more &#8220;unknown&#8221; fields. We can use the built-in parser for these payload responses to see what kind of device it is and what firmware it&#8217;s running:<\/p>\n<pre><code class=\"language-r\">(y &lt;- parse_ubnt_discovery_response(x))\n## [Model: LM5; Firmware: XM.ar7240.v5.6.5.29033.160515.2119; Uptime: 1.4 (hrs)\n<\/code><\/pre>\n<p>Yep, it even has a pretty-printer. Here&#8217;s some of what&#8217;s under the hood (again, I&#8217;ve redacted things you shouldn&#8217;t know about since it could harm the target:<\/p>\n<pre><code class=\"language-r\">str(y, 1)\nList of 10\n $ name       : chr \"969 - Juvenal Ribeiro\"\n $ model_long : chr \"NanoStation Loco M5\"\n $ model_short: chr \"LM5\"\n $ firmware   : chr \"XM.ar7240.v5.6.5.29033.160515.2119\"\n $ essid      : chr \"NETSUPER-SIQUEIRA\"\n $ uptime     : int 118619\n $ macs       : chr [1:2] \"dc:9f:db:3a:xx:xx\" \"dc:9f:db:3b:xx:xx\"\n $ ips        : chr [1:2] \"REDACTED\", \"REDACTED\"\n $ ux0e       : raw 02\n $ ux10       : raw [1:2] e8 a5\n - attr(*, \"class\")= chr \"ubnt_d\"\n<\/code><\/pre>\n<p>That&#8217;s way too much info to be leaking to the internet and 500,000 nodes were gleefully giving it away for anyone that asked.<\/p>\n<h3>FIN<\/h3>\n<p><strike>I need to add support for UDP timeouts and dynamic response sizes (there&#8217;s a temporary hard-coded limit of 4K)<\/strike>. There is support for UDP timeouts and dynamic response sizes (provided you give a good enough buffer hint). I tested it on a Windows VM and it does work but more testing would be appreciated by those of you on that platform.<\/p>\n<p>Kick the tyres, file issues &amp; PRs and welcome to the world of UDP in R!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>We worked pretty hard over at $DAYJOB on helping to quantify and remediate a fairly significant configuration weakness in Ubiquiti network work gear attached to the internet. Ubiquiti network gear &mdash; routers, switches, wireless access points, etc. &mdash; are enterprise grade components and are a joy to work with. Our home network is liberally populated [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":11876,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":3,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[91],"tags":[],"class_list":["post-11865","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-r"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Send UDP Probes (with payloads) and Receive\/Process Responses in R - rud.is<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Send UDP Probes (with payloads) and Receive\/Process Responses in R - rud.is\" \/>\n<meta property=\"og:description\" content=\"We worked pretty hard over at $DAYJOB on helping to quantify and remediate a fairly significant configuration weakness in Ubiquiti network work gear attached to the internet. Ubiquiti network gear &mdash; routers, switches, wireless access points, etc. &mdash; are enterprise grade components and are a joy to work with. Our home network is liberally populated [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/\" \/>\n<meta property=\"og:site_name\" content=\"rud.is\" \/>\n<meta property=\"article:published_time\" content=\"2019-02-03T20:32:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-02-04T02:14:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/02\/ubi-geo.png?fit=1400%2C1012&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1400\" \/>\n\t<meta property=\"og:image:height\" content=\"1012\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"hrbrmstr\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"hrbrmstr\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/\"},\"author\":{\"name\":\"hrbrmstr\",\"@id\":\"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886\"},\"headline\":\"Send UDP Probes (with payloads) and Receive\/Process Responses in R\",\"datePublished\":\"2019-02-03T20:32:48+00:00\",\"dateModified\":\"2019-02-04T02:14:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/\"},\"wordCount\":707,\"commentCount\":5,\"publisher\":{\"@id\":\"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886\"},\"image\":{\"@id\":\"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/02\/ubi-geo.png?fit=1400%2C1012&ssl=1\",\"articleSection\":[\"R\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/\",\"url\":\"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/\",\"name\":\"Send UDP Probes (with payloads) and Receive\/Process Responses in R - rud.is\",\"isPartOf\":{\"@id\":\"https:\/\/rud.is\/b\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/02\/ubi-geo.png?fit=1400%2C1012&ssl=1\",\"datePublished\":\"2019-02-03T20:32:48+00:00\",\"dateModified\":\"2019-02-04T02:14:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/#primaryimage\",\"url\":\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/02\/ubi-geo.png?fit=1400%2C1012&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/02\/ubi-geo.png?fit=1400%2C1012&ssl=1\",\"width\":1400,\"height\":1012},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/rud.is\/b\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Send UDP Probes (with payloads) and Receive\/Process Responses in R\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/rud.is\/b\/#website\",\"url\":\"https:\/\/rud.is\/b\/\",\"name\":\"rud.is\",\"description\":\"&quot;In God we trust. All others must bring data&quot;\",\"publisher\":{\"@id\":\"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/rud.is\/b\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886\",\"name\":\"hrbrmstr\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1\",\"url\":\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1\",\"width\":460,\"height\":460,\"caption\":\"hrbrmstr\"},\"logo\":{\"@id\":\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1\"},\"description\":\"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7\",\"sameAs\":[\"http:\/\/rud.is\"],\"url\":\"https:\/\/rud.is\/b\/author\/hrbrmstr\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Send UDP Probes (with payloads) and Receive\/Process Responses in R - rud.is","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/","og_locale":"en_US","og_type":"article","og_title":"Send UDP Probes (with payloads) and Receive\/Process Responses in R - rud.is","og_description":"We worked pretty hard over at $DAYJOB on helping to quantify and remediate a fairly significant configuration weakness in Ubiquiti network work gear attached to the internet. Ubiquiti network gear &mdash; routers, switches, wireless access points, etc. &mdash; are enterprise grade components and are a joy to work with. Our home network is liberally populated [&hellip;]","og_url":"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/","og_site_name":"rud.is","article_published_time":"2019-02-03T20:32:48+00:00","article_modified_time":"2019-02-04T02:14:59+00:00","og_image":[{"width":1400,"height":1012,"url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/02\/ubi-geo.png?fit=1400%2C1012&ssl=1","type":"image\/png"}],"author":"hrbrmstr","twitter_card":"summary_large_image","twitter_misc":{"Written by":"hrbrmstr","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/#article","isPartOf":{"@id":"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/"},"author":{"name":"hrbrmstr","@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"headline":"Send UDP Probes (with payloads) and Receive\/Process Responses in R","datePublished":"2019-02-03T20:32:48+00:00","dateModified":"2019-02-04T02:14:59+00:00","mainEntityOfPage":{"@id":"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/"},"wordCount":707,"commentCount":5,"publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"image":{"@id":"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/02\/ubi-geo.png?fit=1400%2C1012&ssl=1","articleSection":["R"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/","url":"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/","name":"Send UDP Probes (with payloads) and Receive\/Process Responses in R - rud.is","isPartOf":{"@id":"https:\/\/rud.is\/b\/#website"},"primaryImageOfPage":{"@id":"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/#primaryimage"},"image":{"@id":"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/02\/ubi-geo.png?fit=1400%2C1012&ssl=1","datePublished":"2019-02-03T20:32:48+00:00","dateModified":"2019-02-04T02:14:59+00:00","breadcrumb":{"@id":"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/#primaryimage","url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/02\/ubi-geo.png?fit=1400%2C1012&ssl=1","contentUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/02\/ubi-geo.png?fit=1400%2C1012&ssl=1","width":1400,"height":1012},{"@type":"BreadcrumbList","@id":"https:\/\/rud.is\/b\/2019\/02\/03\/send-udp-probes-with-payloads-and-receive-process-responses-in-r\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rud.is\/b\/"},{"@type":"ListItem","position":2,"name":"Send UDP Probes (with payloads) and Receive\/Process Responses in R"}]},{"@type":"WebSite","@id":"https:\/\/rud.is\/b\/#website","url":"https:\/\/rud.is\/b\/","name":"rud.is","description":"&quot;In God we trust. All others must bring data&quot;","publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rud.is\/b\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886","name":"hrbrmstr","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","contentUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","width":460,"height":460,"caption":"hrbrmstr"},"logo":{"@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1"},"description":"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7","sameAs":["http:\/\/rud.is"],"url":"https:\/\/rud.is\/b\/author\/hrbrmstr\/"}]}},"jetpack_featured_media_url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/02\/ubi-geo.png?fit=1400%2C1012&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p23idr-35n","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":13317,"url":"https:\/\/rud.is\/b\/2022\/01\/28\/a-weatherflow-tempest-udp-broadcast-receiver-in-golang-rust-swift-and-c\/","url_meta":{"origin":11865,"position":0},"title":"A WeatherFlow Tempest UDP Broadcast Receiver in Golang, Rust, Swift, and C++","author":"hrbrmstr","date":"2022-01-28","format":false,"excerpt":"After a Twitter convo about weather stations I picked up a WeatherFlow Tempest. Setup was quick, but the sensor package died within 24 hours. I was going to give up on it but I had written an R package (for the REST API & UDP broadcast interfaces) and C++ utility\u2026","rel":"","context":"In &quot;C++&quot;","block_context":{"text":"C++","link":"https:\/\/rud.is\/b\/category\/c\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":11911,"url":"https:\/\/rud.is\/b\/2019\/02\/14\/using-the-ropendata-r-package-to-access-petabytes-of-free-internet-telemetry-data-from-rapid7\/","url_meta":{"origin":11865,"position":1},"title":"Using the ropendata R Package to Access Petabytes of Free Internet Telemetry Data from Rapid7","author":"hrbrmstr","date":"2019-02-14","format":false,"excerpt":"I've got a post up over at $DAYJOB's blog on using the ropendata? package to access the ginormous and ever-increasing amount of internet telemetry (scan) data via the Rapid7 Open Data API. It's super-R-code-heavy but renders surprisingly well in Ghost (the blogging platform we use at work) and covers everything\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":13137,"url":"https:\/\/rud.is\/b\/2021\/07\/25\/acoustic-solving-a-cyberdefenders-pcap-sip-rtp-challenge-with-r-zeek-tshark-friends\/","url_meta":{"origin":11865,"position":2},"title":"Acoustic: Solving a CyberDefenders PCAP SIP\/RTP Challenge with R, Zeek, tshark (&#038; friends)","author":"hrbrmstr","date":"2021-07-25","format":false,"excerpt":"Hot on the heels of the previous CyberDefenders Challenge Solution comes this noisy installment which solves their Acoustic challenge. You can find the source Rmd on GitHub, but I'm also testing the limits of WP's markdown rendering and putting it in-stream as well. No longer book expository this time since\u2026","rel":"","context":"In &quot;Cybersecurity&quot;","block_context":{"text":"Cybersecurity","link":"https:\/\/rud.is\/b\/category\/cybersecurity\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":11894,"url":"https:\/\/rud.is\/b\/2019\/02\/09\/quick-hit-speeding-up-a-slow-mundane-task-with-a-little-rcpp\/","url_meta":{"origin":11865,"position":3},"title":"Quick Hit: Speeding Up a Slow\/Mundane Task with a Little Rcpp","author":"hrbrmstr","date":"2019-02-09","format":false,"excerpt":"Over at $DAYJOB's blog I've queued up a post that shows how to use our new ropendata? package to work with our Open Data portal's API. I'm not super-sure when it's going to be posted so keep an RSS reader fixed on https:\/\/blog.rapid7.com\/ if you're interested in seeing it (I\u2026","rel":"","context":"In &quot;C++&quot;","block_context":{"text":"C++","link":"https:\/\/rud.is\/b\/category\/c\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":7051,"url":"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/","url_meta":{"origin":11865,"position":4},"title":"Measuring &#038; Monitoring Internet Speed with R","author":"hrbrmstr","date":"2017-11-11","format":false,"excerpt":"Working remotely has many benefits, but if you work remotely in an area like, say, rural Maine, one of those benefits is not massively speedy internet connections. Being able to go fast and furious on the internet is one of the many things I miss about our time in Seattle\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/spdtst.gif?fit=1200%2C647&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/spdtst.gif?fit=1200%2C647&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/spdtst.gif?fit=1200%2C647&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/spdtst.gif?fit=1200%2C647&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/spdtst.gif?fit=1200%2C647&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":96,"url":"https:\/\/rud.is\/b\/2011\/02\/12\/web-development-is-dangerous\/","url_meta":{"origin":11865,"position":5},"title":"&#8220;Web Development Is Dangerous&#8221;","author":"hrbrmstr","date":"2011-02-12","format":false,"excerpt":"Those were the words that greeted me within five minutes of checking out the Flask microframework for Python web applications. I feel compelled to inline those four, short paragraphs: I\u2019m not joking. Well, maybe a little. If you write a web application, you are probably allowing users to register and\u2026","rel":"","context":"In &quot;Information Security&quot;","block_context":{"text":"Information Security","link":"https:\/\/rud.is\/b\/category\/information-security\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/11865","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/comments?post=11865"}],"version-history":[{"count":0,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/11865\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media\/11876"}],"wp:attachment":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media?parent=11865"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/categories?post=11865"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/tags?post=11865"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}