Introdução
O Nmap Scripting Engine (NSE) é um dos recursos mais poderosos e flexíveis do Nmap. Ele permite aos usuários escrever (e partilhar) scripts simples para automatizar uma ampla variedade de tarefas de rede. Esses scripts são executados em paralelo com a velocidade e eficiência que se espera do Nmap. Os usuários podem contar com a crescente e diversificada base de dados de scripts distribuídos com o Nmap, ou escrever o seu próprio para atender às necessidades personalizadas, os scripts Nmap Scripting Engine são implementados usando linguagem de programação Lua, Nmap API e um número de realmente poderosas Bibliotecas NSE.
LUA: Lua Tutorials - www.dev-hq.net NMAP API: Nmap API NSEDOC: nsedoc (nse)
Os scripts NSE são (pack) em diferentes categorias:
auth, broadcast, brute, default, discovery, dos, exploit, external, fuzzer, intrusive, malware, safe,vuln
configuando o nosso script NSE dentro de uma destas categorias permite-nos chama-lo a ele e todos
os scripts dentro dessa mesma categoria usando a 'flag' (--script <categoria> <target>). o seguinte
exemplo "irá correr o nosso script e todos que se encontrarem dentro da categoria 'discovery'"
exemplo: nmap -sS -Pn -p 80 --script discovery <target>
Os scripts NSE são divididos em 4 secções:
O 'HEAD' contém meta-dados que descreve a funcionalidade do modulo, autor, impacto, categoria e outros dados descritivos.
As 'DEPENDENCIES' (bibliotecas lua necessarias) ao uso da API de programação do nmap
A 'RULE SECTION' define as condições necessárias para o script executar. Esta secção deve conter pelo menos uma função desta lista: portrule, hostrule, prerule, postrule. Para os fins deste tutorial (e a maioria dos scripts), vou concentrar-se no portrule que pode executar verificações sobre ambas as propriedades de host e porta antes de correr o script. No script abaixo, portrule se aproveita da API do nmap para verificar se há alguma porta http aberta para executar os commands da secção 'the action section'.
A 'ACTION SECTION' define a lógica do script, Na tradição de K&R (kernighan & ritchie) eu vou simplesmente dar a saída "Olá, mundo!" para qualquer porta aberta http usando a API 'return' para fazer o output.
hello.nse
Vamos começar com um script que simplesmente irá imprimir "hello world" para todas as portas HTTP encontradas abertas.Abra um editor de texto e escreva o seguinte trecho em 'hello.nse' em seu diretório home.
- ------------------------------ The Head Section ------------------------------
- description = [[
- Author: r00t-3xp10it
- INURLBR AULA - escrevendo o meu primeiro script NSE para o nmap
- Some Syntax examples:
- nmap --script-help hello.nse
- nmap -sS -Pn -p 80 --script hello.nse <target>
- ]]
- author = "r00t-3xp10it"
- categories = {"discovery", "safe"}
- ------------------------------ Dependencies ------------------------------
- local http = require "http"
- local shortport = require "shortport"
- ------------------------------ The Rule Section ------------------------------
- portrule = shortport.http
- ------------------------------ The Action Section ------------------------------
- action = function(host, port)
- return "Hello world!"
- end
Descrição: na secção 'head' definimos a categoria como 'discovery and safe', para correr este script e todos contidos na categoria 'discovery' basta executarmos 'nmap -sV -p 80,8080 --script discovery <target>', na secção 'Dependencies' chamamos as bibliotecas 'http & shortport', na secção 'the rule section' vamos nos servir da biblioteca 'shortport' para verificar se o <target> está a correr alguma porta com o protocol 'http' abertas, para podermos executar a secção 'the action section' a 'funtion(host, port)' vai executar o command "hello world!" (display no terminal), P.S. a portrule 'shortport.http' verifica todos os protocolos http based, like: http, https, ipp, http-alt, https-alt, vnc-http, oem-agent, soap, http-proxy, (descrição da biblioteca 'shortport.lua')...
shortport.http: https://nmap.org/nsedoc/lib/shortport.html#http
exporte o script para a base de dados do nmap ('/nmap/scripts/' folder)
sudo cp hello.nse /usr/share/nmap/scripts/hello.nse
actualize a base de dados do NSE
sudo nmap --script-updatedb
visualizar a descrição do modulo
sudo nmap --script-help hello.nse
corra o script
sudo nmap -sV -Pn -p 80,443,445,8080 --script hello.nse <target>
file-checker.nse
- description = [[
- Author: r00t-3xp10it
- Quick NSE script to check if the selected file/path/folder exists
- on target webserver by checking google API return codes.
- 'default behavior its to search for robots.txt file'
- Some Syntax examples:
- nmap -sS -Pn -p 80 --script file-checker.nse <target>
- nmap -sS -Pn -p 80 --script file-checker.nse --script-args file=/privacy/ <target>
- nmap -sS -sV -iR 40 -p 80 --open --script file-checker.nse --script-args file=/robots.txt
- ]]
- ---
- -- @usage
- -- nmap --script-help file-checker.nse
- -- nmap -sS -Pn -p 80 --script file-checker.nse <target>
- -- nmap -sS -Pn -p 80 --script file-checker.nse --script-args file=/robots.txt <target>
- -- nmap -sS -Pn -p 80 --script file-checker.nse --script-args file=/privacy/ 113.38.34.72
- -- @output
- -- PORT STATE SERVICE
- -- 80/tcp open http
- -- | file-checker: /robots.txt
- -- | : STRING FOUND...
- -- |_ : returned 200 OK
- -- @args file-checker.file the file/path name to search. Default: /robots.txt
- ---
- author = "r00t-3xp10it"
- license = "Same as Nmap--See http://nmap.org/book/man-legal.html"
- categories = {"discovery", "safe"}
---'DEPENDENCIES'---
- -- Dependencies (lua libraries)
- local shortport = require "shortport"
- local stdnse = require ('stdnse')
- local http = require "http"
shortport: https://nmap.org/nsedoc/lib/shortport.html
- -- Port rule will only execute if port 80/tcp http is open
- portrule = shortport.port_or_service({80}, "http", "tcp", "open")
- -- Seach for string stored in variable @args.file or use default
- local file = stdnse.get_script_args(SCRIPT_NAME..".file") or "/robots.txt"
Descrição: a biblioteca 'shortport' vai se servir da função 'port_or_service' para só executar a secção 'the action section' se todos os valores retornarem correctos (port 80 tcp http open), a biblioteca 'stdnse.get_script_args' vai ler o que foi inserido no @argumento (e procurar por essa string) ou então vai procurar pelo valor default (/robots.txt) se não for utilizada a 'flag' '--script-args file='
- action = function(host, port)
- local response = http.get(host, port, file)
- -- Check google API return codes to determine if file exists
- if (response.status == 200 ) then
- return file.."\n : STRING FOUND...\n : returned 200 OK\n"
- elseif (response.status == 400 ) then
- return file.."\n : BadRequest...\n : returned 400 BadRequest\n"
- elseif (response.status == 302 ) then
- return file.."\n : Redirected...\n : returned 302 Redirected\n"
- elseif (response.status == 401 ) then
- return file.."\n : Unauthorized...\n : returned 401 Unauthorized\n"
- elseif (response.status == 404 ) then
- return file.."\n : STRING NOT FOUND...\n : returned 404 NOT FOUND\n"
- elseif (response.status == 403 ) then
- return file.."\n : Forbidden...\n : returned 403 Forbidden\n"
- elseif (response.status == 503 ) then
- return file.."\n : Service_unavailable...\n : returned 503 Service_unavailable\n"
- else
- return file.."\n : UNDEFINED ERROR...\n : returned "..response.status.."\n"
- end
- end
Descrição: a função 'action = function(host, port)' vai executar os commands no <target>, na função seguinte a biblioteca 'http.get' retorna um recurso com um pedido GET, a API NSE 'response.status' vai verificar o codigo de retorno da API do google para determinar se o file existe, e vamos nos servir da API 'return' vai fazer o display do output...
exporte o script para a base de dados do nmap ('/nmap/scripts/' folder)
sudo cp file-checker.nse /usr/share/nmap/scripts/file-checker.nse
actualize a base de dados do NSE
sudo nmap --script-updatedb
visualizar a descriçao do modulo
sudo nmap --script-help file-checker.nse
corra o script
sudo nmap -sV -Pn -p 80,443,445,8080 --script file-checker.nse <target>
sudo nmap -sV -Pn -p 80,443,445,8080 --script file-checker.nse --script-args file=/etc/passwd <target>
ms15-034.nse
Detecta a vulnerabilidade MS15-034 (HTTP.sys) em servidores Microsoft IIS. e explora a condição denial-of-service usando argumentos de script (--script-args D0S=exploit) ou podemos verificar (escanear) ainda mais usando outro argumento (--script-args uri =/wellcome.png), o comportamento padrão 'default' será verificar pela existencia da vulnerabilidade, e só se for introduzido o @argumento D0S (--script-args D0S=exploit) é que será explorado o denial-of-service.
versões afetadas são o Windows 7,8,8.1, Windows Server 2008 R2, 2012 e 2012R2.
An analysis of ms15-034: an-analysis-of-ms15-034
An analysis of ms15-034: an-analysis-of-ms15-034
1º - download ms15-034.nse: ms15-034.nse
2º - exporte o script para a base de dados do nmap ('/nmap/scripts/' folder)
sudo cp ms15-034.nse /usr/share/nmap/scripts/ms15-034.nse
3º - actualize a base de dados do NSE
sudo nmap --script-updatedb
4º - visualizar a descriçao do modulo
sudo nmap --script-help ms15-034.nse
5º - corra o script
sudo nmap -sV -Pn -p 80 --script ms15-034.nse <target>
sudo nmap -sV -Pn -p 80,443,445,8080 --script ms15-034.nse --script-args D0S=exploit <target>
How To Display outputs:
- -- writting output to table (using return)
- if (response.status == 200) then
- return file.." FOUND..."
- elseif (response.status == 404) then
- return file.." NOT FOUND..."
- else
- return file.." undefined"..response.status
- end
- end
- --writting output to table (using 'table.insert')
- if (response.status == 200) then
- table.insert(response, " STRING FOUND: "..file)
- table.insert(response, " returned 200 OK")
- elseif (response.status == 404) then
- table.insert(response, " STRING NOT FOUND: "..file)
- table.insert(response, " returned 404 NOT FOUND")
- else
- table.insert(response, " STRING : "..file)
- table.insert(response, " returned "..response.status)
- end
- --writting response output to table
- return stdnse.format_output(true, response)
- end
- -- writting output to table using stdnse.output_table()
- -- THE RULES SECTION --
- local file = stdnse.get_script_args(SCRIPT_NAME..".file") or "/robots.txt"
- local output = stdnse.output_table() -- fazendo table em 'the rules section'
- -- THE ACTION SECTION --
- if (response.status == 200) then
- output.found = {}
- output.found[#output.found + 1] = file
- output.found[#output.found + 1] = "/privacy/"
- output.found[#output.found + 1] = "/news/"
- return output
- elseif (response.status == 404) then
- output.found = {}
- output.found[#output.found + 1] = file
- output.found[#output.found + 1] = "/privacy/"
- output.found[#output.found + 1] = "/news/"
- return output
- else
- output.found = {}
- output.found[#output.found + 1] = file
- output.found[#output.found + 1] = "/privacy/"
- output.found[#output.found + 1] = "/news/"
- return output
- end
- return output
- end