确定我有读取和/或写入权限的 SMB 共享

n00*_*00b 2 smb shared-folders

对于一系列目标 (IP),我想确定我的帐户无法访问哪些 SMB 共享,它具有读访问权限,以及它具有读/写访问权限。

目前我正在使用 smbclient。我首先运行的命令是

smbclient -L [targetIP] -U [user] -p 445
Run Code Online (Sandbox Code Playgroud)

这给了我一份股票清单。例如;

        Sharename       Type      Comment
        ---------       ----      -------
        ADMIN$          Disk      Remote Admin
        C$              Disk      Default share
        IPC$            IPC       Remote IPC
        print$          Disk      Printer Drivers
        MySecrets       Disk
Run Code Online (Sandbox Code Playgroud)

然后我可以使用此命令连接到文件共享

smbclient //[target]/[name_of_share_from_list] -U [user] -p 445
Run Code Online (Sandbox Code Playgroud)

这会导致 SMB 提示。根据我输入的提示ls,如果我看到文件,我知道我有读取权限。我猜我必须推送一个文件来查看我是否有写权限。

这很乏味。如何自动执行此操作,以便对于给定的目标列表,我可以获得所有共享的列表,以及我的帐户对它们的访问级别?

roa*_*ima 6

您已经完成了大部分工作。阅读手册页smbclient将为您提供-c <command>参数,该参数可用于直接而不是交互地提供一个或多个命令。

#!/bin/bash
username="DOMAIN\\USER"    # Double backslash
password="PASSWORD"        # For demonstration purposes only
hostname="TARGET_HOST"     # SMB hostname of target

cd "${TMPDIR:-/tmp}"
touch tmp_$$.tmp           # Required locally to copy to target

smbclient -L "$hostname" -g -A <( echo "username=$username"; echo "password=$password" ) 2>/dev/null |
    awk -F'|' '$1 == "Disk" {print $2}' |
    while IFS= read -r share
    do
        echo "Checking root of share '$share'"

        if smbclient "//$hostname/$share/" "$password" -U "$username" -c "dir" >/dev/null 2>&1
        then
            status=READ

            # Try uprating to read/write
            if smbclient "//$hostname/$share/" "$password" -U "$username" -c "put tmp_$$.tmp ; rm tmp_$$.tmp" >/dev/null 2>&1
            then
                status=WRITE
            fi
        else
            status=NONE
        fi

        case "$status" in
            READ) echo "Well, $username has read access" ;;
            WRITE) echo "Yes, $username has write access" ;;
            *) echo "No, $username has no access" ;;
        esac
    done

rm -f tmp_$$.tmp
Run Code Online (Sandbox Code Playgroud)