Java学习之Swing

Java学习之Swing

介绍

Swing是一个为Java设计的GUI工具包

Swing是Java基础类的一部分

Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表。

Swing提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT。它们是JFC的一部分。它们支持可更换的面板和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。这意味着你可以在任意平台上使用JAVA支持的任意面板。轻量级组件的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为。

创建项目

File–new–project

image-20200710142559984

选择Maven

image-20200710142636828

image-20200710142709546

Helloworld程序

代码如下:

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
import javax.swing.*;

public class Helloworld {
//创建并现实GUI出于线程安全的考虑
//这个方法在事件调用线程中调用
private static void TestGUI(){
//确保一个漂亮的外观风格
JFrame.setDefaultLookAndFeelDecorated(true);

//创建及设置窗口
JFrame frame = new JFrame("Helloworld");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//添加"Helloworld"标签
JLabel jLabel = new JLabel("Helloworld");
frame.getContentPane().add(jLabel);

//显示窗口
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
//现实应用GUI
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
TestGUI();
}
});
}
}

运行成功:

image-20200710142826291

一个轮子实例

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
import javax.swing.*;


public class Test1 {
public static void main(String[] args) {
//创建JFrame实例
JFrame frame = new JFrame();
frame.setSize(350,200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

/*
* 创建面板
* */
JPanel panel = new JPanel();
frame.add(panel);

/*
* 调用用户定义的方法
* */
placeComponents(panel);

//设置见面可见
frame.setVisible(true);
}

private static void placeComponents(JPanel panel) {
//设置布局
panel.setLayout(null);

//创建JLabel
JLabel jLabel = new JLabel("Test:");
jLabel.setBounds(10,20,80,25);
panel.add(jLabel);

//创建用户输入
JTextField jTextField = new JTextField();
jTextField.setBounds(10,50,80,25);
panel.add(jTextField);

JPasswordField passwordField = new JPasswordField(20);
passwordField.setBounds(100,50,165,25);
panel.add(passwordField);

//创建登陆按钮
JButton jButton = new JButton("login");
jButton.setBounds(10,80,80,25);
panel.add(jButton);
}
}

image-20200710144125700

概念解析:

JFrame:java的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化、关闭。
JPanel:Java图形用户界面(GUI)工具包swing中的面板容器类,包含在javax.swing 包中,可以进行嵌套,功能是对窗体中具有相同逻辑功能的组件进行组合,是一种轻量级容器,可以加入到JFrame窗体中。。
JLabel: JLabel 对象可以显示文本、图像或同时显示二者。可以通过设置垂直和水平对齐方式,指定标签显示区中标签内容在何处对齐。默认情况下,标签在其显示区内垂直居中对齐。默认情况下,只显示文本的标签是开始边对齐;而只显示图像的标签则水平居中对齐。
JTextField:一个轻量级组件,它允许编辑单行文本。
JPasswordField:允许我们输入了一行字像输入框,但隐藏星号(*) 或点创建密码(密码)
JButton:JButton 类的实例。用于创建按钮类似实例中的 “Login”。
MacOS下微信取证

MacOS下微信取证

1. 找到微信数据库文件

​ ~/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/XXX/XXX/Message 

image-20200413143943005

2.从内存中读取密钥

1.打开Mac版微信

2.打开终端数据:lldb -p $(pgrep WeChat)进入lldb的子shell界面

image-20    200413144314193

在输入 z 和c

image-20200413144442160

登陆微信,会卡在正在登陆的界面

image-20200413144921822

然后在终端输入:memory read –size 1 –format x –count 32 $rsi

image-20200413145010088

这个就是64位的字符串的密钥

0x600001c2dfa0
0x600001c2dfa8
0x600001c2dfb0
0x600001c2dfb8

3.读取数据

使用:DB Browser for SQLite MAC版进行读取即可

Wireshark提取图片,文章

一、文件的导出

1、选取文件的流量包

例如:

img

2、选取MIME Multipart Media Encapsulation(MIME多部分媒体封装)

img

3、在数据包中看下文件是什么类型

img

4、选择文件数据包导出相应格式

img

右键点击选择—>导入分组字节流(或者选取直接ctrl+H)

img

选择全部文件,保存为3中得到的文件类型

img

二、图片的导出

1、选取文件的流量包

img

2、同文件导出相同

3、同文件导出相同

4、选择文件数据包导出相应格式

选择Portable Network Graphics这个导入就行

img

Opencanary开源蜜罐搭建

Opencanary开源蜜罐

介绍:

opencanary_web是一个Linux web蜜罐管理系统,基于Tornado+Vue+Mysql+APScheduler+Nginx+Supervisor。可收集相对全面的攻击信息,还具有很多管理功能,如白名单/邮件/过滤等。

可统计信息

  1. ftp登录尝试;
  2. http访问请求;
  3. http登录请求;
  4. ssh建立连接;
  5. ssh远程版本发送;
  6. ssh登录尝试;
  7. telnet登录尝试;
  8. 全端口(SYN)扫描识别;
  9. NMAP OS扫描识别;
  10. NMAP NULL扫描识别;
  11. NMAP XMAS扫描识别;
  12. NMAP FIN扫描识别;
  13. mysql登录尝试;
  14. git clone请求;
  15. ntp monlist请求(默认关闭);
  16. redis命令请求;
  17. TCP连接请求;
  18. vnc连接请求;
  19. rdp协议windows远程登录;
  20. snmp扫描;
  21. sip请求;
  22. mssql登录sql账户认证;
  23. mssql登录win身份认证;
  24. http代理登录尝试;

架构图

opencanary_web:一个开源的Linux蜜罐框架

搭建步骤

需要两台服务器:一台是后台管理,另一台是WEB网站

项目地址:https://github.com/p1r06u3/opencanary_web

安装方式

有以下安装方式

1.自动化安装

2.手工安装

笔者采用自动化安装方式,比较方便快捷

操作系统:CentOS7.3

第一步

打开终端,在root用户shell下输入以下命令:

1
curl -O https://raw.githubusercontent.com/p1r06u3/opencanary_web/master/install/install_opencanary_web.sh

或者输入以下命令:

1
wget --no-check-certificate https://raw.githubusercontent.com/p1r06u3/opencanary_web/master/install/install_opencanary_web.sh
安装步骤一

image-20200706200411505

安装步骤二

image-20200706200814415

等它自动跑完以后就安装成功了。

Web页面

image-20200706200946472

默认账号:admin

默认密码:admin

image-20200706201047573

安装蜜罐客户端-Agent
步骤一:

另外开一台虚拟主机(VPS)安装蜜罐客户端.

1
curl -O https://raw.githubusercontent.com/p1r06u3/opencanary_web/master/install/install_opencanary_agent.sh

或者输入输入以下命令:

1
wget --no-check-certificate https://raw.githubusercontent.com/p1r06u3/opencanary_web/master/install/install_opencanary_agent.sh

下载后输入:

1
bash install_opencanary_agent.sh

输入上面Web服务端的IP.等待脚本执行完毕,即可.

到服务端的Web页面进行管理http://$ip.

看我如何突破ios微信获取女朋友手机里的聊天记录

IOS端微信取证

1.通过备份获取数据库文件

image-20200517180621777

2.在文件夹中找到备份文件

​ 文件路径隐藏文件下,所以先显示隐藏文件Command+Shift+.

​ /Users/username/资源库/Application Support/MobileSync/Backup/

在文件夹里查找Manifest.db

image-20200517183355829

Manifest.db里面记录了各个 app 备份文件的存放状况,但数据太多,这里用sql语句查询下

image-20200517181714499

MM.sqlite就是微信的主要数据库

用fileID搜索文件

image-20200517182013289

把文件复制出来,并把后缀改为db

3.读取数据

ios微信数据库没有加密的,直接使用Navicat等工具直接打开即可

image-20200517183710525

Cobalt Strike 基础设施

Cobalt Strike 基础设施

在基础设施方面,我们希望设置这样一个可重用且高度灵活的环境。Cobalt Strike 支持重定向,当你的 Cobalt Strike 使用的 C2 域名被销毁了,你不需要创建并启用一个新的环境,只需要替换一个新的 C2 域名。你可以在这里找到更多的使用 socat 配置这些重定向器的信息:链接1 & 链接2

image-20200620234934528

为了使你更好的重定向,我们可以使用域名前置(域名幌子)。域名前置是使用其他的域名和基础设施的技术作为控制器重定向的技术集合(参考链接)。这可以通过使用流行的内容分发网络(CDNs)来实现,如亚马逊云的 CloudFront或其他的 Google Hosts 来隐蔽我们的流量源。这在过去曾被不同的攻击者所利用过(参考链接)。通过使用这些高信誉域名,无论 HTTP 或 HTTPS 的任何流量,看起来都像是它正在与这些域通信,而不是与我们的恶意 C2 服务器通信。这一切是如何运作的?用一个比较抽象的例子来说,你的所有流量将被发送到 CloudFront 的一个主要完全限定域名(FQDNs),例如 a0.awsstatic.com,它是 CloudFront 的主要域名。修改请求中的主机header 将把所有流量重定向到我们的 CloudFront 分发(CloudFront distribution),后者最终会将流量转发到我们的Cobalt Strike C2服务器上(参考链接)

image-20200620235134706

通过更改 HTTP 主机的 header,CDN 将很轻松的的的地把流量传输回到正确的服务器。红队一直使用这种技术通过使用高信誉域名来隐藏 C2 服务器的流量。

另外两个支持域名前置的两个不同公司的优秀资源

CyberArk 还写了一篇很好的博客文章,在文章里他介绍了如何使用谷歌的应用产品来使你的流量看起来是流经了 www.google.com, mail.google.com 或者 docs.google.com.Vincent Yiu 写了一篇关于如何使用阿里巴巴 CDN 来支持自己的域名前置攻击的文章。Cobalt Strike 不是唯一可以支持域名前置的工具,也可以通过 Meterpreter 来完成(参考链接)。

尽管不是基础架构的一部分,但是我们还是应该要理解 beacon 是如何在内部环境中工作的。在操作安全方面,我们应该避免建立会被轻易发现并清除的持久连接。作为一名红队成员,我们必须假设我们的一些客户端是会被蓝队发现的。如果我们让所有的主机都与一个或两个 C2 服务器通信,蓝队很容易就可以把整个基础设施连根拔除。幸运的是,Cobalt Strike 支持内网主机之间使用基于 SMB 的 Beacon 来进行交互。这允许你让一台受感染的计算机与你的C2 服务器进行正常且合适的 beacon 连接,并使内部网络上的所有其他的服务器通过 SMB 协议与最初受感染的主机进行通信。采用这种连接方式,当蓝队检测到一个二级系统有问题并进行取证分析,他们可能会无法识别与这次攻击相关的 C2 服务器域名。Cobalt Strike 可以操纵你的 Beacon 通信,这对红队成员来说是一个非常有用的特性。使用自定义 C2 配置文件,你可以让所有来自受感染主机系统的流量看起来和普通流量无异。现在我们会发现越来越多的内网环境中会针对第7层网络应用层进行过滤。很多时候蓝队在这层中找寻那些网络通信中的异常流量,那么我们怎样才能让我们的C2通信变得如同正常的 Web 流量呢?这就是可定制 C2 配置文件发挥作用的地方。看看这个例子。阅读这个例子,你会看到一些显而易见的信息:

我们可以看出这将会产生带有URI路径的HTTP请求:
1
set uri “/s/ref=nb_sb_noss_1/167-3294888-0262949/field-keywords=books”;
主机 header 设置为 Amazon:
1
header “Host” “www.amazon.com”;
甚至一些自定义服务器的 header 也从 C2 服务器发回:
1
2
header “x-amz-id-1” “THKUYEZKCKPGY5T42PZT”; 
header “x-amz-id-2” “a21yZ2xrNDNtdGRsa212bGV3YW85amZuZW9ydG5rZmRuZ2t

现在很多红队已经在许多不同的活动中使用了这些配置文件,许多安全厂商已经给所有常见的自定义配置文件创建了指纹签名。为了解决这个问题,我们能做的是: 确保修改了配置文件中的所有静态字符串,确保更改了所有 UserAgent 信息,使用真实的证书配置 SSL(不要使用 Cobalt Strike 默认的 SSL 证书),调整抖动率,并更改客户端的的 beacon 时间。 最后一个注意事项是确保通过 POST(http-post)命令进行通信,因为如果不这样做可能会导致使用自定义配置文件时出现很多问题。 如果你的配置文件注明了通过 http-get 进行通信,它仍然有效,但上传大文件将一直被限制。 请记住,GET 请求通常限制在2048个字符以内。SpectorOps 安全团队还创建了可定制混淆 C2 配置文件的项目.

这个脚本可以将 Cobalt Strike 的配置文件进行混淆来绕过一些基于签名检测的软件,其原理是将变量替换为提供的字典中的随机字符串,然后输出新的 Malleable C2 配置文件

深入理解RMI原理

深入理解RMI原理

RMI原理的几个问题:

1、是谁创建了s tubs对象,服务器?客户端?还是注册中心?

2、怎么知道服务器监听的端口是哪一个?

3、注册中心对RMI系统来说是必须的吗?

4、如果没有注册中心,RMi可以运行吗?

请忘记注册中心

大概的场景应该是这样的:我们有一个server和一个client,server继承了java.rmi.server.UnicastRemoteObject

client和server运行在不同的机器上面。

现在我们的需求是这样的:client想执行一个在远程机器上的server的一个方法

我们如果做到这一点?java rmi 会处理这些问题,解决方案肯定会涉及到socket网络编程,因为server运行在远程机器上,解决这个问题的关键点在于

1、客户端如何从处理网络链接中解耦开来

2、客户端如何能就像调用本地方法一样来调用远程机器上的方法 ,因此rmi的开发人员就引入了stub和skeleton模型

用一个例子来说明整个过程

1
2
3
4
5
6
7
8
9
10
11
12
package com.free04k;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface IHello extends Remote {
//简单返回"Hello World"
public String helloWord() throws RemoteException;

//一个简单的业务方法,根据传入的人名返回相对应的问候语
public String Hellotomso (String someBodyName) throws RemoteException;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.free04k;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class HelloImpl extends UnicastRemoteObject implements IHello{
private static final long serialVersionUID = -5638936712154214504L;

public HelloImpl() throws RemoteException{

}

@Override
public String helloWord() throws RemoteException {
return "hello World";
}

@Override
public String Hellotomso(String someBodyName) throws RemoteException {
return "你好" + someBodyName + "!";
}
}

server服务器的实现:

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

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class HelloImpl extends UnicastRemoteObject implements IHello{
private static final long serialVersionUID = -5638936712154214504L;

public HelloImpl() throws RemoteException{

}

@Override
public String helloWord() throws RemoteException {
return "hello World";
}

@Override
public String Hellotomso(String someBodyName) throws RemoteException {
return "你好" + someBodyName + "!";
}

Server发布服务

1、创建一个远程服务对象,已及实现

2、在指定的端口上发布RMIRegistry服务,用户客户端链接

3、在注册中心发布服务

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
ackage com.free04k;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

public class Imserver {
public static void main(String[] args) {
try {
//创建一个远程对象
IHello rhello = new HelloImpl();

//本地主机上的远程对象注册表Registry实例,并指定客户端为7777这一步必不可少
LocateRegistry.createRegistry(7777);
Naming.bind("//127.0.0.1:7777/RHello",rhello);

System.out.println(">>>>INFO:远程Ihello对象绑定成功");
} catch (RemoteException e) {
System.out.println("创建远程对象发生异常");
e.printStackTrace();
} catch (AlreadyBoundException e) {
System.out.println("要发生重复绑定对象异常");
e.printStackTrace();
} catch (MalformedURLException e) {
System.out.println("发生URL畸形异常");
e.printStackTrace();
}
}
}

上述为服务端Server发布服务的整个过程

image-20200622103559149
© 2020 John Doe
Powered by hexo | Theme is blank