0x00 上节回顾回顾一下戏精斗哥第4弹中的故事情节:一家电信公司的红队参与。发现了有趣的子域,对该子域进行了全端口扫描,发现了12000/tcp、14000/tcp和14100/tcp端口,发现了一个正在运行的JBoss实例(幸运!),利用JBoss进行RCE,实现了HTTP上的TCP隧道,实现了Shell稳定性。声明:这篇文章相当长,所以只需坐下来,耐心等待,享受旅程!在上一部分中,根据斗哥提到了所遵循的步骤,斗哥配置了TCP Tunnel over HTTP和SSH端口转发,从斗哥的服务器使用2222/tcp端口访问NMS服务器的22/tcp端口。在这篇博文中,斗哥将展示我是如何实现SSH动态隧道来进一步进行内网渗透的。0x01 隐蔽的SSH访问当你连接到SSH服务器时,连接细节会保存在日志文件中。要检查这些连接细节,你可以在*nix系统中执行’w’命令。在许多类似Unix的操作系统上,w命令提供了一个快速的总结,包括每个登录到计算机的用户,每个用户目前正在做什么,以及所有活动对计算机本身造成的负荷。这个命令是其他几个Unix程序的一个命令组合:who、uptime和ps -a。来源:维基百科。所以基本上保存了源IP,这对于一个红队队员来说是很危险的。由于这是一次RTE,斗哥不能冒险让管理员知道我的C2位置。(不用担心,斗哥使用的ABPTTS壳是从我的服务器连接的,而且斗哥已经买了一个IDN同名攻击的域名,以减少被发现的机会)为了让隐身连接成功,斗哥查看了hosts文件,收集了更多的信息,斗哥发现这台服务器在内网里面的使用率相当高。这样的服务器已经被监控了,所以斗哥在想如何在这样的情况下尽可能的隐蔽。NMS已经在监控网络,所以斗哥想它一定是在监控自己,包括所有与服务器之间的网络连接。这意味着斗哥不能使用普通的端口扫描,使用TCP隧道通过HTTP。斗哥的服务器和NMS服务器之间的通信用SSH加密怎么样?但是对于SSH连接,斗哥的主机名/IP会存储在日志文件中,而且用户名也很容易识别。在这种情况下,斗哥的服务器的用户名是’harry’,为这个用户生成一个密钥,并存储在authorized_keys文件中,这不是一个好的选择。然后斗哥想到了一个好主意(分步骤)。在我的服务器上创建用户’nms’(这个用户已经在NMS服务器上创建了)。将我的服务器的主机名从OPENVPN改为[REDACTED]_NMS[REDACTED]。(与NMS服务器相同)在我的服务器上为’nms’用户生成SSH密钥,并在NMS服务器上复制公钥。(authorized_keys)配置运行在NMS上的SSH服务器,启用root登录(PermitRootLogin)、TCP端口转发和网关端口。(SSH -g开关,以备不时之需)配置NMS服务器作为SOCKS代理,以便我进一步利用网络。(动态SSH隧道)现在SOCKS隧道已经加密了,我可以用这个隧道用Metasploit进行内部网络扫描。0x02 实施时间实施时间!斗哥首先在我的服务器上添加了用户’nms’,这样我就可以生成用户特定的SSH密钥。斗哥甚至将我的服务器的主机名修改与NMS服务器的主机名完全相同,这样当我使用SSH登录时,日志将显示用户登录条目为nms@[REDACTED]_NMS[REDACTED]。接下来,斗哥为服务器上的’nms’用户生成SSH密钥。斗哥也必须改变NMS服务器上的SSH配置,所以斗哥从NMS服务器上下载了sshd_config文件,并修改了里面的一些东西。AllowTCPForwarding:该选项用于启用通过SSH转发TCP端口。GatewayPorts:该选项用于启用远程端口与环回以外的接口进行端口绑定。这个选项用来启用远程端口上除环回以外的接口绑定。(斗哥启用这个选项只是为了以防万一,如果斗哥想在这台服务器上从其他内部系统上进行反向shell,它会通过反向端口转发将shell转发给我)PermitRootLogin:这个选项允许客户端使用’root’连接到SSH服务器。StrictModes:这个选项指定了SSH是否应该在接受登录前检查用户主目录的权限。这个选项指定SSH是否应该在接受登录前检查用户主目录的权限。现在配置完成了,斗哥很快就把sshd_config文件上传到了NMS服务器上(更像是覆盖)。斗哥还把SSH公钥复制到’root’用户的authorized_keys文件中。在一切都设置好之后,我又尝试了一个测试连接,只是为了检查我是否能够在NMS服务器上使用’root’来进行SSH操作!Booyah! 😎😎😎SSH over TCP over HTTP (通过ABPTTS shell(JSP)在HTTP连接上创建的SSH端口转发TCP隧道)0x03 动态端口转发(动态SSH隧道)我们先来看看维基百科是怎么说的–。动态端口转发(DPF)是一种通过使用防火墙针孔穿越防火墙或NAT的按需方法。其目的是使客户机能够安全地连接到一个受信任的服务器,该服务器作为中介,向一个或多个目标服务器发送/接收数据。DPF可以通过设置一个本地应用程序(如SSH)作为SOCKS代理服务器来实现,它可以用来处理通过网络或互联网的数据传输。一旦建立了连接,DPF就可以用来为连接到不受信任网络的用户提供额外的安全性。由于数据在转发到原来的目的地之前,必须通过安全的隧道到另一个服务器,因此,用户受到保护,不受局域网上可能发生的数据包嗅探的影响。所以斗哥所要做的就是创建一个动态SSH隧道,这样NMS服务器就可以作为一个SOCKS代理服务器。斗哥使用SOCKS隧道的一些好处:通过NMS服务器间接访问其他网络设备/服务器(NMS服务器成为我的网关)。因为动态SSH隧道的原因,我的服务器到NMS服务器的所有流量都被加密了(用的是SSH连接,还记得吗?)即使服务器管理员坐在NMS服务器上监控网络,也不能完全马上找到根本原因。(专职的肯定会加入到这个点上)连接很稳定(多亏了HTTP Keep-Alive),现在所有这些递归隧道都在顺利运行,没有任何连接掉线,因为我通过HTTP实现了TCP Tunnel。当斗哥通过SSH登录到NMS服务器时,’w’命令是这样显示的。现在,斗哥所要做的就是创建SOCKS隧道,使用如下命令:ssh -NfCq -D 9090 -i <private key/identity file> <user@host> -p <ssh custom port>为此在sshd_config文件中修改了’PermitRootLogin’(以root身份登录NMS服务器)。担心服务器管理员会对这个设置有什么看法?一般来说,当SSH连接被打开时,服务器管理员有时会检查登录的用户名和用于登录的授权密钥,但大多数时候,他会检查连接发起的主机名/IP。在斗哥的例子中,斗哥从地址为127.0.0.1的服务器使用2222/tcp端口(感谢通过HTTP的TCP隧道)发起连接到目标地址为127.0.0.1的NMS服务器(再次!)。现在由于这个设置,他看到的是一个由NMS服务器发起的连接,使用授权密钥(公钥)作为用户’nms’存储到NMS服务器的SSH(这就是为什么斗哥在我的主机上创建了相同的用户来生成密钥),即使管理员检查已知的_hosts文件,他看到的是’nms@[REDACTED]_NMS[REDACTED]’用户连接到SSH,IP为127.0.0.1,这已经是NMS服务器中的用户配置文件。为了确认SOCKS隧道,斗哥检查了服务器上的连接表,9090/tcp端口处于LISTEN状态。厉害!SOCKS隧道已经准备好了!对斗哥来说,剩下的就是利用SOCKS隧道进行Metasploit的进一步网络利用,斗哥将在下一个小节中介绍。专业提示!当你通过SSH连接到服务器时,会自动分配一个伪TTY。当然,当你通过SSH执行命令时,这种情况不会发生(一语中的)。所以,每当你想通过SSH建立隧道或创建SOCKS隧道时,可以尝试使用-T开关来禁用伪TTY分配。你也可以使用下面的命令。ssh -NTfCq -L <local port forwarding> <user@host>ssh -NTfCq -D <Dynamic port forwarding> <user@host>要检查所有的SSH开关,你可以参考SSH手册(强烈推荐!)。当使用交换机创建隧道时(如上图所示),你可以创建一个没有TTY分配的隧道,而隧道端口将正常工作!0x04 形势感知(内部网络)在上一部分中,斗哥提到了我使用2222/tcp端口从我的服务器创建SSH隧道与隐身SSH访问的步骤。在这小节中,斗哥将展示我是如何使用SOCKS隧道进行内部网络侦察,并利用内部服务器来获取存储在服务器中的CDR。在参与的过程中,斗哥通过TCP隧道通过HTTP创建了一个动态SSH隧道,相信我说这句话的时候,shell很整齐!接着,斗哥又通过9090/tcp端口配置了SOCKS隧道,然后连接代理链进行NMap扫描。虽然斗哥更喜欢Metasploit而不是NMap,因为它给我提供了更多的扫描覆盖面,而且斗哥能够用它轻松地管理内部IP扫描。为了使用所有模块的代理,斗哥使用了 “setg Proxies socks4:127.0.0.1:9090 “命令(全局设置代理选项)。斗哥寻找内部的web服务器,所以使用了auxiliary/scanner/http/http_version模块。因为setg的缘故,Proxies选项已经设置好了,现在斗哥需要做的只是给出IP子网范围,然后运行模块。斗哥找到了一些远程管理控制器(iRMC),一些SAN交换机(switchExplorer.html),以及一个JBoss实例…内网居然还用了另一个JBoss实例?🤣🤣🤣0x05 利用内部网络服务所以斗哥只需要使用代理链,在内部IP上再运行一次JexBoss(也可以在JexBoss中使用-P开关来提供代理地址)。这对斗哥来说是一个轻松的胜利,因为运行的内部JBoss服务器也是脆弱的,由于这一点,斗哥能够从我的枢纽机(初始立足机)上获得RCE到下一个内部JBoss服务器😎。厉害了! 现在,当拿到shell后,斗哥用下面的命令将/home/位置下的所有文件和目录以结构化的方式列出来。cd /home/<user> | find . -print | sed -e “s;[^/]*/;|_ _ _ _;g;s;_ _ _ _|; |;g” 2>&1在输出中,斗哥发现了一个有趣的.bat文件–ss7-cli.bat(该脚本配置SS7管理bash引导环境)。在同一个内部JBoss服务器中,还存储了一个访客位置登记(VLR)控制台客户端应用程序,以便从数据库中访问VLR信息。什么是SS7?信令系统№7(SS7)是一套在1975年开发的电话信令协议,用于在世界范围内的公共交换电话网络(PSTN)的大部分地区建立和取消电话呼叫。该协议还可以执行号码转换、本地号码可携性、预付费计费、短信息服务(SMS)等服务。来源:维基百科。维基百科为了监控SS7/ISDN链路,并解码协议标准和生成CDR,以达到计费目的,需要一个控制台客户端与系统交互。你可能会问,为什么JBoss上会运行一个SS7客户端应用?一个词–“Mobicents”MobicentsMobicents是一个用Java编写的开源VoIP平台,可以帮助创建、部署、管理在一系列IP和传统通信网络上集成语音、视频和数据的服务和应用。来源:维基百科。维基百科Mobicents可以实现服务构件(SBB)的组成,如呼叫控制、计费、用户配置、管理和存在敏感的功能。这使得Mobicents服务器成为电信运营支持系统(OSS)和网络管理系统(NMS)的轻松选择。来源:design.jboss.org所以看起来内部的JBoss服务器运行的是一个VoIP网关应用(SIP服务器),使用SS7与公共交换电话网(PSTN)进行交互。(在没有任何网络架构图的情况下,要了解内部网络结构,这很累)超越在内部运行VoIP网关的JBoss应用中再做一些侦查时,发现有一些内部网关服务器、CDR备份数据库、存储SS7和USSD协议备份配置的FTP服务器等(感谢/etc/hosts)。从hosts文件中,斗哥发现了很多FTP服务器,一开始斗哥并不觉得重要,但后来斗哥发现了CDR-S和CDR-L的FTP服务器。这些服务器分别存储着备份的CDR S-Records和CDR L-Records。你可以从这里阅读更多关于这些记录的信息。CDR S-记录:第157页和CDR L-记录:第157页和CDR L记录:第168页使用Metasploit,斗哥迅速扫描了这些FTP服务器,并检查它们的认证状态。FTP服务器在没有经过任何形式的认证的情况下就可以访问🤣🤣也许FTP服务器被VoIP应用程序或其他东西用于内部使用,但仍然是赢了就是赢了!由于这个原因,斗哥能够得到几乎所有移动用户的CDR备份,这些备份是以XLS格式存储的。(抱歉,斗哥不得不删减了很多内容,因为这些都是非常关键的信息)从截图上看,A号是通话发起地(主叫方),B号是已拨号码。CDR记录还包括IMSI和IMEI号码,通话开始/结束日期和时间戳,通话时长,通话类型(呼入或呼出),服务类型(电信服务公司),小区ID-A(通话发起地的小区塔)和地点-A(主叫人的位置)。当斗哥通知客户关于斗哥访问CDR备份服务器的情况后,客户要求斗哥结束在那里的委托。斗哥想他们是受不了了🤣希望你们喜欢!剧本来源:1.https://medium.com/bugbountywriteup/how-i-hacked-into-a-telecom-network-part-3-playing-with-tunnels-stealthy-ssh-dynamic-tunnels-5ac26557d0eb2.https://medium.com/bugbountywriteup/how-i-hacked-into-a-telecom-network-part-4-getting-access-to-cdrs-ss7-applications-vlrs-9a8cf95e2648扫码关注我们更多精彩等待你发现