smbmap報[*] Detected 0 hosts serving SMB

GUXH發表於2024-08-10

執行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即可

相關文章