1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
| # -*- coding: utf-8 -*-
import socket, sys, thread, threading
def main_sock(daddr, actions, saddr=()):
if saddr:
try:
sc=socket.create_connection(daddr, 3, saddr)
#print "Now %s connecting to %s ... ..."%(saddr, daddr)
except socket.error:
print 'TCP socket connect %s => %s failed'%(saddr, daddr)
return
else:
try:
sc=socket.create_connection(daddr, 3)
except socket.error:
print 'TCP socket connect %s failed'%(daddr)
return
#step 1 : print welcome informations
print "<--recive: ",sc.recv(1024)
#step 2 login
login(sc, actions[0])
#step 3 use ASCII TYPE send and recv data
sc.send('TYPE A\r\n')
recv=sc.recv(1024)
print "send--> TYPE A\n <---recive: ",recv
#step 4 use mode PORT OR PASV
if actions[1][0]==1: # PORT mode
if daddr[0].find(':')!=-1: #IPV6
sc.send('EPRT |2|%s|%s|\r\n'%(actions[1][1], actions[1][2]))
elif daddr[0].find(':')==-1: #ipv4
sc.send('PORT %s\r\n'%handle_PORT(actions[1][1], actions[1][2]))
print "<--recive: ",sc.recv(1024)
#step 5 build sub connection
th_1=threading.Thread(target=sub_bindSock, args=(actions[1][1], actions[1][2]))
th_1.start()
sc.send(actions[2]) #send LIST command
print "<--recive: ",sc.recv(1024)
th_1.join()
elif actions[1][0]==0: #PASV mode
if daddr[0].find(':')!=-1: #ipv6
sc.send('EPSV\r\n')
recv=sc.recv(1024)
subDport=int(recv[recv.find('(|||')+4:recv.find('|)')])
elif daddr[0].find(':')==-1: #ipv4
sc.send('PASV\r\n')
recv=sc.resv(1024)
subDport=handle_PASV(recvStr)
subDaddr=(daddr[0], subDport)
#step 5 build sub connection
th_2=threading.Thread(target=sub_sock, args=(subDaddr, ))
th_2.start()
sc.send(actions[2])
th_2.join()
while 1:
try:
data=sc.recv(1024)
if not len(data):
break
else:
print "<--recived: ",data
except:
print "timeout!"
break
sc.close()
def sub_sock(daddr, saddr=()):
try:
subSc=socket.create_connection(daddr, 3, saddr)
#print "Now %s connecting to %s ... ..."%(saddr, daddr)
except socket.error:
print 'TCP socket connect %s => %s failed'%(saddr, daddr)
while 1:
try:
data=subSc.recv(2048)
if not len(data):
break
else:
print "<--subCon recived:",data
except:
print "timeout!"
break
subSc.close()
def sub_bindSock(saddr, sport):
if saddr.find(':')==-1:
sc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
else:
sc = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
try:
sc.bind((saddr, sport))
sc.listen(5)
sc.settimeout(3)
except:
print "bind %s:%s failed!"%(sip, sport)
return -1
peerSock, peerAddr=sc.accept()
print "sub connect is builded\r\n%s<------>%s"%((saddr, sport), peerAddr)
while 1:
try:
data=peerSock.recv(2048)
if not len(data):
break
else:
print "<--subCon recived:",data
except:
print "timeout!"
break
sc.close()
def login(sock, loginInfo):
sock.send('USER %s\r\n'%loginInfo[0])
recv=sock.recv(1024)
print "send--> username ok!\n<--recive: ",recv
sock.send('PASS %s\r\n'%loginInfo[1])
recv=sock.recv(1024)
print "send--> password ok!\n<--recive: ",recv
def handle_PORT(saddr, sport):
'''主动模式时,如果地址是IPV4,将地址和端口的格式进行转换,然后放到Port 命令中发送 '''
addrStr=','.join(saddr.split('.'))
temp=divmod(sport, 256)
portStr=str(temp[0])+','+str(temp[1])
return addrStr+','+portStr
def handle_PASV(recvStr):
'''针对IPV4,将受到的子连接端口字符串信息转换为真正的端口,并返回'''
temp=recvStr[recvStr.find('Mode (')-1:recvStr.find(')')]
a=temp.split(',')[4]
b=temp.split(',')[5]
subPort=int(a)*256+int(b)
return subPort
if __name__=='__main__':
#target='192.168.10.112'
target='4001::112'
port=21
Daddr=(target, port)
username='anonymous'
passwd='IE@126.com'
loginInfo=(username, passwd)
FTPmode=1 # 1 means PORT mode, 0 means PASV mode
#saddr='192.168.10.102'
saddr='2000::5d80:b20f:8631:9782'
sport=11178
PASV_or_PORT=(FTPmode, saddr, sport)
LIST='LIST\r\n'
actions=(loginInfo, PASV_or_PORT, LIST)
main_sock(Daddr, actions)
|