50
Running at 99%: Mitigating Application DoS Ryan Huber [email protected] @ryanhuber 1 Thursday, October 10, 13

Running At 99%: Mitigating App DoS

Embed Size (px)

Citation preview

Page 1: Running At 99%: Mitigating App DoS

Running at 99%: Mitigating Application DoSRyan [email protected]@ryanhuber1

Thursday, October 10, 13

Page 2: Running At 99%: Mitigating App DoS

$contest

ssid: DoS2own

key: DoS2own!

target: http://feeblechat.com/ or http://10.0.0.2

rules: network DoS doesn’t count, MITM meh..

goal: polling must fail for > 30 seconds

prize: MY WEBSERVER!

Thursday, October 10, 13

Page 3: Running At 99%: Mitigating App DoS

$topics

app DoS intro/attack demo

mitigation strategies

bouncer

recap

Thursday, October 10, 13

Page 4: Running At 99%: Mitigating App DoS

$99%?

service 99% of users (limit false positives)

at 99% utilization (know your capacity)

Thursday, October 10, 13

Page 5: Running At 99%: Mitigating App DoS

$denial of service

network DoSapplication DoS

Thursday, October 10, 13

Page 6: Running At 99%: Mitigating App DoS

$topics

app DoS primer/attack demo

mitigation strategies

bouncer

recap

Thursday, October 10, 13

Page 7: Running At 99%: Mitigating App DoS

$application DoSits goal is

goal is to exceed your capacity to handle requestsit is

effective with few attack resources

targets or creates slow operations

more difficult to detect

no easy off-the-shelf mitigation

Thursday, October 10, 13

Page 8: Running At 99%: Mitigating App DoS

$app DoS categories

webserver

your application

Thursday, October 10, 13

Page 9: Running At 99%: Mitigating App DoS

$apache

the number we care about is

MaxClients

Thursday, October 10, 13

Page 10: Running At 99%: Mitigating App DoS

$slow headers

(slow loris)

connect

send a header every X seconds

wash, rinse, repeat

Thursday, October 10, 13

Page 11: Running At 99%: Mitigating App DoS

$slow POST

(R U Dead Yet)

find a form

POST 2gb of data @ .0000001KB/s

Thursday, October 10, 13

Page 12: Running At 99%: Mitigating App DoS

$slow read

GET /a_page

read it @ .000000001KB/s

Thursday, October 10, 13

Page 13: Running At 99%: Mitigating App DoS

$webserver DoS demo

Thursday, October 10, 13

Page 14: Running At 99%: Mitigating App DoS

$app DoS (your_app)

(targeted attack)

repeatedly execute expensive queries

large downloads

exceed a backend connection pool

create many sessions

Thursday, October 10, 13

Page 15: Running At 99%: Mitigating App DoS

$topics

app DoS primer/attack demo

mitigation strategies

bouncer

recap

Thursday, October 10, 13

Page 16: Running At 99%: Mitigating App DoS

$apache

mod_reqtimeout/mod_qos

varnish/reverse proxy

Thursday, October 10, 13

Page 17: Running At 99%: Mitigating App DoS

$strategies

keep slow pages behind login

limit POSTs

don’t generate sessions on GET /

leverage a CDN for large/static content

change webserver software

¡optimize your code!

Thursday, October 10, 13

Page 18: Running At 99%: Mitigating App DoS

$identification

Thursday, October 10, 13

Page 19: Running At 99%: Mitigating App DoS

$identification

user-agent

same url

no referer

hidden link(s)

geoip

ignores cookies/session

missing common headers

request timing

first seen time

proof of work

last resort: captcha

Thursday, October 10, 13

Page 20: Running At 99%: Mitigating App DoS

$a real example

german website

100,000 hosts

3 req/min

random valid URLs

Thursday, October 10, 13

Page 21: Running At 99%: Mitigating App DoS

$topics

app DoS primer/attack demo

mitigation strategies

bouncer

recap

Thursday, October 10, 13

Page 22: Running At 99%: Mitigating App DoS

$bouncer

(written in node)

(inspired by netflow)

Thursday, October 10, 13

Page 23: Running At 99%: Mitigating App DoS

$why node.js?

because it’s @hipsterhacker approved!

Thursday, October 10, 13

Page 24: Running At 99%: Mitigating App DoS

$seriously why node.js?

asynchronous

fast when your task is not CPU bound

great lib node-http-proxy

well known language

JSON is native

Thursday, October 10, 13

Page 25: Running At 99%: Mitigating App DoS

$goals

minimal code

small memory footprint

fail open

works in cloud

JSON messaging

decisions made outside of proxy code

Thursday, October 10, 13

Page 26: Running At 99%: Mitigating App DoS

$architecture

GRAPHIC HERE (combine next slide)

Thursday, October 10, 13

Page 27: Running At 99%: Mitigating App DoS

$message format{"time":1379603264938,"type":"connect","host":"10.0.0.150"}

{"time":1379603264940,"type":"request","host":"10.0.0.150","url":"/changelog/","method":"GET","headers": (....),"uuid":"f42095a1-3a4b-41fc-b005-46f504cde2a0"}

{"time":1379603263662,"type":"end","uuid":"f42095a1-3a4b-41fc-b005-46f504cde2a0"}

Thursday, October 10, 13

Page 28: Running At 99%: Mitigating App DoS

$proxy.js

reverse proxy

has own blacklist

has own greylist

has own disabled URL list

236 lines of code

dynamic header and request timeouts

Thursday, October 10, 13

Page 29: Running At 99%: Mitigating App DoS

$proxy.js (does):

closes blacklisted sockets immediately

monitors total time to send headers (mitigate slow loris)

monitors total time from request to end of response

assigns UUID (v4) to every request

forwards request records to aggregator

Thursday, October 10, 13

Page 30: Running At 99%: Mitigating App DoS

$aggregator.js (does)

links proxies and consumers

multiplex events to consumers

multiplex commands to proxies

64 lines of code

Thursday, October 10, 13

Page 31: Running At 99%: Mitigating App DoS

$consumers

you write these

“drink from the (JSON) firehose”

make independent decisions

can be sized to the problem

send commands upstream via aggregator

Thursday, October 10, 13

Page 32: Running At 99%: Mitigating App DoS

$consumer commands

block/unblock

grey

durl/eurl

htimeout

rtimeout

flush

Thursday, October 10, 13

Page 33: Running At 99%: Mitigating App DoS

$example commands

BLOCK 10.0.0.1|10000

DURL /puppies_in_santa_costume.jpgGREY 192.168.1.1|60000

HTIMEOUT 2000RTIMEOUT 10000

Thursday, October 10, 13

Page 34: Running At 99%: Mitigating App DoS

$example consumer 1

track TCP connection attempts over a time period

cross the threshold, block

Thursday, October 10, 13

Page 35: Running At 99%: Mitigating App DoS

$demo consumer 1

Thursday, October 10, 13

Page 36: Running At 99%: Mitigating App DoS

$example consumer 2

track pages using the most time

track hosts using those pages

disable the url for hosts that cross threshold

Thursday, October 10, 13

Page 37: Running At 99%: Mitigating App DoS

$demo consumer 2

Thursday, October 10, 13

Page 38: Running At 99%: Mitigating App DoS

$demo consumer 2a

thi

Thursday, October 10, 13

Page 39: Running At 99%: Mitigating App DoS

$example consumer 3

python + redis

sorted sets are AWESOME

times stored for each ip with specified granularity

Thursday, October 10, 13

Page 40: Running At 99%: Mitigating App DoS

$demo consumer 3

Thursday, October 10, 13

Page 41: Running At 99%: Mitigating App DoS

$logs

echo -e ‘C\n’ | ncat (aggregator) 5555 | gzip > /tmp/meh.log

Thursday, October 10, 13

Page 42: Running At 99%: Mitigating App DoS

$running

proxy MUST be run with ulimit -n increase

node ‘forever’ for daemonizing

clock sync VERY IMPORTANT

Thursday, October 10, 13

Page 43: Running At 99%: Mitigating App DoS

$performance testing!

AWS c1.medium example 2 -> 62k requests/s (datatest.py generated data)

network saturated before CPU

Thursday, October 10, 13

Page 44: Running At 99%: Mitigating App DoS

$other uses

weathering a popularity storm

scraper-pocalypse

Thursday, October 10, 13

Page 45: Running At 99%: Mitigating App DoS

$the future, Conan?gzip

operationalize

document

amazon amis

library of consumers

¿multicast?

¿log destroyed connections?

Thursday, October 10, 13

Page 46: Running At 99%: Mitigating App DoS

$takeaways

DoS mitigation is easier with a complete picture

suggestions are VERY welcome

contribution much appreciated

Thursday, October 10, 13

Page 47: Running At 99%: Mitigating App DoS

$further reading

http://goo.gl/c2vyEc

Thursday, October 10, 13

Page 48: Running At 99%: Mitigating App DoS

$whoami

ryan huber

risk.ioorbitz.com

ebookers.com

small local ISP

Thursday, October 10, 13

Page 49: Running At 99%: Mitigating App DoS

$thanks!

https://www.github.com/rawdigits/Bouncer

[email protected]

@ryanhuber

Thursday, October 10, 13

Page 50: Running At 99%: Mitigating App DoS

$DEMO!!11!1!

Thursday, October 10, 13