74 |
75 | #include "/usr/local/include/modbus/modbus.h"
76 |
77 | #define DEBUG 1
78 |
79 | #define MAXLEN 16384
80 |
81 | void Process(char *server, char * port)
82 | { modbus_t *mb;
83 | uint8_t buf[MAXLEN];
84 | char fname[MAXLEN];
85 | FILE *fp;
86 | int i;
87 | short int v;
88 | struct timeval tv;
89 | mb = modbus_new_rtutcp(server, atoi(port));
90 | tv.tv_sec = 2;
91 | tv.tv_usec = 0;
92 | modbus_set_response_timeout(mb, &tv);
93 | if (modbus_connect(mb) == -1) {
94 | #ifdef DEBUG
95 | fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
96 | #endif
97 | abort();
98 | }
99 |
100 | while (1) {
101 | // read L1-L6 status
102 | modbus_set_slave(mb, 1);
103 | if(6!=modbus_read_registers(mb, 40400, 6, buf)) {
104 | #ifdef DEBUG
105 | printf("read L1-L6 registers failed: %s\n", modbus_strerror(errno));
106 | #endif
107 | abort();
108 | }
109 | #ifdef DEBUG
110 | printf("L1-L6 status: ");
111 | for(i=0;i<6;i++)
112 | printf("L%d=%d ",i+1, *(short int*)(buf+i*2));
113 | printf("\n");
114 | #endif
115 | for(i=0;i<6;i++) {
116 | sprintf(fname,"UL%d",i+1);
117 | fp=fopen(fname,"r+");
118 | if(fp) {
119 | fseek(fp,0L,SEEK_SET);
120 | if(1 == *(short int*)(buf+i*2))
121 | fprintf(fp,"1");
122 | else
123 | fprintf(fp,"0");
124 | fclose(fp);
125 | }
126 | }
127 |
128 | //read temp & hum
129 | modbus_set_slave(mb, 2);
130 | if(modbus_read_input_registers(mb, 0, 2, buf)!=2) {
131 | #ifdef DEBUG
132 | printf("read temp/hum registers failed: %s\n", modbus_strerror(errno));
133 | #endif
134 | abort();
135 | }
136 | v = *(short int*)(buf);
137 | #ifdef DEBUG
138 | printf("Temp=%d ",v);
139 | #endif
140 | fp=fopen("Utemp","r+");
141 | if(fp) {
142 | fseek(fp,0L,SEEK_SET);
143 | fprintf(fp,"%6.2f",v/10.0);
144 | fclose(fp);
145 | }
146 | v = *(short int*)(buf+2);
147 | #ifdef DEBUG
148 | printf("Hum=%d\n ",v);
149 | #endif
150 | fp=fopen("Uhum","r+");
151 | if(fp) {
152 | fseek(fp,0L,SEEK_SET);
153 | fprintf(fp,"%5.2f",v/10.0);
154 | fclose(fp);
155 | }
156 |
157 | fp=fopen("Ulastrun","r+");
158 | if(fp) {
159 | fseek(fp,0L,SEEK_SET);
160 | fprintf(fp,"%ld",time(NULL));
161 | fclose(fp);
162 | }
163 | sleep(1);
164 | }
165 | }
166 |
167 |
168 | void usage()
169 | {
170 | printf("read485 v1.0 by james@ustc.edu.cn\n");
171 | printf("read485 [ x.x.x.x port ]\n\n");
172 | exit(0);
173 | }
174 |
175 | int main(int argc, char *argv[])
176 | {
177 | char *server="202.38.64.142";
178 | char *port = "8000";
179 | signal(SIGCHLD,SIG_IGN);
180 | if(argc==3) {
181 | server=argv[1];
182 | port = argv[2];
183 | } else if(argc!=1) {
184 | usage();
185 | exit(0);
186 | }
187 |
188 | #ifndef DEBUG
189 | daemon_init("read485",LOG_DAEMON);
190 | while(1) {
191 | int pid;
192 | pid=fork();
193 | if(pid==0) // i am child, will do the job
194 | break;
195 | else if(pid==-1) // error
196 | exit(0);
197 | else
198 | wait(NULL); // i am parent, wait for child
199 | sleep(2); // if child exit, wait 2 second, and rerun
200 | }
201 | #endif
202 | Process(server, port);
203 | return(0);
204 | }
205 | ```
206 |
207 | 执行`make`编译程序后,`./read485`可以看到能读出相关信息。
208 |
209 |
210 | ## 五、简单的WEB显示程序
211 |
212 | 下面是非常简单的index.php,用来显示采集到的状态。
213 |
214 | 显示的例子请参见 [http://netfee.ustc.edu.cn/powermon/](http://netfee.ustc.edu.cn/powermon/)
215 |
216 | ```
217 |
220 |
221 | UPS房间
222 | ";
226 | if(time()-$tm>5) echo "数据更新不及时
";
227 | readfile ("/usr/src/powermon/Utemp");
228 | echo "°C ";
229 | readfile ("/usr/src/powermon/Uhum");
230 | echo "%
";
231 | echo "
\n";
232 | echo "| | 主用 | 备用 |
\n";
233 | echo "| 电源 |  |  |
\n";
238 | echo "
| 开关 |  |  |
\n";
243 | echo "
| 过流 |  |  |
\n";
248 | echo "
";
249 | ?>
250 | ```
251 |
252 |
253 | ***
254 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS)
255 |
--------------------------------------------------------------------------------
/security/gpg/README.md:
--------------------------------------------------------------------------------
1 | ## [原创] 从一个简单的备份需求演示GPG的使用
2 |
3 | 本文原创:**中国科学技术大学 张焕杰**
4 |
5 | 修改时间:2019.01.26
6 |
7 | ## 一、一个简单需求
8 |
9 | 领导说:要保障数据安全,做好备份工作。现在预算紧张,有那么多免费的云空间,能否直接备份到云上呢?
10 |
11 | ## 二、需求落实调研
12 |
13 | 各种脚本可以上传/下载云空间文件,只要解决了安全问题,使用云空间备份是可行的。
14 |
15 | 为了安全,显然要在备份上传前对文件进行加密。说到加密,就离不开两种加解密算法:
16 |
17 | ### 2.1 对称加解密算法
18 |
19 | 对称加解密算法,它的特点是加密和解密操作使用同样的密钥key。
20 |
21 | 
22 |
23 | 常见的对称加解密算法有AES、3DES等,一般来说性能很高,每秒钟可以加解密100MB字节或更多的信息。
24 |
25 | 一旦密钥key泄漏,加密的信息就可以被解密,也就是泄漏了。
26 |
27 | 如果使用对称加密算法加密备份文件,然后再上传到云空间,似乎能解决数据安全问题,但实际上这样做有很大的安全隐患:
28 |
29 | 对称加解密算法加密时需要密钥key,为了自动化操作,势必要在服务器上存放密钥key。一旦服务器被入侵,密钥key泄漏,之前所有加密的备份文件,都可以被解密而泄漏。
30 |
31 | ### 2.2 非对称加解密算法
32 |
33 | 非对称加解密算法,它的特点是加密和解密操作使用不同的密钥。2个密钥成对出现,1个称为私钥(private key)需要私密保存,另1个称为公钥(public key)可以对外公开。
34 |
35 | 在单独知道公钥的情况下,短时间无法推导或计算出私钥。
36 |
37 | 
38 |
39 | 常见的非对称加解密算法有RSA、ECC,一般来说加密/解密的性能比对称加解密算法要慢2-3个数量级。
40 |
41 | 除了简单加解密外,非对称加解密算法还可以完成数字签名、身份认证等工作。
42 | 如果说对称加解密是农耕时代,非对称加解密算法则是进入到电气化时代。
43 | 
44 |
45 | 对于上述备份加密需求,服务器上可以仅仅存放公钥,备份文件使用公钥加密后上传到云空间。公钥本来就是公开的,即使服务器被入侵,也不会泄漏什么。
46 | 需要解密文件时,再拿出单独保存的私钥来完成文件解密操作。
47 |
48 | ### 2.3 实际应用
49 |
50 | 实际使用时,往往采用非对称加解密算法来加密解密文件密钥key,然后通过性能高的对称加解密算法使用文件密钥key完成对文件的快读加解密操作。这样做既保证了安全性,又能提供很高的性能。
51 |
52 | 以上原理看起来复杂,使用常见的gpg(GnuPGP)软件操作并不复杂,主要包含如下步骤:
53 | * 生成私钥和公钥
54 | * 导出私钥和公钥
55 | * 把公钥导入要备份的服务器
56 | * 加密文件
57 | * 导入私钥
58 | * 解密文件
59 |
60 | 
61 |
62 | 最早实现加密/解密功能的软件是PGP,但它是商业软件。gpg(GnuPGP)是一个实现了类似PGP功能的开源软件。
63 |
64 | 以下演示在CentOS 7.0下完成,gpg版本是 2.0.22
65 |
66 | ## 三、操作演示
67 |
68 | ### 3.1 生成私钥和公钥
69 |
70 | 在一台安全的机器上,生成私钥和公钥对。由于我们是做备份文件的加密,因此有效期可以设置为0(永不过期)。
71 | 期间会提示输入一个密码用来保护私钥,请记住这个密码。私钥将用这个密码加密存放,一但忘记这个密码,
72 | 将无法获取到私钥,也就无法解密用公钥加密的文件。
73 |
74 | 由于需要足够的随机性,生成私钥和公钥的时间比较长,我花了30分钟左右。
75 |
76 | ```console
77 | # gpg --gen-key
78 | gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
79 | This is free software: you are free to change and redistribute it.
80 | There is NO WARRANTY, to the extent permitted by law.
81 |
82 | 请选择您要使用的密钥种类:
83 | (1) RSA and RSA (default)
84 | (2) DSA and Elgamal
85 | (3) DSA (仅用于签名)
86 | (4) RSA (仅用于签名)
87 | 您的选择? 1
88 | RSA 密钥长度应在 1024 位与 4096 位之间。
89 | 您想要用多大的密钥尺寸?(2048)4096
90 | 您所要求的密钥尺寸是 4096 位
91 | 请设定这把密钥的有效期限。
92 | 0 = 密钥永不过期
93 | = 密钥在 n 天后过期
94 | w = 密钥在 n 周后过期
95 | m = 密钥在 n 月后过期
96 | y = 密钥在 n 年后过期
97 | 密钥的有效期限是?(0) 0
98 | 密钥永远不会过期
99 | 以上正确吗?(y/n)y
100 |
101 | You need a user ID to identify your key; the software constructs the user ID
102 | from the Real Name, Comment and Email Address in this form:
103 | "Heinrich Heine (Der Dichter) "
104 |
105 | 真实姓名:backup user
106 | 电子邮件地址:backup@ustc.edu.cn
107 | 注释:
108 | 您选定了这个用户标识:
109 | “backup user ”
110 |
111 | 更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?o
112 | 您需要一个密码来保护您的私钥。
113 |
114 | 我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
115 | 鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
116 |
117 |
118 | --- 这里等了大约30分钟
119 |
120 | gpg: /root/.gnupg/trustdb.gpg:建立了信任度数据库
121 | gpg: 密钥 AC76A983 被标记为绝对信任
122 | 公钥和私钥已经生成并经签名。
123 |
124 | gpg: 正在检查信任度数据库
125 | gpg: 需要 3 份勉强信任和 1 份完全信任,PGP 信任模型
126 | gpg: 深度:0 有效性: 1 已签名: 0 信任度:0-,0q,0n,0m,0f,1u
127 | pub 4096R/AC76A983 2019-01-26
128 | 密钥指纹 = 8762 C5E9 9525 D863 8742 7D06 8C06 2706 AC76 A983
129 | uid backup user
130 | sub 4096R/339EB9D2 2019-01-26
131 | ```
132 |
133 | 输入以下命令可以查看生成的私钥和公钥信息。实际上生成了一个主密钥(master key)和一个子密钥(subkey),每个
134 | 密钥包含私钥和公钥,其中的sec是主密钥私钥(SECret key),ssb是子密钥私钥(Secret SuBkey),pub是主密钥公钥(PUBlic key),
135 | sub是子密钥公钥(public SUBkey)。主密钥是用来对子密钥进行签名的,并不直接使用。
136 |
137 | ```console
138 | # gpg --list-secret-key
139 | /root/.gnupg/secring.gpg
140 | ------------------------
141 | sec 4096R/AC76A983 2019-01-26
142 | uid backup user
143 | ssb 4096R/339EB9D2 2019-01-26
144 |
145 | # gpg --list-key
146 | /root/.gnupg/pubring.gpg
147 | ------------------------
148 | pub 4096R/AC76A983 2019-01-26
149 | uid backup user
150 | sub 4096R/339EB9D2 2019-01-26
151 | ```
152 |
153 |
154 | ### 3.2 导出私钥和公钥
155 |
156 | 执行以下命令可以将私钥和公钥导出成文件:
157 | ```console
158 | # gpg --armor --export-secret-keys > sec.key
159 | # gpg --armor --export-secret-subkeys > ssb.key
160 | # gpg --armor --export > pub.key
161 | ```
162 | sec.key 是主密钥和子密钥私钥,ssb.key 是子密钥私钥,这两个文件使用生成密钥时输入的密码加密保存的,切记要保密存放。
163 |
164 | pub.key 是两者的公钥,可以公开。 公开公钥最简单的方法是送给key server,如把AC76A983密钥的公钥送给pgp.ustc.edu.cn(中国科大的pgp key server,注意这里的域名是pgp,因为最早的软件是PGP,gpg是GnuPGP)
165 | ```
166 | # gpg --keyserver pgp.ustc.edu.cn --send-key AC76A983
167 | gpg: 将密钥‘AC76A983’上传到 hkp 服务器 pgp.ustc.edu.cn
168 | ```
169 | 这时访问 http://pgp.ustc.edu.cn/ ,输入 0xAC76A983,可以查询到对应的公钥信息,内容就是文件 pub.key。
170 |
171 |
172 | ### 3.3 导入公钥
173 |
174 | 在要备份的机器,即将来要加密文件的机器上,导入公钥。
175 |
176 | ```console
177 | # gpg --import pub.key
178 | gpg: 密钥 AC76A983:公钥“backup user ”已导入
179 | gpg: 合计被处理的数量:1
180 | gpg: 已导入:1 (RSA: 1)
181 | ```
182 |
183 | 使用以下命令可以验证公钥已经导入,私钥为空:
184 | ```console
185 | # gpg --list-key
186 | /root/.gnupg/pubring.gpg
187 | ------------------------
188 | pub 4096R/AC76A983 2019-01-26
189 | uid backup user
190 | sub 4096R/339EB9D2 2019-01-26
191 |
192 | # gpg --list-secret-key
193 | ```
194 |
195 | 导入的key还不被信任,可以执行以下命令信任这个key,或者在第一次执行加密时,按照提示信任key。
196 | ```console
197 | # gpg --edit-key AC76A983
198 | gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
199 | This is free software: you are free to change and redistribute it.
200 | There is NO WARRANTY, to the extent permitted by law.
201 |
202 |
203 | pub 4096R/AC76A983 创建于:2019-01-26 有效至:永不过期 可用于:SC
204 | 信任度:未知 有效性:未知
205 | sub 4096R/339EB9D2 创建于:2019-01-26 有效至:永不过期 可用于:E
206 | [ 未知 ] (1). backup user
207 |
208 | gpg> trust
209 | pub 4096R/AC76A983 创建于:2019-01-26 有效至:永不过期 可用于:SC
210 | 信任度:未知 有效性:未知
211 | sub 4096R/339EB9D2 创建于:2019-01-26 有效至:永不过期 可用于:E
212 | [ 未知 ] (1). backup user
213 |
214 | 您是否相信这位用户有能力验证其他用户密钥的有效性(查对身份证、通过不同的渠道检查
215 | 指纹等)?
216 |
217 | 1 = 我不知道或我不作答
218 | 2 = 我不相信
219 | 3 = 我勉强相信
220 | 4 = 我完全相信
221 | 5 = 我绝对相信
222 | m = 回到主菜单
223 |
224 | 您的决定是什么?5
225 | 您真的要把这把密钥设成绝对信任?(y/N)y
226 |
227 | pub 4096R/AC76A983 创建于:2019-01-26 有效至:永不过期 可用于:SC
228 | 信任度:绝对 有效性:未知
229 | sub 4096R/339EB9D2 创建于:2019-01-26 有效至:永不过期 可用于:E
230 | [ 未知 ] (1). backup user
231 | 请注意,在您重启程序之前,显示的密钥有效性未必正确,
232 |
233 | gpg> quit
234 | ```
235 |
236 | ### 3.4 加密文件
237 |
238 | 导入公钥后,加密文件非常简单,假定要加密的文件是 test.txt,加密后的文件是 test.txt.gpg。
239 | ```console
240 | # gpg -e -r backup test.txt
241 | ```
242 |
243 | ### 3.5 导入私钥
244 |
245 | 解密文件之前,需要导入私钥。我们仅仅导入子密钥的私钥即可,导入私钥的同时也导入了公钥。
246 | 导入的密钥仍旧是加密的,因此这时并未要求输入密码。
247 |
248 | ```console
249 | # gpg --import ssb.key
250 | gpg: 密钥 AC76A983:私钥已导入
251 | gpg: /root/.gnupg/trustdb.gpg:建立了信任度数据库
252 | gpg: 密钥 AC76A983:公钥“backup user ”已导入
253 | gpg: 合计被处理的数量:1
254 | gpg: 已导入:1 (RSA: 1)
255 | gpg: 读取的私钥:1
256 | gpg: 导入的私钥:1
257 | # gpg --list-key
258 | /root/.gnupg/pubring.gpg
259 | ------------------------
260 | pub 4096R/AC76A983 2019-01-26
261 | uid backup user
262 | sub 4096R/339EB9D2 2019-01-26
263 |
264 | # gpg --list-secret-key
265 | /root/.gnupg/secring.gpg
266 | ------------------------
267 | sec# 4096R/AC76A983 2019-01-26
268 | uid backup user
269 | ssb 4096R/339EB9D2 2019-01-26
270 | ```
271 |
272 | ### 3.6 解密文件
273 |
274 | 解密文件就很简单了,以下命令会把 test.txt.gpg 文件解密输出到 test.txt,中间会要求输入密钥的密码。
275 |
276 | ```console
277 | # gpg -o test.txt -d test.txt.gpg
278 |
279 | 您需要输入密码,才能解开这个用户的私钥:“backup user ”
280 | 4096 位的 RSA 密钥,钥匙号 339EB9D2,建立于 2019-01-26 (主钥匙号 AC76A983)
281 |
282 | gpg: 由 4096 位的 RSA 密钥加密,钥匙号为 339EB9D2、生成于 2019-01-26
283 | “backup user ”
284 |
285 | # cat test.txt
286 | this is a test file
287 | ```
288 |
289 | ## 四、进阶使用
290 |
291 | 非对称密钥系统,最需要保护的是私钥。以上操作,虽然使用密码加密保存了私钥,但还是不够安全。
292 |
293 | 更安全的做法是把私钥除了离线保存(锁在保险柜中)备份外,平时不直接使用私钥,
294 | 而是使用一个存有私钥的硬件设备(如Yubikey)。
295 |
296 | Yubikey是一个硬件设备,可以单向将私钥导入,无法读取私钥。Yubikey可以利用私钥信息,
297 | 实现RSA 4096bit的加密、解密、签名、认证等操作。
298 |
299 | 每次加密、解密等需要使用私钥参与处理时,还可以增加一个触摸按键人工确认的过程,更加安全可靠。
300 |
301 | ***
302 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS)
303 |
--------------------------------------------------------------------------------
/security/gh0st/README.md:
--------------------------------------------------------------------------------
1 | ## [原创]使用deepseek辅助一次安全入侵事件分析
2 |
3 | 本文原创:**中国科学技术大学 张焕杰**
4 |
5 | 修改时间:2025.03.22
6 |
7 | 注:本文使用中国科学技术大学部署的deepseek https://chat.ustc.edu.cn ,相关命令在Linux系统中运行,其他系统结果可能略有出入。
8 |
9 | ## 一、安全事件通报
10 |
11 | 收到安全通报,通报说某80端口发生木马安全事件,通报包含如下内容:
12 | ```
13 | ;payload=Gh0st\AD\00\00\00\E0\00\00\00x\9CKS``\98\C3\C0\C0\C0\06\C4\8C@\BCQ\96\81\81\09H\07\A7\16\95e&\A7*\04$&g+\182\94\F6\B000\AC\A8rc\00\01\11\A0\82\1F\\`&\83\C7K7\86\19\E5n\0C9\95n\0C;\84\0F3\AC\E8sch\A8^\CF4'J\97\A9\82\E30\C3\91h]&\90\F8\CE\97S\CBA4L?2=\E1\C4\92\86\0B@\F5`\0CT\1F\AE\AF]\0Ar\0B\03#\A3\DC\02~\06\86\03+\18m\C2=\FDtC,C\FDL<<==\\\9D\19\88\00\E5 \02\00T\F5+\\;hex=\\x47\\x68\\x30\\x73\\x74\\xAD\\x00\\x00\\x00\\xE0\\x00\\x00\\x00\\x78\\x9C\\x4B\\x53\\x60\\x60\\x98\\xC3\\xC0\\xC0\\xC0\\x06\\xC4\\x8C\\x40\\xBC\\x51\\x96\\x81\\x81\\x09\\x48\\x07\\xA7\\x16\\x95\\x65\\x26\\xA7\\x2A\\x04\\x24\\x26\\x67\\x2B\\x18\\x32\\x94\\xF6\\xB0\\x30\\x30\\xAC\\xA8\\x72\\x63\\x00\\x01\\x11\\xA0\\x82\\x1F\\x5C\\x60\\x26\\x83\\xC7\\x4B\\x37\\x86\\x19\\xE5\\x6E\\x0C\\x39\\x95\\x6E\\x0C\\x3B\\x84\\x0F\\x33\\xAC\\xE8\\x73\\x63\\x68\\xA8\\x5E\\xCF\\x34\\x27\\x4A\\x97\\xA9\\x82\\xE3\\x30\\xC3\\x91\\x68\\x5D\\x26\\x90\\xF8\\xCE\\x97\\x53\\xCB\\x41\\x34\\x4C\\x3F\\x32\\x3D\\xE1\\xC4\\x92\\x86\\x0B\\x40\\xF5\\x60\\x0C\\x54\\x1F\\xAE\\xAF\\x5D\\x0A\\x72\\x0B\\x03\\x23\\xA3\\xDC\\x02\\x7E\\x06\\x86\\x03\\x2B\\x18\\x6D\\xC2\\x3D\\xFD\\x74\\x43\\x2C\\x43\\xFD\\x4C\\x3C\\x3C\\x3D\\x3D\\x5C\\x9D\\x19\\x88\\x00\\xE5\\x20\\x02\\x00\\x54\\xF5\\x2B\\x5C
14 | ```
15 |
16 | ## 二、payload 分析
17 |
18 | 从中猜测hex=后面是可疑payload的hex编码,提取hex=后内容到文件 payload.hex,文件内容为:
19 | ```
20 | \\x47\\x68\\x30\\x73\\x74\\xAD\\x00\\x00\\x00\\xE0\\x00\\x00\\x00\\x78\\x9C\\x4B\\x53\\x60\\x60\\x98\\xC3\\xC0\\xC0\\xC0\\x06\\xC4\\x8C\\x40\\xBC\\x51\\x96\\x81\\x81\\x09\\x48\\x07\\xA7\\x16\\x95\\x65\\x26\\xA7\\x2A\\x04\\x24\\x26\\x67\\x2B\\x18\\x32\\x94\\xF6\\xB0\\x30\\x30\\xAC\\xA8\\x72\\x63\\x00\\x01\\x11\\xA0\\x82\\x1F\\x5C\\x60\\x26\\x83\\xC7\\x4B\\x37\\x86\\x19\\xE5\\x6E\\x0C\\x39\\x95\\x6E\\x0C\\x3B\\x84\\x0F\\x33\\xAC\\xE8\\x73\\x63\\x68\\xA8\\x5E\\xCF\\x34\\x27\\x4A\\x97\\xA9\\x82\\xE3\\x30\\xC3\\x91\\x68\\x5D\\x26\\x90\\xF8\\xCE\\x97\\x53\\xCB\\x41\\x34\\x4C\\x3F\\x32\\x3D\\xE1\\xC4\\x92\\x86\\x0B\\x40\\xF5\\x60\\x0C\\x54\\x1F\\xAE\\xAF\\x5D\\x0A\\x72\\x0B\\x03\\x23\\xA3\\xDC\\x02\\x7E\\x06\\x86\\x03\\x2B\\x18\\x6D\\xC2\\x3D\\xFD\\x74\\x43\\x2C\\x43\\xFD\\x4C\\x3C\\x3C\\x3D\\x3D\\x5C\\x9D\\x19\\x88\\x00\\xE5\\x20\\x02\\x00\\x54\\xF5\\x2B\\x5C
21 | ```
22 | 执行`vi payload.hex`,输入`:s/\\\\x//g` 删除 `\\x`,`:w`保存,此时 payload.hex 内容为
23 | ```
24 | 4768307374AD000000E0000000789C4B53606098C3C0C0C006C48C40BC51968181094807A716956526A72A042426672B183294F6B03030ACA87263000111A0821F5C602683C74B378619E56E0C39956E0C3B840F33ACE8736368A85ECF34274A97A982E330C391685D2690F8CE9753CB41344C3F323DE1C492860B40F5600C541FAEAF5D0A720B0323A3DC027E0686032B186DC23DFD74432C43FD4C3C3C3D3D5C9D198800E520020054F52B5C
25 | ```
26 | payload.hex文件长度346个字符+换行,共347字节。
27 |
28 | 问deepseek `如何把hex字符串转换为二进制文件`,得到回答是:
29 |
30 | ```
31 | echo -n "48656C6C6F" | xxd -r -p > output.bin
32 | ```
33 | 执行 `cat payload.hex | xxd -r -p > payload.bin`,得到文件payload.bin,文件大小为173字节。同时,根据回答中
34 | ```
35 | 转换后,可以用以下方法检查文件内容:
36 | xxd output.bin # 查看十六进制转储
37 | ```
38 | 执行命令`xxd payload.bin`,显示为
39 | ```
40 | 00000000: 4768 3073 74ad 0000 00e0 0000 0078 9c4b Gh0st........x.K
41 | 00000010: 5360 6098 c3c0 c0c0 06c4 8c40 bc51 9681 S``........@.Q..
42 | 00000020: 8109 4807 a716 9565 26a7 2a04 2426 672b ..H....e&.*.$&g+
43 | 00000030: 1832 94f6 b030 30ac a872 6300 0111 a082 .2...00..rc.....
44 | 00000040: 1f5c 6026 83c7 4b37 8619 e56e 0c39 956e .\`&..K7...n.9.n
45 | 00000050: 0c3b 840f 33ac e873 6368 a85e cf34 274a .;..3..sch.^.4'J
46 | 00000060: 97a9 82e3 30c3 9168 5d26 90f8 ce97 53cb ....0..h]&....S.
47 | 00000070: 4134 4c3f 323d e1c4 9286 0b40 f560 0c54 A4L?2=.....@.`.T
48 | 00000080: 1fae af5d 0a72 0b03 23a3 dc02 7e06 8603 ...].r..#...~...
49 | 00000090: 2b18 6dc2 3dfd 7443 2c43 fd4c 3c3c 3d3d +.m.=.tC,C.L<<==
50 | 000000a0: 5c9d 1988 00e5 2002 0054 f52b 5c \..... ..T.+\
51 | ```
52 |
53 | 问deepseek `Gh0st`得到回答与 Gh0st RAT有关,但无直接有用信息。
54 |
55 | 在google中搜索`Gh0st RAT 数据包结构`,第一个链接`https://www.freebuf.com/articles/paper/167917.html Gh0st大灰狼RAT家族通讯协议分析`。提到Gh0st通讯实现包结构是
56 | ```
57 | |------------|------------|-------------------|-----------------|
58 | |Magic Number|Total Length|Uncompressed Length|Compressed Data |
59 | |------------|------------|-------------------|-----------------|
60 | |5 Byte |4 Byte |4 Byte |Compressed length|
61 | |------------|------------|-------------------|-----------------|
62 | ```
63 | 其中Magic Number是`Gh0st`,后续是4字节数据包总长度,4字节解压后的消息长度,zlib压缩后的数据。本次数据包,总长度0xad = 173, zlib解压后的数据包长度应该是0xe0 = 224。
64 |
65 | 问 deepseek `写一段程序解压zlib压缩文件`,根据回答编辑文件`decompress_zlib.py`,内容如下:
66 |
67 | ```
68 | import zlib
69 | import sys
70 |
71 | def decompress_zlib_file(input_path, output_path):
72 | try:
73 | # 读取压缩文件的二进制内容
74 | with open(input_path, 'rb') as f_in:
75 | compressed_data = f_in.read()
76 |
77 | # 解压数据
78 | decompressed_data = zlib.decompress(compressed_data)
79 |
80 | # 保存到输出文件
81 | with open(output_path, 'wb') as f_out:
82 | f_out.write(decompressed_data)
83 |
84 | print(f"解压成功!输出文件:{output_path}")
85 |
86 | except FileNotFoundError:
87 | print(f"错误:输入文件 {input_path} 未找到!")
88 | except zlib.error as e:
89 | print(f"错误:解压失败,可能不是有效的 zlib 压缩数据。详情:{str(e)}")
90 | except Exception as e:
91 | print(f"发生未知错误:{str(e)}")
92 |
93 | if __name__ == "__main__":
94 | # 使用示例:命令行传入输入和输出文件路径
95 | if len(sys.argv) != 3:
96 | print("用法:python decompress_zlib.py <输入压缩文件> <输出解压文件>")
97 | sys.exit(1)
98 |
99 | input_file = sys.argv[1]
100 | output_file = sys.argv[2]
101 | decompress_zlib_file(input_file, output_file)
102 | ```
103 |
104 | 将前面生成的payload.hex备份,并删除789C之前的Magic Number、Total Length、Uncompressed Length部分,保留如下从789C开始的内容:
105 | ```
106 | 789C4B53606098C3C0C0C006C48C40BC51968181094807A716956526A72A042426672B183294F6B03030ACA87263000111A0821F5C602683C74B378619E56E0C39956E0C3B840F33ACE8736368A85ECF34274A97A982E330C391685D2690F8CE9753CB41344C3F323DE1C492860B40F5600C541FAEAF5D0A720B0323A3DC027E0686032B186DC23DFD74432C43FD4C3C3C3D3D5C9D198800E520020054F52B5C
107 | ```
108 | 执行命令 `cat payload.hex | xxd -r -p > zlib.bin`,执行命令 `python3 decompress_zlib.py zlib.bin zlib.out.bin`,输出`解压成功!输出文件:zlib.out.bin`,输出的文件zlib.out.bin长度224字节,与数据包头处的Uncompressed Length 0xe0 = 224一致。
109 |
110 | 执行命令`xxd payload.bin`,显示为:
111 | ```
112 | 00000000: 6620 0000 9c00 0000 0600 0000 0100 0000 f ..............
113 | 00000010: b11d 0000 0200 0000 5365 7276 6963 6520 ........Service
114 | 00000020: 5061 636b 2031 0075 8c04 0000 a87a 4600 Pack 1.u.....zF.
115 | 00000030: 0000 0000 1402 0000 f80a 0000 0000 0000 ................
116 | 00000040: 48e9 4600 9877 4600 6c79 4600 b813 c300 H.F..wF.lyF.....
117 | 00000050: a88e 4600 807b af02 9c5a 2d02 7808 c300 ..F..{...Z-.x...
118 | 00000060: c45b 2d02 b813 c300 b9e9 9577 b813 c300 .[-........w....
119 | 00000070: 0000 0000 1402 0000 0000 0000 1402 0000 ................
120 | 00000080: 0000 0000 90c8 a480 d05a 2d02 d05a 2d02 .........Z-..Z-.
121 | 00000090: d05b 2d02 572f 2b75 0100 0000 0001 011e .[-.W/+u........
122 | 000000a0: a00f 0000 c0a8 013c 5749 4e2d 5439 554e .......> /var/log/xl2tpd.log
351 | ```
352 | vi /etc/ppp/ip-down,增加
353 | ```
354 | echo "`date -d today +%F_%T` $PEERNAME $IPREMOTE stop" >> /var/log/xl2tpd.log
355 | ```
356 |
357 | 3.10 修改日志保存时间
358 |
359 | vi /etc/logrotate.d/syslog
360 | 增加
361 | ```
362 | /var/log/xl2tpd.conf
363 | ```
364 |
365 | vi /etc/logrotate.conf
366 |
367 | ```
368 | rotate 40
369 | ```
370 |
371 |
372 | 重启服务器就可以工作了。
373 |
374 |
375 | ## 参考资料
376 |
377 | * https://www.wenjinyu.me/zh/centos-7-build-l2tp-vpn/
378 | * http://www.beijinghuayu.com.cn/centos7-l2tp-freeradius/
379 | * http://www.majinlei.com/2018/11/05/Centos7-5%E7%B3%BB%E7%BB%9F%E4%BD%BF%E7%94%A8L2TP-IPSec-%E6%90%AD%E5%BB%BA%E6%9C%8D%E5%8A%A1%E5%99%A8/
380 |
381 |
382 | ***
383 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS)
384 |
--------------------------------------------------------------------------------
/other/eduroam/README.md:
--------------------------------------------------------------------------------
1 | ## [原创] centos7 eduroam freeradius 安装记录
2 |
3 | 本文原创:**中国科学技术大学 张焕杰**
4 |
5 | 修改时间:2019.04.11
6 |
7 | eduroam@CERNET http://www.eduroam.edu.cn
8 |
9 | [Protocol and Password Compatibility](http://deployingradius.com/documents/protocols/compatibility.html)
10 |
11 | eduroam是education roaming的缩写,在各个国家的教育科研网广泛采用。如果所在学校/单位已经加入eduroam,那么他们可以非常容易地在其他支持eduroam的学校/单位免费使用Internet,不受国界限制。目前eduroam已经覆盖全球100余个国家,我国也覆盖了180余所高校和50余个中国科学院研究所。
12 |
13 | 我国高校的漫游认证中心由北京大学提供,详细的漫游认证中心,请见 eduroam@CERNET http://www.eduroam.edu.cn
14 |
15 | 如果您所在的学校还未加入eduroam认证体系,您可以建议学校网络管理部门尽快加入,以便尽快享受免费服务。
16 |
17 | ## 0. 基础
18 |
19 | 1. 有用户名,明文 或 NT Hash 密码,以便radius使用 (关于NT Hash密码,请见最后)
20 |
21 | 2. 准备一个IP地址,将来用作radius服务器。
22 |
23 | ## 1. 联系eduroam认证中心
24 |
25 | CERNET用户可以联系eduroam@CERNET http://www.eduroam.edu.cn
26 |
27 | 其他用户请联系 eduroam 中国无线网漫游交换中心 http://eduroam.cstnet.cn
28 |
29 | https://analysis.eduroam.edu.cn/admin/univ/create 填写申请表,打印盖章,寄快递,等北大的老师收到快递后,开通服务。然后就可以到 https://analysis.eduroam.edu.cn 登录,并获取到相关的key.
30 |
31 | ## 2. 安装radius服务器
32 |
33 | 2.1 虚拟机安装CentOS 7
34 |
35 | 设置好主机名、IP地址等信息。
36 |
37 | 2.2 安装如下包
38 |
39 | ```
40 | yum install -y mariadb mariadb-server freeradius-mysql freeradius freeradius-utils git
41 | ```
42 |
43 | ## 3. 启动mysqld
44 | ```
45 | systemctl start mariadb #启动mariadb
46 | systemctl enable mariadb
47 | ```
48 |
49 | ## 4. 初始化git,跟踪修改
50 | ```
51 | cd /etc/raddb
52 | git init
53 | git add *
54 | git commit -m init
55 | ```
56 |
57 | ## 5. 创建数据库
58 |
59 | 参考 /etc/raddb/mods-config/sql/main/mysql/schema.sql setup.sql
60 |
61 | 必要时修改setup.sql中的密码
62 |
63 | ```
64 | echo "create database radius" | mysql
65 | mysql radius < /etc/raddb/mods-config/sql/main/mysql/schema.sql
66 | mysql radius < /etc/raddb/mods-config/sql/main/mysql/setup.sql
67 | ```
68 |
69 | ## 6. 设置包过滤规则
70 |
71 | 下面的2个IP是上游radius服务器(北大维护)IP地址。
72 |
73 | 如果自己的无线控制器AC也要连接radius服务器认证,需要把自己的无线控制器放开。
74 |
75 | ```
76 | firewall-cmd --permanent --remove-service=ssh
77 | firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="x.x.x.0/24" service name="ssh" accept"
78 | firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="162.105.129.2" service name="radius" accept"
79 | firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="121.194.2.97" service name="radius" accept
80 | firewall-cmd --reload
81 | ```
82 |
83 | ## 7. 修改配置
84 |
85 | 7.1 ca有关配置
86 |
87 | 生成一个有效期足够长的证书,以免使用中更换。
88 |
89 | ```
90 | cd /etc/raddb/certs
91 | make destroycerts
92 | vi ca.cnf
93 |
94 | #修改default_days 7200
95 | #修改[certificate_authority]
96 |
97 | vi server.cnf
98 |
99 | #修改default_days 7200
100 | #修改[certificate_authority]
101 |
102 | openssl dhparam -out dh 1024
103 | make ca.pem
104 | make ca.der
105 | make server.pem
106 |
107 | chgrp radiusd *
108 | ```
109 |
110 | 如果想查看生成的证书,可以执行
111 | ```
112 | openssl x509 -in ca.pem -text | more
113 | openssl x509 -in server.pem -text | more
114 | ```
115 |
116 | 7.2 clients.conf & proxy.conf
117 |
118 | /etc/raddb/clients.conf增加如下:
119 |
120 | 注意:我这里仅仅作为漫游认证,并未增加本地无线控制器的信息。正常还需要增加无线控制器的信息
121 |
122 | ```
123 | client flr.edu.cn {
124 | ipaddr = x.x.x.x
125 | proto = *
126 | secret = yyyyyyyyyyyyyyyy
127 | require_message_authenticator = no
128 | }
129 | client backup.flr.edu.cn {
130 | ipaddr = x.x.x.x
131 | proto = *
132 | secret = yyyyyyyyyyyyyyyy
133 | require_message_authenticator = no
134 | }
135 | ```
136 |
137 | /etc/raddb/proxy.conf
138 | ```
139 | realm fsyy.ustc.edu.cn {
140 | }
141 |
142 | home_server flr.edu.cn {
143 | type = auth
144 | ipaddr = x.x.x.x
145 | port = 1812
146 | secret = ****************
147 | response_window = 20
148 | zombie_period = 40
149 | status_check = status-server
150 | check_interval = 120
151 | num_answers_to_alive = 3
152 | max_outstanding = 65536
153 | }
154 |
155 | home_server backup.flr.edu.cn {
156 | type = auth
157 | ipaddr = x.x.x.x
158 | port = 1812
159 | secret = ****************
160 | response_window = 20
161 | zombie_period = 40
162 | status_check = status-server
163 | check_interval = 120
164 | num_answers_to_alive = 3
165 | max_outstanding = 65536
166 | }
167 |
168 | home_server_pool edu.cn-Failover {
169 | type = fail-over
170 | home_server = flr.edu.cn
171 | home_server = backup.flr.edu.cn
172 | }
173 |
174 | realm DEFAULT {
175 | auth_pool = edu.cn-Failover
176 | nostrip
177 | }
178 | ```
179 | 7.3 其他
180 |
181 | /etc/raddb/mods-available/sql
182 | ```
183 | driver = "rlm_sql_mysql"
184 |
185 | dialect = "mysql"
186 |
187 | # Connection info:
188 | #
189 | server = "localhost"
190 | port = 3306
191 | login = "radius"
192 | password = "radpass"
193 | ```
194 | /mods-config/sql/main/mysql/queries.conf
195 | ```
196 | sql_user_name = "%{%{Stripped-User-Name}:-%{%{User-Name}:-DEFAULT}}"
197 | ```
198 |
199 | sites-available/default
200 | 将authorize中
201 | ```
202 | auth_log
203 | ```
204 |
205 | accounting中
206 | ```
207 | #unix
208 | ```
209 | post-auth中
210 | ```
211 | #-sql
212 | ```
213 |
214 | 这样设置,会把关键日志记录在 /var/log/radius目录下。
215 |
216 | 如果想记录更多的日志,可以把 pre-proxy 中的pre_proxy_log和post-proxy中的post_proxy_log也打开。
217 |
218 | 以下按照上海交通大学赖学亮老师的《eduroam配置建议》 https://www.eduroam.edu.cn/info/1021/1072.htm
219 |
220 | vi /etc/raddb/sites-enabled/default 文件, pre-proxy 段落里,增加了
221 | ```
222 | update proxy-request {
223 | Operator-Name := "1fsyy.ustc.edu.cn"
224 | }
225 | ```
226 |
227 | vi /etc/raddb/dictionary.eduroam.local,增加如下内容:
228 | ```
229 | VENDOR eduroam 9048
230 | BEGIN-VENDOR eduroam
231 | ATTRIBUTE Eduroam-Proxy 0 String
232 | END-VENDOR eduroam
233 | ```
234 |
235 | vi /etc/raddb/dictionary文件里增加一行
236 | ```
237 | $INCLUDE /etc/raddb/dictionary.eduroam.local
238 | ```
239 |
240 | ## 8. 启用sql模块
241 |
242 | ```
243 | cd /etc/raddb/mods-enabled
244 | ln -s ../mods-available/sql .
245 | ```
246 |
247 | ## 9. 测试用户
248 | ```
249 | mysql radius
250 | INSERT INTO radcheck VALUES (1,'test','Cleartext-Password',':=','test123');
251 | ```
252 | 建立一个用户test,密码test123
253 |
254 | ## 10. 测试
255 |
256 | 1. 在radius服务器上执行
257 | radiusd -X
258 |
259 | 2. 访问 http://eduroam.ustc.edu.cn
260 |
261 | 输入 test@fsyy.ustc.edu.cn test123 测试正常
262 |
263 | 如果测试通过,说明本地用户已经可以在其他地方登录。
264 |
265 | 测试完毕后,把修改commit到git:
266 | ```
267 | cd /etc/raddb
268 | git add *
269 | git commit -m "now works"
270 | ```
271 |
272 | ## 11. 加入启动过程
273 |
274 | ```
275 | systemctl start radiusd
276 | systemctl enable radiusd
277 | ```
278 | 默认的设置,可能因为mariadb启动有点慢,自动启动会出错,修改以下文件:
279 | ```
280 | vi /usr/lib/systemd/system/radiusd.service
281 | After后增加 mariadb.service
282 | ```
283 |
284 | ## 12. 本地无线网络控制器设置
285 |
286 | 12.1 修改clients.conf,增加类似如下信息
287 |
288 | 其中x.x.x.x是无线控制器IP地址,secret是密码。
289 |
290 | ```
291 | client x.x.x.x{
292 | secret = *****
293 | shortname = myac
294 | }
295 | ```
296 |
297 | 注意每次修改后,需要重启radiusd后才生效。
298 |
299 | 12.2 防火墙允许无线控制器通信
300 |
301 | ```
302 | firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="x.x.x.x" service name="radius" accept
303 | firewall-cmd --reload
304 | ```
305 |
306 | 12.3 无线控制器设置
307 |
308 | 这里以H3C和华为的AC为例,设置如下:
309 |
310 | H3C例子:
311 |
312 | 假定用户在vlan 196,radius服务器IP是s.s.s.s
313 |
314 | ```
315 | dot1x authentication-method eap
316 |
317 | wlan service-template 5
318 | ssid eduroam
319 | vlan 196
320 | akm mode dot1x
321 | cipher-suite ccmp
322 | cipher-suite tkip
323 | security-ie rsn
324 | security-ie wpa
325 | client-security authentication-mode dot1x
326 | dot1x domain eduroam
327 | service-template enable
328 | #
329 |
330 | #
331 | radius scheme eduroam
332 | primary authentication s.s.s.s key cipher *************************************
333 | primary accounting s.s.s.s key cipher *************************************
334 | timer realtime-accounting 0
335 | #
336 | domain eduroam
337 | authentication lan-access radius-scheme eduroam
338 | authorization lan-access radius-scheme eduroam
339 | accounting lan-access radius-scheme eduroam
340 | #
341 |
342 | ```
343 |
344 | 华为的例子:
345 |
346 | ```
347 | authentication-profile name wlan-eduroam
348 | dot1x-access-profile wlan-eduroam
349 | access-domain default dot1x force
350 |
351 | radius-server template radius_eduroam
352 | radius-server shared-key cipher *************************************************
353 | radius-server authentication s.s.s.s 1812 weight 80
354 | radius-server accounting s.s.s.s 1813 weight 80
355 |
356 | aaa
357 | authentication-scheme radius_eduroam
358 | authentication-mode radius
359 |
360 | domain default
361 | authentication-scheme radius_eduroam
362 | radius-server radius_eduroam
363 |
364 | wlan
365 |
366 | security-profile name eduroam
367 | security wpa2 dot1x aes-tkip
368 |
369 | ssid-profile name eduroam
370 | ssid eduroam
371 |
372 | vap-profile name eduroam
373 | forward-mode tunnel
374 | service-vlan vlan-id 191
375 | ssid-profile eduroam
376 | security-profile eduroam
377 | authentication-profile wlan-eduroam
378 |
379 | ap-group name ****
380 | radio 0
381 | vap-profile eduroam wlan 1
382 |
383 | dot1x-access-profile name wlan-eduroam
384 | ```
385 |
386 |
387 | 12.4 测试
388 |
389 | 如果需要调试,可以停止radiusd,并用调试模式启动,查看交互信息
390 |
391 | ```
392 | systemctl stop radiusd
393 | radiusd -X
394 | ```
395 |
396 | ## 13. 关于密码
397 |
398 | eduroam使用EAP-MSCHAPv2认证,需要使用明文密码或NT Hash密码。
399 |
400 | 如用户test,密码test,明文密码和NT Hash密码格式如下(只要一个即可):
401 | ```
402 | MariaDB [radius]> select * from radcheck;
403 | +----+----------+--------------------+----+----------------------------------+
404 | | id | username | attribute | op | value |
405 | +----+----------+--------------------+----+----------------------------------+
406 | | 1 | test | NT-Password | := | 0CB6948805F797BF2A82807973B89537 |
407 | | 2 | test | Cleartext-Password | := | test |
408 | +----+----------+--------------------+----+----------------------------------+
409 | ```
410 |
411 | NT Hash密码是把密码MD4hash后得到的,使用如下php片段可以生成NT Hash密码:
412 |
413 | 来自 https://www.php.net/manual/en/ref.hash.php
414 |
415 | ```
416 |
424 |
425 | ```
426 | ***
427 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS)
428 |
--------------------------------------------------------------------------------