Jolokia 支持一个叫做代理模式(Proxy Mode)的东西,是为了解决不能将 Jolokia Agent 部署在目标平台上的问题。具体架构如下:
可以通过向 Jolokia 发送 POST 请求来触发:
熟悉 Java 安全的朋友可能会注意到,这里可能有一个 JNDI 注入。的确,在 WAR Agent 的情况下,此处存在一个 JNDI 注入,问题发生在
当 Web Container 将请求的交由
那么,攻击者只需发送一个带有 Evil JMXRMI 的地址的 JSON,即可利用 JNDI 在目标机器上执行命令。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
可以通过向 Jolokia 发送 POST 请求来触发:
熟悉 Java 安全的朋友可能会注意到,这里可能有一个 JNDI 注入。的确,在 WAR Agent 的情况下,此处存在一个 JNDI 注入,问题发生在
agent\jsr160\src\main\java\org\jolokia\jsr160\Jsr160RequestDispatcher.java:当 Web Container 将请求的交由
Jsr160RequestDispatcher 处理时,Jolokia Agent 创建连接,导致 JNDI 注入。在 WAR Agent 里,默认是由 Jsr160RequestDispatcher 处理的,这一点在 web.xml 也有体现:那么,攻击者只需发送一个带有 Evil JMXRMI 的地址的 JSON,即可利用 JNDI 在目标机器上执行命令。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
分析泄露的源代码,我们发现其
现在,我们可以使用此有效载荷读取系统上我们用户拥有权限的任何文件:
提供的Dockerfile显示了一些有趣的信息和文件路径,我们可以使用 LFI 读取这些信息和文件路径。
首先, docker 容器会确认php、apache 和 mysql
找到了MySQL用户密码和一些系统信息。
MySQL root 密码:
我们还尝试对常用路径、/proc、文件描述符等进行模糊测试,以获取有关系统的更多信息。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
http://47.97.221.96:23333/index.php?action=login存在本地文件包含漏洞。现在,我们可以使用此有效载荷读取系统上我们用户拥有权限的任何文件:
http://47.97.221.96:23333/index.php?action=../../etc/passwd提供的Dockerfile显示了一些有趣的信息和文件路径,我们可以使用 LFI 读取这些信息和文件路径。
首先, docker 容器会确认php、apache 和 mysql
FROM andreisamuilik/php5.5.9-apache2.4-mysql5.5的版本。找到了MySQL用户密码和一些系统信息。
MySQL root 密码:
root / Nu1Lctf%#~:p我们还尝试对常用路径、/proc、文件描述符等进行模糊测试,以获取有关系统的更多信息。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
即使没有远程代码执行 (RCE),并且已经掌握了有关系统的所有枚举信息,我们也决定解决 md5 碰撞问题,开始攻击登录系统。
所以,他们
这段代码存储在
如果系统返回,则
MD5 前 5 个字节哈希碰撞生成器
我们迅速编写了这段代码来获取有效的碰撞检测结果。
获取系统访问权限
现在,利用预先生成的代码,
好的,已登录。
浏览网页应用程序功能时,我们可以发布一些内容,并将
除非你
如您所见,此标志启用了文件发送选项,这是获取 RCE 的好方法。
如何设置 is_admin=1?
如果登录/注册 POST 请求来自正确的 IP 地址,代码会将此标志设置为 1,我敢肯定它是正确的
该
尝试注入会话 cookie 代码
第一个想法是
现在 cookie 文件中存储了更多信息,但只有
此检查会阻止无效用户名。我们不能创建包含某些代码的新用户。
尝试 SQL 注入
所以,我们的下一个想法是检查是否存在 SQL 注入漏洞。
查询语句非常简单,Db() 控制器没有正确地进行过滤。但代码本身没有问题。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
所以,他们
user.php~泄露了所有登录过程的详细信息。if(substr(md5($_POST['code']),0, 5)!==$_SESSION['code'])要破解注册/登录凭证检查功能,必须将代码拆分成多个部分来解决。这段代码存储在
session cookie我们泄露内容但(目前)无法控制的地方。如果系统返回,则
Invalid user name表示我们已发送正确的内容code。MD5 前 5 个字节哈希碰撞生成器
我们迅速编写了这段代码来获取有效的碰撞检测结果。
<?php
## MD5 first 5 bytes hash collision generator - solution to easy_php @ N1CTF2018
# solved by intrd & shrimpgo - p4f team
## 1st create a wordlist: crunch 4 4 1234567890abcdefghijklmnopqrstuvwxyz_ -o file.txt
$_SESSION['code']=$argv["1"];
echo "** searching for: ".$_SESSION['code']."\n";
if ($file = fopen("file.txt", "r")) {
while(!feof($file)) {
$line = trim(fgets($file));
$_POST['code'] = $line;
if(substr(md5($_POST['code']),0, 5)===$_SESSION['code']){
echo "yeah!\n".md5($line);
echo ":\n".$line."\n";
die();
}
}
fclose($file);
}
?>
获取系统访问权限
现在,利用预先生成的代码,
aklhic我们可以创建一个正在浏览的新用户。http://47.97.221.96:23333/index.php?action=register好的,已登录。
浏览网页应用程序功能时,我们可以发布一些内容,并将
Allow different ip to login标志设置为当前用户。仅此而已。除非你
is_admin=1在 cookie 中设置了该标志,否则不会有其他操作。如您所见,此标志启用了文件发送选项,这是获取 RCE 的好方法。
如何设置 is_admin=1?
如果登录/注册 POST 请求来自正确的 IP 地址,代码会将此标志设置为 1,我敢肯定它是正确的
127.0.0.1。该
get_ip()函数严格读取该值REMOTE_ADDR,我认为我无法伪造该值。尝试注入会话 cookie 代码
第一个想法是
<?php code ?>在 cookie 会话文件中注入一些东西,我可以从 LFI 启动它。现在 cookie 文件中存储了更多信息,但只有
username我可以控制这些信息。而且这些信息都经过了适当的过滤。此检查会阻止无效用户名。我们不能创建包含某些代码的新用户。
尝试 SQL 注入
所以,我们的下一个想法是检查是否存在 SQL 注入漏洞。
查询语句非常简单,Db() 控制器没有正确地进行过滤。但代码本身没有问题。
(int)有时它会在发送查询之前转换数据类型,这会破坏我们的 SQL 注入尝试。渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
通常情况下获取到数据库名,表名,字段名后,就可以直接查询数据了,但是之前遇到一个场景就是过滤了字符处理函数和字段名,从而导致无法直接获取该字段的内容。场景伪代码如下图所示,通过username字段回显数据,这里我们需要获取password的内容,但是password在filter函数中被过滤了:
下面介绍两种方法在过滤字段名时获取该字段数据。
第一种方法:不适用字段获取数据
原理就是利用虚表e,获取虚表e的第三列数据,在通过便宜获取一个内容,最后将此内容返回到username的位置,最后回显出来。
第二种方法:盲注法
我们来看一个例子:
可以看到,当我们使用order by 3 desc对第三列进行排序的时候,当我们在union里面select的内容不同时,返回的内容也不一样,原因是因为MySQL的字符串排序是从左往右一一使用字符串的ASCII码进行对比。
当我们union select 0x32时回显的username字段内容应该时2,当我们unionselect 0x31和0x30时,username字段内容应该时admin,所以这个时候我们能确定,0x31应该是跟我们需要查询的password的第一个字符的ASCII码值是相等的,从而可以编写脚本一位一位爆破出password的内容:
最后将ASCII码转换成字符串就是我们想获取的字段内容。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
下面介绍两种方法在过滤字段名时获取该字段数据。
第一种方法:不适用字段获取数据
原理就是利用虚表e,获取虚表e的第三列数据,在通过便宜获取一个内容,最后将此内容返回到username的位置,最后回显出来。
第二种方法:盲注法
我们来看一个例子:
可以看到,当我们使用order by 3 desc对第三列进行排序的时候,当我们在union里面select的内容不同时,返回的内容也不一样,原因是因为MySQL的字符串排序是从左往右一一使用字符串的ASCII码进行对比。
当我们union select 0x32时回显的username字段内容应该时2,当我们unionselect 0x31和0x30时,username字段内容应该时admin,所以这个时候我们能确定,0x31应该是跟我们需要查询的password的第一个字符的ASCII码值是相等的,从而可以编写脚本一位一位爆破出password的内容:
最后将ASCII码转换成字符串就是我们想获取的字段内容。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM