专栏首页漏斗社区工具| 诸神之眼之邮件发送nmap的扫描报告

工具| 诸神之眼之邮件发送nmap的扫描报告

VPS上的Nmap还在扫描工作着,而你已经把它忘了忙着其他事情。突然,一封邮件发来,向你汇报本次扫描完毕,和具体的扫描报告。是不是觉得很方便?借助Nmap的库文件和NSE引擎,这件事情将变得简单。

wode

0x01 从SMTP协议说起

优秀的扫描器都有邮件通知的功能,Nmap也一样,在Nmap的库文件中已经为我们提供了用来操作SMTP协议的库文件smtp.lua。

邮件的发送依靠的是SMTP协议,在smtp.lua这个库文件,共14个函数有关SMTP邮件的发送,且该库支持SMTP指令EHLO,HELP,AUTH,MAIL,RCPT,DATA,STARTTLS,RSET,VREY,EXPN10个指令,借助socket我们其实可以发送任何的SMTP指令。

为了便于我们来理解SMTP指令的使用,下面我简单介绍下,在CMD下,如何用telnet发送SMTP指令的方式发出一封邮件。

telnet smtp.163.com 25

打开163邮箱,收到发出的邮件。

熟悉了以上过程,就能够明白smtp.lua这个库的每个函数都是在干些什么了,也方便我们去扩充和修改。

wode

0x02 smtp库文件

根据上述过程,我们来认识下smtp.lua我们需要用到的几个函数。

●connect函数 发起SMTP连接,并确认对方是否需要ssl的支持。

●ehlo函数

ehlo函数,其实就是发送ehlo的指令,是扩展的helo指令,服务器会在响应中表明自己支持的认证方式。

●login函数 login = function(socket, username, password, mech) mech:指得是认证方式,该函数支持LOGIN, PLAIN, CRAM-MD5, DIGEST-MD5和NTLM这5种方式,一般我们使用LOGIN。

●mail函数 mail = function(socket, address, esmtp_opts):发送mail指令。 address:参数用来指定发件人地址。 esmtp_opts: 用来设定邮件大小,envid,transid等,不设定可以设为nil

●recipient函数 recipient = function(socket, address) address:参数用来指定收件人地址。

●datasend函数 datasend = function(socket, data) 发送邮件内容。

●query函数 query = function(socket, cmd, data, lines) 发送邮件请求。 cmd:是SMTP的指令参数。 data:是指令的内容。

0x03 编写NSE脚本发送扫描报告

编写脚本遇到的两个问题,一个是如何获取扫描结果,另外一个是如何发送邮件正文。

虽然我们有API可以调用,但是一直没有找到调用所有结果的那个API,所以就决定先把扫描结果写在一个文件里,然后读取该文件。 nmap <TARGET> --script smtp -oG 1.txt 这个方法有点简单粗暴哈,有更好方案的小伙伴吗?

注意,因为发送邮件头和邮件正文是有一个回车换行的,但是实际代码,我确是拼接了2个\r\n才区分开正文和邮件头。

完整的NSE脚本:

local shortport = require "shortport"
local smtp = require "smtp"

description = [[send the scan result use smtp]]
author = "reborn"
license = "Same as Nmap--See http://nmap.org/book/man-legal.html"
categories = {"default"}
--[[
    example:nmap <TARGET> --script smtp -oG 1.txt
    1.txt is the smtp.nse use ,if you want replace or rename , modify the code.
]]

postrule = function () return true end
action = function(host, port)
    local socket,resp = smtp.connect("smtp.163.com",25,{ssl = false,recv_before = true})

    if ( not(socket) ) then return fail("Failed to connect to SMTP server") end
    local st, resp =smtp.ehlo(socket,"smtp.163.com") -- 发送ehlo,获取邮件服务器支持的登陆方式
    local status, err =smtp.login(socket,"rebornxxx@163.com","xxxxxx","LOGIN") -- 登陆
    if(status) then
        local mail_st,mail_response = smtp.mail(socket,"rebornxxx@163.com",nil) --设置发件人

        local recipient_st,recipient_response = smtp.recipient(socket,"rebornxxx@163.com")    --设置收件人 
        -- 读取扫描结果,设置邮件头和正文
        local result = ''
        for line in io.lines("1.txt") do
            line = string.gsub(line,"/","     ")
            line = string.gsub(line,",","\r\n")
            result = result .. line .. "\r\n"
        end    
        senddata="subject:The scan result\r\n" .. "from:reborn\r\n" .."\r\n".. result
        -- 邮件发送
        local st2 ,resp2 = smtp.datasend(socket,senddata)  
        print(st2,resp2)
        smtp.quit(socket)
        socket:close()
    end
    return "send mail test...."
end

收取到Nmap扫描结果的邮件:

0x04 关于写上述脚本的一些其他思路

●有的小伙伴说python玩得溜,为啥要用lua。

没错,用python发邮件更加容易,而且我们可以在lua中来执行python脚本,简单粗暴的方式如下:直接用lua的os.execute命令执行系统命令,而sendmail.py则写好了如何发送邮件。 os.execute('python "C:\\Program Files (x86)\\Nmap\\nselib\\sendmail.py"')

●关于扩展smtp.lua库

其实smtp库的各种连接,登陆,发送数据,完全可以用socket来直接完成了,之前一直不会用datasend这个函数的用法,是采用如下方式替代:

local st, ret, response
st,response =smtp.query(socket, "DATA")
st,ret = socket:send("subject:test message\r\n")
st,ret = socket:send("from:reborn\r\n")
st,ret = socket:send("to:rebornxxx@163.com\r\n")
st,ret = socket:send("\r\n")
st,ret = socket:send("content\r\n")
st, response =smtp.query(socket, "\r\n.")

0x05 小结

邮件发送扫描报告解决了平时不知何时扫描结束的一个痛点,经常做扫描任务的童鞋可以试试哈。本期内容就到这里,我们下期见。

本文分享自微信公众号 - 漏斗社区(newdooneSec)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • DNS Rebinding 域名重新绑定攻击技术

    近期斗哥在学习有关于浏览器同源策略方面的知识点,发现了一个有趣的绕过浏览器同源策略的方法,故在这一期的文章中与大家分享。

    漏斗社区
  • 工具| sqlmap payload修改之路(下)

    上周通过一个例子让大家大致了解了sqlmap 如何添加以及修改payload,本周斗哥将带领各位完整地学习sqlmap与payload有关的xml文件下的pay...

    漏斗社区
  • 工具 | sqlmap系列(三)进阶篇

    SQLMAP系列(二)介绍了sqlmap的基本注入流程,登陆注入和POST注入以及一个小技巧,本期斗哥将带来sqlmap的进阶使用,希望通过本期的学习能够帮助大...

    漏斗社区
  • 精尽 Dubbo 原理与源码专栏( 已经完成 69+ 篇,预计总共 75+ 篇 )

    本小节,我们将 《精尽 Dubbo 源码解析》 和 《Dubbo 用户指南》 做一次映射,方便大家直接找到感兴趣的功能的具体源码实现。当然,如果有整理不到位的地...

    芋道源码
  • 精尽 Dubbo 原理与源码专栏( 已经完成 69+ 篇,预计总共 75+ 篇 )

    本小节,我们将 《精尽 Dubbo 源码解析》 和 《Dubbo 用户指南》 做一次映射,方便大家直接找到感兴趣的功能的具体源码实现。当然,如果有整理不到位的地...

    芋道源码
  • 在tornadofx中使用javafx并发框架示例

    1个枚举javafx.concurrent.Worker.State,代表Worker的不同状态READY,SCHEDULED,RUNNING,SUCCEEDE...

    用户6167008
  • RF、GBDT、XGBoost面试级整理

    由于本文是基于面试整理,因此不会过多的关注公式和推导,如果希望详细了解算法内容,敬请期待后文。

    西西木木
  • RF(随机森林)、GBDT、XGBoost面试级整理

    由于本文是基于面试整理,因此不会过多的关注公式和推导,如果希望详细了解算法内容,敬请期待后文。   RF、GBDT和XGBoost都属于集成学习(Ens...

    机器学习AI算法工程
  • RF、GBDT、XGBoost面试级整理

    RF、GBDT和XGBoost都属于集成学习(Ensemble Learning),集成学习的目的是通过结合多个基学习器的预测结果来改善单个学习器的泛化能力和鲁...

    机器学习AI算法工程
  • 【干货】树算法对比:RF、GBDT、XGBoost

    Spark学习技巧

扫码关注云+社区

领取腾讯云代金券