對於一系列目標 (IP),我想確定我的帳戶無權存取哪些 SMB 共用、具有讀取存取權限以及具有讀取/寫入存取權限。
目前我正在使用 smbclient。我首先運行的命令是
smbclient -L [targetIP] -U [user] -p 445
這給了我一份股票清單。例如;
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
IPC$ IPC Remote IPC
print$ Disk Printer Drivers
MySecrets Disk
然後我可以使用此命令連接到文件共享
smbclient //[target]/[name_of_share_from_list] -U [user] -p 445
這會導致 SMB 提示。根據我輸入的提示ls
,如果我看到文件,我就知道我有讀取權限。我猜我必須推送一個文件來查看我是否有寫入訪問權限。
這很乏味。如何自動執行此操作,以便對於給定的目標列表,我可以獲得所有共享的列表以及我的帳戶對它們的存取級別?
答案1
您已經完成了大部分工作。閱讀手冊頁將為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
答案2
或許中小企業地圖可以幫助您完成這項任務。它的作者正是為此目的而開發它。
$ 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
您可以用來--host-file
傳遞目標清單。
在內部,它嘗試建立一個具有隨機名稱的目錄來檢查我們是否具有寫入權限。
答案3
與接受的答案相同的方法,但使用安西布爾。然後可以將其用於以唯讀或讀寫方式安裝。 (然後製作其他工具,例如合併檔案系統建立檔案系統聯合後如預期工作)
- name: get available samba shares
ansible.builtin.shell:
cmd: "smbclient -L //{{ samba_ip }} -U % -g | grep Disk"
register: samba_shares_raw
- name: extract samba shares
ansible.builtin.set_fact:
samba_shares: "{{ (samba_shares | default([])) + [ ( item | split('|') )[1] ] }}"
loop: "{{ samba_shares_raw.stdout_lines }}"
- name: send a file to test ro / rw access
ansible.builtin.file:
path: "{{ ansible_env.HOME }}/samba_client"
state: touch
- name: test writeable samba
ansible.builtin.shell:
cmd: "smbclient -U % //{{ samba_ip }}/{{ item }} -c 'put samba_client'"
chdir: "{{ ansible_env.HOME }}"
register: writeable_raw
ignore_errors: true
loop: "{{ samba_shares }}"
- name: extract writeable results
ansible.builtin.set_fact:
writeable: "{{ writeable | default({}) | combine({ item.item : not item.failed }) }}"
loop: "{{ writeable_raw.results }}"
loop_control:
label: "{{ item.item }}"
- name: samba mount directories
ansible.builtin.file:
state: directory
recurse: true
path: "{{ ansible_env.HOME }}/samba/{{ item }}"
loop: "{{ samba_shares }}"
- name: mount samba shares
ansible.posix.mount:
src: "//{{ samba_ip }}/{{ item }}"
path: "{{ ansible_env.HOME }}/samba/{{ item }}"
fstype: cifs
opts: "{{ 'rw' if writeable[item] else 'ro' }},guest,uid=1000,gid=1000"
state: mounted
loop: "{{ samba_shares }}"
become: true