Determine os compartilhamentos SMB que eu li e / ou acesso de gravação a

2

Para uma série de destinos (IPs), gostaria de determinar quais compartilhamentos SMB a minha conta não tem acesso, quais são os acessos de leitura e quais têm acesso de leitura / gravação.

Atualmente estou usando o smbclient. O comando que eu corro primeiro é

smbclient -L [targetIP] -U [user] -p 445

Isso me dá uma lista de compartilhamentos. Por exemplo:

        Sharename       Type      Comment
        ---------       ----      -------
        ADMIN$          Disk      Remote Admin
        C$              Disk      Default share
        IPC$            IPC       Remote IPC
        print$          Disk      Printer Drivers
        MySecrets       Disk

Eu então posso me conectar a um compartilhamento de arquivos com este comando

smbclient //[target]/[name_of_share_from_list] -U [user] -p 445

O que resulta em um prompt SMB. No prompt, digito ls e, se vir arquivos, sei que tenho acesso de leitura. Eu estou supondo que eu tenho que empurrar um arquivo para ver se eu tenho acesso de gravação.

Isso é tedioso. Como eu automatizo isso de tal forma que, para a lista de destinos fornecida, recebo uma lista de todos os compartilhamentos e o nível de acesso que minha conta tem para eles?

    
por n00b 26.05.2017 / 02:09

2 respostas

6

Você teve muito do trabalho já em vigor. Ler a man page para smbclient teria dado a você o parâmetro -c <command> , que pode ser usado para fornecer um ou mais comandos diretamente e não interativamente.

#!/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
    
por 30.05.2017 / 17:24
3

Talvez o SMBmap possa ajudá-lo com este recurso. Seu autor desenvolveu precisamente para esse fim.

$  python smbmap.py -H [targetIP] -u [user] -P 445
[+] Finding open SMB ports....
[+] User SMB session establishd...
[+] IP: 192.168.0.4:445 Name: 192.168.0.4
        Disk                                                    Permissions
        ----                                                    -----------
        ADMIN$                                                  READ, WRITE
        C$                                                      READ, WRITE
        IPC$                                                    NO ACCESS
        TMPSHARE                                                READ, WRITE     

Você pode usar --host-file para passar uma lista de alvos.

Internamente, ele tenta criar um diretório com um nome aleatório para verificar se temos permissões de gravação.

    
por 06.06.2017 / 13:19