xu言:

最近,有个朋友让我帮忙“搞点事情”,然后正好在学习socket模块,这个模块666啊,基本上可以实现远程服务器cmd shell的大部分功能。好,话不多说,直接上码~

由于很多电信运营商都会封杀UDP端口,外网服务器这种就不建议使用UDP端口了。直接使用TCP来实现,那么还有一个问题。windows的拨号和把账号填入adsl客户端上面的方法怎么处理呢?

cmd自带命令:

rasdial 宽带连接 /disconnect && rasdial 宽带连接 %s %s

三方工具:

http://www.nirsoft.net/utils/dialupass.html

Dialupass /setpass 宽带连接 %s %s

如果以上两个命令你都搞清楚是什么了,那么下面代码就很好写了:

Server:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "loki" import json
import socket
import struct
import subprocess
import time s_ip = ("0.0.0.0", 19999)
c_time = time.strftime("%Y-%m-%d %X", time.localtime()) win_ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
win_ser.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
win_ser.bind(s_ip)
win_ser.listen(5)
print('Server listening begin ,port %s' % s_ip[1]) # get socket
while 1:
conn, address = win_ser.accept() while 1:
try:
cmd = conn.recv(1024)
print('Receive client[%s] command : %s %s' % (address, cmd, c_time))
client_cmd = cmd.decode('utf-8')
client_cmd = client_cmd.split()
cmd_len = len(client_cmd)
if cmd_len == 3 and client_cmd[0] == 'Dial':
username = client_cmd[1]
password = client_cmd[2]
# command = "echo %s %s" % (username, password)
# command = "rasdial 宽带连接 /disconnect && rasdial 宽带连接 %s %s" % (username, password)
command = "Dialupass /setpass 宽带连接 %s %s" % (username, password)
cmd_execute = subprocess.Popen(command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout = cmd_execute.stdout.read()
stderr = cmd_execute.stdout.read()
# if not cmd:
# break # DIY head
header_dict = {
'total_size': len(stdout) + len(stderr),
'filename': None
}
header_bytes = json.dumps(header_dict).encode('utf-8') # Send head length
header_len = struct.pack('i', len(header_bytes))
conn.send(header_len)
# Send head
conn.send(header_bytes)
# conn.send(cmd_execute) # Send data
conn.send(stdout)
conn.send(stderr)
else:
print('hello...')
stdout = 'Please input correct command!Format:Dial <username> <password>'.encode('utf-8')
# DIY head
header_dict = {
'total_size': len(stdout),
'filename': None
}
header_bytes = json.dumps(header_dict).encode('utf-8') # Send head length
header_len = struct.pack('i', len(header_bytes))
conn.send(header_len)
# Send head
conn.send(header_bytes)
# conn.send(cmd_execute) # Send data
conn.send(stdout) except Exception as e:
print(e)
break
conn.close()
# win_ser.close()

Client:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "loki" import json
import socket
import struct c_ip = ('127.0.0.1', 19999)
win_cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
win_cli.connect(c_ip) while 1:
mes = input('>>').strip()
if mes == 'Quit':
break
if not mes:
continue win_cli.send(mes.encode('utf-8'))
# receive head length
res_head_len = win_cli.recv(4)
# unpack head length
# print(res_head_len, type(res_head_len))
head_size = struct.unpack('i', res_head_len)[0]
# receive head length content
header_bytes = win_cli.recv(head_size).decode('utf-8')
# to head dic json
header_json = json.loads(header_bytes)
# get data length
data_size = header_json['total_size'] # receive data to the length of the header
receive_size = 0
total_data = b''
while receive_size < data_size:
data_receive = win_cli.recv(1024)
if (data_size - len(data_receive)) < 1024:
left_data = win_cli.recv(data_size - len(data_receive))
total_data += left_data
total_data += data_receive
receive_size += len(data_receive) print(total_data.decode('GBK'))

Warp-up:

1.期间遇到系统是xp、win2003大部分都是32位,建议编译的时候使用最高不能超过python34版本

2.为了更好的配合windows服务启动 使用pyinstaller -F 把py代码转换为exe

3.使用exe to 服务包把exe程序作为服务启动(期间用到:instsrv.exe <服务名> x:\xxx\srvany.exe,并且自己创建注册表项Parameters.项下面需要2个字符串值AppDirectory(目录路径)和Application(绝对路径)),添加服务成功后还需要在相应创建的服务上 服务-属性-登陆-打勾“服务与桌面交互”

遗留问题,如何配合服务关闭的时候kill掉这个socket的server进程。感觉还有很多地方都可以用到,比如监控、比如自动化执行某些任务。。。当然,安全问题也需要深入研究。避免被恶意利用做非法用途。以上代码仅供学习研究之用,切勿做非法用途!

利用Py-Socket模块做的一个不登陆windows服务器自动实现替换或者调用自动拨号功能的更多相关文章

  1. 利用网络Socket和多线程实现一个双向聊天

    接收键盘输入然后向对方发送消息的线程 package cn.com.chat; import java.io.BufferedReader; import java.io.BufferedWriter ...

  2. 利用spring boot+vue做的一个博客项目

    技术栈: 后端 Springboot druid Spring security 数据库 MySQL 前端 vue elementUI 项目演示: GitHub地址: 后端:https://githu ...

  3. Unity进阶:用AssetBundle和Json做了一个玩家登陆界面

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  4. nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录

    geo指令使用ngx_http_geo_module模块提供的.默认情况下,nginx有加载这个模块,除非人为的 --without-http_geo_module.ngx_http_geo_modu ...

  5. 使用 Python 的 Socket 模块构建一个 UDP 扫描工具

    译文:oschina 英文:bt3gl 当涉及到对一些目标网络的侦察时,出发点无疑是首先发现宿主主机.这个任务还可能包含嗅探和解析网络中数据包的能力. 几周前,我曾经谈到了如何使用Wireshark来 ...

  6. (转)nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录

    nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录 原文:http://www.cnblogs.com/kevingrace/p/6165572.html Nginx的geo模块 ...

  7. 利用SCI做的一个足球答题系统

    SCI,异步串行通信接口,内置独立的波特率产生电路和SCI收发器,可以选择发送8或9个数据位(其中一位可以指定为奇或偶校验位). SCI是全双工异步串行通信接口,主要用于MCU与其他计算机或设备之间的 ...

  8. python基础===socket模块的讲解(转)

    一.网络知识的一些介绍 socket 是网络连接端点.例如当你的Web浏览器请求www.jb51.net上的主页时,你的Web浏览器创建一个socket并命令它去连接 www.jb51.net的Web ...

  9. socket模块和黏包问题

    socket套接字简介 编写cs架构的程序 实现数据交互 OSI七层相当复杂 socket套接字是一门技术 socket模块>>>:提供了快捷方式 不需要自己处理每一层 " ...

随机推荐

  1. Trove系列(三)—Trove的功能管理功能介绍

    Trove的功能管理功能Trove的功能管理功能包括给各种不同的版本的 datastore 安装不同的 功能. 本管理功能只适用于激活/去活全系统的功能.唯一例外的是数据存储功能列表功能,该功能对所有 ...

  2. 【译】在Asp.Net中操作PDF - iTextSharp - 利用列进行排版(转)

    [译]在Asp.Net中操作PDF - iTextSharp - 利用列进行排版   在使用iTextSharp通过ASP.Net生成PDF的系列文章中,前面的文章已经讲述了iTextSharp所涵盖 ...

  3. Code Blocks+gtest环境配置

    本文仅介绍Code::Blocks+gtest环境配置,gtest具体使用方法请参考: 玩转Google开源C++单元测试框架Google Test系列(gtest)(总) http://www.cn ...

  4. 如何用tomcat发布自己的Java项目

    如何用tomcat发布自己的Java项目 tomcat是什么?它是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器.我们用Java开发出来的web项目,通过tomcat发布出来,别人就可 ...

  5. 20145105 《Java程序设计》第6周学习总结

    20145105 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 输入/输出 一.InputStream与OutputStream (一)串流设计的概念 输入串流代表对象:j ...

  6. 20145206邹京儒《网络对抗》逆向及Bof基础实践

    20145206邹京儒<网络对抗>逆向及Bof基础实践 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:ma ...

  7. tensorflow mnist 给一张手写字辨别

    https://www.jianshu.com/p/db2afc0b0334 https://blog.csdn.net/xxzhangx/article/details/54563574

  8. VC 线程池

    参照:http://www.cnblogs.com/kzloser/archive/2013/03/11/2909221.html 参照:http://blog.csdn.net/pjchen/art ...

  9. VS编译duilib项目时候的错误解决方法整理(转载)

    转载自:http://blog.csdn.net/x356982611/article/details/30217473 @1:找不到Riched20.lib 用everything等软件搜索下磁盘, ...

  10. myeclipse中文名字项目运行报错

    今天由于项目进行分支,负责开发迭代的功能对应不同的分支项目,没想到的是分支项目名称加上了功能的中文名字.要使用了resin发布项目的时候,报了 java.io.CharConversionExcept ...