内网渗透工具
Setspn
SPN
Service Principal Names
SPN是服务器上所运行服务的唯一标识,每个使用Kerberos的服务都需要一个SPN。
SPN分为两种,一种注册在AD上机器账户(Computers)下,另一种注册在域用户账户下(Users)下。
当一个服务的权限为Local System或 Network Serivce,则SPN注册在机器账户(Computers)下。当一个服务的权限为一个域用户,则SPN注册在域用户账户(User)下。
SPN的格式
serviceclass/host:port/servicename
说明:
- serviceclass可以理解为服务类的名称,常见的有www,ldap,SMTP,DNS,HOST等。
- host有两种形式,FQDN(全域名)和NetBIOS(简域名)名,例如server01.test.com和server01。
- 如果服务运行在默认端口上,则端口号(Port)可以省略。
查询SPN
对域控制器发起LDAP查询,这是正常Kerberos票据行为的一部分,因此查询SPN的操作很难被检测。
使用SetSPN
win7和windows server2008自带的工具。
查询当前域内所有的SPN:
1 | setspn.exe -q */* |
查看某个域内的所有SPN:
1 | setspn.exe -T xxx -q */* |
输出结果实例:
以CN开头的每一行代表一个账户,其下的信息是与该账户相关联的SPN。
对于上面的输出数据,机器账户(Computers)为:
1 |
|
域用户账户(Users)为:
1 | CN=user02,CN=Users,DC=lab,DC=com |
注册在域用户账户(Users)下的SPN有两个:kadmin/changepw和MSSQLSvc/DC1.test.com。
Windows系统通过SPN查询获得服务和服务实例账户的对应关系
比如说:
用户a要访问MySQL服务的资源,进行到4.tgs_replay时,步骤如下:
1.Domain Controller查询MYSQL服务的SPN
如果该SPN注册在机器账户(Computers)下,将会查询所有机器账户(Computers)的servicePrincipalName属性,找到对应的账户。
如果该SPN注册在域用户账户(Users)下,将会查询所有域用户(Users)的servicePrincipalName属性,找到对应的账户。
2.找到对应的账户后,使用该账户的NTML hash,生成TGS
域内的任何用户都可以向域内的任何服务请求TGS
综上,域内的任何一台主机,都能够通过查询SPN,向域内的所有服务请求TGS,拿到TGS后对其进行暴力破解。
对于破解出的明文口令,只有域用户账户(Users)的口令存在价值,不必考虑机器账户的口令(无法用于远程连接)。
因此,高效率的利用思路如下:
- 查询SPN,找到有价值的SPN,需要满足以下条件:
该SPN注册在域用户账户(Users)下
域用户账户的权限很高
- 请求TGS
- 导出TGS
- 暴力破解
我们可以在内网中扫描spn,快速寻找内网中注册的服务。
普通域用户权限即可
1 | setspn -T xxx(y) -Q */* |
Nslookup
域名查询一般是指查询域名的whois注册信息,域名WHOIS是当前域名系统中不可或缺的一项信息服务。在使用域名进行Internet冲浪时,很多用户希望进一步了解域名,名字服务器等详细信息,这就会用到WHOIS。对于域名的注册服务机构(registrar)而言,要确认域名数据是否已经正确注册到域名注册中心(registry),也经常会用到WHOIS。直观来看,WHOIS就是链接到域名数据库的搜索引擎,一般来说是属于网络信息中心(NIC)所提供和维护的名字服务之一。
在内网渗透中有时需要在某台WEB服务器中留下后门,该机器可以通过内网ip建立IPC连接,但还需要获知外网ip或域名才能访问Webshell,在无网关权限的情况下,有如下方法:
1.通过nslookup访问为外部地址,回显ip
1 | nslookup myip.opendns.com resolver1.opendns.com |
2.查看dns缓存,如果某站点频繁被访问,相关记录可能会出现在缓存里
1 | ipconfig /displaydns |
3.如果是IIS7 IIS7.5:
执行如下命令:
1 | %windir%\system32\inetsrv\appcmd list site |
显示网站列表
1 | %windir%\system32\inetsrv\appcmd list site /config /xml |
导出指定网站的配置信息
从中找到绑定的域名及IP
4.接上条,大型网络一般得到结果都为localhost
上述的config文件还记录了一条关键信息,就是Web绝对路径,通过绝对路径,翻看网站源代码,找到title、目录结构、链接及相关的说明信息,再通过google搜索,加上相关域名或关键字的缩写,尝试从Google收录中找到该网站。
5.如果为IIS6 无法快速确定Web目录,还可以查看IIS日志:
c$\inetpub\logs\LogFiles\W3SVC1,日志可能会暴露外网ip、域名;通过访问者ip能判断是否能够外网访问;通过post或get请求的路径,加上相关域名或关键字配合google搜索。
注意:在分析日志时使用正则表达式搜索可以提高效率。
查看域控主机名
1 | nslookup -type=SRV _ldap._tcp |
快速定位域控ip,一般是dns、时间服务器:
1 | net time /domain |
内网主机发现
可以使用如下命令来达到内网主机的发现
查看共享资料:
net view
查看arp表:
arp -a
查看hosts文件:
1 | liunx: cat/etc/hosts |
查看dns缓存:
1 | ipconfig /displaydns |
AdFind
AdFind是一款c++编写的域内查询信息的工具
常用命令:
列出域控制器名称:
1 | ADfind -sc dclist |
查看域控版本
1 | ADfind -schema -s base objectversion |
查询当前域中在线的计算机:
1 | ADFind -sc computers_active |
查询当前域中所有计算机:
1 | ADFind -f "objectcategory=computer" |
查询当前域中所有计算机(只显示名称和操作系统):
1 | ADFind -f "objectcategory=computer" name operatingSystem |
查询域内所有⽤户:
1 | Adfind -users name |
查询所有GPO:
1 | adfind -sc gpodmp |
枚举受保护AD账户:
1 | adfind -f "&(objectcategory=person)(samaccountname=*)(admincount=1)" -dn |
查看域内用户详细信息
1 | adfind.exe -h DNS_SERVER_IP -sc u:username #目标用户 |
查看域用户能登陆的机器
1 | adfindexe -h DNS_SERVER_IP -sc u:username userWorkstatioins |
查看域内所有用户详细信息
1 | Adfind.exe -h DNS_SEVER_IP -sc u:*>result.txt |
Psloggendon
Psloggendon.exe可以用来定位域管
Psloggendon.exe是psTools工具套件中的一员,用来查看通过资源共享登录的用户,该工具的一些功能需要管理员权限。
另外两个定位域管的工具
PVEFindADUser.exe
1 | PVEFindADUser.exe -current "<domain admin name>" |
PowerView.ps1
1 | powershell.exe -exec bypass -Command "&{Import-module<绝对路径>;Invoke-Userhunter}" |
360safebrowserdecrypt
这是一个一键辅助抓取360安全浏览器密码的cs脚本,通过下载浏览器数据库、记录密钥来离线解密浏览器密码。
https://github.com/c0de3/360SafeBrowsergetpass
加载Aggressor script后,beacon右键打开菜单执行SafeBrowsergetpass即可
执行后将下载浏览器数据库,记录密钥MachineGuid
到Credential
离线解密数据库
只需要替换本地注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid
,替换原来360浏览器的assis2.db
,通常路径为C:\Users\Administrator\AppData\Roaming\360se6\User Data\Default\apps\LoginAssis
,即可通过BrowserView进行本地解密。