Skip to content

Commit f94d072

Browse files
committed
other platform should work
1 parent 8d10960 commit f94d072

2 files changed

Lines changed: 25 additions & 4 deletions

File tree

src/synack/plugins/duo.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ def __init__(self, *args, **kwargs):
2626
self._factor = None
2727
self._grant_token = None
2828
self._hotp = None
29+
self._progress_token = None
2930
self._referrer = None
3031
self._session_vars = None
3132
self._status = None
@@ -58,8 +59,24 @@ def get_grant_token(self, auth_url):
5859
self._get_status()
5960
if self._status == 'SUCCESS':
6061
self._get_oidc_exit()
62+
if self._progress_token:
63+
self._get_grant_token()
6164
return self._grant_token
6265

66+
def _get_grant_token(self):
67+
headers = {
68+
'X-Csrf-Token': self._xsrf
69+
}
70+
data = {
71+
'progress_token': self._progress_token
72+
}
73+
res = self._api.login('POST',
74+
'authenticate',
75+
data=data,
76+
headers=headers)
77+
if res.status_code == 200:
78+
self._grant_token = res.json().get('grant_token')
79+
6380
def _get_mfa_details(self):
6481
if self._state.otp_secret:
6582
self._device = 'null'
@@ -117,15 +134,19 @@ def _get_oidc_exit(self):
117134
}
118135
res = self._api.request('POST', f'{self._base_url}/frame/v4/oidc/exit', headers=headers, data=data)
119136
if res.status_code == 200:
120-
self._grant_token = re.search('grant_token=([^&]*)', res.url).group(1)
137+
try:
138+
self._grant_token = re.search('grant_token=([^&]*)', res.url).group(1)
139+
except AttributeError:
140+
self._progress_token = re.search('token=([^&]*)', res.url).group(1)
141+
self._xsrf = self._utils.get_html_tag_value('csrf-token', res.text)
121142

122143
def _get_session_variables(self):
123144
self._referrer = f'https://login.{self._state.synack_domain}/'
124145
res = self._api.request('GET', self._auth_url, headers=self._build_headers())
125146
if res.status_code == 200:
126147
self._sid = re.search('sid=([^&]*)', res.url).group(1)
127148
self._referrer = res.url
128-
self._base_url = re.search('(https.*duosecurity.com)/', res.url).group(1)
149+
self._base_url = re.search('(https.*duo[^.]*.com)/', res.url).group(1)
129150
self._xsrf = self._utils.get_html_tag_value('_xsrf', res.text)
130151

131152
client_hints = base64.b64encode(json.dumps({

src/synack/plugins/utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def __init__(self, *args, **kwargs):
1818

1919
@staticmethod
2020
def get_html_tag_value(field, text):
21-
match = re.search(f'<[^>]*name=.{field}.[^>]*value=.([^"\']*)', text)
21+
match = re.search(f'<[^>]*name=.{field}.[^>]*(?:content|value)=.([^"\']*)', text)
2222
if match.group is None:
23-
match = re.search(f'<[^>]*value=.([^"\']*)[^>]*name=.{field}', text)
23+
match = re.search(f'<[^>]*(?:content|value)=.([^"\']*)[^>]*name=.{field}', text)
2424
return match.group(1) if match else ''

0 commit comments

Comments
 (0)