吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12317|回复: 155
收起左侧

[原创工具] 远程桌面守护者,保护服务器的3389端口

    [复制链接]
oldman 发表于 2022-11-15 13:49
本帖最后由 oldman 于 2022-11-16 08:44 编辑

远程桌面守护者,3389马后炮,3389看门狗。

这个软件是用于防守远程桌面的,目的在于加强服务器安全,防止别有用心的人登录你的服务器3389。

防御原理:利用Windows系统日志产生的 登录成功4624事件 和 登录失败4625事件,并判断相关的IP、地理位置等来执行相关操作,简单说就是对方IP不是允许的范围,则拉黑它,因为正常用户不会去登陆你的3389(当然,对于正常服务器来说,这样可能会误伤这个IP下的所有用户,这个就需要自行斟酌了。)

为什么说是马后炮?因为日志的产生是在结果之后,也就是说,对方已经登录进来了,然后才产生的日志,并不能在对方登录之前拦截,因此是被动的防御。

其实这个想法很久之前就有了,Linux上有个fail2ban,但是Windows上我没有找到类似的,所以按照自己的想法做了这个。因为要放到服务器上用,所以开源了。其实按照这个思路自己做个也很容易。
其实当时做的时候,还有另一种思路,但是我实现不了,思想就是hook系统进程之类的,hook关键的对比call,拿到对方登录输入的账号密码等,此时判断对方IP,不合法则直接返回错误,这就相当于主动防御了,更加安全,但是成本太高,期待哪位大佬实现一下。

另外就是火绒的系统防御还是啥的,会有这种提示,某个“ip触犯远程WMI调用,已阻止”之类的,但是却没有后续操作,比如直接将IP拉黑等等。

做出来一年多了,断断续续改了好多地方,目前不光3389,别的形式的登录也会产生这俩事件,后来就加上了一并处理。

现在一天一个服务器可能就得面临十几次的非法访问,国外IP居多。

软件的功能及设置很简单,基本都有对应的说明,但是还是得强调,不要设置错了,不然可能你就无法登录服务器了!

建议改个迷惑性的名字然后塞到迷惑性的目录里,这样隐蔽性比较高。

另外,最好自己审核代码自己编译。源码中的DeLog_EC.ec也是开源的,但是代码貌似找不到了,只是用来输出日志的,可以自己删了。



Snipaste_2022-11-15_11-13-23.jpg

Snipaste_2022-11-14_22-00-19.png

源码、成品等附件太大,上传阿里云了:https://www.aliyundrive.com/s/SAXe9QJRnBu

排版不会整,凑合看吧。


补充一下:
1.修改远程桌面的默认端口号,有用,但是同时也是最没用的防护,因为不管怎么改,协议不变,遍历端口号0-65535,总会识别出来的。
2.本软件会动态读取你远程桌面所使用的端口号,也就是说,修改了RDP端口号依然可以使用本软件。
3.关于端口号的高端玩法是这样的:服务器端口号改不改随意,但是可以限制客户端端口号,也就是客户端只能通过指定的端口来连接服务器的RDP端口,因为入侵者不可能知道你的服务器允许的客户端端口号。(这个主要适用于使用第三方RDP工具,可以指定出站端口号的RDP工具)
举个例子来说就是:Client通过本地12345端口 来连接 Server的3389端口,Server会检查远程Client的端口号,发现是12345,不符合设置的1234端口,则会中断远程会话。

另外关于为什么不用第三方远程桌面工具
对于我来说:1.自带的更方便,第三方的工具可能要求客户端服务端都安装之类的比较麻烦;2.服务器上还是尽可能用开源的、自带的工具比较放心;

一些仁者见仁的问题,就不一一回复了。

经过66楼大佬提醒,GitHub上有这么个开源项目:https://github.com/DigitalRuby/IPBan 如果需要保护 SSH, SMTP, databases like MySQL or SQL Server, 可以试试,他支持的更加全面。
原理都是一样的,监控系统日志。它对于第三方软件使用的端口,则是监控软件的log文件。
要说不同,就是IPBan则是后台持续运行,因为使用了系统日志监控,这和我最初的设计思路是一致的,但是后来我觉得没必要,改成了仅当日志产生后才会启动进程执行后续操作,代码里应该有注释说明。另外就是,不知道它是不是支持地理位置限制啥的。总之,各有优缺,各取所需吧~

免费评分

参与人数 29吾爱币 +35 热心值 +25 收起 理由
shuihuo8 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
huacha + 1 + 1 太棒了 现在扫端口已经算是常态的东西了
cdis + 1 + 1 鼓励转贴优秀软件安全工具和文档!
孤王 + 1 + 1 能否出个视频教程,新手还是害怕搞错了,导致进不去服务器
02aaaa + 1 + 1 谢谢@Thanks!
zyxm2013 + 1 + 1 我很赞同!
yihan01 + 1 + 1 我很赞同!
dubois2007 + 1 + 1 热心回复!
ciss520 + 1 + 1 有个想法,你可以监控每次远程,首次接入直接1秒后断开。之后对比黑名单,.
yesgreat + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
贪睡的叶浠 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
被遗忘的天空 + 1 + 1 我很赞同!
HWinZnieJ + 1 谢谢@Thanks!
xuxu123 + 1 热心回复!
whisky2011 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
y250812704 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Edison_zhu + 3 + 1 可以,有用
xzm1008 + 1 + 1 我很赞同!
艾爱姆Joker + 1 + 1 谢谢@Thanks!
smallstar + 1 谢谢@Thanks!
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
PAQ + 1 + 1 谢谢@Thanks!
yjqyjq1717 + 1 + 1 谢谢@Thanks!
s90232003 + 1 + 1 最近也在做3389防御,有个简单的办法可以实现的!发现登录立马踢下线,拉黑.
RainH + 1 + 1 谢谢@Thanks!
bbs119 + 1 + 1 谢谢@Thanks!
351413 + 1 我很赞同!
jtq1234 + 1 + 1 有人需要兰州 https://eva.lanzoue.com/b0fa9wohi 密码:eva
极品黑车 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| oldman 发表于 2022-11-15 16:03
本帖最后由 oldman 于 2022-11-15 16:06 编辑
lane_dell 发表于 2022-11-15 15:50
没太理解,都登进来了,再进行拉黑的意义在哪儿?

哈哈,所以说有点马后炮。。

但是总不能因为它已经进来了,就不管了吧(假装不知道,不太好吧),哈哈。。

对于我个人而言,是这样的:
1.登录失败,直接拉黑,它就没机会穷举我的密码了。
2.登录成功,立即拉黑,在它没反应过来的时候,就拉黑了,它也会纳闷,后续它针对我的操作就都无法进行了,除非换IP。哈哈。

上面的动作都不重要,重要的是,我可以立即接到通知,尤其登录成功的,意味着我的密码已经不安全了,总比我的密码已经不安全了,而我却还不知道 要安全吧~~~

目前能做到的,也就如此了。

类似这样:

配置好了之后,可以及时通知

配置好了之后,可以及时通知
 楼主| oldman 发表于 2022-11-19 09:20
hua_z 发表于 2022-11-18 15:10
你好,API通知消息接口方便分享下吗?
另外,支持多个服务器吗?

你好。软件是放到服务器上运行的,所以支持多个服务器,标签就是用来区分哪个服务器的。

消息通知接口可以用这个,PHP的。另外就是得自己注册企业微信并申请机器人,具体我忘了~

[PHP] 纯文本查看 复制代码
<?php
// config
// ======================================
define('SENDKEY', '调用密码');
define('WECOM_CID', '自己根据机器人配置');
define('WECOM_SECRET', '自己根据机器人配置');
define('WECOM_AID', '1000001自己根据机器人配置');
define('WECOM_TOUID', '@all');

// 以下配置需要有 redis 服务和 phpredis 扩展
define('REDIS_ON', false);
define('REDIS_HOST', '127.0.0.1');
define('REDIS_PORT', '6379');
define('REDIS_EXPIRED', '7000');
define('REDIS_KEY', 'wecom_access_token');

// code
// ======================================

if (strlen(@$_REQUEST['sendkey'])  < 1
    || strlen(@$_REQUEST['msg'])  < 1 || @$_REQUEST['sendkey'] != SENDKEY
) {
    die('bad params');
}

header("Content-Type: application/json; charset=UTF-8");
echo send_to_wecom(@$_REQUEST['msg'], WECOM_CID, WECOM_SECRET, WECOM_AID, WECOM_TOUID);


function redis()
{
    if (!isset($GLOBALS['REDIS_INSTANCE']) || !$GLOBALS['REDIS_INSTANCE']) {
        $GLOBALS['REDIS_INSTANCE'] = new Redis();
        $GLOBALS['REDIS_INSTANCE']->connect(REDIS_HOST, REDIS_PORT);
    }

    return $GLOBALS['REDIS_INSTANCE'];
}

function send_to_wecom($text, $wecom_cid, $wecom_secret, $wecom_aid, $wecom_touid = '@all')
{
    $access_token = false;
    // 如果启用redis作为缓存
    if (REDIS_ON) {
        $access_token = redis()->get(REDIS_KEY);
    }

    if (!$access_token) {
        $info = @json_decode(file_get_contents("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=".urlencode($wecom_cid)."&corpsecret=".urlencode($wecom_secret)), true);
                
        if ($info && isset($info['access_token']) && strlen($info['access_token']) > 0) {
            $access_token = $info['access_token'];
        }
    }
    
    if ($access_token) {
        $url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?debug=1&access_token='.urlencode($access_token);
        $data = new \stdClass();
        $data->touser = $wecom_touid;
        $data->agentid = $wecom_aid;
        $data->msgtype = "text";
        $data->text = ["content"=> $text];
        $data->duplicate_check_interval = 600;

        $data_json = json_encode($data);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_json);

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        
        $response = curl_exec($ch);
        if ($response !== false && REDIS_ON) {
            redis()->set(REDIS_KEY, $access_token, ['nx', 'ex'=>REDIS_EXPIRED]);
        }
        return $response;
    }
    
    
    return false;
}
 楼主| oldman 发表于 2022-11-15 14:17
chajiahuo 发表于 2022-11-15 14:08
楼主楼主  爆破数据库端口的也能做个拦截么

不行哦,原理不一样~
zoeroland 发表于 2022-11-15 13:59
支持下,虽然目前没用
z1872428255 发表于 2022-11-15 14:03
这个值得支持下
52菜鸟 发表于 2022-11-15 14:04
试下  好用来好评
qwerdf4567 发表于 2022-11-15 14:05
支持下,后续会用到,感谢分享
chajiahuo 发表于 2022-11-15 14:08
楼主楼主  爆破数据库端口的也能做个拦截么
likaiaixuexi 发表于 2022-11-15 14:11
这软件不错,我也支持楼主
pan3363 发表于 2022-11-15 14:15
chajiahuo 发表于 2022-11-15 14:08
楼主楼主  爆破数据库端口的也能做个拦截么

不行,这个是守护远程桌面程序防御的。
18653188004 发表于 2022-11-15 14:16
看着挺高级的 学习下
AkerIII 发表于 2022-11-15 14:17
支持,正好项目里面可以借鉴思路
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 00:57

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表