Волшебный прокси-инструмент shadowProxy — переключайте IP-адреса призрачным образом

Python

предисловие

В процессе тестирования на проникновение мы часто сталкиваемся с особо «скупыми» целями, и IP будет заблокирован после небольшого прикосновения. В этом случае мы, естественно, думаем о сокрытии IP через большое количество бесплатных прокси в Интернете.

Так вот вопрос, какие агенты получаются, а очередной агент заменяется вручную каждый раз при его использовании? Это слишком похоже на то, как работает огнестрельное оружие, и я чувствую усталость, просто думая об этом.

Итак, мой младший брат приехал, чтобы построить пулемет, чух чу чу... Мне хочется думать об этом.

GitHub.com/OD boy/Антивирус…

Реализация функции

Функция прокси

В основном это реализовано с использованием встроенных в Python библиотек http.server и http.client.

Для интерпретации кода, связанного с http.server, обратитесь к моей предыдущей статье Анализ исходного кода Python от SocketServer до SimpleHTTPServer

Код функции главного агента:

def do_GET(self):

    if self.path == 'http://shadow.proxy/':
        self.send_cacert()
        # print("%s download %s" % (self.client_address, self.cacert))
        return

    req = self
    content_length = int(req.headers.get('Content-Length', 0))
    req_body = self.rfile.read(content_length) if content_length else None

    if req.path[0] == '/':
        if isinstance(self.connection, ssl.SSLSocket): # ssl.SSLSocket or ssl.SSLContext
            req.path = "https://%s%s" % (req.headers['Host'], req.path)
        else:
            req.path = "http://%s%s" % (req.headers['Host'], req.path)

    u = urlparse(req.path)
    scheme, netloc= u.scheme, u.netloc
    assert scheme in ("http", "https")
    if netloc:
        req.headers['Host'] = netloc
    setattr(req, 'headers', self.filter_headers(req.headers))

    retryFlag = 0
    while retryFlag < 10 :
        try:
            target = (scheme, netloc)
# Введите протокол и узел URL, верните доступные соединения HTTP(S)Connection
            proxy = proxyCoor.dispatchProxy(target)
            if proxy is None:
      print("Не удалось получить доступный прокси... (Возможно, прокси закончился...)")
                self.send_error(502,"proxy resource RUN OUT!!!")
                return
            print("%s --> [ %d ] %s" % (proxy, retryFlag + 1, req.path))

            if proxy.split("://")[0] == "http":
                conn = http.client.HTTPConnection(proxy.split("://")[1], timeout=self.timeout)
            elif proxy.split("://")[0] == "https":
                conn = http.client.HTTPSConnection(proxy.split("://")[1], timeout=self.timeout)

            conn.request(self.command, req.path, req_body, dict(req.headers))
            res = conn.getresponse()
            # res.response_version = 'HTTP/1.1' if res.version == 11 else 'HTTP/1.0'
res_body = res.read() # Transfer-Encoding не требует специальной обработки (кроме Content-Length)

        except Exception as e:
            retryFlag += 1
            # self.send_error(502)
            # return
        else:
            try:
                if 'Content-Length' not in res.headers:
                    res.headers['Content-Length'] = str(len(res_body))
                setattr(res, 'headers', self.filter_headers(res.headers))
                self.send_response_only(res.status, res.reason)
                for keyword in res.headers:
                    self.send_header(keyword, res.headers.get(keyword, ""))
                self.end_headers()
                self.wfile.write(res_body)
                self.wfile.flush()
            except:
                pass
            finally:
retryFlag = 9999 # Максимальное значение, окончание повторной попытки.
                conn.close()


# Другие методы повторно используют метод GET.
do_HEAD = do_GET
do_POST = do_GET
do_PUT = do_GET
do_DELETE = do_GET
do_OPTIONS = do_GET
do_TRACE = do_GET
Прокси-координатор

Основная реализация:

Импорт прокси-списка

Проверить доступность и анонимность прокси

Ведение двумерной таблицы целевых сайтов и списков прокси

Согласно ведущейся двумерной таблице обратной связи доступны прокси-адреса.

Кроме того, список прокси, который я использовал, просканирован с kuaidaili.com, но качество прокси относительно низкое, и он очень большой. Я также использовал xicidaili раньше, и ситуация аналогична.

Веб-сайты, которые проверяют общедоступный IP-адрес, следующие:

ip.chinaz.com/getip.aspx

ifconfig.me/ip

api.ipify.org

ip.seeip.org

ifconfig.co/ip

myexternalip.com/raw

wtfismyip.com/text

icanhazip.com/

ipv4bot.whatismyipaddress.com/

ip4.seeip.org

Тестовая проверка

код верификации

Зайдите на http://ip.chinaz.com/getip.aspx через shadowProxy, чтобы визуально проверить эффект прокси.

import requests
import time

i = 0
while True:
    try:
        i += 1
        r =requests.get("http://ip.chinaz.com/getip.aspx",proxies={"http":"http://127.0.0.1:8088"},timeout=10)
        if r.status_code == 200:
msg = "Запрос %d✅\t%s"%(i,r.text)
        else:
msg = "Запрос %d⭕\t%d"% (i, r.status_code)
            time.sleep(2)
    except KeyboardInterrupt:
print('\r**************************\n\tПользователь прерван\t\n************ ************')
        break
    except Exception as e:
msg = "Запрос %d❗\t%s" % (i, e )
        time.sleep(2)
    finally:
        print(msg)
Показать результаты

Анимированный дисплей:test_shadowProxy.gif

Пистолет хороший, но есть некоторые проблемы.

закончились боеприпасы- Прокси, просканированные инструментом, имеют много дубликатов, многие недоступны, а их всего сто восемьдесят.

Боеприпасы плохого качества- Многие полученные прокси не могут передавать большие пакеты данных (прерывание), а мелкие пакеты тоже нестабильны.

варенье из пулемета- Из-за вышеуказанных проблем необходимо улучшить функцию отказоустойчивости/повторных попыток инструмента. (Последующие моменты для улучшения)

PS: после того, как последующий код будет улучшен, можно рассмотреть выпуск с открытым исходным кодом.

2018-01-10 Update

В настоящее время в агент добавлена ​​функция автоматического повтора, чтобы сделать его более стабильным при выполнении запросов.

Заодно нашел хороший проксилист.GitHub.com/fate0/proxy…

Теперь вы можете использовать его более плавно:

Релиз с открытым исходным кодом

GitHub.com/OD boy/Антивирус…

Создать и установить сертификат

создать сертификат

shadowProxy git:(мастер) ✗ ll
    total 112
    -rw-r--r--  1 bingo  staff   573B Jan 10 16:42 PCtest.py
    -rw-r--r--  1 bingo  staff   5.9K Jan 10 16:42 ProxyCoordinator.py
    -rw-r--r--  1 bingo  staff    14B Jan 10 16:42 README.md
    drwxr-xr-x  3 bingo  staff    96B Jan 10 16:42 __pycache__
    -rw-r--r--  1 bingo  staff   100B Jan 10 16:42 proxylist-4.txt
    -rw-r--r--  1 bingo  staff    19K Jan 10 16:42 proxylist.txt
    -rwxr-xr-x  1 bingo  staff   302B Jan 10 16:42 setup_https_intercept.sh
    -rw-r--r--  1 bingo  staff    11K Jan 10 16:42 shadowProxy.py

shadowProxy git:(master) ✗ ./setup_https_intercept.sh # Запускаем скрипт напрямую для генерации корневого сертификата
    Generating RSA private key, 2048 bit long modulus
    ........................................................................................................................................+++
    ..................................................................+++
    e is 65537 (0x10001)
    Generating RSA private key, 2048 bit long modulus
    .....................................................................................................................................+++
    ...................+++
    e is 65537 (0x10001)

Установить сертификат

Установите прокси в браузере, указавhttp://127.0.0.1:8088, затем посетитеshadow.proxy/, появится сообщение об установке сертификата. (…)

После установки можно получить доступ к веб-сайту https.

использовать тест
➜ shadowProxy git:(мастер) ✗ python shadowProxy.py -h
        .--.
       |o_o |    ------------------
       |:_/ |   < Author: Mr.Bingo >
      //   \ \   ------------------
     (|     | ) <    oddboy.cn     >
    /'\_   _/`\ ------------------
    \___)=(___/

usage: shadowProxy.py [-h] [--bind BIND] [--port PORT]
                      [--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
                      [--proxyListFile PROXYLISTFILE]

optional arguments:
  -h, --help            show this help message and exit
  --bind BIND           Default: 0.0.0.0
  --port PORT           Default: 8088
  --log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
                        Default: WARNING
  --proxyListFile PROXYLISTFILE
Файл списка прокси
                       
➜ shadowProxy git:(мастер) ✗ python shadowProxy.py
        .--.
       |o_o |    ------------------
       |:_/ |   < Author: Mr.Bingo >
      //   \ \  ------------------
     (|     | ) <    oddboy.cn     >
    /'\_   _/`\  ------------------
    \___)=(___/

Инициализировать пул прокси-серверов Локальный IP-адрес :: 36.110.16.74
импортировать пул прокси::: proxylist.txt
110 прокси успешно импортированы
Serving HTTP on 0.0.0.0 port 8088 (http://0.0.0.0:8088/) ...

Посетите сайт непосредственно для тестирования.

Поскольку инструмент в основном основан на бесплатном онлайн-прокси для сокрытия IP-адресов, его стабильность все еще недостаточно высока, поэтому его рекомендуется использовать только для тестирования пакетов конкретных запросов. Если у вас возникнут какие-либо проблемы во время использования, пришлите мне письмо, я исправлю и улучшу его, если возможно, поставьте моему GitHub звезду, спасибо!

Все статьи на этом сайте являются оригинальными, просьба указывать источник для перепечатки!