| 关键词: 数据 脚本 服务器 用户 SQL 数据库 攻击 运行 函数 |
把SQL服务器黑了是件很有趣的事儿。今年的时候,我发布过一篇有关于《无需密码黑掉mssql服务器》的文章。我利用Ettercap制作了一个中间人攻击,并将它放在了微软SQL服务器和用户之间。利用Ettercap过滤器,我展示了如何立刻将SQL的查询替换成你自己的恶意查询。这允许你去运行一系列的攻击,比如创建一个数据库的管理员用户来帮助你获得数据或者执行功能。我写了一个脚本来使得整个过程能够更加自动化,给大家学习使用。 当脚本工作时,它会有一些限制。第一,你必须知道数据库正在运行的SQL查询。一般来讲,你不大可能有这样的信息。第二,脚本依赖于Ettercap来运行MITM攻击。最后,它只支持微软SQL服务器。虽然它是一个很流行的数据库引擎,但它只代表了数据库种类中的一小部分。 在最近的一个对于Anitian用户的渗透测试中,我决定重写一下整个工具,来将我所进行的一些测试变成自动化。目标是做成一个一体化的SQL MITM工具。你可以用一下的表格来下载这个Python原程序。(这里是对于你要进行的下载的条款) ![]() 表格地址:https://blog.anitian.com/hacking-sql-servers-without-password/ 由于之前的文章已经详细说明漏洞以及如何补救的方法,这篇文章就主要讲解如何利用这个工具来查找SQL MITM漏洞。 Options 这个工具使用有几个必须的条件: ![]() 交互界面:要去监听的网络交互界面。 SQL 类型:第二个项目需要提供具体的SQL服务器类型。目前,工具支持MSSQL,MySQL,Oracle和PostgreSQL.这是目前最为流行的四种数据库引擎。 用户 IP:发送请求SQL用户的IP地址。 服务器IP:SQL服务器的IP地址。这两个IP地址允许脚本进行ARP毒化攻击。这表明这个程序能自己执行MITM攻击而不需要诸如Ettercap的外部工具。 新请求:新的SQL请求。这是一个有害SQL字符串,它们会被植入到连接中。 同样,还有两个可选条目 开始关键字:脚本搜索的第一个关键字。 结束关键字:脚本所要搜索的最后一个关键字(或者字符)。 这两个项目是原始SQL字符串中的开始和结束关键字。从这些关键字可以辨认出SQL请求而不需要提前知道整个请求。比如说,开始关键字的默认值是“选择”,而结束关键字的默认值是分号。这满足所有如下的例子: ![]() 这使得这个脚本拥有较好的通用型。你不需要知道具体的SQL请求来插入有害请求。 Scapy 我使用Python来进行这个项目,原因是它用起来很简单,并且我能利用它所拥有的Scapy操作库。Scapy有对于很多协议的内在支持,在这个情形下,重要的是TCP和ARP协议支持。它能够用来当作独立的数据包操作程序,或者是其他项目的库文件。 ARP投毒 攻击的第一步是毒化用户和服务器的ARP缓存。这一步欺骗你的服务器将主机当作用户,反之亦然。你所有需要做的仅仅是将用户和服务器IP地址输入就好了。这个脚本利用ARP来辨认相应的MAC地址。然后,脚本调用arp_spoof()函数。这个函数能够构建正确的ARP数据包来毒化用户和服务器缓存。利用一个计时器,arp_spoof()函数每15秒被调用一次。这保证缓存器能够在攻击期间保持被毒化的状态。 Scap_sniff()函数被用来嗅探数据包。这个函数会一直嗅探输入的数据包并一直循环下去,直到攻击者按下了ctrl+c来跳出程序的执行。每当线上有数据包被探测到的时候,sniff()函数会利用过滤器来分辨这个数据包是发送给SQL服务器IP的还是用户IP 的。如果不是,那么这个数据包会被忽略掉。如果真是这样,那么数据包会被送到processPacket()函数。 数据包处理 这儿是所有神奇的事情发生的地方。脚本会根据攻击者所选择的SQL引擎类型来处理数据。它在整个数据包中搜索开始和结束字符。如果找不到,那么就将数据包正常发送出去。 如果它找到了,那么它会比较原始请求的长度和新请求的长度。如果新请求比较长,那么脚本给出个错误,然后将原始数据包送出并不做改变。这是因为TCP的工作方式。被改变的数据包必须要和原始数据包一样长,不然则会打破TCP连接,并导致重启。结果就是,原始请求越长,你能拥有的替换空间就越大。 如果新的请求比原始请求要小,那么一切都很好。脚本用新的请求更新数据包,并在数据包的尾部增加一些补丁,用以将数据包保持原有的长度。然后,修改好了的数据包会被送到服务器。 Re-ARPing 在攻击的最后,按下ctrl+c来停止程序。脚本会检测到这个反应,并在结束前调用undo_arp_spoof()函数。这会重置ARP存储器,如此一来,受害者会正常地接受消息。如果没有这一步,用户和服务器会有联网问题,并且攻击会被简单地发现。 例子 MSSQL 首先,我会用Microsoft SQL来测试这个软件。我创建了一个简单的测试数据库,如下所示: ![]() 你可以看到在产品表中有三条输入项。下面我会运行一个基本的命令来从表中抽取一个简单的目标。 ![]() 你会看到我查找了名为ProductZero的内容。服务器仅仅返回了一个匹配的输入。然后我运行了sqlmitm.py脚本来注入有害命令。 利用这些声明,脚本会替换SELECT为我所选择的的命令。意思是说,不管我用SELECT从数据库中查询了什么,服务器的返回值永远是ProductOne这个输入项。 ![]() 你可以看到我运行了一个请求来查询 ProductZero数据,但是服务器返回了ProductOne!这个返回并不正确!MITM脚本在传输中替换了请求。客户并不知道这一事件发生了。这一过程允许所有目的的恶意程序。 MySQL 现在,我们来试试MySQL。我构建了一个类似的数据库来测试MySQL服务器: ![]() 下一步,我运行了sqlmitm.py脚本,但是这次我设置成攻击MySQL服务器。 ![]() 你可以在输出发现脚本分辨出了一个匹配的数据包并替换了语句。 但是在用户端看是什么样子? ![]() 你会发现我试图去查询“Test Product 1”的信息,但是服务器却给了我“Test Product 2”。同样,客户端并没有发现任何问题。 Oracle 下面,我们来测试Oracle。这里是测试用的数据库: ![]() 然后,继续来运行这个脚本。 ![]() 当它已经被设置好并在运行时,我执行了另一个相似的命令 ![]() 服务器又给了错误的返回 PostgreSQL 过程依然是相似的。这里是测试用的数据库: ![]() 运行脚本。 执行命令。 ![]() 脚本又一次替换了数据并且用户端不会知道发生了什么。 创建一个MySQL用户 之前的例子都是无害的。下面我来试试比较有危害性的事儿:来建一个MySQL上的用户?这需要三步操作。 第一步,我们来创建数据库用户。 这一请求会创建一个名为“anitian”的用户,并允许这个用户从任何地方登录。用户的密码是“hacked”。在运行完mitm脚本之后,我回到MySQL用户,并执行一个无害的SELECT请求。 ![]() 注意到,没有行真正被返回了。我们的返回值与请求并不相符。但是,如果这个请求时从一个应用程序发出的,估计谁都不会发现。 下面,我们来提高用户的权限。这会给我们创建的用户所有的权限,只要目标拥有这些权限。 我又执行了一次SELECT请求 ![]() 没有返回错误。看来命令执行成功了。最后我们需要去掉这些权限 最后执行一次SELECT请求 ![]() 现在用户已经被创建了,可以试着登录看看: ![]() 登录成功,它开始工作了!现在我们创建的用户拥有数据库的控制权限。当然,这意味着你可以所任何事情,例如偷点受保护的数据什么的。这仅仅是这个脚本能做的其中一个事情。 如何防范
*原文:anitian Mottoin翻译发布 原创文章,作者:Moto,转载自:http://www.mottoin.com/article/web/89825.html |
| 本文出处: https://www.toutiao.com/a6672157995364778499/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|