【草船借箭】4.密码统计分析(Pandas)

  • ~2.87K 字
  • 次阅读
  • 条评论
  1. 1. 背景
  2. 2. CSV 文件加载
  3. 3. 最常用用户名 TOP10
  4. 4. 最常用密码 TOP10
  5. 5. 用户名密码组合 TOP10
  6. 6. SSH 客户端 TOP10
  7. 7. 访问 IP TOP10
  8. 8. 排序结果输出到文本文件中

使用 Pandas 的方案,分析统计用户名密码概况

背景

接上篇,已生成了数据处理过的 CSV 文件,包含时间、IP、用户名、密码信息。
如下:

1
2
3
4
5
6
timestamp,ip,port,client,username,password
2025/03/07 12:20:36.496984,111.1.27.170,35638,,,
2025/03/07 12:20:37.051431,111.1.27.170,35638,SSH-2.0-libssh2_1.11.0,pi,pi
2025/03/07 12:20:37.165172,111.1.27.170,35638,SSH-2.0-libssh2_1.11.0,pi,raspberry
2025/03/07 12:20:37.278851,111.1.27.170,35638,SSH-2.0-libssh2_1.11.0,pi,5nWt3P-fF4WosQm5O
2025/03/07 12:20:37.392358,111.1.27.170,35638,SSH-2.0-libssh2_1.11.0,pi,FAqY7=MZk66k-ob3Rmk

本次使用累积一年多的日志分析。

CSV 文件加载

使用Pandas加载 csv 作为DataFrame

1
2
3
4
import pandas as pd
from common import DOWNSTREAM_DIR

df = pd.read_csv(DOWNSTREAM_DIR / 'output_3.csv')

最常用用户名 TOP10

把用户名字段提取出来后,进行统计计数,去掉计数小于 5 次的结果
Pandas代码实现如下:

1
2
usernames = df['username'].value_counts()
usernames = usernames[usernames >= 5]

统计结果前 10 如下

username count
root 50969
ubuntu 821
admin 735
user 634
aaa 502
lab 502
test 398
debian 299
oracle 173
ftpuser 170

最常用的用户名root断崖式领先

最常用密码 TOP10

类似的,对密码字段分析
Pandas代码实现如下:

1
2
passwords = df['password'].value_counts()
passwords = passwords[passwords >= 5]
password count
123456 2752
123 527
1234 233
password 228
12345678 223
admin 176
root 162
12345 161
test 139
1 137

前 10 密码还都是很常见的弱密码

用户名密码组合 TOP10

再看看用户名密码的组合最常见的

1
2
3
4
5
6
7
df_auth = (
df
.groupby(['username', 'password'])
.size()
.reset_index(name='count')
.sort_values('count', ascending=False)
)
username password count
root 123456 165
root root 51
ubuntu 123456 45
test test 41
admin admin 38
test 12345678 37
root password 36
root Aa123456 33
root 1234 31
ubuntu ubuntu 30

SSH 客户端 TOP10

1
2
clients = df['client'].value_counts()
clients = clients[clients >= 5]
client count
SSH-2.0-Go 45649
SSH-2.0-libssh_0.9.6 16566
SSH-2.0-libssh2_1.11.0 1400
SSH-2.0-libssh_0.7.4 1000
SSH-2.0-libssh2_1.7.0 293
SSH-2.0-libssh2_1.9.0 276
SSH-2.0-makiko 257
SSH-2.0-libssh2_1.4.3 219
SSH-2.0-libssh_0.10.5 149
SSH-2.0-libssh2_1.10.0 108

访问 IP TOP10

1
2
ips = df['ip'].value_counts()
ips = ips[ips >= 5]
client count
218.0.55.157 46203
186.53.130.195 24077
116.128.230.184 7167
62.25.85.233 5495
177.234.178.105 5390
54.249.4.26 4626
110.52.193.178 4441
47.76.79.138 4214
47.95.208.72 4194
60.205.91.164 4151

排序结果输出到文本文件中

1
2
3
4
5
6
7
from common import OUTPUT_DIR

fields = ['usernames', 'passwords', 'clients', 'ips']
for field in fields:
with open(OUTPUT_DIR / f'{field}.txt', 'w', encoding='utf-8') as file:
for value in eval(f'{field}.index'):
file.write(f"{value}\n")

上述 4 个文件已上传GitHub

赞助喵
非常感谢您的喜欢!
赞助喵
分享这一刻
让朋友们也来瞅瞅!