现在很多高校都是使用drcom客户端管理学生的上网流量等信息

在Linux下Drcom客户端版本有的学校可能没有发布

我们可以使用Python模拟登陆Drcom

最主要的就是认证的服务器地址

这个需要抓包分析出ip,自行谷歌,很容易可以实现的

Linux下运行py脚本 (必须安装Python2)

命令行: python drclient.py

下面附drclient.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket, struct, time
from hashlib import md5
import sys
import os
import random# CONFIG
server = ''   #认证服务器地址
username=''   #账号
password=''    #密码
CONTROLCHECKSTATUS = '\x08'
ADAPTERNUM = '\x01'
host_ip = ''  #ipv4地址
IPDOG = '\x01'
host_name = 'DRCOMFUCKER'
PRIMARY_DNS = ''   #DNS服务器
dhcp_server = ''   #DHCP服务器
AUTH_VERSION = '\x08\x00'
mac = 0xMac地址    #Mac地址
host_os = 'WINDIAOS'
KEEP_ALIVE_VERSION = '\xdc\x02'
AUTH_VERSION = '\x0a\x00'
IPDOG = '\x01'
# CONFIG_ENDnic_name = '' #Indicate your nic, e.g. 'eth0.2'.nic_name
bind_ip = '0.0.0.0'class ChallengeException (Exception):def __init__(self):passclass LoginException (Exception):def __init__(self):passdef bind_nic():try:import fcntldef get_ip_address(ifname):s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)return socket.inet_ntoa(fcntl.ioctl(s.fileno(),0x8915,  # SIOCGIFADDRstruct.pack('256s', ifname[:15]))[20:24])return get_ip_address(nic_name)except ImportError as e:print('Indicate nic feature need to be run under Unix based system.')return '0.0.0.0'except IOError as e:print(nic_name + 'is unacceptable !')return '0.0.0.0'finally:return '0.0.0.0'if nic_name != '':bind_ip = bind_nic()s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((bind_ip, 61440))s.settimeout(3)
SALT = ''
IS_TEST = True
# specified fields based on version
CONF = "/etc/drcom.conf"
UNLIMITED_RETRY = True
EXCEPTION = False
DEBUG = False #log saves to file
LOG_PATH = '/var/log/drcom_client.log'
if IS_TEST:DEBUG = TrueLOG_PATH = 'drcom_client.log'def log(*args, **kwargs):s = ' '.join(args)print sif DEBUG:with open(LOG_PATH,'a') as f:f.write(s + '\n')def challenge(svr,ran):while True:t = struct.pack("<H", int(ran)%(0xFFFF))s.sendto("\x01\x02"+t+"\x09"+"\x00"*15, (svr, 61440))try:data, address = s.recvfrom(1024)log('[challenge] recv',data.encode('hex'))except:log('[challenge] timeout, retrying...')continueif address == (svr, 61440):breakelse:continuelog('[DEBUG] challenge:\n' + data.encode('hex'))if data[0] != '\x02':raise ChallengeExceptionlog('[challenge] challenge packet sent.')return data[4:8]def md5sum(s):m = md5()m.update(s)return m.digest()def dump(n):s = '%x' % nif len(s) & 1:s = '0' + sreturn s.decode('hex')# def ror(md5, pwd):
#     ret = ''
#     for i in range(len(pwd)):
#         x = ord(md5[i]) ^ ord(pwd[i])
#         ret += chr(((x<<3)&0xFF) + (x>>5))
#     return retdef keep_alive_package_builder(number,random,tail,type=1,first=False):data = '\x07'+ chr(number) + '\x28\x00\x0b' + chr(type)if first :data += '\x0f\x27'else:data += KEEP_ALIVE_VERSIONdata += '\x2f\x12' + '\x00' * 6data += taildata += '\x00' * 4#data += struct.pack("!H",0xdc02)if type == 3:foo = ''.join([chr(int(i)) for i in host_ip.split('.')]) # host_ip#CRC# edited on 2014/5/12, filled zeros to checksum# crc = packet_CRC(data+foo)crc = '\x00' * 4#data += struct.pack("!I",crc) + foo + '\x00' * 8data += crc + foo + '\x00' * 8else: #packet type = 1data += '\x00' * 16return data# def packet_CRC(s):
#     ret = 0
#     for i in re.findall('..', s):
#         ret ^= struct.unpack('>h', i)[0]
#         ret &= 0xFFFF
#     ret = ret * 0x2c7
#     return retdef keep_alive2(*args):#first keep_alive:#number = number (mod 7)#status = 1: first packet user sended#         2: first packet user recieved#         3: 2nd packet user sended#         4: 2nd packet user recieved#   Codes for testtail = ''packet = ''svr = serverran = random.randint(0,0xFFFF)ran += random.randint(1,10)   # 2014/10/15 add by latyas, maybe svr sends back a file packetsvr_num = 0packet = keep_alive_package_builder(svr_num,dump(ran),'\x00'*4,1,True)while True:log('[keep-alive2] send1',packet.encode('hex'))s.sendto(packet, (svr, 61440))data, address = s.recvfrom(1024)log('[keep-alive2] recv1',data.encode('hex'))if data.startswith('\x07\x00\x28\x00') or data.startswith('\x07' + chr(svr_num)  + '\x28\x00'):breakelif data[0] == '\x07' and data[2] == '\x10':log('[keep-alive2] recv file, resending..')svr_num = svr_num + 1packet = keep_alive_package_builder(svr_num,dump(ran),'\x00'*4,1, False)else:log('[keep-alive2] recv1/unexpected',data.encode('hex'))#log('[keep-alive2] recv1',data.encode('hex'))ran += random.randint(1,10)   packet = keep_alive_package_builder(svr_num, dump(ran),'\x00'*4,1,False)log('[keep-alive2] send2',packet.encode('hex'))s.sendto(packet, (svr, 61440))while True:data, address = s.recvfrom(1024)if data[0] == '\x07':svr_num = svr_num + 1breakelse:log('[keep-alive2] recv2/unexpected',data.encode('hex'))log('[keep-alive2] recv2',data.encode('hex'))tail = data[16:20]ran += random.randint(1,10)   packet = keep_alive_package_builder(svr_num,dump(ran),tail,3,False)log('[keep-alive2] send3',packet.encode('hex'))s.sendto(packet, (svr, 61440))while True:data, address = s.recvfrom(1024)if data[0] == '\x07':svr_num = svr_num + 1breakelse:log('[keep-alive2] recv3/unexpected',data.encode('hex'))log('[keep-alive2] recv3',data.encode('hex'))tail = data[16:20]log("[keep-alive2] keep-alive2 loop was in daemon.")i = svr_numwhile True:try:ran += random.randint(1,10)   packet = keep_alive_package_builder(i,dump(ran),tail,1,False)#log('DEBUG: keep_alive2,packet 4\n',packet.encode('hex'))log('[keep_alive2] send',str(i),packet.encode('hex'))s.sendto(packet, (svr, 61440))data, address = s.recvfrom(1024)log('[keep_alive2] recv',data.encode('hex'))tail = data[16:20]#log('DEBUG: keep_alive2,packet 4 return\n',data.encode('hex'))ran += random.randint(1,10)   packet = keep_alive_package_builder(i+1,dump(ran),tail,3,False)#log('DEBUG: keep_alive2,packet 5\n',packet.encode('hex'))s.sendto(packet, (svr, 61440))log('[keep_alive2] send',str(i+1),packet.encode('hex'))data, address = s.recvfrom(1024)log('[keep_alive2] recv',data.encode('hex'))tail = data[16:20]#log('DEBUG: keep_alive2,packet 5 return\n',data.encode('hex'))i = (i+2) % 0xFFtime.sleep(20)keep_alive1(*args)except:passimport re
def checksum(s):ret = 1234for i in re.findall('....', s):ret ^= int(i[::-1].encode('hex'), 16)ret = (1968 * ret) & 0xffffffffreturn struct.pack('<I', ret)def mkpkt(salt, usr, pwd, mac):data = '\x03\x01\x00'+chr(len(usr)+20)data += md5sum('\x03\x01'+salt+pwd)data += usr.ljust(36, '\x00')data += CONTROLCHECKSTATUSdata += ADAPTERNUMdata += dump(int(data[4:10].encode('hex'),16)^mac).rjust(6,'\x00') #mac xor md51data += md5sum("\x01" + pwd + salt + '\x00'*4) #md52data += '\x01' # number of ip#data += '\x0a\x1e\x16\x11' #your ip address1, 10.30.22.17data += ''.join([chr(int(i)) for i in host_ip.split('.')]) #x.x.x.x -> data += '\00'*4 #your ipaddress 2data += '\00'*4 #your ipaddress 3data += '\00'*4 #your ipaddress 4data += md5sum(data + '\x14\x00\x07\x0b')[:8] #md53data += IPDOGdata += '\x00'*4 #delimeterdata += host_name.ljust(32, '\x00')data += ''.join([chr(int(i)) for i in PRIMARY_DNS.split('.')]) #primary dnsdata += ''.join([chr(int(i)) for i in dhcp_server.split('.')]) #DHCP serverdata += '\x00\x00\x00\x00' #secondary dns:0.0.0.0data += '\x00' * 8 #delimeterdata += '\x94\x00\x00\x00' # unknowdata += '\x05\x00\x00\x00' # os majordata += '\x01\x00\x00\x00' # os minordata += '\x28\x0a\x00\x00' # OS builddata += '\x02\x00\x00\x00' #os unknowndata += host_os.ljust(32,'\x00')data += '\x00' * 96#data += '\x01' + host_os.ljust(128, '\x00')#data += '\x0a\x00\x00'+chr(len(pwd)) # \0x0a represents version of client, algorithm: DRCOM_VER + 100#data += ror(md5sum('\x03\x01'+salt+pwd), pwd)data += AUTH_VERSIONdata += '\x02\x0c'data += checksum(data+'\x01\x26\x07\x11\x00\x00'+dump(mac))data += '\x00\x00' #delimeterdata += dump(mac)data += '\x00' # auto logout / default: Falsedata += '\x00' # broadcast mode / default : Falsedata += '\xe9\x13' #unknown, filled numbers randomly =w=log('[mkpkt]',data.encode('hex'))return datadef login(usr, pwd, svr):import randomglobal SALTi = 0while True:salt = challenge(svr,time.time()+random.randint(0xF,0xFF))SALT = saltpacket = mkpkt(salt, usr, pwd, mac)log('[login] send',packet.encode('hex'))s.sendto(packet, (svr, 61440))data, address = s.recvfrom(1024)log('[login] recv',data.encode('hex'))log('[login] packet sent.')if address == (svr, 61440):if data[0] == '\x04':log('[login] loged in')breakelse:log('[login] login failed.')if IS_TEST:time.sleep(3)else:time.sleep(30)continueelse:if i >= 5 and UNLIMITED_RETRY == False :log('[login] exception occured.')sys.exit(1)else:continuelog('[login] login sent')#0.8 changed:return data[23:39]#return data[-22:-6]def keep_alive1(salt,tail,pwd,svr):foo = struct.pack('!H',int(time.time())%0xFFFF)data = '\xff' + md5sum('\x03\x01'+salt+pwd) + '\x00\x00\x00'data += taildata += foo + '\x00\x00\x00\x00'log('[keep_alive1] send',data.encode('hex'))s.sendto(data, (svr, 61440))while True:data, address = s.recvfrom(1024)if data[0] == '\x07':breakelse:log('[keep-alive1]recv/not expected',data.encode('hex'))log('[keep-alive1] recv',data.encode('hex'))def empty_socket_buffer():
#empty buffer for some fucking schoolslog('starting to empty socket buffer')try:while True:data, address = s.recvfrom(1024)log('recived sth unexpected',data.encode('hex'))if s == '':breakexcept:# get exception means it has done.log('exception in empty_socket_buffer')passlog('emptyed')
def daemon():with open('/var/run/jludrcom.pid','w') as f:f.write(str(os.getpid()))def main():if not IS_TEST:daemon()execfile(CONF, globals())log("auth svr:"+server+"\nusername:"+username+"\npassword:"+password+"\nmac:"+str(hex(mac)))log(bind_ip)while True:try:package_tail = login(username, password, server)except LoginException:continuelog('package_tail',package_tail.encode('hex'))#keep_alive1 is fucking bullshit!empty_socket_buffer()keep_alive1(SALT,package_tail,password,server)keep_alive2(SALT,package_tail,password,server)
if __name__ == "__main__":main()

  

转载于:https://www.cnblogs.com/mlsq2015/p/6218930.html

Linux或Linux虚拟机桥接模式使用Python2认证Drcom相关推荐

  1. Linux系统下使用桥接模式,无法ping通外网解决问题方案!

    Linux系统下使用桥接模式,无法ping通外网解决问题方案! 参考文章: (1)Linux系统下使用桥接模式,无法ping通外网解决问题方案! (2)https://www.cnblogs.com/ ...

  2. 虚拟机桥接模式上网,局域网内ping通

    项目场景: 项目场景:使用虚拟机的桥接模式,完成局域网内的ping通,而不仅仅是只能与宿主机ping通 问题描述 网上的解答非常杂乱,不能很好匹配Ubuntu 21的问题.在后面成功上网后,虚拟机也不 ...

  3. 虚拟机桥接模式无法联网

    问题:虚拟机桥接模式无法联网 解决:1.打开虚拟网络编辑器 2.点击右下角更改设置 3.下拉选择网卡(控制面板\网络和 Internet\网络连接),并点击确定 4.打开虚拟机设置,网络连接选择自定义 ...

  4. VMware虚拟机桥接模式配置

    前述有配置过NAT模式的虚拟机环境,这篇再简单谈谈桥接模式的虚拟机环境配置. VMware虚拟机桥接模式配置_w450093854的专栏-CSDN博客_vm虚拟机桥接模式网络配置 VM无法将网络更改为 ...

  5. Linux网络适配器(Bridged(桥接模式),NAT(网络地址转换模式))设置IP连接外网,互拼

    废话不多说,直接正题. Bridged(桥接模式) 说明:什么是桥接模式?桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信.在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置的 ...

  6. 虚拟机桥接模式下ping不通外网(baidu.com)

    项目场景: 提示:这里简述项目相关背景: 1.安装虚拟机(不再赘述) ==>安装好虚拟机--选桥接模式--编辑--虚拟机网络编辑器,选择桥接模式,连接到本地电脑所用网络: 给虚拟机(Window ...

  7. Ubuntu18.04虚拟机桥接模式连wifi并配置静态IP

    宿主机有两块网卡,一个有线网卡,一个无线网卡,无线网卡连接wifi并可以上网.在宿主机里用vmware创建了一个虚拟机,通过桥接模式连wifi并配置静态IP. 具体实施步骤如下: 一.操作系统版本 1 ...

  8. VM虚拟机桥接模式无法联网解决办法

    1.背景介绍: 桥接模式----使虚拟机客户机可以和主机在同一网段,这样,和主机同局域网内的其他主机就也可以ping到虚拟机了: 因此,虚拟机设置为桥接模式,且设为静态IP,这样以后就可以方便的使用虚 ...

  9. vmware虚拟机桥接模式在有线/无线双网卡解决方案

    在使用虚拟机时,经常出现有时用有线网络,有时用无线网络,这样就导致用无线时,虚拟机网络是断线的.有线时是正常. 解决方案: 点击vmare菜单编辑-->虚拟网络设置.点击更改设置. 弹出下图,将 ...

  10. vmware搭建多台虚拟机-桥接模式

    我们本次的目的是搭建4台虚拟机,网络配置为桥接模式,以供局域网使用. (1)创建虚拟机 以下文章详细介绍了单台虚拟机镜像的下载及安装,大家只看到第(1)部分就可以,上篇文章第二部分不用看. https ...

最新文章

  1. 如何避免APK文件的反向工程?
  2. 蓝桥杯日期计算java_日期类的使用(java)-蓝桥杯
  3. 库壳的一些有趣面试题
  4. linux网络编程之posix 线程(三):posix 匿名信号量与互斥锁 示例生产者--消费者问题
  5. docker 训练深度学习_基于 Alluxio 数据缓存的大规模深度学习训练性能优化
  6. 怎么利用Excel实现随机取样
  7. CentOS7.5安装WPS并解决字体报错
  8. 为什么国内VPS与国外的价格相差甚多?
  9. 后盾人tp5教程_5个出色的应用程序以开放数据为后盾
  10. CPU使用率100%怎么办
  11. jzojWZK打雪仗【高精】【DP】【卡特兰数】
  12. 基于android的社团管理app
  13. linux如何测试IP和端口是否能访问
  14. 标准化学校考场自动校时同步时钟系统
  15. R Studio 安装stringi 报错download of package ‘stringi’ failed
  16. 实验6 蓝桥ROS1使用moveit 适用kinetic/melodic/noetic
  17. 荣耀30s刷鸿蒙,荣耀30S“超过”苹果XS,靠华为鸿蒙框架优化能力
  18. 论文降重有效减少重复率修改的方法
  19. 计算机基础和wps office,办公装office还是wps好,wps和office哪个好用
  20. 空间存储公链(SSCC):共建数字化特性的共识价值和存储网络

热门文章

  1. FISCO BCOS源码(6)编译源码 获取FISCO BCOS可执行程序
  2. 区块链 使用xbench测试xuperchain 教程
  3. call to a member funciton get() on null
  4. JavaSE基础———ArrayList、Vector和LinkedList 泛型 可变参
  5. 基Java的高校毕业管理系统
  6. JDBC14 ORM03 JavaBean封装
  7. java常用api-字符串
  8. 使用 lanmps 环境套件安装设置新站点 案例
  9. Apache Commons Lang3 常用工具类库
  10. Java 面试——字符串操作、值传递、重载与重写