執行smbmap
smbmap -H {target_ip}
顯示
[*] Detected 0 hosts serving SMB [*] Closed 0 connections
vps連目標機時正常,vps距離目標時延較低
抓包顯示本機直接syn, syn+ack, 第三個包直接rst
懷疑是timeout設定問題
檢視幫助man smbmap
發現可以設定--timeout, 預設0.5s
於是設定為10,發現還是老樣子
smbmap -H {target_ip} --timeout 10
於是檢視smbmap.py關於timeout的程式碼,如下:
if args.scan_timeout: if args.scan_timeout > 0 and args.scan_timeout < 10: PORT_SCAN_TIMEOUT = args.scan_timeout
執行連線時的程式碼如下:
def find_open_ports(address): result = 1 address = address.strip() try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(PORT_SCAN_TIMEOUT) result = sock.connect_ex((address, 445)) if result == 0: sock.close() return address else: return False except Exception as e: return False
終於發現問題了
PORT_SCAN_TIMEOUT預設值0.5
問題一,PORT_SCAN_TIMEOUT在設定該值的函式中沒有宣告global,導致該設定是無效的,find_open_ports在呼叫PORT_SCAN_TIMEOUT恆為0.5
問題二,scan_timeout只接受0 ~ 10之間的值,超出這個範圍就是0.5,但是幫助裡沒給提示
上面問題,導致時延大於500MS的環境,就會掃描失敗,看提示還看不出來,設定timeout也不管用
解決方法:
在設定PORT_SCAN_TIMEOUT的程式碼前加global,並且--timeout只能用0~10之間的數
global PORT_SCAN_TIMEOUT
if args.scan_timeout:
if args.scan_timeout > 0 and args.scan_timeout < 10:
PORT_SCAN_TIMEOUT = args.scan_timeout
還有個問題,Authenticating認證時如果因為超時報Connection error on {target_ip}
是因為認證連線時的程式碼也有設定timeout,這個timeout預設3秒,執行指令碼時不提供修改該值的引數,只能直接修改程式碼
def login(host): smbconn = None try: if host['port'] == 445: smbconn = SMBConnection(host['ip'], host['ip'], sess_port=host['port'], timeout=3) else: smbconn = SMBConnection('*SMBSERVER', host['host'], sess_port=host['port'], timeout=3)
直接改為timeout=10即可