2021-01-29
SOCKS5协议在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问Internet网中的服务器,或者使通讯更加安全。SOCKS5服务器通过将前端发来的请求转发给真正的目标服务器,模拟了一个前端的行为。在这里,前端和SOCKS5之间也是通过TCP/IP协议进行通讯,前端将原本要发送给真正服务器的请求发送给SOCKS5服务器,然后SOCKS5服务器将请求转发给真正的服务器。
Socks5支持两种认证方式:
用户/口令
Gssapi
今天介绍的这个插件是可以对用户/口令认证方式的弱口令进行检测。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date : 2015-06-15 13:34:42
# @Author : Medici.Yan (Medici.Yan@gmail.com)
# @Link : http://blog.evalbug.com
import socket,struct
def validate(host,port,username,password):
try:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socket.setdefaulttimeout(20)
s.connect((host,port))
payload1='\x05\x01\x02'#socks 5 版本1 02采用用户名密码验证
s.send(payload1)
data1=s.recv(1024)
if data1!='\x05\x02': # Server response 05 02 use username/password validate
#Don't support user/pass authmethod
s.close()
return False
#send validate data
#version len(username) username len(password) password
payload2=struct.pack('!BB'+str(len(username))+'sB'+str(len(password))+'s',1,len(username),username,len(password),password)
s.send(payload2)
data2=s.recv(1024)
if data2 =='\x01\x00': #success
#'username:%s\tPassword:%s---Success!'%(username,password)
Flag=True
else:
#'username:%s\tPassword:%s\t---Auth Fail!'%(username,password)
Flag=False
s.close()
except:
#'validate host:%s with %s/%s occurred some exception.'
Flag=False
if s:
s.close()
return Flag
def check(host,port):
try:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socket.setdefaulttimeout(20)
s.connect((host,port))
payload1='\x05\x02\x00\x02'#socks 5 版本1 02采用用户名密码验证
s.send(payload1)
data1=s.recv(1024)
if data1[0]!='\x05': # Server response 05 02 use username/password validate
#Don't support user/pass authmethod
s.close()
return False
if data1[1]=='\x00':
security_warning('socks5: %s:%s => NO AUTHENTICATION REQUIRED'%(host,str(port)))
return False
elif data1[1]=='\x02':
return True
else:
return False
except:
if s:
s.close()
return False
def assign(service, arg):
if service == 'socks5':
return True, arg
def audit(arg):
host,port = arg
if check(host,port)==False:
return
pass_list = util.load_password_dict(host,userfile='database/ssh_user.txt',passfile='database/ssh_pass.txt')
for useri,pwdj in pass_list:
try:
debug('Try %s/%s'%(useri,pwdj))
ret=validate(host, int(port), useri, pwdj)
if ret:
security_warning('socks5 weak password=> %s:%s %s %s'%(host,str(port),useri,pwdj))
except Exception, e:
pass
if __name__ == '__main__':
from dummy import *
audit(assign('socks5', ('127.0.0.1',1080))[1])
微信支付扫描上方二维码
云闪付支付扫描上方二维码