跨平台快速文件共享 Samba

0x01 关于smaba

1
2
主要用于实现不同系统平台间的文件共享,配置非常简单,轻量,适合用于常规办公内网环境中
linux <==> windows <==> unix

此次演示环境

1
2
CentOS6.9 x86_64 ip:192.168.3.55 samba服务器
CentOS6.9 x86_64 ip:192.168.3.57 用来模拟smb客户端进行访问测试

0x02 samba服务默认所监听的端口

1
2
137/udp,138/udp nmb 进程提供netbios解析,以满足基于 CIFS 协议的共享访问环境
138/tcp,445/tcp smb 进程主要为客户端提供文件共享,打印机服务以及用户权限验证

0x03 使用samba客户端工具 smbclient,其实有些类似于ftp的客户端工具,也是一种交互式的访问

在linux下使用smbclient访问windows中的共享目录

1
2
3
# smbclient -L 192.168.3.23 -U administrator
# smbclient //192.168.3.23/linux_dir -U dcadmin
# mount -t cifs //192.168.3.23/linux_dir /mnt/windows/ -o username=dcadmin 注意,此处要使用cifs协议进行挂载

在linux下使用smbclient访问linux中samba服务共享目录

1
# smbclient -L 192.168.3.55 -U webadmin

0x04 安装samba服务所需的各种软件包

1
2
# yum install samba samba-client samba-common -y
# /etc/init.d/nmb start;/etc/init.d/smb start

0x05 先来手工配置samba,编辑samba主配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
# egrep -v "^$|;|#" /etc/samba/smb.conf
# vi /etc/samba/smb.conf
[global]
workgroup = klionsec
server string = Samba Server Version %v
netbios name = SmbServer # netbios名称,有点儿类似windows的机器名
interfaces = eth0 # 将端口监听在指定的网卡接口上
hosts allow = 192.168.3. # 只允许指定的网段访问
# samba日志文件存放位置
log file = /var/log/samba/log.%m
max log size = 50
# 启用为用户登陆模式
security = user
passdb backend = tdbsam
[tools] # 访问时的共享目录名
comment = My HackTools # 对该共享目录的用途描述
path = /data/tools # 共享目录所在的绝对路径
guest ok = yes # 是否允许以来宾用户身份访问
read only = no # 表示对该共享目录可写
write list = webadmin,dbadmin # 允许写的用户列表
browseable = yes # 是否显示文件或目录列表

1
2
3
# testparm 用于测试samba主配置文件是否有语法错误,并显示最终生效的配置
# /etc/init.d/smb restart;/etc/init.d/nmb restart
# chkconfig smb on && chkconfig nmb on

0x06 创建用于共享访问的目录,并为该共享目录配置好权限,注意,如果要用户能写,务必要保证两点,首先,smb.conf中的共享目录要设置为read only = no,其次,还要对本地文件系统也能写才行,这里纯粹是为了方便才直接用facl来授权,你可以通过修改属主,属组来实现,比较简单,就不赘述了

1
2
3
4
# mkdir /data/tools -p
# setfacl -m u:sec:rx /data/tools/
# setfacl -m g:admins:rwx /data/tools/ 直接对指定组setfacl
# getfacl -c /data/tools/

0x07 创建samba用户并为每个用户设置samba密码,注意samba的验证方式,samba用户虽为系统本地用户,但samba用户的密码却为samba服务自己的密码,并存在它自己特定格式的数据库中,再次强调,严禁弱口令

1
2
3
4
5
6
7
# groupadd admins
# useradd -G admins -s /sbin/nologin -M webadmin
# useradd -G admins -s /sbin/nologin -M dbadmin
# useradd -s /sbin/nologin -M sec
# smbpasswd -a webadmin
# smbpasswd -a dbadmin
# smbpasswd -a sec

0x08 关于smbpasswd的基本使用,主要用来将系统用户添加为samba内置用户

1
2
3
4
-d 禁用指定系统用户
-e 启用指定系统用户
-x 删除指定系统用户
-a 添加指定系统用户

0x09 在192.168.3.57测试刚刚设置的权限是都已否生效,正常来讲,我们应该是一个用户对应一个目录,这样权限相对好控制,可自行写脚本实现

因为webadmindbadmin都属admins组,而admins组对共享目录可写,另外,在共享目录的可写用户列表中也有这俩用户,所以它俩才能往共享目录中写

1
smbclient //192.168.3.55/tools -U webadmin


1
smbclient //192.168.3.55/tools -U dbadmin

sec既不属于admins组,也不在可写用户列表中,所以,该用户在共享目录中只能看不能写,如下

1
smbclient //192.168.3.55/tools -U sec


0x10 如果嫌手工配置麻烦的话,还有一款纯图形化samba配置工具,实际中最好用完立马就关掉,个人觉得根本犯不着这样,其实写个一键脚本就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# yum install samba-swat -y
# vi /etc/xinetd.d/swat
service swat
{
port = 901
socket_type = stream
wait = no
only_from = 192.168.3.0/24 # 允许连的ip
user = root # 因为工具中间还涉及到一些服务管理功能,所以此处最好直接用root身份来搞
server = /usr/sbin/swat
log_on_failure += USERID
disable = no
}
# 另外,需要注意swat基于xinet管理
# /etc/init.d/xinetd start
# chkconfig xinetd on


0x11 关于samba的一些安全问题

1
2
3
绝大部分问题都出自samba自身的一些漏洞,如,各类RCE...直接可远程getshell的漏洞就已经出了好几次了,所以建议大家实际中尽量用新一点的版本
关于权限分配,问题不太大,毕竟只是个内网服务,别傻到直接把端口暴露在公网就行,不然,很可能哪天一不小心就成了别人的`矿鸡`了
...



后话:
    服务比较简单,此处仅做学习实验之用,切勿直接照搬用于实际生产环境中…