1.代码及代码讲解。

实验环境:windows10下的linux子系统+kali虚拟机

import argparse
import socket
import shlex
import subprocess
import sys
import textwrap
import threading

def execute(cmd):
    cmd = cmd.strip()
    if not cmd:
        return
    output = subprocess.check_output(shlex.split(cmd),stderr=subprocess.STDOUT)
#subprocess。这个库提供了一组强大的进程创建接口,让你可以通过多种方式调用其他程序

return output.decode()
class Netcat:
    def __init__(self,args,buffer=None):
        self.args = args
        self.buffer = buffer
        self.socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#利用传进来的参数,初始化一个NetCat对象,然后创建一个socket对象
    def run(self):
        if self.args.listen:
            self.listen()
        else:
            self.send()
#run函数作为NetCat对象的执行入口,它的逻辑其实相当简单:直接把后续的执行移交给其他两个函数。如果我们的NetCat对象是接收方,run就执行listen函数;如果是发送方,run就执行send函数 def send(self): self.socket.connect((self.args.target,self.args.port)) if self.buffer: self.socket.send(self.buffer) try: while True: recv_len = 1 response = '' while recv_len: data = self.socket.recv(4096) recv_len = len(data) response += data.decode() if recv_len < 4096: break if response: print(response) buffer = input('>') buffer += '\n' self.socket.send(buffer.encode()) except KeyboardInterrupt: print('User terminated') self.socket.close() sys.exit() #先连接到target和port,之后利用try/catch块,这样就能直接用Ctrl+C组合键手动关闭连接,再通过通过循环接收数据 def listen(self): self.socket.bind((self.args.target,self.args.port)) self.socket.listen(5) while True: client_socket,_ = self.socket.accept() client_thread = threading.Thread(target=self.handle,args=(client_socket,)) client_thread.start() #listen函数把socket对象绑定到target和port上,然后开始用一个循环监听新连接,并把已连接的socket对象传递给handle函数。 def handle(self,client_socket): if self.args.execute: output = execute(self.args.execute) client_socket.send(output.encode()) elif self.args.upload: file_buffer = b'' while True: data = client_socket.recv(4096) print(data.decode) if data: file_buffer += data else: break with open(self.args.upload,'wb') as f: f.write(file_buffer) message = f'Saved file {self.args.upload}' client_socket.send(message.encode()) elif self.args.command: cmd_buffer = b'' while True: try: client_socket.send(b'ailx10:#>') while '\n' not in cmd_buffer.decode(): cmd_buffer += client_socket.recv(64) response = execute(cmd_buffer.decode()) if response: client_socket.send(response.encode()) cmd_buffer = b'' except Exception as e: print(f'server killed {e}') self.socket.close() sys.exit()
#handle函数会根据它收到的命令行参数来执行相应的任务:执行命令、上传文件,或是打开一个shell。
#如果要执行命令,handle函数就会把该命令传递给execute函数,然后把输出结果通过socket发回去
#如果要执行命令,handle函数就会把该命令传递给execute函数,然后把输出结果通过socket发回去
#最后,如果要创建一个shell,我们还是创建一个循环,向发送方发一个提示符,然后等待其发回命令
if __name__ == "__main__": parser = argparse.ArgumentParser(description="simple netcat tool", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=textwrap.dedent("""Example: netcat.py -t 192.168.0.108 -p 5555 -l -c # command shell netcat.py -t 192.168.0.108 -p 5555 -l -u=mytest.txt # upload file netcat.py -t 192.168.0.108 -p 5555 -l -e=\"cat /etc/passwd\" # execute command echo 'ABC' | ./netcat.py -t 192.168.0.108 -p 135 # echo text to server port 135 netcat.py -t 192.168.0.108 -p 5555 # connect to server """)) parser.add_argument('-c','--command',action='store_true',help='command shell') parser.add_argument('-e','--execute',help='execute specified command') parser.add_argument('-l','--listen',action='store_true',help='listen') parser.add_argument('-p','--port',type=int,default=5555,help='specified port') parser.add_argument('-t','--target',default='192.168.0.108',help='specified ip') parser.add_argument('-u','--upload',help='upload file') args = parser.parse_args() if args.listen: buffer = '' else: buffer = sys.stdin.read() nc = Netcat(args,buffer.encode()) nc.run()

  2.小试牛刀。

1)测试命令控制:

首先在Kali虚拟机上,启动一个接收方,让它在虚拟机IP地址的5555端口提供一个命令行shell。

 

 之后在本地端以客户端的模式打开脚本运行

 

 可以看到,我们得到了一个典型的命令行shell

 2)测试命令执行:

先在服务端运行

 

 在客户端可直接看到命令执行结果

 

 3)在本机上用原版netcat来连接Kali虚拟机

 

 4)发送http请求

 

这次的分享就到这里, 下一次将开发一个TCP代理。

 

原文地址:http://www.cnblogs.com/yaolingyu/p/16848931.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性