Fun with DNS TXT Records
thoughts.theden.sh
thoughts.theden.sh
rfc1035 defines the <character-string> string object, which consists of a length octet (byte), followed by n bytes of text. There is no null terminator. So, the maximum length of the <character-string> is 255 bytes of usable text.
However, a TXT record can contain one or more <character-string> objects, which the DNS client will stitch together into one long string. For a standard DNS record, the length is ultimately limited by the rdlength property of the resource record format (rfc1035, sect 4.1.3). The rdlength is 16 bit unsigned, so the maximum payload length of a resource record is 65,536 octets (64kb). Keeping in mind the overhead of the length octet in each <character-string> object, you'll end up with a maximum of 65,280 octets of usable characters in the TXT record.
This will work, but requires the DNS server to respond to TCP requests. UDP connections that are more typically used for DNS have a limit of about 1500 bytes in length.
Not necessarily. In practice, yes, this is what clients looking for long SPF or DKIM records actually do. But there isn’t anything guaranteeing this if you invent your own use for TXT records.
dig txt @vps7.pgregg.com artofwar.pgregg.com |sed 's/" "//g' |sed 's/`n/\n/g' |less
I got a flashback of a long-ish email exchange with a certain DNS parking provider, related to publishing public 4096bit DKIM keys...
UDP datagrams can be up to 64K using IP fragmentation, but the original DNS protocol limits UDP payload sizes to 512 bytes. Using EDNS, payloads may be as much as 4096 bytes.
Any effort to restore the internet as a diffused & usable information resource (rather than an advertising network) would be beneficial.
I could serve a whole site purely via DNS.
[1] https://certbot-dns-cloudflare.readthedocs.io/en/stable/
Though you'd probably need to label them, or you'd run into the same UDP length issues. Also, there is no guarantee in order the records are returned.
It's just unfortunate now that there's no way you'll squeeze a semi-usable desktop experience through dial-up-tier RDP anymore. IIRC, I had to use 16-color mode on a 640x480-sized desktop (good enough for e-mail!).
Of course, today, people just whip-out their phone's tether/hotspot.
I set it up and it works, of course, then I tried to use it with public limited wifi (hotels, airports) but still have to find what I thought was more common: a connection where the only open DNS traffic is DNS
Putting that aside, as instantiated by the author, there are some problems with the encryption methodology:
1. CBC doesn't provide integrity
There's no guarantee given to you by the construction that the password you (successfully!) decrypted is the same password you encrypted. If you're symmetrically encrypting anything nowadays, you should be using some form of authenticated encryption.
2. `openssl enc`'s -pbkdf2 flag defaults to 10k iterations, which is off by more than an order of magnitude by today's standards for a comparable use case(protecting password vaults).
3. using PBKDF2 in the first place.
There are more modern KDFs nowadays(scrypt, argon2) that are resistant to more kinds of attacks[0] that should probably be used instead.
4. using `openssl enc` in the first place.
OpenSSL has always cautioned against using the `enc` command for anything serious, so I feel obligated to mention it.
Sorry if this seems like I'm talking out of school, but in case any one reading was inspired to use this methodology for encrypting their own passwords, I wanted to give a proper accounting of what I think the limitations are.
Off topic: is this guy a Drake fan?
> OpenSSL has always cautioned against using the `enc` command for anything serious, so I feel obligated to mention it.
Can you talk more about this? I can't find anything in the OpenSSL wiki and my searching skills haven't revealed much except about the possibility of the ciphertext being modified when using AES-256-CBC.
Is this a serious issue for this use case? If the attacker tries to tamper with the ciphertext, chances are it will cause the decrypted plaintext to be gibberish with many invalid/unprintable ascii characters. That should alert the user that something's up.
Not necessarily. If the plaintext you're trying to modify is in the first ciphertext block(which in this scenario is likely the case), you can modify a byte in the IV(assuming the IV is stored alongside the ciphertext) to modify the corresponding byte in the first plaintext block without a trace.
> Is this a serious issue for this use case?
In my opinion this whole use case is an issue. Why give an attacker access to your encrypted passwords?
So with this vulnerability, the attacker can... cause you to enter a wrong password. That's kinda annoying, but at the end of the day it's a DoS attack, and even though using AEAD ciphers would prevent this specific attack, it won't prevent other DoS attacks (eg. blocking/mangling all DNS traffic).
> Registered services and nodes can be queried using a DNS interface or an HTTP interface
This thread is about Hesiod, a service which provides DNS interface for databases.
That's pretty neat though.
I thought they also used it in their client but cannot find a article about that.
$ host -c ch -t txt version.bind glass.its.utexas.edu
version.bind descriptive text "9.11.36-RedHat-9.11.36-11.el8"
$ host -c ch -t txt version.bind ns1.yahoo.com
version.bind descriptive text "Yahoo"A somewhat useful thing what can be stored in TXT is some some self contained script with the encoded payload eg to bypass firewall/proxy. You can even bootstrap it from one record and it can read the rest of payload itself from the other records.
Edit: yep, good old iex:
(Resolve-DnsName -Type TXT yourdnsname).Strings|iexAnd btw, thanks for all your work as a filter list maintainer. I know it's a lot to keep up with, and I appreciate it very much.
Shades of the old NIS+/AUTH_DH/mech_dh scheme. That's a scheme that Sun used in 1987 for NFS security and for authentication. It goes like this:
- there is a name service called 'publickey'
(i.e., with a getent style API, a 'files'
backend, so /etc/publickey, and a NIS+
backend for domain-based authen.)
- each publickey(5) entry has:
- the name ("netname") of the entity
- a DH group identifier
- a DH public key
and
- the corresponding DH private key
encrypted in the entity's password
To login you in the system would prompt you for a username and password, lookup your entry in the publickey(5) name service, if found then it would decrypt the private key and confirm that the public key matches.To authenticate to a remote service the system would find that service's publickey(5) entry, compute the shared DH secret, and send a message with the local and remote names, a nonce, and a proof of knowledge of the shared secret.
Anyways, you could store publickey(5) in DNS, naturally, if you wanted, though that was never implemented because mech_dh simply died of disuse.
It's worth noting that the DNS is mostly public. Yes, you can make zone iteration hard, but not impossible. So if you publish secrets encrypted in low-entropy keys (like typical passwords) then those will be subject to cracking.
I do think mech_dh, modernized with ECDH and PQ key agreement, could make a lot of sense to revive. I could totally see a new scheme that's a cross between mech_dh, Kerberos, and JWT.
So you can `dig` to retrieve passwords:
` dig example.com @my.crazy.password.manager.tld `
` example.com. TXT "username=myuser;password=hunter2"
You can now use tools like rsync, ssh, irc, browsers,next to piggy back in DNS to resolve passwords and private keys, even TOTPs
I was just asking https://www.perplexity.ai for some geek examples of what I can do with TXT Records, and as an answer I've got the summary of this HN page and link
(adding content to HN carry on some big responsibilities nowadays ... )
> With an API, one could programatically update TXT records.
Just run bind yourself and you can update your records with very simply programming!
When you start using DNS as a generalized key/value store, there are some tuning / optimizations to be aware of:
* Production grade caching / recursing servers retry aggressively. There is debouncing in this implementation.
* Tune your EDNS packet size (in your caching server) to make sure you aren't triggering retries unnecessarily. (And frags are bad and Francisco Franco is still dead.)
* Empty non-terminals are rare enough in "happy eyeballs" use that (de) optimizations in the name of things like privacy are known to happen. You should contemplate disabling qname minimization if that's something the caching server does.
Just wanted to add that the first line in the first snippet should be:
>>> lorem_ipsum = b"Lorem..."
Else zlib.compress() will throw a TypeError.Fun fact: Dyna53 was made public exactly on the same day, 1 year before (Sunday before re:Invent).