일련의 대상(IP)에 대해 내 계정이 액세스할 수 없는 SMB 공유, 읽기 액세스 권한이 있는 SMB, 읽기/쓰기 액세스 권한이 있는 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
아마도SMB맵이 작업에 도움을 줄 수 있습니다. 그 저자는 바로 그 목적을 위해 그것을 개발했습니다.
$ 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