在Web渗透测试中,如何快速识别目标站所使用的应用程序类别---cms指纹识别哪家强 技术文章
前言:
在Web渗透测试当中的信息收集环节,对于目标站的指纹收集是很重要的一个环节,同时收集的指纹准确与否在很大程度上对我们渗透测试的快慢和结果有着莫大的关系,今天我就我日常使用的cms识别方法、国内外的常见的公开的在线cms指纹识别网站、和开源/闭源工具以及一些扫描器等方面来说一下如何在web渗透测试实战中快速的判断出目标站所使用的程序类型。
注:以下测试排名不分前后,其中也包括我自己的一些手动测试方法!
首先说一下针对我国的基本国情来说,因为GFW的存在,国外的在线网站cms指纹识别几乎对国内的CMS识别不出来的!故我主要讲国内的几个流行的cms指纹识别网站。
一:
名称:云悉WEB资产梳理|在线CMS指纹识别平台
官网:http://www.yunsee.cn/
简介:云悉安全专注于网络资产自动化梳理,cms检测web指纹识别,让网络资产更清晰。
简评:国内后起之秀,目前指纹特征量:6394,云溪比较全面,在识别指纹的同时会收集操作系统,服务器,web容器,数据库,程序语言等基本web信息;域名信息:备案单位,邮箱,域名所有者,备案号,DNS,域名注册商;ip信息:IDC,IP(支持查看同IP域名网站,同网段IP及域名---即C段查询);常见子域名挖掘等功能模块,支持API调用,不过需要你提供指纹申请,通过了后会发放邀请码,注册就可以使用。PS:单独的指纹识别还支持CDN,WAF识别。
下图所示为我测试一个网站的时候用云溪识别的,但是没有识别出来,我用第二个即将介绍的识别出来了,第三种也没有识别出来,最后介绍手工判断出来的方法。
二:
名称:bugscaner博客出品,在线指纹识别,在线cms识别小插件--在线工具
官网:http://whatweb.bugscaner.com/look/
简介:一款简洁快速的在线指纹,网站源码识别工具,目前已支持2000多种cms的识别!
简评:这个是bugscaner博主自己写的线上工具,出来的时间也比较久了,速度比较快!支持种类多,支持批量cms识别(每次最多100个,一天1000次)支持API接口,支持同IP网站查询,ICP备案查询等功能,博主最近又更新了这个工具,增加了几百种源码正则,增加了对https网址的识别,增加批量cms识别,重新优化了识别代码,减去了大部分命中率低的path路径,识别速度更快,增加通过查询历史,来统计互联网常见的cms建站系统所占使用比例,哪些cms最受欢迎,结果仅供参考,并不准确(仅通过历史查询计算);
下图就是刚刚云溪没有识别到的,但是在这里秒识别!
三:
名称:TideFinger 潮汐指纹
官网:http://finger.tidesec.net/
简介:Tide 安全团队(山东新潮信息技术有限公司)出品的开源cms指纹识别工具
简评:开源!但是只是后端开源,如果有需求做成web版的,需要自己又板砖实力,自己搭建前端。详细的介绍,cms指纹识别相关技术实现细节,后端源码等等在GitHub,地址:https://github.com/TideSec/TideFinger
下图是同上两个图一样的网站识别结果,但是等了好久cms信息一直在转圈,也没有结果。。。但是其他的像网站标题,Banner,IP地址,CDN信息,操作系统,其他的信息显示还是很快的。
四:
手工判断cms类型:
下图所示是同上面三个在线cms指纹识别网站的同一个域名,通过简单的手工也可以快速识别处cms类型,看图,我们可以通过更改目标url的参数名或者参数值来进行fuzz测试,往往会有意想不到的记结果!这也是fuzz这门技术的魅力所在!
通常fuzz除了一些专门的工具:
https://github.com/xmendez/wfuzz
https://github.com/google/oss-fuzz
fuzz相关文章介绍:
https://github.com/wcventure/FuzzingPaper
https://www.zhihu.com/question/28303982
https://zhuanlan.zhihu.com/p/43432370
我还推荐使用burpsuite配合这些工具或者是burp插件来进行fuzz测试,也很顺手!相关burpsuite汉化、burpsuite破解可以在博客搜索burp关键词查看相关文章。
五:
借助扫描器,特别是DIR扫描器这些,比如御剑,Arachni,XssPy,w3af,Nikto,OWASP ZAP,Grabber,Nmap,Netsparker,Acunetix.Web.Vulnerability.Scanner(AWS)等工具进行扫描,同时也可以使用类似JavaScript源码提取分析工具,往往能从JavaScript源码当中发现一些隐藏的子域名,文件内容等等。
六:
国外在线cms指纹识别网站:
https://whatcms.org
http://cmsdetect.com/
https://itrack.ru/whatcms/
不过由于你懂的原因,对于国内程序识别不怎么友好。
「更新」油猴脚本---freebuf文章图片去除!small并自动缩放图片大小到100% 技术文章
我之前写过一篇文章是关于freebuf文章图片去除!small得,地址在这里:https://mrxn.net/jswz/modify_freebuf_pic.html,但是后来我发现有一个BUG,很严重得那种:因为我当时在写插件的时候是在文章全部浏览完后直接写得,这也就导致了我当时忽略了 freebuf 的图片是懒加载的,这样的话如果还是像我之前那样直接去除图片 src 末尾的 !small ,会导致没有在第一屏内的图片不会被渲染出来!so ,趁着这次五一国际劳动节放假当天,我就来更新来了!本次更新重新设计了一下,就是取消掉了那个小标签添加,在文章页面禁用了lazyload加载,当你读文章慢慢往下滚动的时候就可以自动去除图片末尾的 !small 了,而且回自动修改图片的宽度属性到 100% (受父节点限制,不会撑爆的),尽可能的显示图片大小从而方便阅读。
Greasy Fork 在线下载安装
关于SQL中join的各种用法总结 技术文章
首先声明:文章来源于国外的 codeproject 我这里只是由于复习SQL的时候需要就Google搜索[可以用我个人搭建的Google搜索供大家搜索文章学习使用]了一下,找到这篇文章,再次做个简单的记录同时也方便以后的有缘人,如有侵权的地方还请来信注明,感谢原文的作者的勤劳付出,留下如此详细全面的关于SQL的join的用法。
codeproject是国外一个免费的可以公开自己写的代码与程序的优秀网站有点类似于GitHub只不过是社区版,在这个网站所有用户都可以发布自己写过的代码,程序,或者是详细的文档说明。比国内的cnblog、csdn都要好,如果要说缺点的话,就是全英文的,当然大部分还是比较容易理解的。但是codeproject也有中文区: https://www.codeproject.com/Forums/1580230/General-Chinese-Topics.aspx ,感兴趣的可以去注册玩。
我们先用一张图来看一下 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 等七种 join 相关的用法:
下面分开说明这七种用法,先说第一种:
1.INNER JOIN(内连接)
这是最简单,最容易理解的Join,也是最常见的。此查询将返回左表(表A)中右表(表B)中都具有匹配记录的所有记录(共同拥有的相同的部分)。此Join用法的代码大致如下:
SELECT <select_list> FROM Table_A A INNER JOIN Table_B B ON A.Key = B.Key
2.LEFT JOIN
(左连接)
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。此Join用法的代码大致如下:
SELECT <select_list> FROM Table_A A LEFT JOIN Table_B B ON A.Key = B.Key
3.RIGHT JOIN
(右连接)
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。此Join用法的代码大致如下:
SELECT <select_list> FROM Table_A A RIGHT JOIN Table_B B ON A.Key = B.Key
4.OUTER JOIN
(外连接)
FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行. FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果。此Join用法的代码大致如下:
SELECT <select_list> FROM Table_A A FULL OUTER JOIN Table_B B ON A.Key = B.Key
5.LEFT JOIN EXCLUDING INNER JOIN
(左连接-内连接)
此查询将返回左表(表A)中与右表(表B)中的任何记录都不匹配的所有记录。此Join的编写如下:
SELECT <select_list> FROM Table_A A LEFT JOIN Table_B B ON A.Key = B.Key WHERE B.Key IS NULL
6.RIGHT JOIN EXCLUDING INNER JOIN
(右连接-内连接)
此查询将返回右表(表B)中与左表(表A)中的任何记录都不匹配的所有记录。此Join的编写如下:
SELECT <select_list> FROM Table_A A RIGHT JOIN Table_B B ON A.Key = B.Key WHERE A.Key IS NULL
7.OUTER JOIN EXCLUDING INNER JOIN
(外连接-内连接)
此查询将返回左表(表A)中的所有记录以及右表(表B)中都不匹配的所有记录。我还没有需要使用这种类型的Join,但是其他的类型,我经常使用。此Join的编写如下:
SELECT <select_list> FROM Table_A A FULL OUTER JOIN Table_B B ON A.Key = B.Key WHERE A.Key IS NULL OR B.Key IS NULL
下面举一些例子:
TABLE_A PK Value ---- ---------- 1 FOX 2 COP 3 TAXI 6 WASHINGTON 7 DELL 5 ARIZONA 4 LINCOLN 10 LUCENT TABLE_B PK Value ---- ---------- 1 TROT 2 CAR 3 CAB 6 MONUMENT 7 PC 8 MICROSOFT 9 APPLE 11 SCOTCH这七种连接方式的结果如下所示:
-- INNER JOIN SELECT A.PK AS A_PK, A.Value AS A_Value, B.Value AS B_Value, B.PK AS B_PK FROM Table_A A INNER JOIN Table_B B ON A.PK = B.PK A_PK A_Value B_Value B_PK ---- ---------- ---------- ---- 1 FOX TROT 1 2 COP CAR 2 3 TAXI CAB 3 6 WASHINGTON MONUMENT 6 7 DELL PC 7 (5 row(s) affected)
-- LEFT JOIN SELECT A.PK AS A_PK, A.Value AS A_Value, B.Value AS B_Value, B.PK AS B_PK FROM Table_A A LEFT JOIN Table_B B ON A.PK = B.PK A_PK A_Value B_Value B_PK ---- ---------- ---------- ---- 1 FOX TROT 1 2 COP CAR 2 3 TAXI CAB 3 4 LINCOLN NULL NULL 5 ARIZONA NULL NULL 6 WASHINGTON MONUMENT 6 7 DELL PC 7 10 LUCENT NULL NULL (8 row(s) affected)
-- RIGHT JOIN SELECT A.PK AS A_PK, A.Value AS A_Value, B.Value AS B_Value, B.PK AS B_PK FROM Table_A A RIGHT JOIN Table_B B ON A.PK = B.PK A_PK A_Value B_Value B_PK ---- ---------- ---------- ---- 1 FOX TROT 1 2 COP CAR 2 3 TAXI CAB 3 6 WASHINGTON MONUMENT 6 7 DELL PC 7 NULL NULL MICROSOFT 8 NULL NULL APPLE 9 NULL NULL SCOTCH 11 (8 row(s) affected)
-- OUTER JOIN SELECT A.PK AS A_PK, A.Value AS A_Value, B.Value AS B_Value, B.PK AS B_PK FROM Table_A A FULL OUTER JOIN Table_B B ON A.PK = B.PK A_PK A_Value B_Value B_PK ---- ---------- ---------- ---- 1 FOX TROT 1 2 COP CAR 2 3 TAXI CAB 3 6 WASHINGTON MONUMENT 6 7 DELL PC 7 NULL NULL MICROSOFT 8 NULL NULL APPLE 9 NULL NULL SCOTCH 11 5 ARIZONA NULL NULL 4 LINCOLN NULL NULL 10 LUCENT NULL NULL (11 row(s) affected)
-- LEFT EXCLUDING JOIN SELECT A.PK AS A_PK, A.Value AS A_Value, B.Value AS B_Value, B.PK AS B_PK FROM Table_A A LEFT JOIN Table_B B ON A.PK = B.PK WHERE B.PK IS NULL A_PK A_Value B_Value B_PK ---- ---------- ---------- ---- 4 LINCOLN NULL NULL 5 ARIZONA NULL NULL 10 LUCENT NULL NULL (3 row(s) affected)
-- RIGHT EXCLUDING JOIN SELECT A.PK AS A_PK, A.Value AS A_Value, B.Value AS B_Value, B.PK AS B_PK FROM Table_A A RIGHT JOIN Table_B B ON A.PK = B.PK WHERE A.PK IS NULL A_PK A_Value B_Value B_PK ---- ---------- ---------- ---- NULL NULL MICROSOFT 8 NULL NULL APPLE 9 NULL NULL SCOTCH 11 (3 row(s) affected)
-- OUTER EXCLUDING JOIN SELECT A.PK AS A_PK, A.Value AS A_Value, B.Value AS B_Value, B.PK AS B_PK FROM Table_A A FULL OUTER JOIN Table_B B ON A.PK = B.PK WHERE A.PK IS NULL OR B.PK IS NULL A_PK A_Value B_Value B_PK ---- ---------- ---------- ---- NULL NULL MICROSOFT 8 NULL NULL APPLE 9 NULL NULL SCOTCH 11 5 ARIZONA NULL NULL 4 LINCOLN NULL NULL 10 LUCENT NULL NULL (6 row(s) affected)注:原文连接:https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins
MySQL 在 SELECT 的同时 UPDATE 同一张表 技术文章
MySQL 不允许 SELECT FROM 后面指向用作 UPDATE 的表,有时候让人纠结。当然,有比创建无休止的临时表更好的办法。本文解释如何 UPDATE 一张表,同时在查询子句中使用 SELECT.
问题描述
假设我要 UPDATE 的表跟查询子句是同一张表,这样做有许多种原因,例如用统计数据更新表的字段(此时需要用 group 子句返回统计值),从某一条记录的字段 update 另一条记录,而不必使用非标准的语句,等等。举个例子:
create table apples(variety char(10) primary key, price int); insert into apples values('fuji', 5), ('gala', 6); update apples set price = (select price from apples where variety = 'gala') where variety = 'fuji';
错误提示是:ERROR 1093 (HY000): You can't specify target table'apples' for update in FROM clause. MySQL 手册 UPDATE documentation 这下面有说明 : “Currently, you cannot update a table and select from the same table in a subquery.”
在这个例子中,要解决问题也十分简单,但有时候不得不通过查询子句来 update 目标。好在我们有办法。
解决办法
既然 MySQL 是通过临时表来实现 FROM 子句里面的嵌套查询,那么把嵌套查询装进另外一个嵌套查询里,可使 FROM 子句查询和保存都是在临时表里进行,然后间接地在外围查询被引用。下面的语句是正确的:
update apples set price = ( select price from ( select * from apples ) as x where variety = 'gala') where variety = 'fuji';
如果你想了解更多其中的机制,请阅读 MySQL Internals Manual 相关章节。
没有解决的问题
一个常见的问题是,IN() 子句优化废品,被重写成相关的嵌套查询,有时(往往?)造成性能低下。把嵌套查询装进另外一个嵌套查询里并不能阻止它重写成相关嵌套,除非我下狠招。这种情况下,最好用 JOIN 重构查询(rewrite such a query as a join)。
另一个没解决的问题是临时表被引用多次。“装进嵌套查询” 的技巧无法解决这些问题,因为它们在编译时被创建,而上面讨论的 update 问题是在运行时。(译者注:个人认为跟文章讨论的主题没几毛钱关系)
原文地址:http://www.xaprb.com/blog/2006/06/23/how-to-select-from-an-update-target-in-mysql/
MySQL 如何查找并删除重复行? 技术文章
如何查找重复行
第一步是定义什么样的行才是重复行。多数情况下很简单:它们某一列具有相同的值。本文采用这一定义,或许你对“重复”的定义比这复杂,你需要对sql做些修改。
本文要用到的数据样本
create table test(id int not null primary key, day date not null); insert into test(id, day) values(1, '2006-10-08'); insert into test(id, day) values(2, '2006-10-08'); insert into test(id, day) values(3, '2006-10-09'); select * from test; +----+------------+ | id | day | +----+------------+ | 1 | 2006-10-08 | | 2 | 2006-10-08 | | 3 | 2006-10-09 | +----+------------+
前面两行在day字段具有相同的值,因此如何我将他们当做重复行,这里有一查询语句可以查找。查询语句使用GROUP BY子句把具有相同字段值的行归为一组,然后计算组的大小。
select day, count(*) from test GROUP BY day; +------------+----------+ | day | count(*) | +------------+----------+ | 2006-10-08 | 2 | | 2006-10-09 | 1 | +------------+----------+
重复行的组大小大于1。如何希望只显示重复行,必须使用HAVING子句,比如
select day, count(*) from test group by day HAVING count(*) > 1; +------------+----------+ | day | count(*) | +------------+----------+ | 2006-10-08 | 2 | +------------+----------+
这是基本的技巧:根据具有相同值的字段分组,然后知显示大小大于1的组。
为什么不能使用WHERE子句?
因为WHERE子句过滤的是分组之前的行,HAVING子句过滤的是分组之后的行。
如何删除重复行
一个相关的问题是如何删除重复行。一个常见的任务是,重复行只保留一行,其他删除,然后你可以创建适当的索引,防止以后再有重复的行写入数据库。
同样,首先是弄清楚重复行的定义。你要保留的是哪一行呢?第一行,或者某个字段具有最大值的行?本文中,假设要保留的是第一行——id字段具有最小值的行,意味着你要删除其他的行。
也许最简单的方法是通过临时表。尤其对于MYSQL,有些限制是不能在一个查询语句中select的同时update一个表。在我的另一篇文章中 MySQL 在 SELECT 的同时 UPDATE 同一张表(How to select from an update target in MySQL), 讲述了如何绕过这些限制。简单起见,这里只用到了临时表的方法。
我们的任务是:删除所有重复行,除了分组中id字段具有最小值的行。因此,需要找出大小大于1的分组,以及希望保留的行。你可以使用MIN()函数。这里的语句是创建临时表,以及查找需要用DELETE删除的行。
create temporary table to_delete (day date not null, min_id int not null); insert into to_delete(day, min_id) select day, MIN(id) from test group by day having count(*) > 1; select * from to_delete; +------------+--------+ | day | min_id | +------------+--------+ | 2006-10-08 | 1 | +------------+--------+
有了这些数据,你可以开始删除“脏数据”行了。可以有几种方法,各有优劣(详见我的文章many-to-one problems in SQL),但这里不做详细比较,只是说明在支持查询子句的关系数据库中,使用的标准方法。
delete from test where exists( select * from to_delete where to_delete.day = test.day and to_delete.min_id <> test.id )
如何查找多列上的重复行
有人最近问到这样的问题:
我的一个表上有两个字段b和c,分别关联到其他两个表的b和c字段。我想要找出在b字段或者c字段上具有重复值的行。
咋看很难明白,通过对话后我理解了:他想要对b和c分别创建unique索引。如上所述,查找在某一字段上具有重复值的行很简单,只要用group分组,然后计算组的大小。并且查找全部字段重复的行也很简单,只要把所有字段放到group子句。但如果是判断b字段重复或者c字段重复,问题困难得多。这里提问者用到的样本数据
create table a_b_c( a int not null primary key auto_increment, b int, c int ); insert into a_b_c(b,c) values (1, 1); insert into a_b_c(b,c) values (1, 2); insert into a_b_c(b,c) values (1, 3); insert into a_b_c(b,c) values (2, 1); insert into a_b_c(b,c) values (2, 2); insert into a_b_c(b,c) values (2, 3); insert into a_b_c(b,c) values (3, 1); insert into a_b_c(b,c) values (3, 2); insert into a_b_c(b,c) values (3, 3);
现在,你可以轻易看到表里面有一些重复的行,但找不到两行具有相同的二元组{b, c}。这就是为什么问题会变得困难了。
错误的查询语句
如果把两列放在一起分组,你会得到不同的结果,具体看如何分组和计算大小。提问者恰恰是困在了这里。有时候查询语句找到一些重复行却漏了其他的。这是他用到了查询
select b, c, count(*) from a_b_c group by b, c having count(distinct b > 1) or count(distinct c > 1);
结果返回所有的行,因为CONT(*)总是1.为什么?因为 >1 写在COUNT()里面。这个错误很容易被忽略,事实上等效于
select b, c, count(*) from a_b_c group by b, c having count(1) or count(1);
为什么?因为 (b> 1) 是一个布尔值,根本不是你想要的结果。你要的是:
select b, c, count(*) from a_b_c group by b, c having count(distinct b) > 1 or count(distinct c) > 1;
返回空结果。很显然,因为没有重复的{b,c}。这人试了很多其他的OR和AND的组合,用来分组的是一个字段,计算大小的是另一个字段,像这样
select b, count(*) from a_b_c group by b having count(distinct c) > 1; +------+----------+ | b | count(*) | +------+----------+ | 1 | 3 | | 2 | 3 | | 3 | 3 | +------+----------+
没有一个能够找出全部的重复行。而且最令人沮丧的是,对于某些情况,这种语句是有效的,如果错误地以为就是这么写法,然而对于另外的情况,很可能得到错误结果。
事实上,单纯用GROUP BY 是不可行的。为什么?因为当你对某一字段使用group by时,就会把另一字段的值分散到不同的分组里。对这些字段排序可以看到这些效果,正如分组做的那样。首先,对b字段排序,看看它是如何分组的
a | b | c |
---|---|---|
7 | 1 | 1 |
8 | 1 | 2 |
9 | 1 | 3 |
10 | 2 | 1 |
11 | 2 | 2 |
12 | 2 | 3 |
13 | 3 | 1 |
14 | 3 | 2 |
15 | 3 | 3 |
当你对b字段排序(分组),相同值的c被分到不同的组,因此不能用COUNT(DISTINCT c)来计算大小。COUNT()之类的内部函数只作用于同一个分组,对于不同分组的行就无能为力了。类似,如果排序的是c字段,相同值的b也会分到不同的组,无论如何是不能达到我们的目的的。
几种正确的方法
也许最简单的方法是分别对某个字段查找重复行,然后用UNION拼在一起,像这样:
select b as value, count(*) as cnt, 'b' as what_col from a_b_c group by b having count(*) > 1 union select c as value, count(*) as cnt, 'c' as what_col from a_b_c group by c having count(*) > 1; +-------+-----+----------+ | value | cnt | what_col | +-------+-----+----------+ | 1 | 3 | b | | 2 | 3 | b | | 3 | 3 | b | | 1 | 3 | c | | 2 | 3 | c | | 3 | 3 | c | +-------+-----+----------+
输出what_col字段为了提示重复的是哪个字段。另一个办法是使用嵌套查询:
select a, b, c from a_b_c where b in (select b from a_b_c group by b having count(*) > 1) or c in (select c from a_b_c group by c having count(*) > 1); +----+------+------+ | a | b | c | +----+------+------+ | 7 | 1 | 1 | | 8 | 1 | 2 | | 9 | 1 | 3 | | 10 | 2 | 1 | | 11 | 2 | 2 | | 12 | 2 | 3 | | 13 | 3 | 1 | | 14 | 3 | 2 | | 15 | 3 | 3 | +----+------+------+
这种方法的效率要比使用UNION低许多,并且显示每一重复的行,而不是重复的字段值。还有一种方法,将自己跟group的嵌套查询结果联表查询。写法比较复杂,但对于复杂的数据或者对效率有较高要求的情况,是很有必要的。
select a, a_b_c.b, a_b_c.c from a_b_c left outer join ( select b from a_b_c group by b having count(*) > 1 ) as b on a_b_c.b = b.b left outer join ( select c from a_b_c group by c having count(*) > 1 ) as c on a_b_c.c = c.c where b.b is not null or c.c is not null
以上方法可行,我敢肯定还有其他的方法。如果UNION能用,我想会是最简单不过的了。
原文地址:https://www.xaprb.com/blog/2006/10/09/how-to-find-duplicate-rows-with-sql/
写个了油猴脚本-freebuf文章图片去除!small 技术文章
写这个脚本的原因就是我发现freebuf的文章里的图片后缀都会跟一个 !small 后缀,我想网站初心可能是为了对付爬虫吧,恶意爬虫爬去文章文字和图片,但是对于我这种懒虫,不喜欢点击一下放大去看图,而是比较喜欢文章的图片就是页面最佳尺寸,简单的研究了一下,发现去掉文章里的图片的 !small 后缀后,文章图片默认就会显示最佳尺寸了!简直Nice啊!但是每次这么去手动修改太麻烦了,如果文章图片太多,那岂不是要累死?于是这个脚本就出来了!效果如下的动图演示:
使用:前提是在油猴脚本支持的浏览器(比如chrome,Firefox这些现代浏览器),在油猴插件里面自己粘贴我发布在GitHub仓库的代码或者是从Greasy Fork 在线下载安装 (强烈推荐)
Scanning is art - Nmap 扫描的艺术之常见的基本操作 技术文章
Nmap --- 软件名字Nmap是Network Mapper的简称,是渗透测试过程中必不可少的黑客工具之一,其他的更多的介绍请前往官网:https://nmap.org/ 或者是维基百科查看:https://zh.wikipedia.org/wiki/Nmap。在渗透测试中,如果我们在 WEB 应用层没有找到有用的信息,那么此时 Nmap 就派上用场了,利用它我们可以对单个目标主机或者是目标群进行扫描以此来获取基于 IP 的服务器主机信息,这也是信息刺探中的一部分,不过在实际渗透测试中,如果我们在 WEB 应用层找打了可以利用的点并且可以进一步获得权限足够大的时候我们就可以暂时不需要使用 Nmap ,转而在后期需要提权或者是横向移动的时候我们再使用它。这篇文章主要是将在使用 Nmap 的日常使用中的一些基本操作,还有些骚操作,暂时不多(主要是博主太菜了,哈哈哈哈,欢迎有骚姿势的朋友分享
下载地址:https://nmap.org/download.html
Github 项目主页地址:https://github.com/nmap/nmap
Nmap渗透测试思维导图(高清大图):我的 GitHub 仓库地址
我4年前还搞过CHM的手册:Nmap手册
初识Nmap
Nmap是被专业人员广泛使用的一款功能全面的端口扫描工具。它由Fyodor编写并维护。由 于Nmap品质卓越,使用灵活,它已经是渗透测试人员必备的工具。
除了端口扫描外,Nmap还具备如下功能:
主机探测:Nmap可査找目标网络中的在线主机。默认情况下,Nmap通过4种方式—— ICMP echo请求(ping)、向443端口发送TCP、SYN 包、向80端口发送TCP、ACK 包和 ICMP 时间戳请求——发现目标主机。 服务/版本检测:在发现开放端口后,Nmap可进一步检查目标主机的检测服务协议、应用 程序名称、版本号等信息。 操作系统检测:Nmap 向远程主机发送一系列数据包,并能够将远程主机的响应与操作系统 指纹数据库进行比较。如果发现了匹配结果,它就会显示匹配的操作系统。它确实可能无法 识别目标主机的操作系统;在这种情况下,如果您知道目标系统上使用的何种操作系统,可 在它提供的URL里提交有关信息,更新它的操作系统指纹数据库。 网络路由跟踪:它通过多种协议访问目标主机的不同端口,以尽可能访问目标主机。Nmap 路由跟踪功能从TTL的高值开始测试,逐步递减TTL,直到它到零为止。 Nmap脚本引擎:这个功能扩充了Nmap的用途。如果您要使用Nmap实现它(在默认情况 下)没有的检测功能,可利用它的脚本引擎手写一个检测脚本。目前,Nmap可检査网络服务 的漏洞,还可以枚举目标系统的资源。
安装Nmap
nmap的安装很简单,Windows的话直接去官网下载安装包直接安装就行了->下载链接
kali已经自带了nmap,centos如果没有安装的话,yum install nmap
就直接安装了
入门Nmap
刚开始使用的时候可能会因为信息量太大无从下手,最简单的使用就是nmap your-ip(域名)
就可以扫描出其对外开放的服务。
root@kali:~# nmap 192.168.31.13
Starting Nmap 7.70 ( https://nmap.org ) at 2018-08-12 23:02 CST
Nmap scan report for 192.168.31.13
Host is up (0.00038s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
8080/tcp open http-proxy
10010/tcp open rxapi
MAC Address: 00:0C:29:99:D3:E6 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 1.85 seconds
可以看出只开放了8080端口和10010端口
nmap -p 端口 IP(域名),判断ip是否开放指定端口
root@kali:~# nmap -p 8080 192.168.31.13 Starting Nmap 7.70 ( https://nmap.org ) at 2018-08-12 23:05 CST Nmap scan report for 192.168.31.13 Host is up (0.00045s latency). PORT STATE SERVICE 8080/tcp open http-proxy MAC Address: 00:0C:29:99:D3:E6 (VMware) Nmap done: 1 IP address (1 host up) scanned in 0.36 secondsroot@kali:~# nmap -p 80 192.168.31.13 Starting Nmap 7.70 ( https://nmap.org ) at 2018-08-12 23:05 CST Nmap scan report for 192.168.31.13 Host is up (0.00049s latency). PORT STATE SERVICE 80/tcp closed http MAC Address: 00:0C:29:99:D3:E6 (VMware) Nmap done: 1 IP address (1 host up) scanned in 0.42 seconds |
可以看出8080端口开放,80端口没有开放
也可以增加端口和网段 :
nmap -p 22,21,80 192.168.31.13
nmap -p 22,21,80 192.168.31.1-253
nmap 192.168.31.1/24 扫描整个子网(整个C段)的端口 ,这个过程可能会比较久
进阶Nmap
在继续讲之前,先介绍一下Nmap可以识别出的6种端口状态,默认情况下,Nmap会扫描1660个常用的端口,可以覆盖大多数基本应用情况。
常用选项
1.服务版本识别(-sV),Nmap可以在进行端口扫描的时候检测服务端软件的版本信息。版本信息将使后续的漏 洞识别工作更有针对性。
2.操作系统检测(-O),Nmap还能识别目标主机的操作系统。
3.禁用主机检测(-Pn),如果主机屏蔽了ping请求,Nmap可能会认为该主机没有开机。这将使得Nmap无法进行进一 步检测,比如端口扫描、服务版本识别和操作系统识别等探测工作。为了克服这一问题,就 需要禁用Nmap的主机检测功能。在指定这个选项之后,Nmap会认为目标主机已经开机并会 进行全套的检测工作
4.强力检测选项(-A),启用-A选项之后,Nmap将检测目标主机的下述信息
服务版本识别(-sV);
操作系统识别(-O);
脚本扫描(-sC);
Traceroute(–traceroute)。
TCP扫描选项
1.TCP连接扫描(-sT):指定这个选项后,程序将和目标主机的每个端口都进行完整的三次 握手。如果成功建立连接,则判定该端口是开放端口。由于在检测每个端口时都需要进行三 次握手,所以这种扫描方式比较慢,而且扫描行为很可能被目标主机记录下来。如果启动 Nmap的用户的权限不足,那么默认情况下Nmap程序将以这种模式进行扫描。
2.SYN扫描(-sS):该选项也称为半开连接或者SYN stealth。采用该选项后,Nmap将使用 含有SYN标志位的数据包进行端口探测。如果目标主机回复了SYN/ACK包,则说明该端口处 于开放状态:如果回复的是RST/ACK包,则说明这个端口处于关闭状态;如果没有任何响应 或者发送了ICMP unreachable信息,则可认为这个端口被屏蔽了。SYN模式的扫描速度非常 好。而且由于这种模式不会进行三次握手,所以是一种十分隐蔽的扫描方式。如果启动Nmap 的用户有高级别权限,那么在默认情况下Nmap程序将以这种模式进行扫描。
3.TCP NULL(-sN)、FIN(-sF)及XMAS(-sX)扫描:NULL 扫描不设置任何控制位; FIN扫描仅设置FIN标志位:XMAS扫描设置FIN、PSH和URG的标识位。如果目标主机返回 了含有RST标识位的响应数据,则说明该端口处于关闭状态;如果目标主机没有任何回应, 则该端口处于打开|过滤状态。
4.TCP Maimon扫描(-sM):Uriel Maimon 首先发现了TCP Maimom扫描方式。这种模式的 探测数据包含有FIN/ACK标识。对于BSD衍生出来的各种操作系统来说,如果被测端口处于 开放状态,主机将会丢弃这种探测数据包;如果被测端口处于关闭状态,那么主机将会回复 RST。
5.TCPACK扫描(-sA):这种扫描模式可以检测目标系统是否采用了数据包状态监测技术 (stateful)防火墙,并能确定哪些端口被防火墙屏蔽。这种类型的数据包只有一个ACK标识 位。如果目标主机的回复中含有RST标识,则说明目标主机没有被过滤。
6.TCP窗口扫描(-sW):这种扫描方式检测目标返回的RST数据包的TCP窗口字段。如果目 标端口处于开放状态,这个字段的值将是正值;否则它的值应当是0。
7.TCP Idle扫描(-sI):采用这种技术后,您将通过指定的僵尸主机发送扫描数据包。本机 并不与目标主机直接通信。如果对方网络里有IDS,IDS将认为发起扫描的主机是僵尸主机。
UDP扫描选项
Nmap有多种TCP扫描方式,而UDP扫描仅有一种扫描方式(-sU)。虽然UDP扫描结果没有 TCP扫描结果的可靠度高,但渗透测试人员不能因此而轻视UDP扫描,毕竟UDP端口代表着 可能会有价值的服务端程序。但是UDP扫描的最大问题是性能问题。由干Linux内核限制1秒内最多发送一次ICMP Port Unreachable信息。按照这个速度,对一台主机的65536个UDP端口进行完整扫描,总耗时必 定会超过18个小时。
优化方法主要是:
1.进行并发的UDP扫描; 2.优先扫描常用端口; 3.在防火墙后面扫描; 4.启用--host-timeout选项以跳过响应过慢的主机。 |
假如我们需要找到目标主机开放了哪些 UDP端口。为提高扫描速度,我们仅扫描 53端口 (DNS)和161端口(SNMP)。
可以使用命令nmap -sU 192.168.56.103 -p 53,161
目标端口选项
默认情况下,Nmap将从每个协议的常用端口中随机选择1000个端口进行扫描。其nmapservices文件对端口的命中率进行了排名。
可以自定义端口参数:
-p端口范围:只扫描指定的端口。扫描1〜1024号端口,可设定该选项为–p 1-1024。扫描1 〜65535端口时,可使用-p-选项。 -F(快速扫描):将仅扫描100 个常用端口。 -r(顺序扫描):指定这个选项后,程序将从按照从小到大的顺序扫描端口。 -top-ports :扫描nmap-services 里排名前N的端口。 |
输出选项
Nmap可以把扫描结果保存为外部文件。在需要使用其他工具处理Nmap的扫描结果时,这一 功能十分有用。即使您设定程序把扫描结果保存为文件,Nmap还是会在屏幕上显示扫描结果。
时间排程控制选项
Nmap可通过-T选项指定时间排程控制的模式。它有6种扫描模式。
paranoid(0):每5分钟发送一次数据包,且不会以并行方式同时发送多组数据。这种模式 的扫描不会被IDS检测到。
sneaky(1):每隔15秒发送一个数据包,且不会以并行方式同时发送多组数据。
polite(2):每0.4 秒发送一个数据包,且不会以并行方式同时发送多组数据。
normal(3):此模式同时向多个目标发送多个数据包,为 Nmap 默认的模式,该模式能自 动在扫描时间和网络负载之间进行平衡。
aggressive(4):在这种模式下,Nmap 对每个既定的主机只扫描5 分钟,然后扫描下一 台主机。它等待响应的时间不超过1.25秒。
insane(5):在这种模式下,Nmap 对每个既定的主机仅扫描75 秒,然后扫描下一台主 机。它等待响应的时间不超过0.3秒。
默认的扫描模式通常都没有问题。除非您想要进行更隐匿或更快速的扫 描,否则没有必要调整这一选项。
扫描IPv6主机
启用Nmap的-6选项即可扫描IPv6的目标主机。当前,只能逐个指定目标主机的IPv6地址。
nmap -6 fe80::a00:27ff:fe43:1518 |
同一台主机在IPv6网络里开放的端口比它在IPv4网络里开放的端口数量要 少。这是因为部分服务程序尚未支持IPv6网络。
脚本引擎功能(Nmap Scripting Engine,NSE)
最后但是同样重要的,Nmap本身已经很强大了,但是加上它的脚本引擎更加开挂了,NSE 可使用户的各种网络检査工作更为自动化,有助于识别应 用程序中新发现的漏洞、检测程序版本等Nmap原本不具有的功能。虽然Nmap软件包具有各 种功能的脚本,但是为了满足用户的特定需求,它还支持用户撰写自定义脚本。
规避检测的选项
在渗透测试的工作中,目标主机通常处于防火墙或 IDS 系统的保护之中。在这种环境中使用 Nmap 的默认选项进行扫描,不仅会被发现,而且往往一无所获。此时,我们就要使用Nmap 规避检测的有关选项。
nmap -sV -sT -Pn --open -v 192.168.3.23 //扫描常见端口服务 nmap --script=default 192.168.137.* 或者 nmap -sC 192.168.137.* nmap --script=auth 192.168.0.1 //对目标或网段进行应用弱口令检测 nmap --script=brute 192.168.0.105 //对数据库、smb、snmp进行简单密码暴力猜解 nmap --script=vuln 192.168.0.1//检测常见漏洞 nmap --script=realvnc-auth-bypass 192.168.0.0 //扫描vnc服务 可扫mysql、telnet、Rsync nmap -n -p 445 --script=broadcast 192.168.0.1 //探测局域网更多服务 nmap --script external.baidu.com //whois解析 nmap --script external 202.103.243.110 //跟whois解析同样的效果 nmap --script=realvnc-auth-bypass 192.168.137.4 //检查vnc bypass 检查vnc认证方式 nmap --script=vnc-auth 192.168.137.4 获取vnc信息 nmap --script=vnc-info 192.168.137.4 smb破解 nmap --script=smb-brute.nse 192.168.137.4 smb字典破解 nmap --script=smb-brute.nse --script-args=userdb=/var/passwd,passdb=/var/passwd192.168.137.4 smb已知几个严重漏洞 nmap --script=smb-check-vulns.nse --script-args=unsafe=1 192.168.137.4 nmap -p 445 --script smb-ls--script-args ‘share=e$,path=\,smbuser=test,smbpass=test’ 192.168.137.4 查看共享目录 查询主机一些敏感信息(注:需要下载nmap_service) nmap -p 445 -n –script=smb-psexec --script-args= smbuser=test,smbpass=test192.168.137.4 nmap -n -p445 --script=smb-enum-sessions.nse --script-args=smbuser=test,smbpass=test192.168.137.4 查看会话 系统信息nmap -n -p445 --script=smb-os-discovery.nse --script-args=smbuser=test,smbpass=test192.168.137.4 猜解mssql用户名和密码 nmap -p1433 --script=ms-sql-brute --script-args=userdb=/var/passwd,passdb=/var/passwd192.168.137.4 xp_cmdshell 执行命令 nmap -p 1433 --script ms-sql-xp-cmdshell --script-args mssql.username=sa,mssql.password=sa,ms-sql-xp-cmdshell.cmd="net user" 192.168.137.4 dumphash值 nmap -p 1433 --script ms-sql-dump-hashes.nse --script-args mssql.username=sa,mssql.password=sa 192.168.137.4 Mysql扫描: nmap -p3306 --script=mysql-empty-password.nse 192.168.137.4 扫描root空口令 列出所有mysql用户 nmap -p3306 --script=mysql-users.nse --script-args=mysqluser=root 192.168.137.4 支持同一应用的所有脚本扫描 nmap --script=mysql-* 192.168.137.4 Oracle扫描: oracle sid扫描 nmap --script=oracle-sid-brute -p 1521-1560 192.168.137PS:Nmap 在实际渗透测试的时候还可以在MSF里面调用配合MSF一起有时候别有用处!
参考资料如下:
Nmap 官方的在线版 Nmap参考指南(Man Page):https://nmap.org/man/zh/ Github仓库版(网络下载上传)
Nmap 中文域名网站:http://www.nmap.com.cn/doc/manual.shtm
GitBook 在线版 :https://legacy.gitbook.com/book/wizardforcel/nmap-man-page/details
看云在线版:https://www.kancloud.cn/wizardforcel/nmap-man-page/141685
crayon-xin 博客文章:nmap超详细使用指南
GitHub erasin :https://github.com/erasin/notes/blob/master/linux/safe/nmap.md
【实用reg文件分享】设置cmd为utf-8&在此处打开CMD&让 Windows 时钟显示精确到秒 技术文章
【实用reg文件分享】设置cmd为utf-8&在此处打开CMD&让 Windows 时钟显示精确到秒
在实际使用中,我们经常需要使用cmd处理一些小东西,比如解密脚本啊等:cmd默认的编码方式不支持utf-8的,会乱码:
这时候如果我们使用命令:chcp 65001 即可让cmd命令行支持utf-8的编码格式,就不会乱码了:
在我解决这个问题之前,Google了好久,结果是有很多文章看得我是云里雾里。。。不知所云。最后还是找到了一些零散的信息,最终通过实践验证,加上Google查资料,于是就自己写了个注册表文件导入后就可以安心食用了。下载文件我放在最后,代码也会贴出来。
还有另外两个注册表文件,一个是【在此处打开CMD】另一个是【让 Windows 时钟显示精确到“秒”】。
【在此处打开CMD】 主要是方便我们直接在某个文件夹直接打开cmd并且不用去cd切换路径。效果如下:
【让 Windows 时钟显示精确到“秒”】顾名思义:让Windows的时钟显示秒数。效果如下:
下面就是代码:
Windows Registry Editor Version 5.00 ;# -*- coding: utf-8 -*- ;# @Author: Mrxn ;# @Blog: https://mrxn.net/ ;# @DateTime: 2018-10-30 20:25:51 Tuesday ;# @Description: this is the default description for Mrxn ;# ; ; 下载【cmd-utf-8_seconds.zip】 ;【解压!】【解压!】【解压!】重要的事说三遍! ; 解压后,进入 【cmd-utf-8_seconds】文件夹,双击 【设置cmd为utf-8.reg】弹出的对话框按次序选择 【是】【是】【确定】即可。 ; 打开你的cmd.exe 输入 chcp 回车 看到如下类似的信息就表明成功了,以后每次打开cmd就都支持utf-8编码了 ; Active code page: 65001 ; C:\WINDOWS\system32>chcp ; Active code page: 65001 ; C:\WINDOWS\system32> ; 注意:作者在Windows10 1803 中测试没问题。 ;第一个是设置chcp 65001(十六进制),but,貌似没用啥作用 [HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe] "CodePage"=dword:0000fde9 "FaceName"="Lucida Console" ;真正起作用的 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor] "autorun"="chcp 65001" ;设置字体的,不喜欢的可以删除或者是修改成自己喜欢的字体(前提是你的电脑里面有这个字体) [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont] "936"="*Lucida Console" ;小伙砸,看你骨骼精奇,都看到这里了没来我博客逛逛啊 --->https://mrxn.net<
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\shell\OpenCmdHere] @="在此处打开命令提示符" "Icon"="cmd.exe" [HKEY_CLASSES_ROOT\Directory\shell\OpenCmdHere\command] @="cmd.exe /s /k pushd "%V"" [HKEY_CLASSES_ROOT\Directory\Background\shell\OpenCmdHere] @="在此处打开命令窗口" "Icon"="cmd.exe" [HKEY_CLASSES_ROOT\Directory\Background\shell\OpenCmdHere\command] @="cmd.exe /s /k pushd \"%V\"" [HKEY_CLASSES_ROOT\Drive\shell\OpenCmdHere] @="在此处打开命令窗口" "Icon"="cmd.exe" [HKEY_CLASSES_ROOT\Drive\shell\OpenCmdHere\command] @="cmd.exe /s /k pushd \"%V\"" [HKEY_CLASSES_ROOT\LibraryFolder\background\shell\OpenCmdHere] @="在此处打开命令窗口" "Icon"="cmd.exe" [HKEY_CLASSES_ROOT\LibraryFolder\background\shell\OpenCmdHere\command] @="cmd.exe /s /k pushd \"%V\""
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced] "ShowSecondsInSystemClock"=dword:00000001 [HKEY_CURRENT_USER\Control Panel\International] "sLongDate"="yyyy '年' M '月' d '日' dddd" "sShortDate"="yyyy '年' M '月' d '日' dddd" "sTimeFormat"="HH:mm:ss" "sShortTime"="HH:mm:ss" "sYearMonth"="yyyy '年' M '月'"
附件下载:
PS:这周就会更新 kms脚本和宝塔面板开启域名SSL登录脚本,感谢发邮件反馈bug的朋友。
宝塔(bt.cn)面板开启域名登录并且使用域名证书,解决浏览器信任证书问题 Linux
PS:最近因为工作原因,很忙,没时间写博客,各位读者,当你们每次打开都没有更新的时候,给你们说一声抱歉。
Onekey-Open-BT-panel-ssl-with-domain
宝塔(bt.cn)面板开启域名登录并且使用域名证书,解决浏览器信任证书问题,强迫症福音@_@
- 注意 :
目前使用此shell需要你在宝塔后台面板里面建一个需要绑定到面板的域名网站,最好申请Let's SSL证书,当然,shell也支持自定义证书路径。 只测试了建立网站后的,没有测试过不用建立网站,直接解析域名到服务器(这种未来会支持的,使用 acme.sh 来申请SSL证书或者是自定义证书都可以)
shellcheck
推荐一个可以检查shell语法的网站,超级好用.也可以安装到自己的机器上:使用方法:
- 直接wget到本地执行就可以根据提示操作了:
wget https://raw.githubusercontent.com/Mr-xn/Onekey-Open-BT-panel-ssl-with-domain/master/Onekey-Open-BT-panel-ssl-with-domain.sh && bash Onekey-Open-BT-panel-ssl-with-domain.sh
- ToDo
- 支持自定义证书
- 不需要宝塔后台添加域名
- 添加宝塔常用命令:重置面板密码、重置封禁IP列表、更改端口等等
利用fail2ban来阻断一些恶意扫描和暴力破解---保护你的VPS 技术文章
UPdate:使用效果很明显,就这么几天扫描快9W次,ban了八百多IP
简单介绍一下:
如果把vps的iptables比作是一把枪,那么fail2ban就是除了你之外的另一个忠心的手下,他可以拿着枪来枪毙或管理那些非法的探视,将他们拒之门外,将一些危险扼杀在萌芽阶段。但是,他也仅仅是个手下,不是超人,可况超人也不是万能的!所以也不要以为有了它就可以高枕无忧了,这就好比一个人在厉害,也不可能打过一群人。fail2ban可以防御一定范围的CC、暴力破解登录或者是恶意扫描等等。
安装:
推荐使用这个一键脚本(lnmp.org作者写的):
wget https://raw.githubusercontent.com/licess/lnmp/master/tools/fail2ban.sh && ./fail2ban.sh
第二种方法就是自己手动去fail2ban的GitHub下载解压安装,地址:
https://github.com/fail2ban/fail2ban
最后一种就是直接通过包安装,但是可能不是最新的:
Debian/Ubuntu:apt install fail2ban
centos:yum install fail2ban
安装完来配置使其监控我们的nginx、apache或其他服务的日志,从日志中提取我们需要屏蔽的一些恶意请求,比如大量的404---通过扫描器扫描产生,ssh暴力破解,v2ray的暴力尝试爆破ID等等。
如果是通过第一种,使用一键脚本安装的话,我们只需要修改 /etc/fail2ban/jail.local 这个文件然后在 /etc/fail2ban/filter.d/中添加自己的规则文件即可。
比如我的在/etc/fail2ban/jail.local 中追加如下内容,下面使用cat命令直接追加:
cat >>/etc/fail2ban/jail.local<<EOF
[sshd]
enabled = true
port = ssh
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
#mail-whois[name=SSH, [email protected]]
logpath = /var/log/auth.log
maxretry = 5
bantime = 604800
[deny-badcrawl]
enabled = true
port = http,https
filter = deny-badcrawl
action = iptables[name=Http, port=80, protocol=tcp]
action = iptables[name=Https, port=443, protocol=tcp]
logpath = /home/wwwlogs/*.log
maxretry = 4
findtime = 3600
bantime = 3600
[nginx-limit-req]
enabled = true
port = http,https
logpath = /usr/local/nginx/conf/nginx.conf
action = iptables[name=Http, port=80, protocol=tcp]
action = iptables[name=Https, port=443, protocol=tcp]
maxretry = 4
findtime = 600
bantime = 600
EOF
请注意SSH的port,如果你自己修改过端口号,那么请把port替换成你自己修改的端口号。nginx-limit-req需要你在你的nginx配置文件中配置了才能生效的。
因为nginx-limit-req新版本的fail2ban已经有了,具体的可以在 /etc/fail2ban/filter.d 目录下面查看。
好了,然后我们在 /etc/fail2ban/filter.d 目录下新建一个deny-badcrawl.conf:
touch deny-badcrawl.conf
然后将如下内容写进去(我依旧是使用的cat命令,你可以根据自己喜好,比如nano,vi等):
cat >>/etc/fail2ban/filter.d/deny-badcrawl.conf<<EOF
[Definition]
failregex = <HOST> -.*- .*HTTP/*.* 404 .*$
ignoreregex =
EOF
然后重启fail2ban即可:service fail2ban restart
然后查看状态:fail2ban-client status
查看某个规则的具体状态:fail2ban-client status deny-badcrawl
像我这里使用了几个小时后就封了好几个IP:
注意:一般修改配置文件后,我们只需要重新载入即可,不需要重启fail2ban:
fail2ban-client reload nginx-limit-req 如果不生效,就强制重新加载service fail2ban force-reload nginx-limit-req
OK
具体的fail2ban用法和详细参数设置这些,早有前辈写过很多,不过最好是去官网看英文原版。