module.html 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. <div class="row">
  2. <div class="col-md-6">
  3. <div class="panel panel-default" ng-controller="PineAPSettingsController">
  4. <div class="panel-heading">
  5. <h3 class="panel-title">
  6. Configuration
  7. </h3>
  8. </div>
  9. <div class="panel-body">
  10. <div class="alert alert-info" ng-hide="loading || settings.pineAPDaemon">
  11. <strong>Notice:</strong> In order to use some of these features, PineAP must first be enabled.
  12. </div>
  13. <img src="img/throbber.gif" alt="throbber.gif" ng-show="loading">
  14. <div class="input-group">
  15. <div class="checkbox">
  16. <label><input type="checkbox" value="" ng-model="settings.allowAssociations">
  17. Allow Associations
  18. </label>
  19. </div>
  20. <div class="checkbox">
  21. <label><input type="checkbox" value="" ng-model="settings.logEvents">
  22. Log PineAP Events
  23. </label>
  24. </div>
  25. <div class="checkbox">
  26. <label><input type="checkbox" value="" ng-model="settings.connectNotifications">
  27. Client Connect Notifications
  28. </label>
  29. </div>
  30. <div class="checkbox">
  31. <label><input type="checkbox" value="" ng-model="settings.disconnectNotifications">
  32. Client Disconnect Notifications
  33. </label>
  34. </div>
  35. <div class="checkbox">
  36. <label><input type="checkbox" value="" ng-model="settings.captureSSIDs">
  37. Capture SSIDs to Pool
  38. </label>
  39. </div>
  40. <div class="checkbox">
  41. <label><input type="checkbox" value="" ng-model="settings.beaconResponses">
  42. Beacon Response
  43. </label>
  44. </div>
  45. <div class="checkbox">
  46. <label><input type="checkbox" value="" ng-model="settings.broadcastSSIDs">
  47. Broadcast SSID Pool
  48. </label>
  49. </div>
  50. </div>
  51. <div class="input-group margin-bottom">
  52. <span class="input-group-addon" style="width: unset;">
  53. PineAP Daemon: {{ pineAPDaemonStatus }}
  54. </span>
  55. <span class="input-group-btn">
  56. <button ng-disabled="pineAPenabling" class="btn btn-default" type="button"
  57. ng-click="togglePineAP()">
  58. <span ng-hide="pineAPenabling">Switch</span>
  59. <img ng-show="pineAPenabling" src="img/throbber.gif">
  60. </button>
  61. </span>
  62. </div>
  63. <div class="input-group margin-bottom">
  64. <span class="input-group-addon" style="width: unset;">
  65. Autostart PineAP: {{ autostartPineAPStatus }}
  66. </span>
  67. <span class="input-group-btn">
  68. <button ng-disabled="pineAPenabling" class="btn btn-default" type="button"
  69. ng-click="toggleAutoStart()">
  70. <span>Switch</span>
  71. </button>
  72. </span>
  73. </div>
  74. <div class="input-group margin-bottom">
  75. <span class="input-group-addon">Beacon Response Interval</span>
  76. <select class="form-control" ng-model="settings.responseInterval">
  77. <option value="LOW">Low</option>
  78. <option value="NORMAL">Normal</option>
  79. <option value="AGGRESSIVE">Aggressive</option>
  80. </select>
  81. </div>
  82. <div class="input-group margin-bottom">
  83. <span class="input-group-addon">Broadcast SSID Pool</span>
  84. <select class="form-control" ng-model="settings.broadcastInterval">
  85. <option value="LOW">Low</option>
  86. <option value="NORMAL">Normal</option>
  87. <option value="AGGRESSIVE">Aggressive</option>
  88. </select>
  89. </div>
  90. <div class="input-group margin-bottom">
  91. <span class="fixed-addon-width-3 input-group-addon">Monitor Interface</span>
  92. <input type="text" maxlength="8" class="form-control" ng-model="settings.monitorInterface">
  93. </div>
  94. <div class="input-group margin-bottom">
  95. <span class="fixed-addon-width-3 input-group-addon">Source Interface</span>
  96. <input type="text" maxlength="8" class="form-control" ng-model="settings.sourceInterface">
  97. </div>
  98. <div class="input-group margin-bottom">
  99. <span class="fixed-addon-width-3 input-group-addon">Source MAC</span>
  100. <input type="text" maxlength="17" class="form-control" ng-model="settings.sourceMAC">
  101. </div>
  102. <div class="input-group margin-bottom">
  103. <span class="fixed-addon-width-3 input-group-addon">Target MAC</span>
  104. <input type="text" maxlength="17" class="form-control" ng-model="settings.targetMAC">
  105. </div>
  106. <br/>
  107. <div class="input-group">
  108. <button class="btn btn-default" ng-hide="disableButton" ng-click="updateSettings()">
  109. Save PineAP Settings
  110. </button>
  111. <img src="img/throbber.gif" alt="throbber.gif" ng-show="disableButton">
  112. </div>
  113. </div>
  114. </div>
  115. </div>
  116. <div class="col-md-6">
  117. <div class="panel panel-default" ng-controller="PineAPPoolController">
  118. <div class="panel-heading">
  119. <h3 class="panel-title">
  120. SSID Pool
  121. <button class="btn btn-default btn-xs btn-fixed-length pull-right" ng-click="getPool()">Refresh
  122. </button>
  123. <span class="dropdown">
  124. <button class="btn btn-xs btn-default dropdown-toggle" type="button" id="poolDropdown"
  125. data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  126. <span class="caret"></span>
  127. </button>
  128. <ul class="dropdown-menu" aria-labelledby="poolDropdown">
  129. <li ng-click="downloadPool()"><a>Download SSID Pool</a></li>
  130. <li ng-click="clearPool()"><a>Clear SSID Pool</a></li>
  131. <li ng-click="clearSessionCounter()"><a>Clear Session Counter</a></li>
  132. </ul>
  133. </span>
  134. </h3>
  135. </div>
  136. <div class="panel-body">
  137. <p>
  138. <textarea id="ssidPool" class="form-control" rows="15" ng-mouseup="getSSIDLineNumber()"
  139. ng-model="ssidPool" readonly></textarea>
  140. </p>
  141. <div class="input-group">
  142. <input type="text" class="form-control" placeholder="SSID" name="ssid" ng-model="ssid">
  143. <span class="input-group-btn">
  144. <button class="btn btn-default" type="button" ng-click="addSSID()">Add</button>
  145. <button class="btn btn-default" type="button" ng-click="removeSSID()">Remove</button>
  146. </span>
  147. </div>
  148. <br/>
  149. <div class="input-group">
  150. <span class="input-group-addon">Pool Location</span>
  151. <input type="text" class="form-control" ng-model="poolLocation">
  152. <span class="input-group-btn">
  153. <button class="btn btn-default" type="button" ng-click="setPoolLocation()">Save</button>
  154. </span>
  155. </div>
  156. <br/>
  157. <p class="alert well-sm alert-success" ng-show="clearedSSIDPool">SSID pool cleared successfully</p>
  158. <p class="alert well-sm alert-success" ng-show="clearedSessionCounter">SSID collection counter cleared successfully</p>
  159. <p class="alert well-sm alert-success" ng-show="addedSSID">SSID added successfully</p>
  160. <p class="alert well-sm alert-success" ng-show="removedSSID">SSID removed successfully</p>
  161. <p class="alert well-sm alert-success" ng-show="updatedPoolLocation">Pool location updated
  162. successfully</p>
  163. <p class="alert well-sm alert-danger" ng-show="lengthError">SSID must be between 1 and 32 characters</p>
  164. </div>
  165. </div>
  166. </div>
  167. </div>
  168. <div class="row">
  169. <div class="col-md-12" ng-controller="PineAPEnterpriseController">
  170. <div class="panel panel-default">
  171. <div class="panel-heading">
  172. <h3 class="panel-title">
  173. PineAP Enterprise
  174. <span class="dropdown" ng-show="view == 'normal'">
  175. <button class="btn btn-xs btn-default dropdown-toggle" type="button" id="poolDropdown"
  176. data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  177. <span class="caret"></span>
  178. </button>
  179. <ul class="dropdown-menu" aria-labelledby="poolDropdown">
  180. <li ng-click="clearCertificate()"><a>Clear Certificates</a></li>
  181. <li ng-hide="chalrespdata.length == 0 && basicdata.length == 0" ng-click="clearDB()"><a>Clear Credentials</a></li>
  182. <li ng-hide="chalrespdata.length == 0" ng-click="downloadJTR()"><a>Download Credentials (JTR Format)</a></li>
  183. <li ng-hide="chalrespdata.length == 0" ng-click="downloadHashcat()"><a>Download Credentials (Hashcat Format)</a></li>
  184. </ul>
  185. </span>
  186. </h3>
  187. </div>
  188. <div class="panel-body">
  189. <img src="img/throbber.gif" ng-show="loadingView"/>
  190. <div ng-show="view === 'certs'">
  191. <span class="text-info">
  192. To use PineAP Enterprise, you must first configure and generate a certificate. Certificate generation may take up to 5 minutes.
  193. </span><br/><br/>
  194. <div class="col-md-5">
  195. <div class="margin-bottom input-group" style="width: 100%">
  196. <div class="input-group">
  197. <span class="fixed-addon-width-3 input-group-addon">Locality</span>
  198. <input type="text" maxlength="32" class="form-control" ng-model="certificateSettings.locality"
  199. ng-disabled="generatingCertificate">
  200. </div>
  201. </div>
  202. <div class="margin-bottom input-group" style="width: 100%">
  203. <div class="input-group">
  204. <span class="fixed-addon-width-2 input-group-addon">State/Province</span>
  205. <input type="text" maxlength="32" class="form-control" ng-model="certificateSettings.state"
  206. ng-disabled="generatingCertificate">
  207. </div>
  208. </div>
  209. <div class="margin-bottom input-group" style="width: 100%">
  210. <div class="input-group">
  211. <span class="fixed-addon-width-3 input-group-addon">Country Code</span>
  212. <input type="text" maxlength="2" class="form-control" ng-model="certificateSettings.country"
  213. ng-disabled="generatingCertificate">
  214. </div>
  215. </div>
  216. <div class="margin-bottom input-group" style="width: 100%">
  217. <div class="input-group">
  218. <span class="fixed-addon-width-3 input-group-addon">Organization</span>
  219. <input type="text" maxlength="32" class="form-control" ng-model="certificateSettings.organization"
  220. ng-disabled="generatingCertificate">
  221. </div>
  222. </div>
  223. </div>
  224. <div class="col-md-5">
  225. <div class="margin-bottom input-group" style="width: 100%">
  226. <div class="input-group">
  227. <span class="fixed-addon-width-3 input-group-addon">Email</span>
  228. <input type="text" maxlength="32" class="form-control" ng-model="certificateSettings.email"
  229. ng-disabled="generatingCertificate">
  230. </div>
  231. </div>
  232. <div class="margin-bottom input-group" style="width: 100%">
  233. <div class="input-group">
  234. <span class="fixed-addon-width-3 input-group-addon">Common Name</span>
  235. <input type="text" maxlength="32" class="form-control" ng-model="certificateSettings.commonname"
  236. ng-disabled="generatingCertificate">
  237. </div>
  238. </div>
  239. <button class="btn btn-default" ng-click="generateCertificate();"
  240. ng-disabled="generatingCertificate">Generate Certificate
  241. </button>
  242. <img src="img/throbber.gif" ng-show="generatingCertificate"/>
  243. <span class="alert well-sm alert-danger" ng-show="error">{{ error }}<span>
  244. </div>
  245. </div>
  246. <div ng-show="view === 'normal'">
  247. <div class="col-md-5" style="height: 100%">
  248. <div class="input-group">
  249. <div class="checkbox">
  250. <label><input type="checkbox" ng-model="settings.enabled" ng-disabled="savingSettings">
  251. Enable
  252. </label>&nbsp;&nbsp;&nbsp;&nbsp;
  253. <label><input type="checkbox" ng-model="settings.enableAssociations"
  254. ng-disabled="savingSettings">
  255. Enable Passthrough
  256. </label>
  257. </div>
  258. </div>
  259. <br/>
  260. <div class="margin-bottom input-group" style="width: 100%;">
  261. <div class="input-group">
  262. <span class="fixed-addon-width-3 input-group-addon">Enterprise SSID</span>
  263. <input type="text" class="form-control" ng-model="settings.ssid"
  264. ng-disabled="savingSettings">
  265. </div>
  266. </div>
  267. <div class="margin-bottom input-group" style="width: 100%;">
  268. <div class="input-group">
  269. <span class="fixed-addon-width-3 input-group-addon">Enterprise MAC</span>
  270. <input type="text" maxlength="17" class="form-control" ng-model="settings.mac"
  271. ng-disabled="savingSettings">
  272. </div>
  273. </div>
  274. <div class="margin-bottom input-group" style="width: 100%;">
  275. <span class="input-group-addon">Encryption Type</span>
  276. <select class="form-control" ng-model="settings.encryptionType"
  277. ng-disabled="savingSettings">
  278. <option value="wpa2+ccmp">WPA2 Enterprise CCMP</option>
  279. <option value="wpa2+tkip">WPA2 Enterprise TKIP</option>
  280. <option value="wpa2+ccmp+tkip">WPA2 Enterprise TKIP+CCMP</option>
  281. <option value="wpa+ccmp">WPA Enterprise CCMP</option>
  282. <option value="wpa+tkip">WPA Enterprise TKIP</option>
  283. <option value="wpa+ccmp+tkip">WPA Enterprise CCMP+TKIP</option>
  284. <option value="wpa-mixed+ccmp">WPA Mixed Enterprise CCMP</option>
  285. <option value="wpa-mixed+tkip">WPA Mixed Enterprise TKIP</option>
  286. <option value="wpa-mixed+ccmp+tkip">WPA Mixed Enterprise CCMP+TKIP</option>
  287. </select>
  288. </div>
  289. <div class="margin-bottom input-group" style="width: 100%;">
  290. <span class="input-group-addon">Downgrade Attack</span>
  291. <select class="form-control" ng-model="settings.downgrade" ng-disabled="savingSettings">
  292. <option value="DISABLE">Disable</option>
  293. <option value="MSCHAPV2">MSCHAPv2</option>
  294. <option value="GTC">GTC</option>
  295. </select>
  296. </div>
  297. <div class="input-group">
  298. <button class="btn btn-default" ng-click="saveSettings();" ng-disabled="savingSettings">
  299. <span ng-hide="savingSettings">Save</span>
  300. <img src="img/throbber.gif" class="button-throbber" ng-show="savingSettings"/>
  301. </button> &nbsp;&nbsp;
  302. <span class="alert well-sm alert-success" ng-show="savedSettings">Settings Saved</span>
  303. <span class="alert well-sm alert-danger" ng-show="error">{{ error }}</span>
  304. <br/>
  305. <span class="text-muted small">Note: Cloning an Access Point may restart the wireless radios.</span>
  306. <br/>
  307. <br/>
  308. <br/>
  309. </div>
  310. </div>
  311. <div class="col-md-7">
  312. <div class="col-md-12">
  313. <p class="text-center text-info" ng-show="chalrespdata.length == 0">No Challenge Response Data
  314. Available.</p>
  315. <div class="table-responsive">
  316. <table class="table table-hover" ng-show="chalrespdata.length">
  317. <thead>
  318. <tr class="default-cursor">
  319. <th>Type</th>
  320. <th>Username</th>
  321. <th>Challenge</th>
  322. <th>Response</th>
  323. </tr>
  324. </thead>
  325. <tbody>
  326. <tr ng-repeat="datapoint in chalrespdata">
  327. <td>{{ datapoint.type | uppercase }}</td>
  328. <td class="autoselect">{{ datapoint.username }}</td>
  329. <td class="autoselect">{{ datapoint.challenge }}</td>
  330. <td class="autoselect">{{ datapoint.response }}</td>
  331. </tr>
  332. </tbody>
  333. </table>
  334. </div>
  335. </div>
  336. <div class="col-md-12">
  337. <p class="text-center text-info" ng-show="basicdata.length == 0">No Basic Data
  338. Available.</p>
  339. <div class="table-responsive">
  340. <table class="table table-hover" ng-show="basicdata.length">
  341. <thead>
  342. <tr class="default-cursor">
  343. <th>Type</th>
  344. <th>Username</th>
  345. <th>Password</th>
  346. </tr>
  347. </thead>
  348. <tbody>
  349. <tr ng-repeat="datapoint in basicdata">
  350. <td>{{ datapoint.type | uppercase }}</td>
  351. <td class="autoselect">{{ datapoint.username }}</td>
  352. <td class="autoselect">{{ datapoint.password }}</td>
  353. </tr>
  354. </tbody>
  355. </table>
  356. </div>
  357. </div>
  358. </div>
  359. </div>
  360. </div>
  361. </div>
  362. </div>
  363. </div>
  364. <div class="row">
  365. <div class="col-md-6" ng-controller="CapturedHandshakesController">
  366. <div class="panel panel-default">
  367. <div class="panel-heading">
  368. <h3 class="panel-title">
  369. Captured WPA Handshakes
  370. <span class="dropdown" ng-hide="handshakes.length === 0">
  371. <button class="btn btn-xs btn-default dropdown-toggle" type="button" id="handshakeDropdown"
  372. data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  373. <span class="caret"></span>
  374. </button>
  375. <ul class="dropdown-menu" aria-labelledby="handshakeDropdown">
  376. <li ng-click="downloadAllHandshakes()"><a>Download all Handshakes</a></li>
  377. <li ng-click="clearAllHandshakes()"><a>Clear all Handshakes</a></li>
  378. </ul>
  379. </span>
  380. <span>
  381. <button class="btn btn-default btn-xs btn-fixed-length pull-right" ng-click="getAllHandshakes();">
  382. Refresh
  383. </button>
  384. </span>
  385. </h3>
  386. </div>
  387. <div class="panel-body">
  388. <div class="text-center" ng-show="handshakes.length === 0">
  389. <span class="text-info"><i>No Handshakes Available</i></span>
  390. <br/>
  391. </div>
  392. <div class="table-responsive" ng-show="handshakes.length !== 0">
  393. <table class="table table-hover">
  394. <thead>
  395. <tr class="default-cursor">
  396. <th>BSSID</th>
  397. <th>Download</th>
  398. <th>Delete</th>
  399. </tr>
  400. </thead>
  401. <tbody>
  402. <tr ng-repeat="bssid in handshakes">
  403. <td>{{ bssid }}</td>
  404. <td>
  405. <button class="btn btn-default btn-xs" ng-click="downloadHandshake(bssid)">
  406. Download PCAP
  407. </button>
  408. </td>
  409. <td>
  410. <button class="btn btn-danger btn-xs" ng-click="deleteHandshake(bssid)">
  411. Delete
  412. </button>
  413. </td>
  414. </tr>
  415. </tbody>
  416. </table>
  417. </div>
  418. <div ng-show="clearedAllHandshakes" class="alert well-sm alert-success">
  419. <span>Successfully cleared all handshakes.</span>
  420. </div>
  421. </div>
  422. </div>
  423. </div>
  424. <div class="col-md-6" ng-controller="PinejectorController">
  425. <div class="panel panel-default">
  426. <div class="panel-heading">
  427. <h3 class="panel-title">
  428. Inject Raw Frames <img src="img/throbber.gif" ng-show="injecting"/>
  429. </h3>
  430. </div>
  431. <div class="panel-body">
  432. <div class="row">
  433. <div class="col-md-12">
  434. <div class="form-group">
  435. <textarea class="form-control uppercase" id="payload" rows="6"
  436. placeholder="Hex Encoded Payload..." ng-model="payload"></textarea>
  437. </div>
  438. <br/>
  439. <div class="input-group">
  440. <span class="fixed-addon-width-1 input-group-addon">Channel</span>
  441. <select class="form-control" id="channel" ng-model="channel"
  442. ng-options="channel for channel in channels"></select>
  443. </div>
  444. <br/>
  445. <div class="input-group">
  446. <span class="input-group-addon">Frame Count</span>
  447. <input class="form-control" type="number" id="count" ng-model="frameCount" min="1"
  448. max="100"/>
  449. </div>
  450. <br/>
  451. <div class="input-group">
  452. <span class="input-group-addon">Send Delay (ms)</span>
  453. <input class="form-control" type="number" id="delay" ng-model="delay" min="100"
  454. max="1200000"/>
  455. </div>
  456. <br/>
  457. <div class="form-group">
  458. <button class="btn btn-lg btn-default btn-block" type="button"
  459. ng-disabled="injecting || !checkPayload()" ng-click="injectFrames()">
  460. Inject Frames
  461. <img src="img/throbber.gif" ng-show="injecting"/>
  462. </button>
  463. </div>
  464. <div ng-show="error" class="alert well-sm alert-danger">
  465. <span>{{ error }}</span>
  466. </div>
  467. <div class="form-group">
  468. <button class="btn btn-md btn-default btn-block" type="button" ng-show="error"
  469. ng-click="toggleDetails()" data-toggle="collapse" data-target="#detailed-info">
  470. Show Debug Information
  471. </button>
  472. </div>
  473. <div ng-show="error && showDetails" class="alert well-lg alert-danger collapse"
  474. id="detailed-info">
  475. <span>
  476. <h6>Command</h6>
  477. <pre class="autoselect">{{ command }}</pre>
  478. <h6>Exit Code</h6>
  479. <pre class="autoselect">{{ exitCode }}</pre>
  480. <h6>stdout</h6>
  481. <pre class="autoselect">{{ stdout }}</pre>
  482. <h6>stderr</h6>
  483. <pre class="autoselect">{{ stderr }}</pre>
  484. </span>
  485. </div>
  486. <div ng-hide="checkPayload() || payload.length === 0" class="alert well-sm alert-danger">
  487. <span>Invalid hex.</span>
  488. </div>
  489. <div ng-show="checkRadiotap()" class="alert well-sm alert-warning">
  490. <span>It appears that this frame contains a radiotap header. Consider removing it.</span>
  491. </div>
  492. </div>
  493. </div>
  494. </div>
  495. </div>
  496. </div>
  497. </div>