Вот почему большинство обитателей форумов по сет. безопасности не используют функционал nmap скриптов?
в данный момент smb-enum-users.nse, дописав пару строчек кода он создает файлы вида [user].txt и складывает в них хосты с обнаруженным T:3389 предварительно определив имена пользователей 2-мя способами. для брута дедиков просто сказка )
например задались вопросом отпарсить IP-шки с вывода сканирования 3389 порта RDP в 1 файл... легко, пишем: ips.nse Code: -- напишем описание description = [[ Создает список IP в файл исходя из параметров порта 3389. ]] -- укажем автора author = "ROleg aka PabloPicasso" -- укажем условия использования =) license = "Same as Nmap--See http://nmap.org/book/man-legal.html" -- категории к которым относится скрипт categories = {"discovery"} -- укажем необходимые либы для роботы с портами require "shortport" -- оброботка action начнется если portrule будет правдой -- т.е. если порт_или_сервис будут 3389, ms-term-serv portrule = shortport.port_or_service(3389, "ms-term-serv") -- выполняем основные действия -- примем на входе хост и порт action = function(host, port) -- откроем файл ip.txt для записи с добавлением (а+) file = io.open ("ip.txt","a+") -- добавим в очередь записи айпишку file:write (host.ip.."\n") -- запишем в файл file:flash() -- закроем файл file:close() end нечего сложного, единственная проблема что для сканера есть рус. документация http://nmap.org/man/ru/ а для скриптового движка только на англ. http://nmap.org/book/nse.html запускаем: nmap -iR 0 -n -PS 3389 -p T:3389 --script=ips.nse и получили шустрый многопоточный сканер RDP по всему инету с кучей опций сканирования.
продолжим дальше, хотим создать списки для брута RDP используя реальные имена пользователей на атакуемой системе, в этом нам помогут SMB и RPC библиотеки NMAP: rdp-to-users.nse Code: description = [[ 1. Резолвим пользователей 2-мя способами через lsa и samr средствами SMB сервиса проверяемой системы. 2. При доступности открытого 3389 порта создаем файлы вида [username].txt и записываем туда айпишки серверов имеющих такой аккаунт. ]] author = "ROleg aka PabloPicasso" license = "Same as Nmap--See http://nmap.org/book/man-legal.html" categories = {"discovery"} require 'msrpc' require 'smb' require 'stdnse' require 'comm' require 'shortport' -- укажем условие хоста, функция smb.get_port() -- ищет комбинацию открытых портов -- для доступа к SMB сервису обычно 139 либо поверх 445 порта -- если найдены порты, открыты, делаем action hostrule = function(host) return smb.get_port(host) ~= nil end -- примем на входе хост action = function(host) -- об'явим необходимые переменные -- i и j пригодятся для циклов for local i, j -- определим статусные переменные local samr_status = false local lsa_status = false -- и для результата local samr_result = "" local lsa_result = "" -- массивы имен пользователей local names = {} local names_lookup = {} -- массив для сообщений на экран local response = {} -- т.к. нам важно чтобы был открыт 3389 порт, -- будем проверять чтобы лишний раз не выполнять основное тело скрипта if (shortport.port_or_service(3389, "ms-term-serv")) then -- Пробуем получить информацию при помощи SAMR. samr_status, samr_result = msrpc.samr_enum_users(host) -- если получилось if(samr_status) then -- от 1 до #samr_result по одному =) for i = 1, #samr_result, 1 do -- заносим в массив names[] полученные результаты table.insert(names, samr_result[i]) -- будем избавляется от дубликатов names_lookup[samr_result[i]['name']] = true end end -- Пробуем получить информацию через LSA. lsa_status, lsa_result = msrpc.lsa_enum_users(host) if(lsa_status) then for i = 1, #lsa_result, 1 do if(lsa_result[i]['name'] ~= nil) then -- проверим нет ли уже у нас такого имени if(not(names_lookup[lsa_result[i]['name']])) then -- заносим в массив names[] полученные результаты table.insert(names, lsa_result[i]) end end end end -- Если все способы не сработали if(samr_status == false and lsa_status == false) then -- и если ответом было ACCESS_DENIED if(string.find(lsa_result, 'ACCESS_DENIED')) then return stdnse.format_output(false, "Доступ ограничен настройками политик") end return stdnse.format_output(false, {"Невозможно определить имена пользователей", "SAMR вернул " .. samr_result, "LSA вернул " .. lsa_result}) end -- Делаем сортировку table.sort(names, function (a, b) return string.lower(a.name) < string.lower(b.name) end) -- Проверим есть ли имена в массиве if(#names == 0) then table.insert(response, "Скрипт не получил имен, извините!") else -- Запишем айпишки серверов в файлы, для каждого пользователя в свой local names = {} for _, info in ipairs(domain_users) do file = io.open (info['name']..".txt","a+") file:write (host.ip.."\n") file:flush() file:close() table.insert(names, info['name']) end -- Выводим на стандартный выход результаты работы table.insert(response, string.format("Users: %s", stdnse.strjoin(", ", names))) end end return stdnse.format_output(true, response) end брутить по спискам Administrator.txt, Admin.txt, root.txt или Вася.txt намного проще чем перебирать все возможные логины брутом =) но есть свои минусы, не везде включены SMB службы ( заходим например в диррикторию users_ip_to_brute: cd users_ip_to_brute выполняем: nmap -iR 0 -n -sU -sS -PS137,139,445,3389 -p U:137,T:139,445,3389 --script=rdp-to-users.nse ждем, брутим...
Немного не по теме, но хотелось бы узнать, в nmap есть возможность массового сканирования хостов? То бишь конкретнее у меня есть список хостов, к примеру и мне нужно просканировать сервисы, которые там установлены. Так-то юзаю XSpider, но nmap серьезнее все таки.
У меня вопрос по решению задачи, проводится ping-сканирование оборудования по IP Хотелось бы чтобы nmap выводил не только активное оборудование, но и не активные А так же добавить в вывод описания Host *.*.*.* is up (0.0023s latency). "описание" спасибо
насчет питона! вот случайно наткнулся! как нить попробую! http://pypi.python.org/pypi/python-nmap/0.1.1
Скрипт rdp-to-users.nse не работает, тестил на локалке, nmap показывает что все нужные порты открыты но не создает никаких выходных файлов. Тестил на 3500 rdp из интернета - ни одного созданого файла.