kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

unhide 搜寻隐藏进程, 挖矿病毒处理

https://blog.csdn.net/weixin_48958956/article/details/139812765

https://www.cnblogs.com/bonelee/p/16976768.html

cpu us 达到 100%

top ps 命令无法发现进程

进程如何隐藏

Linux系统中有一个特殊的目录:/proc/,这个目录下的内容,不是硬盘上的文件系统,而是操作系统内核暴露出的内核中进程、线程相关的数据接口,也就是procfs,里面记录了系统上正在运行的进程和线程信息

而ps、top等命令的工作原理,实质上就是遍历这个目录。

知道了原理,想实现隐藏就有以下几个思路:

命令替换

直接替换系统中的ps、top命令工具。可以从GitHub上下载它们的源码,加入对应的过滤逻辑,在遍历进程的时候,剔除挖矿进程,实现隐藏的目的。

模块注入

编写一个动态链接库so文件,在so中,HOOK遍历相关的函数(readdir/readdir64),遍历的时候,过滤挖矿进程。

通过修改LD_PRELOAD环境变量或/etc/ld.so.preload文件,配置动态链接库,实现将其注入到目标进程中。

内核级隐藏

模块注入的方式是在应用层执行函数HOOK,隐藏挖矿进程,更进一步,可以通过加载驱动程序的方式在内核空间HOOK相应的系统调用来实现隐藏。不过这对攻击者的技术要求也更高,遇到这样的病毒清理起来挑战也更大了。

揪出挖矿进程

通过上面的进程隐藏原理看得住来,都是想尽办法隐藏/proc目录下的内容,类似于“障眼法”,所以包含ps、top、ls等等在内的命令,都没办法看到挖矿进程的存在。

但蒙上眼不代表不存在,有一个叫unhide的工具,就能用来查看隐藏进程。

1
unhide proc

systemctl status pid

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# systemctl status 77206
● 800a7a3e.service - Server Service
    Loaded: loaded (/usr/lib/systemd/system/800a7a3e.service; disabled; vendor preset: disabled)
   Active: activating (auto-restart) since Tue 2024-08-27 09:00:26 CST; 14min ago
  Process: 47625 ExecStart=/usr/bin/800a7a3e0df6442b 800a7a3e (code=exited, status=0/SUCCESS)
 Main PID: 47625 (code=exited, status=0/SUCCESS)
    Tasks: 22
   Memory: 19.4M
   CGroup: /system.slice/800a7a3e.service
           └─77206 /945d4139

systemctl stop xx.service
systemctl disable xx.service

/etc/rc.local被修改, lsattr被修改

先重装 e2fsprogs , 让 lsattr, chattr 可用

1
yum reinstall e2fsprogs
1
2
3
4
5
lsattr /etc/rc.local

chattr -i /etc/rc.local

chattr -a /etc/rc.local

unhide log

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
[root@localhost ~]# time unhide proc
Unhide 20130526
Copyright © 2013 Yago Jesus & Patrick Gouin
License GPLv3+ : GNU GPL version 3 or later
http://www.unhide-forensics.info

NOTE : This version of unhide is for systems using Linux >= 2.6

Used options:
[*]Searching for Hidden processes through /proc stat scanning

Found HIDDEN PID: 77206
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77207
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77208
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77209
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77210
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77211
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77345
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77346
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77347
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77348
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77349
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77350
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77351
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77352
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77353
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77354
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77355
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77356
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77357
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77358
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77359
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/

Found HIDDEN PID: 77360
        Cmdline: "/945d4139"
        Executable: "/945d4139 (deleted)"
        Command: "945d4139"
        $USER=root
        $PWD=/


real    25m58.149s
user    4m55.258s
sys     20m31.360s

ic卡

写完之后再读,就必须输 key

读出的 keyA 不显示??? keyB会变化


https://nfctool.cn/42

一、M1卡数据结构

Mifare Classic提供1k-4k的容量,现在国内门禁采用的多数是Mifare Classic 1k(S50)[后面简称M1卡]。

M1卡有从0到15共16个扇区,每个扇区配备了从0到3共4个段,每个段可以保存16字节的内容,为什么这里要强调从0开始呢?这跟C语言里面数组下标默认从0开始是差不多的,好计算地址偏移,我们不必太过在意,只是要记住是从0开始,写入数据的时候不要写错地方就可以了。每个扇区的第4个段(也就是3段)是用来保存KeyA,KeyB和控制位的,因为M1卡允许每个扇区有一对独立的密码保护,这样能够更加灵活的控制数据的操作,控制位就是这个扇区各种详细权限计算出来的结果。

每张M1卡都有一个全球唯一的UID号,这个UID号保存在卡的第一个扇区(0扇区)的第一段(0段),也称为厂商段,其中前4个字节(就是前8位,两位一个字节)是卡的UID,第5个字节是卡UID的校验位,剩下的是厂商数据。并且这个段在出厂之前就会被设置了写入保护,只能读取不能修改,当然也有例外,有种叫UID卡的特殊卡,UID是没有设置保护的,其实就是厂家不按规范生产的卡,M1卡出厂是要求要锁死UID的。下图很清晰的列出了M1卡的结构。

二、M1卡种类

普通IC卡,0扇区不可以修改,其他扇区可反复擦写,我们使用的电梯卡、门禁卡等智能卡发卡商所使用的都是 M1 卡,可以理解为物业发的母卡。其他IC卡都是后门卡,可通过各种写入方法修改0扇区,实现复制母卡的目的。

UID 卡(国外称GEN1)

普通复制卡,主要应用在IC卡复制上,遇到带有防火墙的门禁读卡器就会失效。这类门禁读卡器在刷卡的时候会默认发出后门指令修改UID卡卡号,导致UID卡无法再次使用,即UID卡只能使用一次。UID卡失效后可通过比对卡号是否被修改来判断门禁读卡器是否带防火墙。

由于只有读卡器才能发出后门指令,手机不支持发送后门指令,所以UID卡只能通过读卡器修改卡号和免密读写,无法使用手机修改卡号。UID卡即使写入时数据错误,也可以通过后门指令强行格式化救活。

CUID 卡(国外称GEN2)

可擦写防屏蔽卡,可以重复擦写所有扇区,门禁读卡器带防火墙的话,就可以使用CUID绕过防火墙。CUID无需锁卡自动起防屏蔽作用,不会像FUID或UFUID等需要锁卡后才起到防屏蔽作用。

CUID卡不响应后门指令,直接使用普通指令就可以修改卡号,所以可以用手机修改卡号。不过正因为CUID卡不响应后门指令,所以一旦写入过程数据出错,那么卡片将直接报废。

FUID 卡(国外称GEN2)

不可擦写防屏蔽卡,此卡的特点是0扇区只能写入一次,写入一次后FUID就变成普通 M1 卡,CUID卡绕过防火墙失败的话可以使用FUID尝试。

UFUID 卡

高级复制卡,我们可理解为是 UID 和 FUID 的合成卡,执行锁卡操作后变为 普通M1 卡,过程不可逆,不锁卡就是 UID 卡。市面上支持锁卡指令的读卡器和软件很少,我们的APP和读卡器支持UFUID卡的锁卡指令。

GTU/GUID/GDMIC卡

滚动码复制卡,用于滚动码防复制电梯系统,GTU卡锁卡后数据不再改变,每次断电后都会恢复为锁卡前的数据,从而使滚动码电梯系统无法正常滚动卡内数据,实现破解滚动码系统的目的。GTU可解锁,解锁后可通过GTU专用指令进行数据修改。

3.M1卡详解

https://blog.csdn.net/hiwoshixiaoyu/article/details/104048663

M1卡分为16个扇区,每个扇区4块(块0~3),共64块。第0扇区的块0(即绝对地址0块)用于存放厂商代码,已经固化,不可更改。

其他各扇区的块0、块1、块2为 数据块 ,用于存贮数据;块3为 控制块 ,存放密码A、存取控制、密码B,其结构如下:

控制字节

https://blog.51cto.com/u_16213651/11127776

Mifare1S50卡 出厂默认每个扇区的数据块3中的数据都是:

FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

其中:

FF FF FF FF FF FF 为A密钥

FF 07 80 69 为控制字节

FF FF FF FF FF FF为B密钥

控制字节FF 07 80 69所表示的控制权限含义:可用广州慧斯佳智能科技有限公司开发的M1S50卡控制字节工具进行解析得到

常见控制字节组

控制字节的组合方式虽然多,但实际用得比较多的主要是以下4种:

FF 07 80 69

这种字节组合方式是最常见的;只要A密钥或者B密钥验证通过,便可以读写数据块数据,修改A、B密钥,修改控制字节

优点在于:控制字节直接出厂默认,无需重新设置。读写数据,修改密钥都比较方便。缺点在于:安全性能差,数据和密钥容易泄露和被修改

7F 07 88 69

这种字节组合方式是:只要A密钥或者B密钥验证通过,便可以读写数据块数据,修改A、B密钥,控制字节都需要B密钥验证通过才可以

优点在于:密钥B权限最高,只要知道密钥B,就可以对A密钥和控制字节进行改写。应用上一般是由最高管理员掌握密钥B,配置多个密钥A给到对应的管理员。缺点在于:密钥B很重要,一旦忘记,卡就不能再改写密钥

08 77 8F 69

这种字节组合:由密钥A读密钥B来写,可以说是上面一种组合的变体,对于密钥B有更强的保护

FF 00 F0 69

这种字节组合:数据块不具有写入权限;只能读取。最常见用于门禁机发卡;在发卡阶段写入合法的身份识别数据之后;卡片的数据便再也不能修改

已知控制字节·解析权限过程详述

以最常见的 FF 07 80 69 字节组合为例

6: FF 7: 07 8: 80 9: 69

其中字节9目前是作为保留字节,一般固定为0x69;主要是看字节6,7,8这3个字节

步骤1:将字节6,7,8转换成对应的二进制格式,如下表

6: FF 1111 1111

7: 07 0000 0111

8: 80 1000 0000

步骤2:对字节6,7,8进行相应的处理

字节6处理操作:8位2进制数进行按位取反

6: FF 1111 1111 => 0000 0000

字节7处理操作:高4位2进制数保留;低4位2进制数取反

7: 07 0000 0111 => 0000 1000

字节8处理操作:8位2进制数不做任何处理,直接保留

8: 80 1000 0000 => 1000 0000

步骤3:将处理后的字节6,7,8的8位2进制数组成1张表格;如下表

bit-7

bit-6

bit-5

bit-4

bit-3

bit-2

bit-1

bit-0

权限增值表中的

        符号

C23_b

C22_b

C21_b

C20_b

C13_b

C12_b

C11_b

C10_b

字节6

0

0

0

0

0

0

0

0

权限增值表中的

        符号

C13

C12

C11

C10

C33_b

C32_b

C31_b

C30_b

字节7

0

0

0

0

1

0

0

0

权限增值表中的

        符号

C33

C32

C31

C30

C23

C22

C21

C20

字节8

1

0

0

0

0

0

0

0

其中:

C10C20C30组合:表示扇区中数据块0的权限;具体权限需要对应下图的数据块权限真值表

C11C21C31组合:表示扇区中数据块1的权限;具体权限需要对应下图的数据块权限真值表

C12C22C32组合:表示扇区中数据块2的权限;具体权限需要对应下图的数据块权限真值表

C13C23C33组合:表示扇区中密钥数据块(即数据块3)的权限;具体权限需要对应下图的密钥块权限真值表

组合C10C20C30,C11C21C31,C12C22C32的值均为 0 0 0,对应到数据块控制权限真值表中权限为:读:A|B 写:A|B 增值:A|B 减值、转移值、恢复值:A|B

组合C13C23C33的值为 0 0 1,对应到密钥块控制权限真值表中权限为:

AKey:读:Never 写:A|B

控制字节:读:A|B 写:A|B

BKey:读:A|B 写:A|B

综上:FF 07 80 69

数据块权限为:读:A|B 写:A|B 增值:A|B 减值、转移值、恢复值:A|B

密钥块权限为:AKey:读:Never 写:A|B

控制字节:读:A|B 写:A|B

BKey:读:A|B 写:A|B

所以控制字节FF 07 80 69的控制权限是:

只要A密钥或者B密钥验证通过,便可以读写数据块0,1,2;还可以对数据块0,1,2进行增值,减值, 转移值,恢复值等操作

只要A密钥或者B密钥验证通过,便可以写入A密钥;读写控制字节,读写B密钥;但无论任何条件下,都无法读取A密钥

根据所需要权限·生成对应控制字节

假设~~~现在对扇区中数据块0,1,2,密钥块的控制权限分别是以下需求:

1.数据块0:只有B密钥验证通过;才可以读取数据;但无论任何条件下,都不可以写入数据;不可以进行增值,减值, 转移值,恢复值等操作

2.数据块1:只要A密钥或者B密钥验证通过,就可以读取数据;但无论任何条件下,都不可以写入数据;不可以进行增值,减值, 转移值,恢复值等操作

3.数据块2:只有B密钥验证通过;才可以读取数据;但无论任何条件下,都不可以写入数据;不可以进行增值,减值, 转移值,恢复值等操作

4.密钥块:只要A密钥或者B密钥验证通过,就可以读取控制字节,但无论任何条件下,控制字节都不能被修改;只有B密钥验证通过;才可以修改A密钥和B密钥;但无论任何条件下,都不能读取A密钥和B密钥

结合上述需求分析:

数据块0权限值C10C20C30 和 数据块2权限值C12C22C32 均为下表红框中的值,既是C10C20C30 = 1 0 1;C12C22C32 = 1 0 1

数据块1权限值C11C21C301为下表黄框中的值,既是C11C21C31 = 0 1 0

密钥块权限值C13C23C33为下表中绿框中的值,既是C13C23C33 = 1 0 0

步骤1:将分析需求得到的C10C20C30 = 1 0 1;C11C21C31 = 0 1 0;C12C22C32 = 1 0 1;C13C23C33 = 1 0 0;填入下表

bit-7

bit-6

bit-5

bit-4

bit-3

bit-2

bit-1

bit-0

权限增值表中的

        符号

C23_b

C22_b

C21_b

C20_b

C13_b

C12_b

C11_b

C10_b

权限增值表中的

        符号

C13

C12

C11

C10

C33_b

C32_b

C31_b

C30_b

1

1

0

1

权限增值表中的

        符号

C33

C32

C31

C30

C23

C22

C21

C20

0

1

0

1

0

0

1

0

步骤2:根据已经填入的值,对表格进行补全处理

补全处理:_b表示取反;例如C30_b表示是C30的取反值

bit-7

bit-6

bit-5

bit-4

bit-3

bit-2

bit-1

bit-0

权限增值表中的

        符号

C23_b

C22_b

C21_b

C20_b

C13_b

C12_b

C11_b

C10_b

1

1

0

1

0

0

1

0

权限增值表中的

        符号

C13

C12

C11

C10

C33_b

C32_b

C31_b

C30_b

1

1

0

1

1

0

1

0

权限增值表中的

        符号

C33

C32

C31

C30

C23

C22

C21

C20

0

1

0

1

0

0

1

0

步骤3:分别对3组8位2进制数进行格式转换

将8位2进制数C23_bC22_bC21_bC20_bC13_bC12_bC11_bC10_b转换成16进制格式:得到字节6

bit-7

bit-6

bit-5

bit-4

bit-3

bit-2

bit-1

bit-0

C23_b

C22_b

C21_b

C20_b

C13_b

C12_b

C11_b

C10_b

1

1

0

1

0

0

1

0

将8位2进制数 转换 成16进制格式;得到字节6

0xD2

将8位2进制数C13C12C11C10C33_bC32_bC31_bC30_b转换成16进制格式:得到字节7

bit-7

bit-6

bit-5

bit-4

bit-3

bit-2

bit-1

bit-0

C13

C12

C11

C10

C33_b

C32_b

C31_b

C30_b

1

1

0

1

1

0

1

0

将8位2进制数 转换 成16进制格式;得到字节7

0xDA

将8位2进制数C33C32C31C30C23C22C21C20转换成16进制格式:得到字节8

bit-7

bit-6

bit-5

bit-4

bit-3

bit-2

bit-1

bit-0

C33

C32

C31

C30

C23

C22

C21

C20

0

1

0

1

0

0

1

0

将8位2进制数 转换 成16进制格式;得到字节8

0x52

结合上述3个表格得到:字节6:0xD2;字节7:0xDA;字节8:0x52;字节9一般固定为0x69

所以根据需求最终生成的控制字节是:D2 DA 52 69

https://www.cnblogs.com/water-wells/p/18071238

https://www.cnblogs.com/smartlife/articles/14643023.html

https://worktile.com/kb/ask/454988.html

查看 Linux 重启历史记录 last reboot -F

https://blog.csdn.net/m0_45406092/article/details/135715683

last

last 命令是在 Linux 中获取重启历史记录的瑞士军刀,它能够读取 /var/log/wtmp 文件,并显示最后登录用户和重启记录列表。

1
last reboot -F

通过 -F 选项可以显示完整的日期和时间来增强输出,以准确地辨别每次系统重启的准确时刻。

uptime

虽然 uptime 命令简洁明了,但也能够提供有价值的信息。它能够输出自上次重启以来 Linux 的持续运行时间,为系统的稳定性和性能评估提供了数据依据

who

使用 who -b 命令查看 Linux 最后启动时间