实在是受够了,每个服务器24小时反反复复的被扫密码,开始我还手工处理,后来这是被对方逼着进步啊,实在太多了整不过来,于是整了这么一出。
我自己收集的这600多ip段,估计一大部分是肉鸡。这些都是明明确确扫了我的密码的,懒省事就全设置的/24段,因为大部分都是一个段内好多IP在扫,所以这么省事点,假设有冤枉的,那也是对方自己的安全没做好被人咬下来了,不关我事。屏蔽掉这600多个段以后,目前来说没发现还被扫的情况。
这些ip段都收集于自用的备份数据ftp,而这个ftp除我之外没有任何人有权限,所以凡是试着登进来的都一定是坏孩子,诸如这样:
2020-04-28 23:23:36,123 svr-bak proftpd[14320] 61.152.xx.xx (58.87.105.221[58.87.105.221]): USER 67662279.com: no such user found from 58.87.105.221 [58.87.105.221] to ::ffff:61.152.xx.xx:21 2020-04-28 23:23:36,930 svr-bak proftpd[14321] 61.152.xx.xx (58.87.105.221[58.87.105.221]): USER webmaster@67662279.com: no such user found from 58.87.105.221 [58.87.105.221] to ::ffff:61.152.xx.xx:21 2020-04-28 23:23:38,323 svr-bak proftpd[14322] 61.152.xx.xx (58.87.105.221[58.87.105.221]): USER 67662279com: no such user found from 58.87.105.221 [58.87.105.221] to ::ffff:61.152.xx.xx:21 2020-04-28 23:23:39,128 svr-bak proftpd[14323] 61.152.xx.xx (58.87.105.221[58.87.105.221]): USER .67662279.com: no such user found from 58.87.105.221 [58.87.105.221] to ::ffff:61.152.xx.xx:21 2020-04-28 23:23:39,936 svr-bak proftpd[14324] 61.152.xx.xx (58.87.105.221[58.87.105.221]): USER administrator@67662279.com: no such user found from 58.87.105.221 [58.87.105.221] to ::ffff:61.152.xx.xx:21 2020-04-28 23:23:41,313 svr-bak proftpd[14325] 61.152.xx.xx (58.87.105.221[58.87.105.221]): USER administrators@67662279.com: no such user found from 58.87.105.221 [58.87.105.221] to ::ffff:61.152.xx.xx:21 2020-04-28 23:23:42,150 svr-bak proftpd[14326] 61.152.xx.xx (58.87.105.221[58.87.105.221]): USER 67662279: no such user found from 58.87.105.221 [58.87.105.221] to ::ffff:61.152.xx.xx:21 2020-04-28 23:23:42,933 svr-bak proftpd[14327] 61.152.xx.xx (58.87.105.221[58.87.105.221]): USER 67662279com: no such user found from 58.87.105.221 [58.87.105.221] to ::ffff:61.152.xx.xx:21 2020-04-28 23:23:43,742 svr-bak proftpd[14328] 61.152.xx.xx (58.87.105.221[58.87.105.221]): USER admin@67662279.com: no such user found from 58.87.105.221 [58.87.105.221] to ::ffff:61.152.xx.xx:21 2020-04-28 23:23:44,552 svr-bak proftpd[14329] 61.152.xx.xx (58.87.105.221[58.87.105.221]): USER 67662279@67662279.com: no such user found from 58.87.105.221 [58.87.105.221] to ::ffff:61.152.xx.xx:21 2020-04-28 23:23:45,336 svr-bak proftpd[14330] 61.152.xx.xx (58.87.105.221[58.87.105.221]): USER 67662279.com: no such user found from 58.87.105.221 [58.87.105.221] to ::ffff:61.152.xx.xx:21
=============== 2023.12.06 增加参数month,详细说明在下面更新日志里
这些都是更新的:
https://api.tingtao.org/fw2?act=ipsetrestore
这个是ipset的restore格式,另外有几个常用的命令行版本:
Linux的ipset+iptables:
https://api.tingtao.org/fw2?act=ipset
原始数据格式:
https://api.tingtao.org/fw2?act=mytools
原始数据格式是我自己程序用起来方便的,之前未曾公布过,所以看起来这么“入门”的参数只能呵呵了。懒得改了,无碍大局。
格式为半角逗号分隔的数据,没有任何加工。有需要的话拿到这个格式可以自行后续处理成各种你所需要的格式。
下面两个已关闭
windows格式:
https://api.tingtao.org/fw2?act=windows
FreeBSD的ipfw格式:
https://api.tingtao.org/fw2?act=ipfw
各位方便使用的是第一个,直接拿回去删掉每行前面几个字符就行了。
完整的Linux+ipset+iptables用法:
#每次刷新,下面有一句可能会因为重复创建而出错,不用理会: wget https://api.tingtao.org/fw2?act=ipsetrestore -O badip.txt ipset create badip hash:net ipset flush badip ipset restore -f badip.txt rm badip.txt #系统启动后一次性的: iptables -A INPUT -m set --match-set badip src -j DROP
如果要自行收集的话,我的脚本是这样的:
收集IP段:
#列出目前连接21端口的前3位ip,并且不包含自用IP(1.2.3和2.3.4是例子),导出为badip.txt,然后将这个文件内容提交到数据库: netstat -tn 2>/dev/null | grep :21 | awk '{print $5}' | cut -d: -f1 | gawk '{match($0,"(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){2}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])",a)}{print a[0]}' | uniq | sort | head | grep -v '1.2.3' | grep -v '2.3.4' > badip.txt mysql -u数据库用户名 -h数据库ip -p数据库密码 数据库名 --local-infile=1 -e "LOAD DATA LOCAL INFILE 'badip.txt' IGNORE into table ips(ip) "
数据表结构:
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `ips`; CREATE TABLE `ips` ( `ip` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `ipmask` int(255) DEFAULT 24, PRIMARY KEY (`ip`) USING BTREE, INDEX `dfg`(`ip`) USING BTREE ) ENGINE = MyISAM CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1;
注意ip这个字段一定要设置主键,可以避免重复数据,字符集随意了,用啥都可以,反正都是数字。而varchar的长度设置到200是考虑以后可能增加ipv6的情况。
如果你不想用我的库,那用你自己的库导出也是一样的:
mysql -u数据库用户名 -h数据库ip -p数据库密码 数据库名 -N -e "select CONCAT('add badip ',ip,'.0/',ipmask) from ips" > badip.txt
这一行等价于
wget https://api.tingtao.org/fw2?act=ipsetrestore -O badip.txt
其他的自己根据需要修改吧,都是很简单的sql字符串操作。
之所以放mysql里,是因为用来收集的服务器有好几个,放一个统一存储可以避免重复造轮子。如果你只有一个服务器,那直接放文件里是很省事的。
我的库里只有一个段是/16的,因为这个段有超过10个c段在扫,所以一口气干了它,其他都是/24的c段了。
=============================
2021.09.13
今天做了更新,这个接口不再以IP段的形式进行收集,而全部采用单独IP的格式。
此处收集的IP,都是明确发生了暴破密码的行为才会收集,所以封掉不冤枉。
==================================
2021.09.18
我猜到IP会比较多,但也没想到就这么5天时间,已收集到1.77万IP了,再这么单纯使用IP的话,也就不太恰当了。
略微调整,结合之前的思路和做法,目前将超过5个IP的/24段直接组合为一条IP段地址,因为有些段的扫密码IP特别多,还有超过200的。
大概推测的话,超过5个IP在扫密码的话,基本可以断定这是一个已被攻破的多IP机器(像站群这类的)。
目前还有一个两难的选择,cloudflare的机器我怀疑长期被人控制了吧,前两年我就去他们社区问过,他自己公布的IP列表里面,居然有IP在堂而皇之的扫我FTP密码,当时没有所谓的“官方人员”回答。而最近我发现又有这个情况了,所以如果你同时使用用本api和cloudflare cdn的话,那么建议你把cf的IP放行规则摆在第一条,否则本api提供的列表会把cf的有些IP给封掉。
我也不打算在程序里为它做例外了,光凭我肉眼看到的这b扫我密码都是第二轮了,时间跨度一两年吧,而且多个收集恶意IP的组织也都把它家的IP放进列表了。连自己家门都守不好,还搞个毛。整天说什么用户是上帝,如果用户真的是上帝,那你扫用户密码这不就是以下犯上了?不能惯着!
还有这样的行为也被放进列表了:
不管主观意图是什么,光看这行为就肯定不是好货,清一色屏蔽掉。
==================================
2022.07.06
这两天做了更新,单IP的记录是即时的,IP段的合并放到每周末一次。
然后因为数量已经太大,以至于每请求一次都会导致这个web节点满载,所以这个api接口做了1到2小时的缓存。
2022.08.23
对数据源做了优化,以前更新频率是每周末对日志进行分析,然后入库。现在优化为即时入库,也就是即时更新。当然,从产生恶意行为到发给日志服务器,到日志服务器分析入库,再到数据同步至这个api站点所在节点,这中间或许有1到2秒的延迟,毕竟这几个节点的物理距离连起来能绕地球一圈了。
关闭了ipfw和windows接口,增加了原始数据接口mytools。
ipfw是因为基本没人用,freebsd系统的稳定性和效率显著高于所有linux发行版,无奈太小众了,我自己现在都不怎么玩了。
而windows有些尴尬,因为当添加这么大批量的防火墙规则时,不论用批处理还是api形式提交,windows系统都会卡到半死。当然,添加以后呢,win系统的效率并不会产生什么变化,说明win的网络过滤这一块效率极高。所以我个人估计是api接口没弄好,虽然理论上一条规则可以添加“不知道上限是多少个”的ip/ip段作用域,但从批处理和api提交的时候单条规则的ip数量上限大概在1100到1300之间,那么我这里收集的10万+数据就需要分成100多条规则,这就导致了防火墙管理界面的卡疯。所以,既然找不到合适的途径,就暂时放弃吧。
原始数据已经提供,各位可以自行处理数据。
另外,如果哪位大佬知道有什么途径可以在windows系统一次添加10万数据给防火墙,请教教我。
============================================
感谢网友回复,windows通过ps可以一次添加更多ip,代码为:
$IPsPerRule = 5000 $IPRanges="1.1.1.1","2.2.2.2"... Write-Host "Wait... It will take some time... Creating" ([int]($IPRanges.Count/$IPsPerRule)+1) "huge rules..." for ($i=0; $i -lt ($IPRanges.Count/$IPsPerRule); $i++) { New-NetFirewallRule -Name "Banip-[$i]" -DisplayName "Banip-[$i]" -RemoteAddress $IPRanges[($i*$IPsPerRule)..($i*$IPsPerRule+($IPsPerRule-1))] -Enabled True -Direction Inbound -Action Block }
保存扩展名为ps1,然后右键通过powershell运行。
第一行的5000为每次添加数量。
经测试,在win10企业版上面,5000是没任何问题的。但在我机器上,上限为10000,而且设置一万的话会让所有的入站规则无法显示,原因未知。。。所以更详细的数字我这不方便测试了,老老实实用5000就好了。。。
2023.11.26
手工删除了一个空的IP记录,原因未知。。。
因为记录中有V6地址,返回结果暂时屏蔽V6这部分地址,目前有50多个,量很小,且根据地址来看实际只有2到3个网段,但为此要增加V6的防火墙规则和记录,至少目前来说不划算。而且我提供的命令创建的是V4的ipset,不屏蔽V6的话,会让V4也无法导入。
2023.12.06
因为数据量已经大到一定程度了,检索+三轮匹配+组合结果并传输给客户端,这一轮流程下来会很消耗服务器资源,所以增加一个参数month,用来限定时间范围,不输入此参数的话默认为3,就是查询3个月内的记录。输入的话,值从1到12,更多的我想没多大必要了,因为如果在一年内被系统捕捉到恶意行为的话,记录的时间是会更新的。
目前记录收集的数据来源包括扫ssh密码、扫ftp密码,以及web方面各种扫描、暴破行为。
空记录的问题大概也解决了,排查了几天,发现是syslog-ng的毛病,经常会无缘无故的给一个空的记录。
v6暂时仍然不打算搞,那玩意理论数据量太大了点。
这个时节,半夜三更搞这玩意,不会太细致,自己试了几次没毛病,如有bug请提醒我,随后再修。
2024.01.18
调用地址改动,原地址自动转向
2024.01.25
由php改为lua实现,性能大幅提升,且检索结果缓存4小时
$IPsPerRule = 5000
$IPRanges="1.1.1.1","2.2.2.2"...
Write-Host "Wait... It will take some time... Creating" ([int]($IPRanges.Count/$IPsPerRule)+1) "huge rules..."
for ($i=0; $i -lt ($IPRanges.Count/$IPsPerRule); $i++)
{
New-NetFirewallRule -Name "Banip-[$i]" -DisplayName "Banip-[$i]" -RemoteAddress $IPRanges[($i*$IPsPerRule)..($i*$IPsPerRule+($IPsPerRule-1))] -Enabled True -Direction Inbound -Action Block
}
存为ps1执行看看,
谢了,周末试下