предисловие
В моей стране из-за большого количества пользователей Интернета операторы не могут гарантировать каждому пользователю широкополосного доступа уникальный общедоступный IPv4-адрес в мире. Поэтому многие пользователи обнаружат, что IP-адрес на стороне WAN, просматриваемый через маршрутизатор, не соответствует IP-адресу, полученному с помощью ключевого слова Baidu «IP», а IP-адрес первого является частным IP-адресом.
В других случаях общедоступный IP-адрес относительно дорог.Хотя само предприятие имеет небольшое количество независимых общедоступных IP-адресов, оно не может предоставить общедоступный IP-адрес для каждого хоста на предприятии из-за ограничений по стоимости, или внутренняя сеть не подключена к общедоступная сеть.Не все службы должны быть доступны в общедоступной сети для доступа, поэтому предприятия могут использовать технологию NAT для сопоставления большого количества IP-адресов интрасети с общедоступными IP-адресами с помощью определенных правил. Одной из наиболее распространенных технологий является NAPT, также известная как «трансляция адресов сетевых портов». Поскольку служба обычно предоставляется через порт, таким образом, конкретная служба может быть открыта для небольшого числа общедоступных IP-адресов с помощью определенных правил.
проблема
Но иногда наши личные пользователи широкополосного доступа также хотят опубликовать свои услуги на общедоступном IP-адресе. Например, мы сделали красивый сайт и хотим выложить его в интернет для всеобщего обозрения, как это сделать без публичного IP?
Иногда, когда мы проводим тесты на проникновение на предприятии, мы обнаруживаем, что общедоступный сетевой сервер предприятия открывает для общедоступной сети только общий порт 80, а такие порты, как 3389, которые нам нужно использовать для повышения привилегий, не открыты для публичная сеть, что тогда делать?
Способ решения этих проблем — проникновение во внутреннюю сеть.
принцип NAPT
Проще говоря, на шлюзе NAT будет таблица сопоставления, в которой записано, какой IP-адрес и порт интрасети инициирует запрос к общедоступной сети, а затем, если в интрасети есть хост, который инициирует запрос к общедоступному сетевому устройству. , запрос от хоста интрасети Пакет данных передается на шлюз NAT, затем шлюз NAT изменит исходный IP-адрес и исходный порт пакета данных, чтобы они были IP-адресом самого шлюза NAT и любым неконфликтующим портом. который не используется сам по себе, и запишите его изменение в таблице сопоставления. Наконец, измененный пакет данных отправляется запрошенному целевому узлу, и после того, как целевой узел отправляет ответный пакет, он затем используется для поиска узла интрасети для пересылки в таблице сопоставления в соответствии с целевым IP-адресом и целевым портом. в ответном пакете. Таким образом, хост внутренней сети может получить доступ к общедоступному сетевому устройству через технологию NAPT с помощью единственного общедоступного сетевого IP-адреса маршрутизатора без общедоступного сетевого IP-адреса.
Конкретный принцип я нашел картинку в Интернете
Отсюда мы видим, что NAPT решает только проблему того, как узел внутренней сети может получить доступ к узлу общедоступной сети без IP-адреса общедоступной сети, но не может решить проблему того, как узел общедоступной сети активно инициирует запросы к узлу внутренней сети. .
частный адрес
Частные адреса описаны ранее в документе RFC 1918.
Интернет-организация присвоенных именIANAОрганизация (Управление по присвоению номеров в Интернете) резервирует следующие триайпи адресБлоки используются для частных сетей.
10.0.0.0 - 10.255.255.255 (префикс 10/8 бит)
172.16.0.0 - 172.31.255.255 (префикс 172.16/12 бит)
192.168.0.0 - 192.168.255.255 (префикс 192.168/16 бит)
Мы видим, что имеется 1 адресный блок класса A, 32 адресных блока класса B и 256 адресных блоков класса C. Основные домашние маршрутизаторы используют частные адреса класса C в качестве IP-адресов на стороне LAN маршрутизаторов, поэтому мы можем видеть, что IP-адреса на странице настроек маршрутизатора обычно начинаются с 192.168.1.1.
причина
Давайте сначала поговорим о домашнем широкополосном доступе. Если домашняя широкополосная сеть не имеет общедоступного сетевого IP-адреса, это означает, что любой порт, который вы отслеживаете на локальном компьютере, может быть доступен только в сети, где расположена локальная сетевая карта. роутер находится. Если не заданы специальные правила сопоставления, сеть, подключенная к WAN-стороне маршрутизатора, не сможет нормально получать доступ к службам, предоставляемым хостом.
Если вы хотите, чтобы сторона WAN в этом случае (если оператор назначает вам общедоступный сетевой IP-адрес, то сеть, к которой подключена сторона WAN, обычно является общедоступной сетью), вам необходимо выполнить сопоставление портов на маршрутизаторе. Например, IP-адрес маршрутизатора в локальной сети — 192.168.1.1, а IP-адрес в глобальной сети — 23.23.23.23 Я хочу, чтобы HTTP-сервер, предоставляемый портом 80 узла интрасети 192.168.1.2, мог напрямую проходить через общедоступную сеть.http://23.23.23.23доступа, затем сопоставьте 192.168.1.2:80 с 23.23.23.23:80.
Но обычно операторы не дают обычным пользователям общедоступные IP-адреса. Тогда при таком методе сопоставления он по-прежнему недоступен в общедоступной сети, потому что WAN-сторона вашего маршрутизатора подключена к LAN-стороне маршрутизатора на более высоком уровне оператора. соединение в конце не достигает общедоступной сети. , такое поведение называется проникновением трафика. Есть много такого поведения в определенном домашнем электричестве и определенном широкополосном широкополосном доступе. Услуга широкополосного доступа, обеспечиваемая проникновением трафика, может показаться дешевой, но на самом деле она оказывает большое влияние. Поскольку все используют один и тот же IP-адрес, это может привести к тому, что политики защиты от спама на многих веб-сайтах навредят невиновным людям, или использование внутреннего кэша для экономии пропускной способности, что приведет к in Некоторые конфиденциальные и безопасные страницы, которые не должны кэшироваться, кэшируются, и даже некоторые веб-сайты не могут быть полностью открыты из-за аннулирования кеша.
Некоторые люди обнаруживают, что, несмотря на то, что у них есть общедоступный IP-адрес, они все равно не могут настроить сервер обычными методами. Для того, чтобы люди не открывали различные нелегальные сервисы по своему желанию, а хакеры не могли ловить кур и выполнять пакетное сканирование через сканеры, операторы заблокировали некоторые часто используемые порты.Например, China Telecom в нашей стране заблокировала такие порты, как 80 и 8080. . . . Этот запрет в определенной степени обеспечивает нашу сетевую безопасность.Например, вирус-вымогатель некоторое время назад, потому что большинство пользователей в Китае не имеют независимых общедоступных IP-адресов, а операционные системы наиболее подвержены уязвимостям.Порты 135 и 139 заблокированы. Запрет оператора значительно снизил вероятность рекрутирования отечественных персональных домашних компьютеров, однако, даже при наличии общедоступного сетевого IP, общий порт не может быть использован для предоставления услуг во внешнюю сеть, а может быть изменен только на другой. порты. Что в этом плохого? Типичная проблема заключается в том, что веб-сайт по умолчанию использует порт 80, поэтому вам не нужно указывать номер порта при вводе URL-адреса, что выглядит более красиво.
решение
Если мы столкнемся с вышеуказанной ситуацией, как мы можем ее решить?
Если у нас нет общедоступного сетевого сервера, мы можем использовать знаменитые отечественные «арахисовую скорлупу», «нат123» и другие сервисы для достижения цели, но какой принцип стоит за ними?
Если у нас есть сервер с IP-адресом общедоступной сети, мы можем использовать этот IP-сервер общедоступной сети для предоставления услуг. И как именно это нужно сделать?
Реализация решения
Давайте сначала предположим, что у нас есть общедоступный сетевой сервер, и его IP-адрес 45.45.45.45. У нас есть еще один IP-адрес сервера интрасети 23.23.23.23.Теперь мы хотим открыть 23.23.23.23:80, то есть службу HTTP на сервере интрасети, на 45.45.45.45.
Самый простой и грубый способ заключается в том, что мы можем напрямую перестроить всю серверную среду интрасети на сервере общедоступной сети.
Но делать это очень хлопотно.Иногда мы не хотим этого делать.Мы просто хотим просто использовать сеть публичного сервера для публикации внутрисетевого сервиса.
Ранее мы узнали из принципа NAPT: NAPT позволяет узлу внутренней сети получать доступ к узлу общедоступной сети без IP-адреса общедоступной сети. Затем мы можем сделать следующее: предположим, что общедоступный IP-адрес — 23.23.23.23, а внутренний IP-адрес — 192.168.1.2. Хост общедоступной сети сначала прослушивает порт 80, который используется для предоставления службы HTTP снаружи, а 80 является портом по умолчанию для веб-сервера. В то же время любой другой порт (здесь мы предполагаем 7777), прослушивающий этот порт, используется для того, чтобы позволить серверу интрасети активно подключаться для открытия туннеля. Затем интрасеть активно инициирует запрос к 7777 узла общедоступной сети, чтобы интрасеть успешно установила канал соединения с узлом общедоступной сети. Затем, когда какой-либо клиент активно подключается к порту 80 общедоступной сети, общедоступная сеть сразу же пересылает запрос на подключение к хосту внутренней сети через ранее установленный туннель после получения запроса на подключение.После того, как хост внутренней сети получает пакет данных из туннеля Затем активно подключитесь к порту 80 самого хоста интрасети. После успешного подключения пакет данных будет переадресован на порт 80. После того, как программа HTTP-сервера обработает пакет данных и сгенерирует ответное сообщение, он будет перенаправлен обратно тем же путем. Наконец, он достигает порта 80 общедоступной сети, а затем возвращается к клиенту, который первоначально запросил порт 80 сервера общедоступной сети.
Не выглядит ли это довольно запутанным? На самом деле, принцип знаменитой интранет-версии арахисовой скорлупы, nat123 и других инструментов проникновения в интранет в основном одинаков, но это не совсем так. Поскольку порт транспортного уровня может одновременно предоставлять только одну услугу, но мы обнаружим, что служба проникновения во внутреннюю сеть Peanut Shell предоставляет услуги многим пользователям одновременно с помощью IP-адреса общедоступной сети.Уровень не пересылает сообщение, как я сказал ранее, но перед пересылкой добавляет некоторый контент протокола управления, который используется для указания, какой клиент оболочки арахиса должен быть перенаправлен на узел интрасети, где находится клиент. Первый, неповрежденный метод пересылки обычно называется прозрачной передачей или прозрачным прокси.
Проникнуть через брандмауэр
В целях безопасности в сеть обычно добавляется брандмауэр, а у брандмауэра есть правила для входящего и исходящего трафика. Если это не очень строгий контроль безопасности, то исходящие правила обычно не устанавливаются, а входящие правила обычно устанавливаются, например, внешний может получить доступ к веб-странице через веб-сервер внутренней сети через порт 80, но не может войти в систему. через порт 3389. Удаленный рабочий стол внутри сети.
В процессе проникновения в интрасеть в этой ситуации мы также можем использовать традиционный метод вышеупомянутой интрасети для реализации входящих правил для проникновения через брандмауэр. Поскольку брандмауэр обычно перехватывает только входящие, а не исходящие, мы можем сделать сервер интрасети активно исходящим (активно подключаться к серверу хакера), открыть туннель с собственным сервером хакера и, наконец, обойти брандмауэр и подключиться к удаленному рабочему столу 3389. .
Другая ситуация заключается в том, что мы удалили один из серверов из белого списка в интрасети, на котором нет правил брандмауэра, но мы хотим подключиться к другому целевому серверу, который имеет входящие правила в интрасети, тогда мы можем сделать это Сервер белого списка используется в качестве трамплина, чтобы позволить ему прослушивать любой собственный порт, а затем после того, как любой пользователь подключится к этому порту, сервер белого списка будет активно подключаться к целевому серверу в интрасети, а затем использовать этот сервер белого списка, чтобы пройти через хакеров Туннель подключения к целевому серверу.
Знаменитый принцип lcx в хакерских инструментах тот же самый, первый реализуется командами listen и slave lcx, а второй реализуется командой tran lcx.
Код
Зная принцип, как его реализовать?
Я решил использовать язык программирования Go для реализации такого инструмента проникновения в интранет.
Сам Golang предоставляет множество сетевых библиотек, а встроенная в Golang Goroutine легко справляется с асинхронным вводом-выводом в сетевом программировании, а самое главное, программы, разработанные на Golang, могут работать кроссплатформенно, а это значит, что написание копии кода которые мы можем скомпилировать и использовать в любой операционной системе.
https://github.com/cw1997/NATBypass
При начальном выполнении приветственное сообщение выводится в зависимости от ситуации и имеет синтаксические подсказки (здесь важно отметить, что time.Sleep вызывается в конце функции printWelcome для блокировки на одну секунду, это связано с тем, что вывод пакета fmt не является потокобезопасным, а вывод пакета журнала является потокобезопасным. , поэтому используйте эту функцию, чтобы отдохнуть в течение секунды, чтобы предотвратить вкрапление журнала в последующем потоке выполнения в информацию подсказки )
Во-первых, определите, какая стратегия переадресации используется в настоящее время, оценивая входящие параметры.
Затем оцените правильность входящих параметров и проверьте правильность диапазона IP и портов с помощью регулярных выражений и т. д.
С помощью функции port2port два порта могут одновременно прослушивать в обоих направлениях и пересылать данные.
Передача Springboard реализована в операции port2host.
В host2host реализована функция активного подключения для открытия туннеля.
Глядя на код, вы можете понять, что пакет net для работы с сокетом в Golang намного проще, чем операция socket.h в языке C.
Ядро функции пересылки лежит в части функции пересылки.
Сначала выведите журнал, чтобы указать, какие два соединения перенаправляются в обоих направлениях, а затем реализуйте функцию условной блокировки через группу ожидания в пакете синхронизации, чтобы предотвратить выход основного потока до завершения выполнения горутины.
Затем запустите две горутины для обработки копии пакетов ввода-вывода из соединения 1 в соединение 2 и копии пакетов ввода-вывода из соединения 2 в соединение 1 соответственно. Поскольку необходимо обеспечить, чтобы связь между двумя портами была полнодуплексной, то есть обе стороны должны иметь возможность обмениваться данными друг с другом одновременно, поэтому для реализации параллелизма этих двух операций используются горутины.
Основной код для копирования пакетов данных ввода-вывода находится в функции connCopy.Определяется, следует ли использовать функцию io.MultiWriter, которая представляет собой функцию потока данных с многосторонней записью, в соответствии с необходимостью записи журнала трафика.
Если файловый поток файла журнала открывается успешно, функция io.MultiWriter генерирует поток с множественной записью Здесь имя переменной этого потока с множественной записью — w, и любые данные, записываемые в поток записи w будут записываться одновременно.Введите параметры, ранее участвовавшие в выполнении функции создания потока с множественной записью io.MultiWriter, где параметры conn1 и logFile, которые являются портом 1 и потоком файла журнала.
Затем вызовите io.Copy, чтобы непрерывно копировать данные, считанные из потока чтения второго параметра, в поток записи первого параметра.
Здесь следует отметить, что функция io.Copy синхронно заблокирована, а это значит, что пока соединение не будет разорвано, поток выполнения программы всегда будет зависать в этой функции. Если в копии будет ошибка, то функция io.Copy вернется, то есть выполнит код под ней. Ошибка копирования означает, что соединение может быть разорвано, поэтому сначала разрывается соединение с потоком записи.
Здесь важно отметить, почему поток записи отключается, а не все потоки чтения и записи. Поскольку до этого мы запускали две горутины, если их все отключить вслепую, это приведет к потере неписаных данных в другой горутине. В частности, его можно проанализировать по четырем волнам TCP.
фактическое исполнение
Если у вас нет среды Golang, вы можете напрямую загрузить скомпилированный исполняемый файл, адрес загрузки:https://github.com/cw1997/NATBypass/releases
Давайте сначала посмотрим на реальную работу кода после компиляции.Слева на картинке выше это сервер интрасети, работающий на виртуальной машине.Он настроил входящие правила, и невозможно подключиться к удаленному рабочему столу по прямое подключение к 192.168.2.112:3389.
В этот момент картинка справа начинает прослушивать порты 7777 и 9999 через команду listen.
Затем сервер интрасети запускает двустороннее соединение с хостом хакера (192.168.2.101:7777 на правом рисунке) и локальным 127.0.0.1:3389 через подчиненную команду.
Затем хост хакера может подключиться к другому порту 127.0.0.1:9999, прослушивая локально, чтобы подключиться к удаленному рабочему столу сервера интрасети.
Вы можете всесторонне понять этот процесс на основе результатов netstat -an и вывода журнала консоли.
напиши в конце
Этот инструмент по-прежнему представляет собой простую прозрачную передачу, и здесь много проблем. Например, локальное активное подключение к интранет-сервису предварительно подключено с самого начала, что приведет к тому, что некоторые сервисы при отсутствии передачи данных в течение длительного времени после подключения будут активно разрывать подключение, что приводит к периодическим сбоям в работе. подключиться к публичной сети.Небольшой баг, который можно подключить только после отключения и повторного подключения.Конкретно HTTP-серверу нужно несколько раз обновить страницу, а удаленный рабочий стол может быть подключен, а затем отменен, и тогда его можно снова подключил. И еще есть некоторые детали, которые плохо реализованы в обработке одновременных подключений. И в настоящее время поддерживает только переадресацию TCP-соединения и т. Д. Конечно, реализовать переадресацию UDP не очень сложно, и можно сделать небольшое улучшение. Вы также можете щелкнуть звездочку и упомянуть о розыгрыше запрос на совместное решение этих вопросов. В настоящее время связанные проекты с открытым исходным кодом также относительно зрелые, такие как ngork, написанный Golang, вы также можете сослаться на него.
Эта статья написана@чанвэйОригинал, в колонке Zhihu - красота кодаzhuanlan.zhihu.com/codesВ первый раз просьба указывать источник для перепечатки. Если вам нравятся мои статьи и вы поддерживаете их, вы можете нажать на мой аватар и название столбца, чтобы подписаться, или нажать кнопку вознаграждения ниже, чтобы поддержать, спасибо!