предисловие
В процессе тестирования на проникновение мы часто сталкиваемся с особо «скупыми» целями, и IP будет заблокирован после небольшого прикосновения. В этом случае мы, естественно, думаем о сокрытии IP через большое количество бесплатных прокси в Интернете.
Так вот вопрос, какие агенты получаются, а очередной агент заменяется вручную каждый раз при его использовании? Это слишком похоже на то, как работает огнестрельное оружие, и я чувствую усталость, просто думая об этом.
Итак, мой младший брат приехал, чтобы построить пулемет, чух чу чу... Мне хочется думать об этом.
Реализация функции
Функция прокси
В основном это реализовано с использованием встроенных в 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-адрес, следующие:
ipv4bot.whatismyipaddress.com/
Тестовая проверка
код верификации
Зайдите на http://ip.chinaz.com/getip.aspx через shadowProxy, чтобы визуально проверить эффект прокси.
import requestsimport 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
else:
msg = "Запрос %d
time.sleep(2)
except KeyboardInterrupt:
print('\r**************************\n\tПользователь прерван\t\n************ ************')
break
except Exception as e:
msg = "Запрос %d
time.sleep(2)
finally:
print(msg)
Показать результаты
Анимированный дисплей:test_shadowProxy.gif
Пистолет хороший, но есть некоторые проблемы.
закончились боеприпасы- Прокси, просканированные инструментом, имеют много дубликатов, многие недоступны, а их всего сто восемьдесят.
Боеприпасы плохого качества- Многие полученные прокси не могут передавать большие пакеты данных (прерывание), а мелкие пакеты тоже нестабильны.
варенье из пулемета- Из-за вышеуказанных проблем необходимо улучшить функцию отказоустойчивости/повторных попыток инструмента. (Последующие моменты для улучшения)
PS: после того, как последующий код будет улучшен, можно рассмотреть выпуск с открытым исходным кодом.
2018-01-10 Update
В настоящее время в агент добавлена функция автоматического повтора, чтобы сделать его более стабильным при выполнении запросов.
Заодно нашел хороший проксилист.GitHub.com/fate0/proxy…
Теперь вы можете использовать его более плавно:
Релиз с открытым исходным кодом
Создать и установить сертификат
создать сертификат
shadowProxy git:(мастер) ✗ lltotal 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 звезду, спасибо!
Все статьи на этом сайте являются оригинальными, просьба указывать источник для перепечатки!