Приветствую, уважаемый читатель!
Сегодня хочу написать
про сканер уязвимостей Nessus,
а точнее про способ управления Nessus
через Rest API.
Такая необходимость может возникнуть, если хочется автоматизировать запуск
сканирования интересующих ip-адресов
при наступлении какого-либо события.
Для автоматизации
запуска сканирования будет использовать Python и модуль Requests. Алгоритм работы
привычный, получаем токен, вставляем в качестве заголовка в http-запросы и отправляем задания на Nessus.
Получение
сессионного токена для работы с сервером
Первое, что необходимо
сделать, это получить сессионный токен, который будет использоваться в качестве
заголовка http-запросов.
import json
import requests
#Get Nessus session token
body = {'username':
'bas','password': 'bas'}
headers = {'Content-Type':
'application/json'}
req =
requests.post("https://localhost:8834/session",
data=json.dumps(body), headers=headers, verify=False)
token =
json.loads(req.content)
auth_token
= token['token']
print('Session token
-> ' + auth_token)
Получить список
политик/профилей сканирования
Думаю, очевидно, что
перед запуском сканирования необходимо получить список политик или профилей
сканирования. Профиль с необходимым количеством плагинов можно создать в web-интерфейсе Nessus на вкладке Policies, для этого предусмотрен
богатый набор предустановленных шаблонов (представлен на скрине ниже).
Получить
список политик можно следующим запросом:
auth = 'token='+auth_token
pol_Headers =
{"X-Cookie": auth}
req =
requests.get("https://localhost:8834/policies", headers=pol_Headers,
verify=False)
print(req.content)
Из
списка параметров каждой политики нас будут интересовать 2 параметра: template_uuid и id.
Запуск сканирования
Для
запуска сканирования необходимо сформировать задание на сканирование в json-формате, с указанием объекта
сканирования и id
профиля
сканирования, и далее запустить сканирование.
#Task new scan
auth = 'token='+auth_token
pol_Headers =
{"X-Cookie": auth, "Content-Type":
"application/json"}
body = {
"uuid":"ad629e16-03b6-8c1d-cef6-ef8c9dd3c658d24bd260ef5f9e66",
"settings":{
"name": "Rest scan",
"policy_id": "4",
"text_targets":
"192.168.2.253"
}}
req =
requests.post("https://localhost:8834/scans", data=json.dumps(body),
headers=pol_Headers, verify=False)
scan =
json.loads(req.content)
scan_id = scan['scan']['id']
print('ScanID -> ' +
str(scan_id))
В
итоге получаем идентификатор созданной задачи на сканирование. Для запуска
процесса сканирования необходимо отправить ещё один запрос с указанием
идентификатора задачи (представлен ниже).
#Launch new scan
pol_Headers = {'X-Cookie':
auth}
uri = 'https:// localhost:8834/scans/'
+ str(scan_id) +'/launch'
req = requests.post(uri,
headers=pol_Headers, verify=False)
scan_uuid =
json.loads(req.content)
print('ScanUUID -> ' +
str(scan_uuid['scan_uuid']))
Получить список
запущенных сканирований
Для
получения списка запущенных и заверенных сканирований, необходимо выполнить
запрос по ссылке https://nessus_ip:8834/scans .
В поле folder_id передается
идентификатор папки со сканами. В моём случае, я показываю сканы из папки «My Scans».
#List active scans
pol_Headers = {'X-Cookie': auth}
uri = 'https://localhost:8834/scans'
req = requests.get(uri, headers=pol_Headers,
verify=False)
ActiveScans =
json.loads(req.content)
print('\n\r Active Scans
\n\r')
for ActiveScan in
ActiveScans['scans']:
if ActiveScan['folder_id'] == 3:
print ActiveScan['name']
print ActiveScan['uuid']
print ActiveScan['id']
print ActiveScan['status']
print '\n\r'
Использование постоянных токенов
В
запросах к Nessus
вы можете использовать постоянные токены и не получать сессионный. Для их
генерации необходимо перейти в web-интерфейсе
Nessus
на
вкладку User
Profile/API Keys и
нажать на кнопку Generate.
Вы
увидите 2 созданных токена: Access
key
и
Secret
Key.
В запросах к Nessus
их
необходимо поместить в заголовок X-ApiKeys.
#List active scans
access_key =
'ace40ad3b843c01da37219a08cb703f2a1dd8273ba9b7776fb83dc915d4c5331'
secret_key = '812189825d11c49855bbkjbde3d295e8ee5e89914341a5e9b0b0f0315ff73bc'
pol_Headers = {'X-ApiKeys':
'accessKey='+access_key+'; secretKey='+secret_key}
uri = 'https://localhost:8834/scans'
req = requests.get(uri,
headers=pol_Headers, verify=False)
ActiveScans =
json.loads(req.content)
print('\n\r Active Scans
\n\r')
for ActiveScan in
ActiveScans['scans']:
if ActiveScan['folder_id'] == 3:
print ActiveScan['name']
print ActiveScan['uuid']
print ActiveScan['id']
print ActiveScan['status']
print '\n\r'
Всем
удачного использования J
Комментариев нет:
Отправить комментарий