пятница, 28 октября 2016 г.

Nessus. Rest API

Приветствую, уважаемый читатель!

Сегодня хочу написать про сканер уязвимостей 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']))

В web-интерфейсе Nessus вы увидите, что сканирование запущено.



Получить список запущенных сканирований

Для получения списка запущенных и заверенных сканирований, необходимо выполнить запрос по ссылке 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




Комментариев нет:

Отправить комментарий