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