阿里云ECS被封禁端口号解决办法

事情是这样的
我自以为复杂的随机密码,结果还是被破解了,怀疑还是撞库进去的

恩,阿里云就的免费的动态感知就开始报出异常了:SSH远程非交互式一句话异常指令执行

上面这句话不用理解,反正就是从俄怀明州的一个ip用root用户登录到机器上,下载了俩病毒文件,并且happy的运行了起来
并未对服务器上其他程序进行破坏性操作,嗯,我很庆幸。经过查询,貌似是个把你的服务器变成BTC矿机的病毒,并且能够自行对互联网上的其他ip进行攻击扩散病毒

接下来,可以想像到的,这个攻击轻易的就被阿里云发现了,并且封掉了若干dst端口的访问,其中包括了重要的22端口

以上是和阿里云技术客服的一部分对话

那么,关键问题是,我们怎么才能准确的找到病毒,干掉病毒呢

现场截图,我没有留,但是我尽可能还原现场

思路如下:

  • 先确认封禁的端口
  • 进而找到程序的进程号
  • 进而删除病毒程序
  • 再杀掉进程
  • 检查crontab定时任务
  • 结束

假设我们被封禁的端口号是:22

// 切换root权限
sudo su

// 筛选被封禁的端口号连接
netstat -anp | grep :22

最右边一列,为进程号/程序名

假设,这时候问题进程为13411,问题程序为remmina

PS: remmina是我的远程服务器管理工具,一般病毒可能是个随机字符串,特征还是很明显的

// 查看进程的工作目录
pwdx 13411

// 查看程序进程的执行命令
ps -ef | grep 13411

经过上面两部,我们一定能找到程序的执行位置,以及程序本体

// 我们第一步就是删除程序文件
cd /home/bh && rm -f /usr/bin/remmina;
如果有坚强的进程,就顺着pid一直顺上去,不对的程序都干掉

// 现在病毒的执行程序都干掉了,接下来就是要杀进程了
kill -9 13411

// 最后要检查crontab有没有可疑的定时任务
crontab -e

// 干掉奇怪的程序,那么就结束了

以上,基本上可以应对所有被封禁固定端口的场景

如果是非阿里云的服务器,就比较头疼了,要及时发现都是个难事儿。
不过这种挖矿的病毒,占用cpu资源还是比较厉害的,通常通过检查cpu占用率定位程序进程
偷偷的,偷信息的病毒就完蛋了

最关键的还是,不要让别人轻易的登录你的服务器哦

服务器登录,建议初始化的时候,建立好sudo用户,就把root账户封掉吧。然后用户登录要用ssh-key的无密码登录会更加安全哦。这样撞库几乎不可能成功。

赶工期

哈!最近做了较多的整理工作,也在赶工期,没什么内容出来。

但也是草草得发一篇。

追男神训练工具

几年前在某微信公众号里看到一个有意思的文案
于是就直接做成了游戏在公司转发

创意原作者叫啥我都不知道,如果有机会玩到的话,千万不要联系我。我没有钱给版权费,哈哈哈。
本来有张图上还是有作者名字的,虽然不知道是不是真的作者,不过被公司一个好心的美工把名字P成了公司名字。

(好像这个不专业的美工就是我……)

本游戏纯粹个人兴趣,不做任何商业用途哦。

java script 深度对象合并

由于公司最近的某个业务
顺手解决了一下,JS程序员,一直以来避之不及的问题。
那就是对象合并。
以及对象抽取。

var obj1 = {
    a: {
        h: [50, 1,2,3],
        j: "hehe"
    }
};

var obj2 = {
    a: {
        k: "KKK",
        h: [100, 2, 6],
        j: "haha"
    },
    b: {
        i: "abc"
    }
};

假设现在有这两个,js对象。
我们往往希望把他合并为,我们想要的样子,而不是简单的在第一层进行覆盖插入。

我们希望这个对象合并结果是这样:

{
    "a": {
        "h": [1,2,3,6,50,100],
        "j": "haha",
        "k": "KKK"
    },
    "b": {
        "i": "abc"
    }
}

大家可以在一下试一下

对象1

对象2

以下即是源码:

var margeObj = function (obj1, obj2) {
    this.arrayUnique = function(array){
        if (array instanceof Array === false) {
            throw "ARGEMENTS TYPE IS NOT ARRAY";
        }
        array.sort(function (a, b) {return a - b});
        var result = [array[0]];
        for(var i = 1; i < array.length; i++){
            if (result.indexOf(array[i]) === -1) {
                result.push(array[i]);
            }
        }
        return result;
    }

    this.jsonSortByKeys = function (json) {
        var keys = Object.keys(json);
        keys.sort();
        var result = {};
        for (var i = 0; i < keys.length; i++) {
            result[keys[i]] = json[keys[i]];
        }
        return result;
    };

    this.checkVarBothType = function (var1, var2) {
        if (var1 instanceof Array && var2 instanceof Array) {
            return "array";
        }
        if (var1 instanceof Array === false && var2 instanceof Array === false && var1 instanceof Object && var2 instanceof Object) {
            return "object";
        }
        if (var1 instanceof Function && var2 instanceof Function) {
            return "function";
        }
        if (var1 instanceof String && var2 instanceof String) {
            return "string";
        }
        if (var1 instanceof Number && var2 instanceof Number) {
            return "number";
        }
        if (var1 instanceof Boolean && var2 instanceof Boolean) {
            return "boolean";
        }
        return "different";
    };

    this.margeObjLoop = function (obj1, obj2) {
        if (checkVarBothType(obj1, obj2) !== 'object') {
            throw  "ARGEMENTS TYPE IS NOT OBJECT";
        }

        var cell1 = jsonSortByKeys(obj1);
        var cell2 = jsonSortByKeys(obj2);

        for (var i in cell2) {
            if (checkVarBothType(cell1[i], cell2[i]) == "array") {
                cell1[i] = arrayUnique(cell1[i].concat(cell2[i]));
                continue;
            }
            if (checkVarBothType(cell1[i], cell2[i]) == "object") {
                cell1[i] = jsonSortByKeys(margeObjLoop(cell1[i], cell2[i]));
                continue;
            }
            cell1[i] = cell2[i];
        }

        return jsonSortByKeys(cell1);
    };

    return this.margeObjLoop(obj1, obj2);
};

大功告成

哈!阿里云自从有了Ubuntu 16.04,我们这种14.04用了很久的人,都一直趋之若鹜。本来是想新租一台服务器来搞,不过感觉都好贵,这台首购优惠的机,性能也很差,并且上面有我的BLOG以及数据库,一直也不敢动。

迁移的成本太高啦!!!

为啥这么说呢?上面的所有项目,都是我自己写的,框架也是,数据库表结构也是。

如今狠了狠心。直接就给干了,当初练手用的东西,也没有必要多留了。

回想起来,是连一张截图也没有存呢!翻番几年前的朋友圈,兴许能翻出来。

不过,既然要搞,就搞彻底吧,之前自己写的锉货扔了也就扔了。毕竟还是要向前看嘛。

博客系统,我挑来选去,从Odoo,GitLab,我甚至想着搞个Dz的个人空间来当博客。

搭了一堆环境,折腾了一大圈!始终都觉得少点什么,或者感觉哪不合适。最终还是回归,这里吧

《WORD PRESS》

可以说是将我带入互联网的地一个玩意儿,虽然是用,全世界最好的语言写的。但还是要感谢它。

忆当年,申请个免费的空间,上传个WordPress Bla…Bla…Bla…Bla…….

顺便,我会继续在这里书写我成长的历程。。。。尽量吧……