Technical Details Behind a 400Gbps NTP Amplification DDoS Attack
blog.cloudflare.com
blog.cloudflare.com
And their own semi-official ntp server supports monlist with a hefty response
$ ntpdc -c monlist ntp0.ovh.net
remote address port local address count m ver rstr avgint lstint
===============================================================================
10.x.x.246 123 213.251.128.249 515 3 2 0 12 0
10.x.x.248 123 213.251.128.249 396 3 2 0 7 0
10.x.x.245 123 213.251.128.249 104 3 2 0 10 0
212-x-x-101.rev.pon 123 213.251.128.249 178326 3 4 0 0 0
sw.178.x.x.248-n5.f 123 213.251.128.249 12 3 2 0 12 0
proxy.ovh.net 46863 213.251.128.249 252113 3 3 0 0 0
v1.ovh.net 50733 213.251.128.249 2443 3 3 0 0 0
a2.ovh.net 44965 213.251.128.249 3394192 3 3 0 0 0
cross.rfid.ovh.net 33352 213.251.128.249 11823 3 3 0 0 0
10.x.x.176 123 213.251.128.249 1865 3 2 0 4 0
gw6.ovh.net 123 213.251.128.249 1476 3 4 0 3 0
sw.5.x.x.248-n5.fr 123 213.251.128.249 361 3 2 0 2 0
b6.ovh.net 40862 213.251.128.249 1095 3 3 0 4 0
10.x.x.245 123 213.251.128.249 164 3 2 0 6 0
10.x.x.211 123 213.251.128.249 314567 3 2 0 4 0
.
.
.This was at least a week before the news of the big DDoS attack this week, so I'm surprised their own servers still had the vulnerable config/versions.
But while our colo provider was extremely responsive and started calling OVH and the other providers right away, and I also emailed evidence to OVH repeatedly, we were met with total silence. The other providers used reacted quickly. OVH let the servers continue to hammer us for days.
I'm seriously considering just dropping all their net blocks in our firewalls. We have next to no legitimate traffic originating there anyway.
Unfortunately, I can't blackhole their traffic on mail services, because IIRC some open source mailing lists use them.
OVH is not my favorite network.
PS: Why did you "X.X" out IPs from a RFC1918 address space?
ntpdc -c monlist ntp0.ovh.net | wc -l 602
Yikes.
EXPLOIT ntpdx overflow attemptAs far as I am aware, I am not responsible for any Internet-facing NTP servers (I certainly never set one up willingly), but it's good to have this in the back of my mind now in the off-chance that I ever do set one up.
I did have one of my Windows machines used for DNS amplification. I wrote about the incident [1] at my blog because I had been a bit surprised that it was not sufficient to simply disable recursion. That much had seemed like common sense, and I thought I had been so clever and thorough in turning it off. But later I found attackers were leveraging my server's willingness to provide a list of root DNS servers in response, even with recursion disabled. I ended up deleting the list of root servers and the problem went away. (Though, to be clear, I never ran the incident by any DNS experts, so I may have misdiagnosed the whole thing.)
I don't know what else I don't know about amplification attacks, so reports such as yours are helpful for people like myself who find it fun to run our own servers, but don't consider it an area of expertise.
I would like to see servers demystified in general, and that's why I applaud articles such as this one that make the necessary counter-measures/workarounds plain and clear for those like myself.
I assume you mean that you interpret what I've said as implying anyone who does not know about NTP amplification attacks is an amateur server administrator. I do not mean to imply that. I simply mean that for people like myself, who are in fact amateur server administrators, this sort of down-to-earth style of article (here is what the problem is; here is how to deal with it) is very welcome.
Although it's only academic at this point, I am curious why you think I used the word "amateur" pejoratively and what category you believe I am describing in error. I ask simply because I'd like to avoid making similar errors in the future.
It's a hassle, as they're old machines and out of support contract (so we can't upgrade the firmware), and so far as I can tell there's no way to turn off public access to ntpd over the admin interfaces. We're stuck with having to go to the hosting company and change the cabling to route them through the firewall.
Just because you didn't set up ntpd doesn't mean you don't have it running (somewhere).
ntp server sees request from 1.1.1.1 (spoofed by attacker)
ntp server goes to 1.1.1.1 to check that they really sent the request (sort of ack type thing)
1.1.1.1 comes back to say that it's an uninitiated request
ntp server discards similar future requests for some time
Obviously that would require more toing and froing, along with more white / black list tracking etc. Then again, can't all machines have sensible defaults in their firewalls to stop them from participating in such attacks?Is this not an issue for TCP?
EDIT: I'm assuming it's because UDP doesn't do any checking / acknowledge stuff by default?
The problem is: 1) No one has upgraded NTPD (and often can't, for embedded devices like IPMI controllers) 2) This can be fixed by basic configuration in older NTPD versions, but up until recently many linux distributions were shipping vulnerable configs.
This particular command (monlist) is a management query, it's in no way related to serving up accurate time.
restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery
Edit: Note that this also exists in Ubuntu 12.04, so the latest LTS is fine as well.There is a proposal from 2000 that is mentioned in the article (http://tools.ietf.org/html/rfc2827) that recommends that source networks filter out originating traffic that isn't legitimate. It is being implemented slowly.
FWIW, if you install the ntp package and do ntpdc -n -c monlist localhost you'll get a response but I haven't checked if it's configured by default to reject non-LAN requests.
Being able tod this via localhost is not a problem, it's when it's open to the internet.
Before installing ntp (from another host on my LAN):
$ ntpdc -n -c monlist 192.168.1.50
ntpdc: read: Connection refused
After installing ntp (from another host on my LAN): $ ntpdc -n -c monlist 192.168.1.50
192.168.1.50: timed out, nothing received
***Request timed out
After installing ntp (from the server itself): $ ntpdc -n -c monlist localhost
remote address port local address count m ver rstr avgint lstint
===============================================================================
91.189.94.4 123 192.168.1.50 1 4 4 1d0 54 54
...It just gives up that data to anyone that asks? Seems like a huge privacy issue.
Imaging Apache or Nginx giving up the last 600 IPs it served and maybe the URLs they went to.
edit: there is always the occasionally open Apache /server-status handler that leaks this type of data.
I could do a nmap on the public internet and probably get a similar amount of addresses. An IP is about as "private information" as a phone number nowadays (You know, those things that get sent out en masse in yellow and white books for public consumption with real-life names next to them).
So you synced your time with a server. Why would anyone else care about that? Why does it matter if someone else knows you're syncing time?
This is a very different service then a web browser.
Back in 1999 I used these monitoring commands to spider the NTP network, surveying some 175,000 hosts from a desktop workstation. Lots of fun! This kind of survey is much harder to do now because so many systems are locked down. http://alumni.media.mit.edu/~nelson/research/ntp-survey99/
What happened to it? Did the algorithm snip it, but did jgrahamc undelete it somehow, or a mod? Just curious about the way those things work, not complaining.
Also, web servers might want to consult NTP servers now and again.
CloudFlare doesn't host web servers for their customers. They forward HTTP/HTTPS requests to origin servers outside of their network (or serve from their cache). I don't think the DDoS traffic actually hit any of their customers' origin servers (assuming origin server IPs are not known by the attackers). But yeah, it still means CloudFlare's incoming pipes being hit with 400Gbps of traffic before they're able to filter anything.
[1] http://en.wikipedia.org/wiki/User_Datagram_Protocol#Packet_s...
[2] Not sure if this is even possible
The problem is you have UDP packets on port 123 coming from all over the world hammering at your door. They're politely getting dropped by firewalls, but they consume all the bandwidth in to the edge of your network, so the legitimate traffic cant get through.
ntpdc -c monlist 1.2.3.4
For more info see my blog post (it is related to VMware ESXi but instructions are useful for any ntpd): http://ar0.me/blog/en/posts/2014/01/howto-prevent-malicious-...
You can check whether there are open NTP servers that
support the MONLIST command running on your network by
visiting the Open NTP Project[0]. Even if you don't think
you're running an NTP server, you should check your
network because you may be running one inadvertently.
[0] links to http://openntpproject.org/https://github.com/sensepost/ntp_monlist
It at least correctly identifies ntp0.ovh.net as responding -- and seems to match up with what openntpproject.org thinks...
[edit: apparently this (partly) also illustrates why more people should heed the advice to "run only what you need, listen only where you must" -- or in other words, make sure that:
netstat -lnutp # listening, numerical, udp, tcp, program
gives essentially no output, at the very least not a lot of 0.0.0.0:x (listening on all interfaces). I'm always a little sad when people don't check that, and just throw up some complicated iptables-rules -- before checking if they're actually running some daemons that should be removed, or pointed at less public interfaces.] $ nmap -sU -pU:123 -Pn -n --script=ntp-monlist <target>
Note that that only checks if the target responds to the monlist command.If a bunch of computers are hooked together in a mesh relaying traffic in all directions, how can one do ingress filtering?
This would have two benefits. Firstly the owner of the insecure NTP server is going to get a nasty message to fix their damn server, and secondly, the insecure NTP server gets taken out of the attack and becomes useless to the attacker.
As a visual reference, it would be a bit like in Star Wars when Mace Windu fights Palpatine on Coruscant [1]: http://www.youtube.com/watch?v=Pk4AiCnMqpg#t=2m35s
Eventually these server provider who have left their servers wide open will get the message when there NTP servers no longer respond?
Two reasons: it's a bad idea and it wouldn't help very much. Each individual NTP server is only generating a modest amount of traffic and such a response might well go unnoticed by the NTP server. Also, it would mean we'd have to generate 400Gbps back to the NTP servers creating an enormous amount of traffic.
To actually get the benefits you're suggesting, CloudFlare would have to actually DDoS (spoof data from multiple IPs to the point of overwhelming the target) every participating NTP server. So on a 100Gbps attack, they'd need to send out, I dunno, 1Tbps of spoofed traffic? Not probably a wise idea.
The correct way is to just contact the network abuse team. That way I get an email telling me to fix my server. And it's taken care of as quickly as possible.
And the real correct way is for all ISPs to implement source filtering, but last I checked, that was laughably far from being implemented. Lots of ISPs would even take sources of private IPs and merrily forward them on.
Why would that not solve a large part of the problem?
Thank you in advance.
Cisco, Juniper etc. who manufacture high end routers would certainly love it.
A better alternative is to stop or limit source ip spoofing, because you can filter it on the interfaces connecting smaller providers and customers rather than the most resource-constrained routes to other backbone providers. And that's slowly happening (I'm saying, while looking at tcpdump output from a SYN attack that might very well use spoofed IPs). It's simpler because you "only" need a single lookup against a few bytes per packet per interface instead of potentially having a long list of patterns to check against the whole packet.
> and who I would expect to incorporate best practices
Don't bet on it. They will when it makes a big difference to them. But for many of these types of attack you'll see purely reactive reactions because it's often far cheaper (for them) vs. the costs of routing hardware etc. that can do enough processing per packet to be viable.
As a customer, I don't want my ISP screwing with my traffic. As a provider, I don't want any customers complaining because we screw with their traffic.
To block monlist and only monlist queries, we'd have to be looking into the layer 7 payload of IP traffic. I'd rather not do that.
The brute-force method would be to block traffic to/from 123/UDP but that's gonna mess up a lot of stuff (including my own).
However, Tier 1 providers should not in any way police the internet.
UDP? [✓]
Amplification? [✓]
Spoofable? [?]
The _QUIC Crypto_ design doc contains a section that covers spoofing [1], and seems to push responsibility for DDoS mitigation to the server implementation:
"[...] servers may decide to relax source address restrictions dynamically. One can imagine a server that tracks the number of requests coming from different IP addresses and only demands source-address tokens when the count of “unrequited” connections exceeds a limit globally, or for a certain IP range. This may well be effective but it’s unclear whether this is globally stable. If a large number of QUIC servers implemented this strategy then a substantial mirror DDoS attack may be split across them such that the attack threshold wasn’t reached by any one server."
[1] https://docs.google.com/document/d/1g5nIXAIkN_Y-7XJW5K45IblH...