大家好,这里是 渗透攻击红队 的第 72 篇文章,本公众号会记录一些红队攻击的案例,不定时更新!请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关!
PS:祝所有人中秋节快乐~
当渗透测试人员进入内网后,面对的是一片“黑暗森林”,所以渗透测试人员首先会对当前所处的网络环境进行判断,通常的判断分为三种。
- 我是谁?——对机器角色的判断。
- 这是哪?——对目前机器所处网络环境的拓扑结构进行分析和判断。
- 我在哪?——对目前机器所处位置区域的判断。
而我们就需要对当前内网进行信息搜集,信息搜集越多对内网越了解你才能在内网渗透中如鱼得水,因为内网渗透的本质其实就是信息搜集!
假设攻击者已经获取到 redteam.com 域里的 web-2012 机器的控制权限,接下来我使用 Cobalt Strike 来进行演示内网信息搜集。
本篇文章的配套视频已经上传到哔哩哔哩,大家可在文章末尾或者阅读全文查看。
域森林下的内网信息搜集大全
域环境?or 工作组?
当我们通过 Web 漏洞或者其他的手段获取到了一个命令执行的口子后,我们想要对当前服务器进行深层次的内网渗透,那么必须得知道当前机器所在的环境是 工作组 还是 域 ,因为两种环境的攻击手法不同,所以我们需要根据不同的环境来做不同的处理!
判断是否在域内
1、查看当前网卡和IP信息:
代码语言:javascript复制ipconfig /all
由上图可见,当前机器有两个网卡,并且 主 DNS 后缀 是一个域名,一般来说只有域机器才会有域名显示,而在工作组下显示的是空:
通过查看网卡信息也能知道当前机器是否在域内,是否是一台域机器。
2、查看系统详细信息
代码语言:javascript复制systeminfo
通过查看系统详细信息我们发现域显示了一个域名 redteam.com ,这就代表当前机器是一台域机器,在域里。
而在工作组环境的机器只会显示出 WORKGROUP:
通过查看系统详细信息也能知道当前机器是否在域内,是否是一台域机器还是工作组机器。
3、查看当前登录域及域用户
代码语言:javascript复制net config workstation
通过执行命令后发现 工作站域 会显示出你当前的域叫 REDTEAM,而工作组则只会显示出:WORKGROUP
通过查看当前登录域及域用户也能知道当前机器是否在域内,是否是一台域机器还是工作组机器。
4、查看域内时间
代码语言:javascript复制net time /domain
通过执行以上命令后有三种情况:
- 存在域,当前用户不是域用户
- 存在域、当前用户是域用户:
- 不存在域:
通过查看域内时间也能知道当前机器是否在域内,是否是一台域机器还是工作组机器。
本机信息搜集
分清楚是域还是工作组后,我们就可以对当前机器进行信息搜集了。
获取本机网络配置信息
代码语言:javascript复制ipconfig /all
通过查看网络配置信息,我们可以知道当前机器有两个网卡,有两个网卡也就代表我们可以扩大范围进行内网横行渗透,资产也就多了。”资产多也就代表我们有更多机会拿到域内其他主机的权限”!
查询操作系统和版本信息
代码语言:javascript复制英文版系统用这条命令:
systeminfo | findstr /B /C:"OS Nmae" /C:"OS Version"
中文版系统用这条命令:
systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本"
知道了当前系统是 Windows Server 2012 R2 Standard 后,假设我们权限是一个普通用户权限,我们想要提权为 SYSTEM 或者其他高权限,那么我们就可以针对性的去搜集 Windows Server 2012 R2 Standard 的提权 EXP,这也是我们搜集信息的目的之一。
查看系统体系结构
代码语言:javascript复制echo %PROCESSOR_ARCHITECTURE%
通过查看查看系统体系结构我们就可以知道当前机器可以运行什么“软件”,因为我们在内网渗透中会用到很多工具,很多工具不一定是 AMD 的,所以我们需要考虑到兼容性的问题,这也是我们搜集信息的目的之一。
查看安装的软件及版本、路径
代码语言:javascript复制wmic product get name,version
通过搜集当前本机安装了那些软件后,我们就知道当前机器的使用情况,比如某个软件有一些溢出、提权漏洞、又或者我们可以利用一些软件进行 DLL 劫持提权,当然这都是后话了。
查询本机服务信息
代码语言:javascript复制wmic service list brief
通过搜集当前本机的服务信息,我们就可以知道当前机器上有哪些服务,是开启的还是关闭的。
查询进程列表
1、查看当前进程列表和软件进程
代码语言:javascript复制tasklist
2、查看当前进程列表对应的用户身份
代码语言:javascript复制tasklist /v
通过执行这条命令我们可以知道每个进程对应的用户,是那个用户启动的这个软件,但是这条命令只能看到和你一样级别或者比你低权限的用户的进程,这条命令我们会经常用到,后续讲 令牌窃取 会用到。
3、查看当前进程是否有杀毒软件(AV)
代码语言:javascript复制tasklist /svc
通过执行完这条命令后,我们就可以知道当前有哪些软件,以及对应的 PID 号、服务名,我们还可以吧执行命令的返回结果去查询是否有杀毒软件:
Github 上有开源的脚本,我们搭建好了直接使用,在这里就不多阐述。
查看启动程序信息
代码语言:javascript复制wmic startup get command,caption
通过查看启动程序信息我们可以知道当前机器开机的时候会运行哪些软件,这也可以利用自启动劫持。
查看计划任务
代码语言:javascript复制schtasks /query /fo LIST /v
通过查看本机计划任务我们就能知道当前机器上“某个时间”会运行哪些软件,我们就可以利用这一点来做定时任务劫持。
查看主机开机时间
代码语言:javascript复制net statistics workstation
通过查看本机的开机时间,我们就能判断这台机器的管理员是不是经常关机,是不是经常在登陆这台机器。
查看有那些用户
代码语言:javascript复制net user
通过查看当前机器有那些用户,我们就可以知道当前机器有没有其他管理员,又或者是有没有其他黑客”来过”这台机器,是不是留下了一个后门。
查看当前在线用户
代码语言:javascript复制query user || qwinsta
通过查看当前在线用户我们就可以知道当前机器有没有管理员在登陆,因为有的时候我们可能需要远程登录到目标服务器上,万一你盲目的登陆到目标服务器上,那么是不是就暴露了?就是这么一个道理。
查看本机端口开放情况
代码语言:javascript复制netstat -ano
通过查看本机端口开放情况我们就可以知道当前机器有没有与其他机器进行连接,又或者可以分析到当前机器有没有开放远程桌面 3389、MySQL 服务 3306 … 等等
查询补丁信息
代码语言:javascript复制systeminfo
代码语言:javascript复制wmic qfe get Caption,Description,HotFixID,InstalledOn
通过查看目标补丁情况我们就可以知道当前机器上有哪些补丁打了,有一些漏洞补丁是不是没打,没打补丁的话那么我们就可以对某个漏洞进行利用。
查询路由表及所有可用接口的ARP缓冲表
代码语言:javascript复制route print
代码语言:javascript复制arp -a
通过查询路由表及所有可用接口的ARP缓冲表,我们就可以知道当前网络的分布情况,内网有没有其他机器 …
查看防火墙配置
代码语言:javascript复制netsh firewall show config
通过查看防火墙配置我们就能知道当前机器是否开了防火墙,或者一些防火墙配置信息 …
若是想修改防火墙配置信息就可以使用:
代码语言:javascript复制win 2003及之前的版本,运行指定程序全部连接:netsh firewall add allowedprogram c:nc.exe "allow nc" enablewin 2003之后的版本用这条:netsh advfirewall firewall add rule name="pass nc" dir=in action=allow program="C:nc.exe"允许指定程序连出,命令如下netsh advfirewall firewall add rule name="Allow nc" dir=out action=allow program="C: nc.exe" 允许 3389 端口放行,命令如下netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow 自定义防火墙日志储存位置 netsh advfirewall set currentprofile logging filename "C:windowstempfw.log"
若是想要关闭防火墙就可以使用:
代码语言:javascript复制win 2003及之前的版本用这条命令:netsh firewall set opmode disablewin 2003之后的版本用这条命令:netsh advfirewall set allprofiles state off
查询并开启远程桌面连接服务
查看远程桌面服务是否开启,在 cmd 下使用注册表查询语句,命令如下,得到连接端口为 0xd3d,转换后为 3389
代码语言:javascript复制REG QUERY "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp" /V PortNumber
一些开启远程桌面的命令:
代码语言:javascript复制# 在 Windows Server 2003 中开启 3389 端口 wmic path win32_terminalservicesetting where (__CLASS !="") call setallowtsconnections 1# 在 Windows Server 2008 和 Windows Server 2012 中开启 3389 端口 wmic /namespace:\rootcimv2terminalservices path win32_terminalservicesetting where (__CLASS !="") call setallowtsconnections 1wmic /namespace:\rootcimv2terminalservices path win32_tsgeneralsetting where (TerminalName='RDP-Tcp') call setuserauthenticationrequired 1 # 在 Windows 7 中开启 3389 端口reg add "HKLMSYSTEMCURRENTCONTROLSETCONTROLTERMINAL SERVER" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f
域内信息搜集
搜集完本机的一些配置信息、IP信息、网卡信息、补丁信息后,我们接下来就要搜集域内的信息了,比如:域用户、域管理员、域控制器等信息。
获取域SID
代码语言:javascript复制whoami /all
关于获取域sid的作用以后我写了票据传递攻击后大家就了解了。
查询域内用户
代码语言:javascript复制net user /domain
通过查询域内用户我们就可以知道这个域内所有用户名,这也是可以知道这个域的大小到底有多大的一个命令。
查看域用户的详细信息
假如我们要查询 saulGoodmang 这个域用户的信息,我们就可以使用:
代码语言:javascript复制net user saulgoodman /domain
查询域列表(如果有多个域)
代码语言:javascript复制net view /domain
通过查询域列表发现当前只有一个 REDTEAM 域。
查询域管理员列表
代码语言:javascript复制net group "domain admins" /domain
可以看到当前域有两个域管理员:admin、administrator。
查看域内时间(时间服务器)
代码语言:javascript复制net time /domain
通过查看域内时间(时间服务器),我们得知了当前域的时间,我们就可以使用定时任务 IPC来运行一些bat文件。
我们还知道当前域的时间服务器是 AD2-2016,我们可以 Ping 一下它的机器名就知道它的 IP 是多少:
这样就知道了当前域的时间服务机器 AD2-2016 的 IP 为 10.10.10.11。
查看登陆本机的域管理员
代码语言:javascript复制net localgroup administrators /domain
这条命令会显示本地管理员和域管理员。
查看域内所有用户组列表
代码语言:javascript复制net group /domain
查看域的用户组我们可以知道每个组是做什么的,比如一些大型企业或者集团会有 财务组、信息科组、工厂组 … 等等,那么假设我们要针对于某个部门、某个组、某个人来进行渗透是不是搜集组信息就尤为关键了?
查看主域控制器
代码语言:javascript复制netdom query pdc
通过查看主域控制器我们就可以知道当前域的核心域控就是 AD-2016 这台机器。
查看所有域控制器列表
代码语言:javascript复制net group "Domain Controllers" /domain
一个域可以有多个域控制器,通过查看域控制器列表我们就可以得到域控制器对应的机器名是多少,如果想要知道它的 IP 是多少,我们只需要 Ping 它的机器名即可得到域控制器的 IP 地址:
由上图可见,域控机器名为 AD-2016 的 IP 是 10.10.10.10,域控机器名为 AD2-2016 的 IP 是 10.10.10.11,知道域控的 IP 后,我们就可以针对性的对域控制器渗透,只渗透核心机器,拿下域控制器权限整个域也就拿到手了。
查询域信任信息
代码语言:javascript复制nltest /domain_trusts
通过查询域信任信息我们就可以知道当前有多少个域,域名是多少。
查询域密码信息
代码语言:javascript复制net accounts /domain
通过查询域密码信息我们就可以知道当前域用户多久修改一次密码,密码策略是多少(我们就可以根据密码策略来制定一份密码字典,盲目的用字典会很浪费时间)。
当然这些信息搜集的命令我都写到了 Cobalt Strike 的插件里了,在我的知识星球 渗透攻击红队 即可下载,作为一个优秀的红队人员,一定要写一个适合于自己的工具或者插件,这样能够不管是我们做渗透还是内网渗透都有很大的效率,能够大大减少我们做一些手工的操作。
结尾
到此第二章域内信息搜集就到这里了,内网渗透、域渗透的本质其实就是信息搜集,只要你搜集内网的信息越多,你才能了解一个内网是做什么的,那些地方会有瑕疵,那些地方会有可能被红队人员攻破的地方。