{"id":14133,"date":"2026-07-08T04:13:05","date_gmt":"2026-07-08T04:13:05","guid":{"rendered":"https:\/\/serisec.com\/index.php\/2026\/07\/08\/33124\/"},"modified":"2026-07-08T04:13:05","modified_gmt":"2026-07-08T04:13:05","slug":"33124","status":"publish","type":"post","link":"https:\/\/serisec.com\/index.php\/2026\/07\/08\/33124\/","title":{"rendered":"RCS and DNS: The NAPTR Record, (Mon, Jul 6th)"},"content":{"rendered":"<p>    RCS and DNS: The NAPTR Record, (Mon, Jul 6th)<br \/>\n \t<BR><br \/>\n<BR><\/BR><br \/>\n    <!-- no image --><br \/>\n \t<BR><br \/>\n<BR><\/BR><\/p>\n<div>\n<p>Over the last year, with recent updates to iOS and Android, RCS (Rich Communication Services) has become an increasingly used protocol [1]. RCS is supposed to eventually replace SMS, and in addition to richer formatting, provides added (but optional) security. RCS messages may be end-to-end encrypted and digitally signed. Unlike SMS, which was &#8220;bolted on&#8221; to existing voice-focused phone standards. The SMS standard was based on old-fashioned pagers\u00a0and allowed for limited clear-text communications. RCS is built from the ground up around modern IP-based network infrastructure and behaves more like IP chat services (think iMessage, WhatsApp&#8230;). RCS defines\u00a0the message format, while protocols like SIP are used to establish connections and transport messages.<\/p>\n<p>&#8220;Do as you say&#8221;, I do from time to time take a look at odd DNS traffic on my network. An activity I recommend when teaching SEC503. Recently, I noticed more &#8220;NAPTR&#8221; queries, a record type I had not seen before. The record type is defined in RFC 2915 [2], which was ratified in 2000. It is not a new record. But so far, at least in my network, it has not really shown up before.<\/p>\n<p>The description of the record sounds rather ominous:<\/p>\n<blockquote>\n<p>&#8220;a Resource Record that included a regular expression that would be used by a client program to rewrite a string into a domain name.&#8221;<\/p>\n<\/blockquote>\n<p>Wow. Regular expressions to rewrite resource records? What could possibly go wrong? However, right now, I just want to talk about how it &#8220;goes right&#8221; and how these records are currently being used for RCS.<\/p>\n<p>Below is the relevant part of the t-shark decode of a record typical for what I have seen in my network:<\/p>\n<blockquote>\n<p><tt>\u00a0 \u00a0 Queries<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 fp-us-verizon.rcs.telephony.goog: type NAPTR, class IN<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Name: fp-us-verizon.rcs.telephony.goog<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 [Name Length: 32]<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 [Label Count: 4]<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Type: NAPTR (35) (Naming Authority Pointer)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Class: IN (0x0001)<br \/>\n\u00a0 \u00a0 Answers<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 fp-us-verizon.rcs.telephony.goog: type NAPTR, class IN, order 100, preference 100, flags s<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Name: fp-us-verizon.rcs.telephony.goog<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Type: NAPTR (35) (Naming Authority Pointer)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Class: IN (0x0001)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Time to live: 295 (4 minutes, 55 seconds)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Data length: 61<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Order: 100<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Preference: 100<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Flags Length: 1<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Flags: s<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Service Length: 8<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Service: SIPS+D2T<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Regex Length: 0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Regex:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 [Replacement Length: 43]<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Replacement: _sips._tcp.fp-us-verizon.rcs.telephony.goog<\/tt><\/p>\n<\/blockquote>\n<p>\u00a0<\/p>\n<p>This was the only applicable NAPTR record, so order and preference do not matter in this case. The &#8220;S&#8221; flag indicates that the next lookup should be a SRV record. And indeed, we do have a SRV query (see below). Only a &#8220;U&#8221; flag would result in a URI.\u00a0<\/p>\n<p>Remember that this record is about URIs,\u00a0not\u00a0IP addresses? The &#8220;Service&#8221; field indicates what service we may find at the to-be-determined URI. In this case, it is SIPS+D2T. SIPS+D2T is a transport protocol defined in the SIP standard (RFC 3263). SIPS+D2T stands for &#8220;Secure SIP Direct to TCP&#8221;. So we will be using SIP over TLS with TCP as the transport protocol. The SIP standard specifically calls for NAPTR records to find SIP servers. The reason for the NAPTR record is to allow\u00a0URIs to be returned, not just IP addresses\/hostnames (as an SRV record would).<\/p>\n<p>Lucky for us (and the DNS server), the regular expression is empty. And this appears to be normal for this use case. Instead, we just get a &#8220;SRV&#8221; record to request:<\/p>\n<blockquote>\n<p><code>\u00a0 \u00a0 Queries<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 _sips._tcp.fp-us-verizon.rcs.telephony.goog: type SRV, class IN<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Name: _sips._tcp.fp-us-verizon.rcs.telephony.goog<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 [Name Length: 43]<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 [Label Count: 6]<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Type: SRV (33) (Server Selection)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Class: IN (0x0001)<br \/>\n\u00a0 \u00a0 Answers<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 _sips._tcp.fp-us-verizon.rcs.telephony.goog: type SRV, class IN, priority 20, weight 0, port 5223, target fp-us-verizon.rcs.telephony.goog<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Service: _sips<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Protocol: _tcp<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Name: fp-us-verizon.rcs.telephony.goog<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Type: SRV (33) (Server Selection)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Class: IN (0x0001)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Time to live: 300 (5 minutes)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Data length: 40<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Priority: 20<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Weight: 0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Port: 5223<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Target: fp-us-verizon.rcs.telephony.goog<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 _sips._tcp.fp-us-verizon.rcs.telephony.goog: type SRV, class IN, priority 30, weight 0, port 443, target fp-us-verizon.rcs.telephony.goog<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Service: _sips<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Protocol: _tcp<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Name: fp-us-verizon.rcs.telephony.goog<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Type: SRV (33) (Server Selection)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Class: IN (0x0001)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Time to live: 300 (5 minutes)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Data length: 40<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Priority: 30<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Weight: 0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Port: 443<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Target: fp-us-verizon.rcs.telephony.goog<\/code>???????<\/p>\n<\/blockquote>\n<p>And yes, in the end, there is a &#8220;normal&#8221; A and AAAA lookup for\u00a0fp-us-verizon.rcs.telephony.goog.<\/p>\n<p>So far, NAPTR records do not appear to be used to their full potential. I am sure that the use of regular expressions will be of interest to bug hunters and penetration testers.\u00a0<\/p>\n<p>[1]\u00a0https:\/\/support.google.com\/messages\/answer\/13508703?hl=en<br \/>\n[2]\u00a0https:\/\/www.ietf.org\/rfc\/rfc2915.txt<\/p>\n<p>&#8212;<br \/>\nJohannes B. Ullrich, Ph.D. , Dean of Research, <a href=\"https:\/\/sans.edu\/\">SANS.edu<\/a><br \/>\n<a href=\"https:\/\/jbu.me\/164\">Twitter<\/a>|<\/p>\n<p> (c) SANS Internet Storm Center. https:\/\/isc.sans.edu Creative Commons Attribution-Noncommercial 3.0 United States License.<\/p><\/div>\n<p> \t<BR><br \/>\n <BR><\/BR><\/p>\n<p> \t<BR><br \/>\n<BR><\/BR><br \/>\n<a href=\"https:\/\/isc.sans.edu\/diary\/rss\/33124\">Go to isc.sans.edu<\/a><br \/>\n \t<BR><br \/>\n <BR><\/BR><\/p>\n","protected":false},"excerpt":{"rendered":"<p>RCS and DNS: The NAPTR Record, (Mon, Jul 6th) Over the last year, with recent updates to iOS and Android, RCS (Rich Communication Services) has become an increasingly used protocol [1]. RCS is supposed to eventually replace SMS, and in addition to richer formatting, provides added (but optional) security. RCS messages may be end-to-end encrypted [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[56],"tags":[69],"class_list":["post-14133","post","type-post","status-publish","format-standard","hentry","category-isc-sans-edu","tag-isc-sans-edu"],"_links":{"self":[{"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/posts\/14133"}],"collection":[{"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/comments?post=14133"}],"version-history":[{"count":0,"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/posts\/14133\/revisions"}],"wp:attachment":[{"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/media?parent=14133"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/categories?post=14133"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/tags?post=14133"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}